geodjango(postgis)中两个3D点之间的距离

Posted

技术标签:

【中文标题】geodjango(postgis)中两个3D点之间的距离【英文标题】:Distance between two 3D point in geodjango (postgis) 【发布时间】:2016-10-13 14:49:25 【问题描述】:

我有以下问题: 我创建了两个点,例如:

SRID=3857;POINT Z (62780.8532226825 5415035.177460473 100)
SRID=3857;POINT Z (62785.8532226825 5415035.177460473 70)

如你所见,X坐标相差5m,Z坐标相差30m。 当我在 django shell 中运行 a.distance(b) 时,它返回 5,这是错误的。

但是,当我在 psql shell 中运行时:

SELECT ST_3DDistance(a.coordinates, b.coordinates)
FROM restapi_entityxyz a, restapi_entityxyz b
WHERE a.external_id='6841zef1561' AND b.external_id='1G23Fzd';

返回:

st_3ddistance
------------------
 30.4138126514911

哪个是正确的答案。

geodjango 中缺少功能还是错误? 我应该使用自定义库来执行这样的计算吗?

我的环境如下:

Python 3.5, 姜戈, postgresql 9.4 + postgis gdal 和很多 python 库。

【问题讨论】:

我对 geodjango 不熟悉,但听起来它可能是一个错误或缺乏功能。直接使用psycopg2aiopgasyncpg怎么样? 嘿,@GwydionFR 我想知道,你觉得我的回答有帮助吗? 嗨@JohnMoutafis,我不再从事这个项目,所以我无法联系,但对我来说应该有一个功能。作为一个开发者,我只想在不知道内部处理的情况下使用这种微积分,即使它是一个简单的欧几里得距离。 @GwydionFR 确实看起来很奇怪,但我无法找到一个现成的解决方案来计算海拔...... 【参考方案1】:

django 距离方法不是计算 3D 点(带高程)的距离,而是计算 2D 的距离。

我们可以通过创建自定义 3d 距离计算方法来解决这个问题,就像这里描述的那样: Calculating distance between two points using latitude longitude and altitude (elevation)

让:polar_point_1 = (long_1, lat_1, alt_1)polar_point_2 = (long_2, lat_2, alt_2)

利用 this 将每个点转换为它的笛卡尔等价物 公式:

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)


从我的答案的第二部分确认了类似问题的解决方案:3d distance calculations with GeoDjango

【讨论】:

以上是关于geodjango(postgis)中两个3D点之间的距离的主要内容,如果未能解决你的问题,请参考以下文章

带有 Postgis Geodjango 安装的 Postgresql

带有 postgis 的 geodjango 不起作用

如何使用 GeoDjango/PostGIS 满足“enforce_srid_coordinate”约束?

Heroku 上的 postgis Geodjango 出错

为啥它在运行迁移时抛出`GeoDjango Postgis 要求不满足得到错误?

在 PostGIS 数据库中使用带有 spatial_template 的非空间模型