web-dev-qa-db-ja.com

MySQLに地理的位置データを格納するための10進数またはポイントデータタイプ

MySQL(Innodb)の「tblAddress」テーブルに各住所の地理的位置を保存したいのですが、2つのオプションがあると思います。

1) 2 columns for Each Address:
Latitude DECIMAL(10, 8), 
Longitude DECIMAL(11, 8)

2) One Column for Each Address:
GeoLocation POINT

私のプログラムは、現在の場所(モバイルクライアント)から1キロメートルの半径に該当するすべての住所を検索する必要があります。

また、以下のコマンドは私には機能しません、これのために何が必要かわかりません。

CREATE SPATIAL INDEX GeoLocation ON tblAddress (GeoLocation);

したがって、ここで計算と取得を高速化するためにデータを保存するための推奨アプローチは何ですか。お知らせ下さい。

8
Prabhat

MySQLの spatial 拡張子をGISで使用できます。

Googleのコード例 地図上にポイントを表示すると、次のようになります。

MySQLテーブルを作成するときは、lat属性とlng属性に特に注意を払う必要があります。 Googleマップの現在のズーム機能では、小数点以下6桁の精度で十分です。

テーブルに必要なストレージスペースを最小限に保つために、latおよびlng属性がサイズ(10,6)の浮動小数点数であることを指定できます。これにより、フィールドに小数点以下6桁、および小数点以下最大4桁が格納されます。 -123.456789度数値型のパフォーマンスの違いを気にしません。まともなインデックスは、はるかに大きな効果があります。

@ gandaliter が示唆するように、DECIMALを試すこともできます。

DECIMALは、正確な計算のためのMySQLデータ型です。 FLOATとは異なり、その精度は任意のサイズの数値に固定されているため、FLOATの代わりに使用すると、一部の計算を行うときに精度エラーを回避できる場合があります。計算せずに数値を保存して取得するだけであれば、実際にはFLOATが安全ですが、DECIMALを使用しても害はありません。計算でFLOATはほとんど問題ありませんが、8d.pを確実に確認する必要があります。精度はDECIMALを使用する必要があります。

緯度の範囲は-90から+90(度)なので、DECIMAL(10,8)でも問題ありませんが、経度の範囲は-180から+180(度)なので、DECIMAL(11,8)が必要です。最初の数値は保存されている桁数の合計で、2番目の数値は小数点以下の数値です。つまり、lat DECIMAL(10,8) NOT NULL, lng DECIMAL(11,8) NOT NULLThis は、MySQLが浮動小数点データ型を処理する方法を説明します。

関連情報:

6
oNare