1

私のデータベースの各ユーザーは都市に関連付けられています(経度と緯度を使用)

どの都市が互いに近いかを調べるにはどうすればよいですか?

つまり、イングランドでは、ケンブリッジはロンドンにかなり近いです。

したがって、ケンブリッジに住んでいるユーザーがいるとします。それらに近いユーザーは、ロンドン、ハートフォードなどの近くの周辺都市に住んでいるユーザーです。

これについてどうすればよいのでしょうか?また、近いものをどのように定義しますか? つまり、米国ははるかに広がっているため、英国では米国よりも終値がはるかに近くなります。

アイデアと提案。また、この種の機能を提供するサービスを知っていますか?

ありがとう

4

5 に答える 5

0

検討したいもう1つのオプションは、すべての都市をkdツリーのような空間探索ツリーに配置することです。Kdツリーは、特定のバウンディングボックス内のすべてのポイントの高速検索だけでなく、最近傍検索を効率的にサポートします。次に、都市の最も近い近隣のいくつかを検索し、それらの近隣までの距離を使用して、検索するバウンディングボックスの推定サイズを取得することにより、近くの都市を見つけることができます。

于 2011-01-18T09:56:30.250 に答える
0

これを行う最も簡単な方法は、都市の緯度と経度、および距離から境界ボックスを計算することです (距離を経度に変換することによって)。

そのボックス (最小緯度、最大緯度、最小経度、最大経度) を取得したら、緯度と経度が境界ボックス内にある他の都市を照会します。これにより、おおよそのリストが得られます。緯度と経度の列にある可能性のあるインデックスを使用できるため、非常に高速です。

そこから、必要に応じて、実際の「球上のポイント間の距離」関数を使用してリストを絞り込むことができます。

于 2011-01-11T20:06:38.760 に答える
0

外部 Web サービスを呼び出すことができる場合は、GeoNames API を使用して、定義した半径内の近くの都市を見つけることができます。

http://www.geonames.org/export/web-services.html

于 2011-01-11T19:55:11.897 に答える
0

都市名から座標を取得することは、リバース ジオ コーディングと呼ばれます。Google マップには、そのための優れた API があります。

都市、郵便番号などの巨大なデータベースとその座標を取得する Geonames プロジェクトあります。

ただし、座標が既にある場合は、距離を取得するための簡単な計算です。

トリッキーなことは、それの優れたパフォーマンスのバージョンを取得することです。おそらくmysqlデータベースに保存されているので、そこですばやく実行する必要があります.

それは絶対に可能です。私はかつてそのコードを含むプロジェクトを行ったことがあります。それを取得してここに投稿します。

ただし、速度を上げるために、最初に中心座標の周りに長方形の選択を行うことをお勧めします。これは、蜂の木のインデックスや、多次元範囲検索などのより優れたものを使用すると、非常に高速です。その中で、限られたデータセットで正確な距離を計算できます。その長方形の選択の外では、方向は非常に広大であるため、正確に表示または計算する必要はありません。または、国、大陸などを表示するだけです。

私はまだオフィスにいますが、家に帰ったらコードを取得できます。それまでの間、データの保存方法を教えていただければ幸いです。

編集:それまでの間、あなたは私にぴったりの関数を持っています(私は1つのクエリで関数なしでそれをしました...)

   CREATE FUNCTION `get_distance_between_geo_locations`(`lat1` FLOAT, `long1` FLOAT, `lat2` FLOAT, `long2` FLOAT)
  RETURNS FLOAT
  LANGUAGE SQL
  DETERMINISTIC
  CONTAINS SQL
  SQL SECURITY DEFINER
  COMMENT ''
BEGIN
DECLARE distance FLOAT DEFAULT -1;
DECLARE earthRadius FLOAT DEFAULT 6371.009;
-- 3958.761 --miles
-- 6371.009 --km
DECLARE axis FLOAT;

IF ((lat1 IS NOT NULL) AND (long1 IS NOT NULL) AND (lat2 IS NOT NULL) AND (long2 IS NOT NULL)) THEN -- bit of protection against bad data

  SET axis = (SIN(RADIANS(lat2-lat1)/2) * SIN(RADIANS(lat2-lat1)/2) + COS(RADIANS(lat1)) * COS(RADIANS(lat2)) * SIN(RADIANS(long2-long1)/2) * SIN(RADIANS(long2-long1)/2));
  SET distance = earthRadius * (2 * ATAN2(SQRT(axis), SQRT(1-axis)));

END IF;

RETURN distance;
END;

私はここからこれを引用しました:http://sebastian-bauer.ws/en/2010/12/12/geo-koordinaten-mysql-funktion-zur-berechnung-des-abstands.html

ここに別のリンクがあります:http://www.andrewseward.co.uk/2010/04/sql-function-to-calculate-distance.html

于 2011-01-11T20:00:15.337 に答える
0

空間インデックスまたは GIS 機能が必要です。どのデータベースを使用していますか? MySQL と PostgreSQL はどちらも GIS をサポートしており、SQL クエリを使用して N 個の最も近い都市を見つけることができます。

于 2011-01-12T15:49:25.523 に答える