GIS 算法原理记录总结一:距离、方位角、沿线上的点
一、球面距离:根据经纬度计算两点距离(turf.distance)
利用球面计算两点距离的算法公式有:大圆公式(Great-circle)公式、Haversine 公式、Vincenty 公式,TurfJS 使用的就是 Haversine 公式。
一、理解经纬度
当把地球看做一个标准的球体时,地球上某一点 P 的经度是指这一点的经线 ACD 所在的半平面 ABDO,与本初子午线 ABD(即 0° 经线)所在平面 ABDO(即参照面)的二面角 α 的度数。(如下图1)
某一点 P 的纬度是指过这一点纬线圈(即图2中与赤道平面平行的圆 O’)上的任意一点 Q 与球心 O 的连线 OQ,和赤道 ACB(0° 度纬线)所在平面的线面角 θ。
说明:
①(如图1)点 P 的经度角:<PHE = <COB = α
②(如图2)点 P 的纬度角:<FOB = <QOC = θ
③ 由内错角相等得: <POB = <OPO’ = θ,<QOC = <OQO’ = θ
二、经纬度与球面坐标
可以通过经纬度将球面上的任意一点转换为对应的球面坐标 P(x,y,z):
φ:纬度值;λ:经度值;R:地球半径
三、Haversine 公式 及其代码实现
1、Haversine 公式:
a = sin²(Δφ/2) + cos φ1 ⋅ cos φ2 ⋅ sin²(Δλ/2)
c = 2 ⋅ atan2( √a, √(1−a) )
d = R ⋅ c
φ :纬度值(单位:弧度)
λ:经度值(单位:弧度)
R:地球半径
2、代码实现
1、经纬度转弧度(角度转弧度):
2、经度(单位:弧度)差、纬度(单位:弧度)差、纬度1(单位:弧度)、纬度2(单位:弧度)
3、计算两点和地心连线的夹角
4、根据半径和两点夹角计算两端弧段距离
二、方位角:根据经纬度计算两点方位角(turf.bearing)
一、理解方位角
方位角是从某点的指北经线起,依顺时针方向到目标方向线之间的水平夹角(如图所示 θ,可以将其看成是指南针所指示的角度),也即是 OPN 平面与 OPQ 平面的所构成的二面角大小。
以北极点 N 为顶点,N-PQO 构成了一个三面角。
二面角 N-PQ-O 的大小为 θ,其平面角为 π/2 - φ2;
二面角 P-ON-Q 的大小为 λ2−λ1,其平面角为 δ;
二面角
从一条直线出发的两个半平面所组成的图形,叫做二面角。 这条直线叫做二面角的棱,每个半平面叫做二面角的面。以二面角的公共直线上任意一点为端点,在两个面内分别作垂直于公共直线的两条射线,这两条射线所成的角叫做二面角的平面角。二面角的大小, 可以用它的平面角来度量。
三面角
从一点出发并且不在同一平面内的三条射线,其中每相邻两射线可以决定一个平面,这样的三个平面所围成的立体图形叫做三面角
。其中,这三条射线叫做三面角的棱,这些射线的公共端点叫做三面角的顶点,相邻两棱所夹的平面部分叫做三面角的面,在每个面内两条棱所形成的角叫做三面角的面角,过每一条棱的两个面所形成的二面角叫做三面角的二面角。一个三面角可以用它的顶点的字母来表示,例如“三面角S”;或在顶点的字母之后加一短划,并顺次写上每一条棱上的一个字母,例如“三面角S-ABC”。
二、代码实现
三、目标点:根据坐标点、距离、方向计算目标点(turf.destination)
根据前面的 一、球面距离:根据经纬度计算两点距离、二、方位角:根据经纬度计算两点方位角,已经可以进行如下计算:
1、已知两个坐标,可以计算两个坐标的距离
2、已知两个坐标,可以计算两个坐标的方向
因此,在已知一个坐标,方向、距离的情况下,可以反推得到第二个坐标。
具体实现步骤为:
1、将已知坐标的经纬度、距离、方向均转为弧度
2、统一单位后,计算目标点的经度、纬度
四、沿线点:根据线段、距离计算在该线段上指定距离的点(turf.along)
根据前面的 一、球面距离:根据经纬度计算两点距离、二、方位角:根据经纬度计算两点方位角、三、目标点:根据坐标点、距离、方向计算目标点,已经可以进行如下计算:
1、已知两个坐标,可以计算两个坐标的距离
2、已知两个坐标,可以计算两个坐标的方向
3、已知一个坐标、距离、方向,可以计算第二个坐标
因此,已知一条线段的多个坐标之后,可以依次计算相邻两坐标点的方向、距离,在指定距离内获取相邻两个坐标点之间符合指定距离的点。
具体实现步骤为:
1、已知坐标点p1,p2,p3… ,得到两两相邻坐标点的距离,如分别为 d1,d2,d3…
2、比较 指定距离 d 与 d1,d1 + d2,d1 + d2 + d3… 的大小,如 d1 + d2 < d < d1 + d2 + d3,则说明指定距离 d 的点在坐标点 p2 和 p3 之间
3、得到距离差值:△d = d1 + d2 + d3 - d,那么 △d 就是从点 p2 出发,沿着 p3 的方向(p2和p3 的方向)的距离,满足此距离的点即为需要求的点。
因此需要使用到两个核心算法就是:计算距离和计算方位角,基于距离和方位角计算坐标点。
五、参考文献
论文:
《球面距离计算方法及精度比较》
《基于地图地理信息点的数据融合算法的改进》
《考虑地球曲率情况下两点距离问题的求解_卫宇》
文章:
Calculate distance, bearing and more between Latitude/Longitude points
根据经纬度计算地球上两点之间的距离——Haversine公式介绍及计算步骤_Gcs4real的博客-CSDN博客
六、效果与缺陷
当两个点距离较近时,根据距离、方向,求取沿线上的点,得到的结果是准确的,如下图:
但当沿线的点距离较远时,根据距离、方向,求取沿线上的点,得到的结果则是有偏差的,这个偏差在 Turf 官网的示例中也是有偏差的,如下图:
Cesium 中显示的结果也是有偏差的:
即:当一条直线的两个端点距离相当远时,此时要根据指定距离、方向计算沿线上的某点时,along 算法是有偏差的(即使指定距离相当小时)。
那么当直线距离的两个端点过长时,如何避免计算带来的误差呢?
这种误差/偏差的解决方法将在下一章节进行介绍,尽请期待!