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


8

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);

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

回答:


6

MySQLの空間拡張をGISで使用できます。

Googleからのコード例で地図上のポイントを表示し、彼らが述べます:

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

テーブルに必要なストレージ領域を最小限に抑えるには、lat属性とlng属性がサイズ(10,6)の浮動小数点数であることを指定できます。これにより、フィールドは10進数の後に6桁、さらに10進数の前に最大4桁を格納できるようになります。例:-123.456789度数値タイプ間のパフォーマンスの違いについては心配しません。まともなインデックスははるかに大きな影響を与えます。

DECIMAL@ gandaliterが提案するように試すこともできます。

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 これは、MySQLが浮動小数点データ・タイプでどのように機能するかを説明します。

関連情報:


@oNareに詳細な説明と参照をありがとう。私は質問の中でgandaliterによる提案を見ました(stackoverflow.com/questions/12504208/…)。ここでypercubeの提案も見ました(stackoverflow.com/questions/9560147/…)。
Prabhat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.