如何计算GeoDjango中两点之间的3D距离(包括高度)

问题描述 投票:4回答:2

序幕:

这是SO中经常出现的问题:

我想在SO文档上撰写一个例子,但是geodjango章节从未起飞,自2017年8月8日文档关闭以来,我将遵循this widely upvoted and discussed meta answer的建议并将我的例子写成一个自我回答的帖子。

当然,我也很乐意看到任何不同的方法!


题:

假设模型:

class MyModel(models.Model):
    name = models.CharField()
    coordinates = models.PointField()

我将coordinate变量中的点存储为lan, lng, alt点:

MyModel.objects.create(
    name='point_name', 
    coordinates='SRID=3857;POINT Z (100.00 10.00 150)')

我正在尝试计算两个这样的点之间的3D距离:

p1 = MyModel.objects.get(name='point_1').coordinates
p2 = MyModel.objects.get(name='point_2').coordinates

d = Distance(m=p1.distance(p2))

现在d=X米。

如果我只改变其中一个点的高度:

例如:

p1.coordinates = 'SRID=3857;POINT Z (100.00 10.00 200)'

从以前的150,计算:

d = Distance(m=p1.distance(p2))

再次返回d=X,就像高程被忽略一样。 如何计算我的点之间的3D距离?

python django gis postgis geodjango
2个回答
4
投票

GeoDjango Distance计算两点之间的2D距离,并未考虑高度差异。 为了进行3D计算,我们需要创建一个距离函数,该函数将考虑计算中的高度差异:

理论:

latitudelongitudealtitudePolar coordinates,我们需要将它们翻译成Cartesian coordinates (x, y, z),以便将Euclidean Formula应用于它们并计算它们的3D距离。

  • 假设: 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)

1
投票

转换为笛卡尔坐标后,您可以使用numpy计算范数:

np.linalg.norm(point_1 - point_2)
© www.soinside.com 2019 - 2024. All rights reserved.