使用GPS时,计算点之间的距离对于很多实际程序应用都是非常必要的。但是简单的欧几里得距离并不能得到理想的计算结果,因为我们必须处理一个球体,或者确切地说是一个扁球体。因此,我们实际处理的是测地距离。
实践中,有多种方法可以处理此计算问题。例如,存在大圆距离(great circle distance),这是球体表面上两点之间的最短距离。另一种类似的测量距离的方法是使用Haversine公式:
由以上两个公式,可以计算测地距离为:
以上公式中,
把以上公式在python中实现如下:
import
需要注意的重要一点是,我们必须采用经度和纬度值的弧度。以下代码通过简单循环计算多点之间的距离:
london_coord
madrid 1263769.8859593808
vienna 1235650.1412429416
sydney 16997984.55171465
berlin 930723.2019867426
以上公式实现给了我们一些看似准确的结果,让我们将其与另一种方法进行比较。即使用geopy测量距离。该程序包有许多不同的计算距离的方法,但是默认使用Vincenty公式,这是一种更精确的计算地球距离的方法,因为它考虑了地球(如前所述)是扁球体。
from
madrid 1263101.9239132649
vienna 1238804.7757636765
sydney 16988546.466847803
berlin 933410.764122098
可见,以上两种方法计算结果值之间存在差异,尤其是距离非常大的时候,这会加剧球状地球的变形。
除了以上两种方法,还有pyproj Python包,它提供了PROJ.4的 Python接口。它是处理地图投影的绝佳软件包,但在那里您还可以提供提供各种测地线计算的Geod类。要计算两点之间的距离,我们使用inv函数,该函数计算逆变换并返回正向和反向方位角和距离,如下:
import
madrid 1263101.92391795
azimuth -166.0130675331932 11.403752336198153
vienna 1238804.77576733
azimuth 100.74306171242293 -66.60186399055117
sydney 16988546.466908153
azimuth 60.33221400668488 -40.68498881273351
berlin 933410.764123629
azimuth 77.79312482066598 -91.53477000281634
基于GPS坐标的测距是很多应用的基础性工作,当然此处计算的距离并非street distance,这两者之间是有着显著区别的,但是可以通过算法处理来完成更复杂的应用。比如,我们开发的openGIS测距工具,可以生成多点多模式距离时间矩阵。
有了距离,生成时空图用来评价信号运行效果或者公交运营情况也就变得一目了然。比如,我们基于此开发了公交运行动态时空图,你可以选择查看任意时间窗口的公交运行情况,只要拖动即可完成交互了,当然这个你也将会在utb.cloud云数据实验室直接使用体验。
--关于我们--
2015-2020 © utb.cloud. All Rights Reserved. 转载请注明:
转载自公众号“交托邦”