3

住所のデータベースがあり、すべてジオコーディングされています。

What is the best way to find all addresses in our database within a certain radius of a given lat, lng?

In other words a user enters (lat, lng) of a location and we return all records from our database that are within 10, 20, 50 ... etc. miles of the given location.

It doesn't have to be very precise.

I'm using MySQL DB as the back end.

4

6 に答える 6

5

MySQL 5 で利用可能な Spatial 拡張機能があります。ドキュメントへのエントリー ページは次のとおりです。

http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html

DB での空間データの表現方法に応じて、求めていることを達成する方法の詳細がたくさんあります。

もう 1 つのオプションは、前述の Haversine 式を使用して距離を計算する関数を作成することです。その背後にある数学はここにあります:

www.movable-type.co.uk/scripts/latlong.html

うまくいけば、これが役に立ちます。

于 2009-06-16T17:43:48.317 に答える
3

データベースについては言及しませんでしたが、SQL Server 2008 では、地理データ型を使用するとこれと同じくらい簡単です。

これにより、郵便番号 10028 から 20 マイル以内のすべての郵便番号が検索されます。

SELECT h.*
FROM zipcodes g
JOIN zipcodes h ON g.zipcode <> h.zipcode
AND g.zipcode = '10028'
AND h.zipcode <> '10028'
WHERE g.GeogCol1.STDistance(h.GeogCol1)<=(20 * 1609.344)

ここも参照してください。地理データ型を使用した SQL Server 2008 近接検索

SQL Server 2000 バージョンはこちら: S QL Server Zipcode 緯度/経度近接距離検索

于 2009-06-16T17:07:30.713 に答える
2

これは典型的な空間検索の問題です。

1>使用しているデータベース、sql2008、oracle、ESRIジオデータベース、およびpostgisは、この機能を持つ空間データベースエンジンです。2>それ以外の場合、これを実現したい場合は、おそらくいくつかの空間 Algo ライブラリを探します。自分でコーディングすることもできますが、計算ジオメトリは複雑な問題であるため、お勧めしません。

于 2009-06-16T17:06:20.543 に答える
2

空間型をサポートするデータベースを使用している場合は、クエリを直接作成でき、データベースがそれを処理します。PostgreSQL、Oracle、および最新の MS SQL はすべて、他の一部と同様にこれをサポートしています。

そうでない場合、精度が問題にならない場合は、半径ではなくボックス内で検索できます。これは非常に高速です。そうしないと、緯度から経度への実際の変換が投影された空間で発生する必要があるため (地球のさまざまな地域で距離が変化するため)、事態は複雑になり、生活はかなり厄介になります。

于 2009-06-16T17:07:22.400 に答える
1

頭のてっぺんから方程式を覚えていませんが、Haversine 式は、地球上の 2 点間の距離を計算するために使用されるものです。方程式を Google で検索して、アイデアが得られるかどうかを確認してください。申し訳ありませんが、これがあまり役に立たないことはわかっていますが、開始する場所を提供するかもしれません.

于 2009-06-16T17:06:52.713 に答える
0

あまり正確である必要がなく、テーブルに x 列と y 列があると仮定すると、大きな外接長方形ですべての行を選択し、pythagorus (または Haversine) を使用して結果をトリミングします。コーナー。

例えば。(xpos-10miles と xpos+10miles の間の x) と (xpos -10miles と ypos+10miles の間の y) の場所から * を選択します。

ピタゴラスは sqrt(x_dist^2 + y_dist^2) であることを思い出してください。

その迅速かつシンプルで理解しやすく、変な結合は必要ありません。

于 2009-06-16T18:07:11.960 に答える