geodjango - 计算错误的距离

时间:2016-11-18 12:14:56

标签: postgis geodjango

我是GeoDjango的新手,我正在尝试计算物体之间的距离。

我正按照此帖https://coderwall.com/p/k1gg1a/distance-calculation-in-geodjango执行所有操作,但我的结果与Google地图告诉我的结果不同。

当我尝试计算伦敦和巴黎之间的距离时,我得到了这个

london = GEOSGeometry('POINT(-0.056922 51.480415)', srid=4326)
paris = GEOSGeometry('POINT(2.350918 48.867744)', srid=4326)
london = london.transform(900913, clone=True)
paris = paris.transform(900913, clone=True)
print(london.distance(paris))

>>> 527450.6633622452

看起来大概是527公里。

但是,谷歌地图告诉我距离是341公里: enter image description here

我做错了什么?

1 个答案:

答案 0 :(得分:0)

你没有做错任何事。谷歌地图是(我认为)返回大圆距离而GEOS(这是 Geometry 引擎 - 开源的首字母缩写)正在返回欧几里德距离(GEOS更多关于几何和拓扑比地理)。如果你想近似大圆距离,你可以尝试使用以下代码的Haversine公式:this问题:

>>>from math import radians, cos, sin, asin, sqrt
...
>>>def haversine(lon1, lat1, lon2, lat2):
...   # convert decimal degrees to radians 
...    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
...   # haversine formula 
...   dlon = lon2 - lon1 
...   dlat = lat2 - lat1 
...   a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
...   c = 2 * asin(sqrt(a)) 
...   r = 6371 # Radius of earth in kilometers. Use 3956 for miles
...   return c * r

>>>haversine(-0.056922, 51.480415, 2.350918, 48.867744)
>>>337.303...