5

geoname_id都市のとlocation(GeoPt として)を保存する定義済みの都市モデルがあります。実現したいことが2つあります。

  1. 500km特定の都市から半径内のすべての都市を取得したい。
  2. km指定された 2 つの都市間の距離を計算したいと考えています。

私は都市の非常に大きなデータベースを持っており、パフォーマンス要因を犠牲にしたくないことを念頭に置いて、これを達成するための最良の方法は何でしょうか. ヘルプやアドバイスをいただければ幸いです。

4

3 に答える 3

7

これは完璧に機能しますが、少し遅いです:

距離を計算する関数。この関数に渡される引数は、場所または Geopt() の緯度と経度のタプルです。

def HaversineDistance(location1, location2):
  """Method to calculate Distance between two sets of Lat/Lon."""
  lat1, lon1 = location1
  lat2, lon2 = location2
  earth = 6371 #Earth's Radius in Kms.

 #Calculate Distance based in Haversine Formula
 dlat = math.radians(lat2-lat1)
 dlon = math.radians(lon2-lon1)
 a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(math.radians(lat1)) * math.cos(math.radians(lat2)) * math.sin(dlon/2) * math.sin(dlon/2)
 c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
 d = earth * c
 return d

半径内の周辺都市を計算する機能。これは、すべての都市を格納する City モデルのメソッドです。

def get_closest_cities(self, kms):
  cities = []
  #Find surrounding Cities of a given city within a given radius
  allcities = self.country.city_set
  for city in allcities:
    distance = HaversineDistance((self.location.lat, self.location.lon),(city.location.lat, city.location.lon))
    if not distance >= kms:
      cities.append((city.name, int(distance)))
  cities.remove(cities[0])
  return cities
于 2012-05-22T20:53:30.957 に答える
3

Google App Engineは地理空間クエリをサポートしていませんが、GeoModelを使用してGoogleAppEngineで地理空間クエリを参照できます。

また、地理空間インデックスmongoDBをサポートするような他のデータベースを使用し、それだけを実行する外部サービスとして使用することを検討することもできます。

于 2012-05-22T00:00:24.750 に答える
2
  1. https://developers.google.com/appengine/articles/geosearchのようなものを使用できます
  2. 2 つの都市の位置を読み込み、三角法を使用して距離を計算するだけです。たとえば、http ://www.movable-type.co.uk/scripts/latlong.html を参照してください。
于 2012-05-21T23:05:23.683 に答える