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);
したがって、ここで計算と取得を高速化するためにデータを保存するための推奨アプローチは何ですか。お知らせ下さい。
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 NULL
This は、MySQLが浮動小数点データ型を処理する方法を説明します。
関連情報: