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

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

通过Math.atan2 计算角度

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

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

JSTS

Turf

geometric

VJMap

六、效果与缺陷

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

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

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


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

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

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

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

  1. GIS算法--已知一点经纬度,方位角,距离求另一点

    已知一个点A的经纬度坐标,点B相对与A的方位角,B到A的距离,求B的经纬度坐标,用Javascript语言来完成该算法,借用了一下openL CommonFunc.caculate={Vincenty ...

  2. 【操作系统】进程调度(2b):STCF(最短完成时间优先) 算法 原理与实践

    0 前言 接上一篇文章:进程调度(2a):SJF(短任务优先) 算法 原理与实践 1 前提铺垫 与上一篇同. 2 STCF 原理 STCF(Shortest Time-to-Completion Fi ...

  3. K-Means聚类算法 — 算法原理、质心计算、距离度量、聚类效果评价及优缺点

    分类知识   分类是根据样本某些属性或某类特征(可以融合多类特征),把样本类型归为已确定的某一类别中.机器学习中常见的分类算法有:SVM(支持向量机).KNN(最邻近法).Decision Tree( ...

  4. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  5. 三维目标检测算法原理

    三维目标检测算法原理 输入输出接口 Input: (1)图像视频分辨率(整型int) (2)图像视频格式(RGB,YUV,MP4等) (3)左右两边的车道线位置信息摄像头标定参数(中心位置(x,y) ...

  6. MySQL索引背后的数据结构及算法原理【转】

    http://blog.codinglabs.org/articles/theory-of-mysql-index.html MySQL索引背后的数据结构及算法原理[转] 摘要 本文以MySQL数据库 ...

  7. 层次聚类算法原理总结

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 层次聚类(hierarchical clustering)基于簇间 ...

  8. 统计学习方法笔记(一)-k近邻算法原理及python实现

    k近邻法 k近邻算法 算法原理 距离度量 距离度量python实现 k近邻算法实现 案例地址 k近邻算法 kkk近邻法(kkk-NN)是一种基本分类和回归方法. 算法原理 输入:训练集 T={(x1, ...

  9. Kd-Tree算法原理和开源实现代码

    Kd-Tree算法原理和开源实现代码 本文介绍一种用于高维空间中的快速最近邻和近似最近邻查找技术--Kd-Tree(Kd树).Kd-Tree,即K-dimensional tree,是一种高维索引树形 ...

  10. 今日头条算法原理(全文)【转】

    原文地址:https://www.toutiao.com/i6511211182064402951/?tt_from=weixin_moments&utm_campaign=client_sh ...

最新文章

  1. 织梦文章添加字段填栏目id,内容页调用字段里的栏目文章
  2. Internet Explorer 9 新功能:固定并快速打开常用网站
  3. webpack4配置(1)-打包一个js文件
  4. vs2012中对于entity framework的使用
  5. java sql结果写入csv文件_java在处理大数据的时候一些小技巧
  6. 智能优化算法:学生心理学优化算法 -附代码
  7. matlab库存点仿真教程,MATLAB Simulink 汽车整车动力总成仿真 视频教程
  8. matlab仿真高尔顿正态分布源码,《正态分布》教学设计
  9. Redis 列表(List) Redis Lpush 命令
  10. 摩托车竞速游戏:Road Redemption公路救赎mac中文版
  11. Windows蓝屏代码大全及解决提示
  12. 统治地球的冯·诺依曼
  13. val和var的区别
  14. 靶机渗透练习78-Thoth Tech
  15. c# 将EF查询出的日期格式化
  16. IDEA插件系列(18):Translation插件——翻译插件
  17. DNF 鬼剑士技能设置
  18. K8s 初学者入门教程
  19. 转发一篇好文:36氪翻译自medium的文章: 读书没有 KPI:为什么坚持“一年读 100 本书”没用?...
  20. go gorilla_使用gorilla websocket构建浏览器推送通知服务的低级设计

热门文章

  1. Greenplum扩容实践
  2. 孙燕姿--《一起走到》
  3. springmvc知识四------数据转换数据格式化数据校验
  4. 为何将这一项技术称为人工智能的“读心术”
  5. 【MySQL学习笔记】第10章 使用多个表(三 外连接)
  6. 美丽联合2018校招前端开发工程师笔试试卷及解析
  7. 号称考研 “ 九大难 ” 专业,你中了吗?
  8. Android UI组件学习——带预览的图片浏览器
  9. 阿里算法,浙大博士带你写项目经历
  10. APP端----扫码uni.scanCode()不灵敏的问题