我尝试使用纬度经度和海拔(海拔)来计算两点之间的距离。
我正在使用euklides公式以获得我的距离:
D=√((Long1-Long2)²+(Lat1-Lat2)²+(Alt1-Alt2)²)
我的观点是地理坐标,而高度是我在海面之上的高度。 我只有lat和lng,我使用GOOGLE API Elevation来获得我的高度。
我正在开发一个应用程序来计算我的行程距离(在我的滑雪板上)。我使用过的每个应用程序都会在包含高度的情况下行进距离。就像#Endomondo或#Garmin一样,我无法在2D空间中获得距离,因为真正的距离会与我返回的距离不同。
哪个公式最适合计算我的距离?当然包括高度。
我用PostGis用Python编写我的应用程序。
答案 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
是以米为单位的海拔变化。