让我们分解问题:
接受两个地理字段或表达式,并以 形式返回它们之间的 。
因此,Distance(p1, p2)
返回一个Distance
对象。 如果您这样做:
p1 = Instrument.objects.get(pk=151071000).coordinates
p2 = Instrument.objects.get(pk=151071008).coordinates
d = Distance(m=p1.distance(p2))
print d.m
您将获得以米为单位的测量值。
我会坚持的annotate
解决方案,这似乎更可靠!(意见回应)
自从最初的答案以来,我在这里编写了一个问答风格的示例:如何在GeoDjango中计算两个点之间的3D距离(包括海拔高度),该距离使用高度在2个点之间的距离计算要好得多(并且容易出错) 。
排序:
我们需要使用Haversine公式或Vicenty公式来计算2个点之间的2D大圆距离,然后将其与2个点之间的高度差(delta)结合起来,以计算它们之间的欧几里得距离,如下所示:
dist = sqrt(great_circle((lat_1, lon_1), (lat-2, lon_2).m**2, (alt_1 - alt_2)**2)
该解决方案假定海拔高度以米为单位,因此也将great_circle
结果转换为米。
将此留在此处以用于继续注释。
令polar_point_1 =(long_1,lat_1,alt_1)和polar_point_2 =(long_2,lat_2,alt_2)
通过使用以下公式将每个点转换为它的笛卡尔等效项:
x = alt * cos(lat) * sin(long)
y = alt * sin(lat) z = alt * cos(lat) * cos(long)
并且您将分别拥有p_1 =(x_1,y_1,z_1)和p_2 =(x_2,y_2,z_2)点。
最后使用欧几里得公式:
dist = sqrt((x_2-x_1)**2 + (y_2-y_1)**2 + (z_2-z_1)**2)