note


Geo-SELECT memo(MySQL)

緯度経度から範囲指定でSELECTするメモ。たぶんまた使うと思うので。

(準備)
適当なデータベースに、テーブルを作成:
create table testdb( name text not null, latlng geometry, primary key(name(128)));
とりあえずシンプルなテーブルを用意。ここではnameをプライマリーキーに、latlngという要素はgeometry型。

適当にデータを突っ込む:
insert into testdb(name,latlng) VALUES ('testname1’,GeomFromText('POINT(139.777 35.713)'));
insert into testdb(name,latlng) VALUES ('testname2’,GeomFromText('POINT(-79.945039 40.444663)'));

(ゲット)
SELECT name, Y(latlng) as lat, X(latlng) as lng from testdb where MBRContains(GeomFromText('LINESTRING(最大経度 最大経度, 最小経度 最小緯度)'),latlng);

これで最大緯度経度、最小緯度経度を対角とする四角形の範囲に存在するデータをとってくる。

最大緯度・経度は、こんな感じで求めた。

float minLat,maxLat,minLon,maxLon;
float lat = 中心の緯度の値;
float lon = 中心の経度の値;
float dist = 円でいう半径の値;

float earthLen = (float) ((float)6356752*Math.cos(lon/(180*Math.PI))*(2*Math.PI));
float meterPerSec=earthLen/(360*60*60);

minLat = lat - (dist/30.8184*0.00027778f);
maxLat = lat + (dist/30.8184*0.00027778f);
minLon = lon - (dist/meterPerSec*0.00027778f);
maxLon = lon + (dist/meterPerSec*0.00027778f);

このmin/maxLat, min/maxLonを上のSelect分の最大/最小緯度経度に当てはめたらオッケっぽい。

参考:
MySQLで指定した緯度経度から半径nメートル内検索っぽいのを実現するSQL
データベース内の緯度・経度を利用して半径500m以内を検索する方法