使用纬度经度和海拔高度(海拔)计算两点之间的距离

时间:2015-10-13 19:58:51

标签: python django postgis geodjango geographic-distance

我尝试使用纬度经度和海拔(海拔)来计算两点之间的距离。

我正在使用euklides公式以获得我的距离:

D=√((Long1-Long2)²+(Lat1-Lat2)²+(Alt1-Alt2)²)

我的观点是地理坐标,而高度是我在海面之上的高度。 我只有lat和lng,我使用GOOGLE API Elevation来获得我的高度。

我正在开发一个应用程序来计算我的行程距离(在我的滑雪板上)。我使用过的每个应用程序都会在包含高度的情况下行进距离。就像#Endomondo或#Garmin一样,我无法在2D空间中获得距离,因为真正的距离会与我返回的距离不同。

哪个公式最适合计算我的距离?当然包括高度。

我用PostGis用Python编写我的应用程序。

3 个答案:

答案 0 :(得分:2)

您可以通过将坐标从Polar (long, lat, alt)转换为Cartesian (x, y, z)来获得正确的计算:

  • 让:
    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)
    

EDIT 2018:由于这个答案,我编写了一个Q& A风格示例来回答类似的问题(包括这个问题):How to calculate 3D distance (including altitude) between two points in GeoDjango

答案 1 :(得分:2)

我使用了John Moutafis提供的解决方案,但我得不到正确答案。公式需要一些修正。您将在http://electron9.phys.utk.edu/vectors/3dcoordinates.htm处获得从Polar到笛卡尔坐标(x,y,z)的坐标转换。 使用上面的公式将球面坐标(Polar)转换为笛卡尔坐标并计算欧几里德距离。

我在控制台应用中使用了以下c#。 考虑下面的虚拟lat lat

ERROR web[][o.postgresql.Driver] Connection error:
org.postgresql.util.PSQLException: The connection attempt failed.
        at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:275)
        at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)
        at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:194)
        at org.postgresql.Driver.makeConnection(Driver.java:450)
        at org.postgresql.Driver.connect(Driver.java:252)
        at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
        at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582)
        at org.apache.commons.pool.impl.GenericObjectPool.addObject(GenericObjectPool.java:1617)
        at org.apache.commons.pool.impl.GenericObjectPool.ensureMinIdle(GenericObjectPool.java:1575)
        at org.apache.commons.pool.impl.GenericObjectPool.access$700(GenericObjectPool.java:190)
        at org.apache.commons.pool.impl.GenericObjectPool$Evictor.run(GenericObjectPool.java:1709)
        at java.util.TimerThread.mainLoop(Timer.java:555)
        at java.util.TimerThread.run(Timer.java:505)
Caused by: java.net.UnknownHostException: localhost

答案 2 :(得分:1)

您可以使用geopy包或Vincenty's公式计算平面坐标之间的距离,例如米,直接粘贴坐标。假设结果为d米。然后行进的总距离为sqrt(d**2 + h**2),其中h是以米为单位的海拔变化。