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

时间:2016-10-13 14:49:25

标签: python django postgis postgresql-9.4 geodjango

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

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

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

然而,当Ii在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,
  • Django中,
  • postgresql 9.4 + postgis
  • gdal和很多python库。

1 个答案:

答案 0 :(得分: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)

  •   
  • 利用此功能将每个点转换为笛卡尔等效值   式:

    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