GIS 算法原理记录总结一:距离、方位角、沿线上的点

GIS 算法原理记录总结一:距离、方位角、沿线上的点

一、球面距离:根据经纬度计算两点距离

利用球面计算两点距离的算法公式有:大圆公式(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、根据半径和两点夹角计算两端弧段距离

请添加图片描述

二、方位角:根据经纬度计算两点方位角

一、理解方位角

方位角是从某点的指北经线起,依顺时针方向到目标方向线之间的水平夹角(如图所示 θ,可以将其看成是指南针所指示的角度),也即是 OPN 平面与 OPQ 平面的所构成的二面角大小。

请添加图片描述

以北极点 N 为顶点,N-PQO 构成了一个三面角。

二面角 N-PQ-O 的大小为 θ,其平面角为 π/2 - φ2;
二面角 P-ON-Q 的大小为 λ2−λ1,其平面角为 δ;

请添加图片描述

二面角
从一条直线出发的两个半平面所组成的图形,叫做二面角。 这条直线叫做二面角的棱,每个半平面叫做二面角的面。以二面角的公共直线上任意一点为端点,在两个面内分别作垂直于公共直线的两条射线,这两条射线所成的角叫做二面角的平面角。二面角的大小, 可以用它的平面角来度量。

请添加图片描述

三面角
从一点出发并且不在同一平面内的三条射线,其中每相邻两射线可以决定一个平面,这样的三个平面所围成的立体图形叫做三面角。其中,这三条射线叫做三面角的棱,这些射线的公共端点叫做三面角的顶点,相邻两棱所夹的平面部分叫做三面角的面,在每个面内两条棱所形成的角叫做三面角的面角,过每一条棱的两个面所形成的二面角叫做三面角的二面角。一个三面角可以用它的顶点的字母来表示,例如“三面角S”;或在顶点的字母之后加一短划,并顺次写上每一条棱上的一个字母,例如“三面角S-ABC”。

请添加图片描述

二、代码实现

请添加图片描述
请添加图片描述
请添加图片描述

三、目标点:根据坐标点、距离、方向计算目标点

根据前面的 一、球面距离:根据经纬度计算两点距离二、方位角:根据经纬度计算两点方位角,已经可以进行如下计算:

1、已知两个坐标,可以计算两个坐标的距离

2、已知两个坐标,可以计算两个坐标的方向

因此,在已知一个坐标,方向、距离的情况下,可以反推得到第二个坐标。

具体实现步骤为:

1、将已知坐标的经纬度、距离、方向均转为弧度

2、统一单位后,计算目标点的经度、纬度

请添加图片描述

四、沿线点:根据线段、距离计算在该线段上指定距离的点

根据前面的 一、球面距离:根据经纬度计算两点距离二、方位角:根据经纬度计算两点方位角三、目标点:根据坐标点、距离、方向计算目标点,已经可以进行如下计算:

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博客

根据经纬度对球面距离的求解

通过Math.atan2 计算角度

使用GPS坐标来计算距离和方位角

前端几何计算GIS空间分析库介绍及优缺点分析

JSTS

Turf

geometric

VJMap

六、效果与缺陷

当两个点距离较近时,根据距离、方向,求取沿线上的点,得到的结果是准确的,如下图:

请添加图片描述

但当沿线的点距离较远时,根据距离、方向,求取沿线上的点,得到的结果则是有偏差的,这个偏差在 Turf 官网的示例中也是有偏差的,如下图:

请添加图片描述

请添加图片描述

Cesium 中显示的结果也是有偏差的:

请添加图片描述
请添加图片描述

即:当一条直线的两个端点距离相当远时,此时要根据指定距离、方向计算沿线上的某点时,along 算法是有偏差的(即使指定距离相当小时)。

那么当直线距离的两个端点过长时,如何避免计算带来的误差呢?

这种误差/偏差的解决方法将在下一章节进行介绍,尽请期待!

猜你喜欢

转载自blog.csdn.net/yinweimumu/article/details/131566064
GIS