2012-05-03 22 views
0

私はitaly(> 100000)でたくさんのレストランのデータベースを作成しましたが、私の近くに "機能します。私はすべてのレストランの緯度と経度を含む表を作成したいと思っています。私はmysql空間を使用すると考えました。mysql:たくさんのPOIの緯度と経度をmysql空間で計算し、距離を計算する

10キロの半径の中で私の周りのレストラン(私の座標はgpsで撮影されます)を見つけるためにどのようにクエリを作成できますか?

私は距離を遠ざけようとしていますが、周りをグーグルで調べると面白いものは見つかりませんでした。

あなたはmysql空間を使用するのが良いアイデアだと思いますか?代わりにフロートを使用できますか?この場合、10kmの半径内にある私の周りのレストランをすべて検索するクエリを作成するにはどうすればよいですか?

どうもありがとう

答えて

1

MySQL空間のMBRInectectまたはMBRContains関数は、あなたが知る必要があるようです。

this questionの回答を開始してください。

gis.stackexchange.comに問い合わせると、MySQLの空間に関する具体的な回答が得られる場合があります。

+0

あなたのヒントに感謝します。私はそれを試してみます – satboy78

-2

はい、あなたは地理空間機能を使用することができます - それはかなり複雑です。緯度と経度(および経度と緯度も)に基づいて項目を索引付けする方がはるかに簡単です。データを照会する場合は、実際に10km以内のレコードを照会するのではなく、現在の位置(インデックスを使用できる)を中心とした20km x 20km境界ボックスに一致する行を検索するクエリを実行することをお勧めします。クエスチョンの半径以外のものを捨てる、例えば

SELECT * FROM (
    SELECT p.id, p.description, 
    SQRT((x.current_latitiude-p.latitude)*(x.current_latitiude-p.latitude) 
     + (x.current_longitude-p.longitude)*(x.current_longitude-p.longitude)) 
     AS distance 
    FROM places p 
    WHERE p.latitude BETWEEN (x.current_latitiude - x.max_range) 
    AND (x.current_latitiude + x.max_range) 
    AND p.longitude BETWEEN (x.current_longitiude - x.max_range) 
    AND (x.current_longitiude - x.max_range) 
) ilv 
WHERE ilv.distance<x.max_range 

(あなたが経度/緯度のために使用している単位に10キロを変換しx.max_rangeの値をsubsituteする必要があります)。

+0

ありがとうございます。なぜ私は20×20キロを使うべきか理解できません:私に説明してもらえますか? – satboy78

+0

西10km +東10km = 20kmスパンのため – symcbean

+3

緯度と経度は線形ではなく角量です。 Pythogorasの斜辺計算でそれらを直接使用すると、非常に奇妙な数が得られます。むしろ、地球が一定の半径を持つ球であると仮定して(ここで議論されている近似距離についての公式を使用してください)(http://stackoverflow.com/questions/1006654/fastest-distance-lookup-given-latitude-longitude)そうではありません)。 – acraig5075

関連する問題