在 Google App Engine 上使用 Python 计算城市之间的距离并根据 GeoPT 查找周边城市

Posted

技术标签:

【中文标题】在 Google App Engine 上使用 Python 计算城市之间的距离并根据 GeoPT 查找周边城市【英文标题】:Calculate distance between cities & find surrounding cities based on GeoPT, in Python on Google App Engine 【发布时间】:2012-05-21 22:55:21 【问题描述】:

我定义了一个城市模型,它保存了城市的 geoname_idlocation(作为 GeoPt)。我想实现两件事。

    我想从给定城市获取500km 半径范围内的所有城市。 我想计算两个给定城市之间km 的距离。

实现这一目标的最佳方法是什么,请记住,我有一个非常大的城市数据库,我不想在性能因素上做出太多牺牲。感谢您提供任何帮助或建议。

【问题讨论】:

【参考方案1】:

这很完美,但速度有点慢:

计算距离的功能。传递给此函数的参数是位置的纬度和经度元组或 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

【讨论】:

【参考方案2】:

Google App Engine 不支持地理空间查询,但您可以参考Geospatial Queries with Google App Engine using GeoModel。

您可能还想考虑使用支持Geospatial Indexing 的其他数据库(如mongoDB),并可能将其作为仅执行此操作的外部服务。

【讨论】:

我真的不想为此使用单独的库,因为我已经将城市的纬度和经度保存在数据存储中。您不认为应该进行简单的计算还是建议使用 geomodel ?它将如何影响应用程序的性能?感谢您的答复。 :) 没有其他方法.. 除非您要实现自己的地理空间索引.. 因为 GAE 根本不支持它。你至少应该用 GeoModel 试一试。性能取决于数据存储的大小,它肯定会增加索引大小。通读文档以了解他们是如何实现它的。 谢谢 Lipis,我现在就去看看!【参考方案3】:
    你可以使用类似于https://developers.google.com/appengine/articles/geosearch的东西 只需加载两个城市的位置并使用三角函数计算距离。参见例如http://www.movable-type.co.uk/scripts/latlong.html

【讨论】:

以上是关于在 Google App Engine 上使用 Python 计算城市之间的距离并根据 GeoPT 查找周边城市的主要内容,如果未能解决你的问题,请参考以下文章

Python - Google App Engine - Django 模板中的方法

在 Google-App-Engine 中使用 HSQLDB

使用 Google App Engine 发布订阅

如何在 Google Cloud App Engine 上使用 PubSub 创建订阅者,该订阅者通过 Publisher 从 Google Cloud App Engine Flex 收听消息?

使用 rtmplite 在 Google App Engine 中录制音频?

为啥在 Google App Engine 上使用 Django?