Goi*_*oin 7 python gis django geodjango
from django.contrib.gis.geos import Point
p1 = Point(36.74851779201058, -6.429006806692149, srid=4326)
p2 = Point(37.03254161520977, -8.98366068931684, srid=4326)
p1.distance(p2)
Out: 2.5703941316759376
Run Code Online (Sandbox Code Playgroud)
但这个浮点数的单位是多少?
如果你计算这个距离,这是229.88公里.您也可以使用geopy获取它:
from geopy.distance import distance
distance(p1, p2)
Out: Distance(229.883275249)
distance(p1, p2).km
Out: 229.88327524944066
Run Code Online (Sandbox Code Playgroud)
我已经读过你可以得到(如此),如果你将之前的数字除以111:
(2.5703941316759376 / 111) * 10000
Out: 231.5670388897241 # kilometers
Run Code Online (Sandbox Code Playgroud)
有没有办法只使用GeoDjango获得真正的距离?或者我应该使用geopy?
通常,所有空间计算都在与输入相同的坐标系中得出结果。在您的情况下,您应该使用SRID 4326进行计算,该SRID是与本初子午线和赤道成度的经度/纬度极。
因此,如果我正确理解的话,GeoDjango的距离计算就是两对坐标之间的欧几里得距离。您正在搜索大圆距(111在某些纬度范围内,除以仅是近似于实际大圆距的粗略近似值)。
geopy应该将SRID 4326的大圆距离隐式使用,从而得出正确的结果。
您现在有几个不同的选择:
使用Google haversine公式,您可以打入两对纬度/经度坐标,并且应该可以很好地近似实际的大圆圈距离。但是,这取决于使用的墨卡托近似值-请记住地球不是球体。这样您可能会遇到两极分化的问题。
如果将两个位置转换为另一个以米为单位的坐标系,则计算欧几里得距离将得出正确的结果。但是,此类坐标系统(称为平面系统)对于地球上的各个区域是不同的。对于不同的国家,会有不同的预测,因为地球的不规则曲面近似于平面是错误的-尤其是对于其表面上的任何位置都不是唯一错误的。
仅当您要计算距离的所有点都在同一地理区域中时才适用。
请使用geopy或shapely或任何其他可以根据给出点的SRID计算实际大圆距离的合格库。请记住,由于地球的不规则性,所有坐标只是近似值。