当前位置: 首页 > 面试题库 >

使用GeoDjango进行3d距离计算

澹台臻
2023-03-14
问题内容

我在用

  • python 2.7.12
  • Django 1.10.6
  • PostgreSQL 9.5.6
  • postGIS 2.2.2

第一个问题

我需要使用GeoDjango计算两点之间的距离。当我检查了
文档它说,
GeoQuerySet.distance() 已被弃用,而使用 距离()
django.contrib.gis.db.models.functions

以下代码可以正常工作:

from django.contrib.gis.db.models.functions import Distance

p1 = Instrument.objects.get(pk=151071000).coordinates
p2 = Instrument.objects.filter(pk=151071008)

for i in p2.annotate(distance=Distance('coordinates', p1)):
    print i.distance
    print i.distance.__class__

输出:

461.10913945 m
<class 'django.contrib.gis.measure.Distance'>

我的模特:

class Instrument(models.Model):
    ...
    coordinates = gis_models.PointField(null=True, blank=True, dim=3)

但是我只有两点,所以当我尝试不使用 annotate() 使用Distance()时,它比
django.contrib.gis.measure.Distance 返回类
django.contrib.gis.db.models.functions.Distance()的 实例。 ()

p1 = Instrument.objects.get(pk=151071000).coordinates
p2 = Instrument.objects.get(pk=151071008).coordinates
print Distance(p1, p2)

输出:

Distance(Value(SRID=4326;POINT Z (-76.4862html" target="_blank">3600000001 44.260223 0)), GeomValue(SRID=4326;POINT Z (-76.490923 44.262658 0)))

如何获得与使用 anateate() 相同的结果?

第二个问题

我必须计算考虑到深度/高程的3d距离。但是,当我尝试执行此操作时,会收到与2d相同的结果。下面,我将第一个对象的高程更改为200:

p1 = Instrument.objects.get(pk=151071000)
p1.coordinates = 'SRID=4326;POINT Z (-76.48623600000001 44.260223 200)'
p2 = Instrument.objects.filter(pk=151071008)

for i in p2.annotate(distance=Distance('coordinates', p1.coordinates)):
    print i.distance

输出:

461.10913945 m

问题答案:

让我们分解问题:

  1. 在Distance类文档中,我们可以阅读以下内容:

接受两个地理字段或表达式,并以 Distance对象的 形式返回它们之间的 距离

因此,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解决方案,这似乎更可靠!(意见回应)

  1. Distance计算两个点之间的2D距离。为了获得3D计算,您需要自己创建一个。
    您可以从以下问题了解我的方法:使用纬度经度和海拔(高程)计算两点之间的距离

EDIT 2019:
自从最初的答案以来,我在这里编写了一个问答风格的示例:如何在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结果转换为米。

将此留在此处以用于继续注释。

2. Distance计算两点之间的二维距离。为了获得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)
    


 类似资料:
  • 问题内容: 如何在Swift中使用CoreLocation计算行进的总距离 到目前为止,我还无法找到有关如何在iOS 8的Swift中执行此操作的任何资源。 自开始跟踪位置以来,您将如何计算移动的总距离? 根据到目前为止的读物,我需要保存一个点的位置,然后计算当前点与最后一个点之间的距离,然后将该距离添加到totalDistance变量中 Objective-C对我来说是非常陌生的,所以我还无法计

  • 我需要计算汽车行驶的距离!不是距离,不是距离到否。如果我们通过谷歌提供的API计算,距离可以完全不同。谷歌可以提供从一个点到另一个点的1公里距离,但汽车可以按照骑手想要的方式行驶800米。使用加速计没有帮助。它适用于步行,但绝不适用于更快的速度。 我尝试过使用Google的位置API:距离到或距离之间根本不是一个选项。它可以给出与IN REAL截然不同的结果。在真实的汽车中,可以通过非常短的地方并

  • 我目前正在开发一个专注于健身的应用程序。我的基本想法是允许人们跟踪他们的速度、距离和时间。到目前为止,我已经通过使用位置管理器getSpeed()设法获得了速度。我想知道如何获得旅行的距离?我寻找了一些示例,但对我来说有点困惑,因为我刚刚开始使用android。我将感谢任何帮助或建议,谢谢

  • 我正在尝试写我的第一次postgis查询 我的桌子如下所示 这是一辆id为1的车辆的gps数据。我需要计算车辆行驶的总距离,比方说2017-05-20年,以米为单位。可以有其他具有不同ID的视图。 参考(如)。https://gis.stackexchange.com/Questions/268776/Finding-Total-Distance of-Path-Along-Post-PointG

  • 我正在寻找NumPy方法来计算两个Numpy数组(x和y)之间的Mahalanobis距离。下面的代码可以正确地计算相同的使用cdist函数的西皮。因为这个函数在我的情况下计算不必要的matix,我想要更直接的方法来计算它只使用NumPy。 我的审判: 有人能纠正这个方法吗? 下面是它的公式: http://docs.scipy.org/doc/scipy-0.14.0/reference/gen

  • 我有一个多边形类型的几何体,我正在计算一个点的最小距离可能在多边形几何体内部(由360个点组成,作为闭合几何体)或多边形几何体外部。使用postgis的ST_distance方法,当点在几何体外部时,我得到精确的距离,但如果点在几何体内部,则得到0作为距离,我想要与多边形几何体最近点的点之间的最小距离,无论该点位于几何体内部还是外部。