我定义了一个城市模型,用于保存城市的geoname_id和位置(如GeoPt).我想要实现两件事.
>我希望距离某个城市500公里半径范围内的所有城市.
>我想计算两个城市之间以km为单位的距离.
实现这一目标的最佳方式是什么,请记住,我有一个非常庞大的城市数据库,我不想在性能因素上牺牲很多.任何帮助或建议表示赞赏.
最佳答案
这很完美,但速度很慢:
计算距离的功能.传递给此函数的参数是位置的纬度和经度元组或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
@H_404_19@用于计算半径内的周边城市的函数.这是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
@H_404_19@