私は MySQL の空間拡張についてまったくの初心者なので、このトピックについて無知であることをお許しください。
シナリオ:
1) 緯度と経度でユーザーの位置を収集します。その場所を MySQL テーブルに保存します。
2) 次に、そのユーザーの範囲内にある他のユーザーを表示します。範囲は狭く、1000 フィートとしましょう。
質問: ロケーション ポイントを保存するためのベスト プラクティスは何ですか? そのユーザーに最も近いポイントをクエリして選択するためのベスト プラクティスは何ですか?
私は MySQL の空間拡張についてまったくの初心者なので、このトピックについて無知であることをお許しください。
シナリオ:
1) 緯度と経度でユーザーの位置を収集します。その場所を MySQL テーブルに保存します。
2) 次に、そのユーザーの範囲内にある他のユーザーを表示します。範囲は狭く、1000 フィートとしましょう。
質問: ロケーション ポイントを保存するためのベスト プラクティスは何ですか? そのユーザーに最も近いポイントをクエリして選択するためのベスト プラクティスは何ですか?
座標を格納するには、POINTSpatialデータ型を使用します。
構造は次のようになります。
CREATE TABLE gps name varchar(0), `location` point NOT NULL;
列のタイプ'場所'に注意してください。
その後、「location」列のSPATIALインデックスを定義する必要があります。
CREATE SPATIAL INDEX sp_index ON gps(`location`);
データの挿入(緯度と経度)
INSERT INTO gps (name, location) VALUES ( 'India' , GeomFromText( ' POINT(31.5 42.2) ' ) )
関数GeomFromTextは文字列を受け取り、Geometryオブジェクトを返します。ここで、31.5と42.2はそれぞれ緯度と経度です。それらの間にコンマがないことに注意してください。それらはスペースで区切られます。
データの読み取り
SELECT name, AsText(location) FROM gps;
AsText関数は、ジオメトリの内部表現を文字列形式に変換します。
注:MySQL5.0以降の空間拡張サポートを使用する必要があります。また、クエリを高速化するには、「MyIsam」データベースエンジンを使用します。
残念ながら、MySQL には半径内のポイントを選択するような機能はありません。しかし、次の余弦法則式を簡単に使用できます: d = acos( sin(φ1)*sin(φ2) + cos(φ1)*cos(φ2)*cos(Δλ) )*R 2 点間の距離を取得します。ここで詳細を確認できます: http://www.movable-type.co.uk/scripts/latlong-db.html SQL クエリは次のようになります。
SELECT acos(sin(radians(Y(point1)))*sin(radians(Y(point2))) + cos(radians(Y(point1)))*cos(radians(Y(point2)))*cos(radians(X(point2))-radians(X(point1)))) * 6371 AS `distance`
FROM locations