最近处理GPS定位坐标在Cesium中显示的问题,需要将定位坐标绘制到指定的路线上。但实际的显示结果是,因为定位不准确,最终绘制的GPS坐标基本都是在路线周围乱跳。为了效果好看一点,最终的想法将球面上短距离的路线看作是平面坐标中的直线,将定位坐标通过计算,算出坐标点到直线的垂足点,将垂足点作为最终的定位坐标。

整理相关 JS 方法如下:

    1. 计算点到直线的垂足点

/*** 点到直线的垂足点*/
function getFootPoint(point, start, end) {var A = end.Latitude - start.Latitude; var B = start.Longitude - end.Longitude; var C = end.Longitude * start.Latitude - start.Longitude * end.Latitude; if (A * A + B * B < 1e-13) {return start; // start与end重叠} else if (Math.abs(A * point.Longitude + B * point.Latitude + C) < 1e-13) {return point; // point在直线上(start_end)} else {var Longitude = (B * B * point.Longitude - A * B * point.Latitude - A * C) / (A * A + B * B);var Latitude = (-A * B * point.Longitude + A * A * point.Latitude - B * C) / (A * A + B * B);return {Longitude: Longitude,Latitude: Latitude};}
}

 2. 计算点到直线的距离(平面坐标)

/*** 点到直线的距离*/
function getDistancePoineToLine_planeCoord(point, start, end) {var A = end.Latitude - start.Latitude; var B = start.Longitude - end.Longitude;var C = end.Longitude * start.Latitude - start.Longitude * end.Latitude;if (A * A + B * B < 1e-13) { // pnt1与pnt2重叠var dx = point.Longitude - start.Longitude;var dy = point.Latitude - start.Latitude;return Math.sqrt(dx * dx + dy * dy);} else if (Math.abs(A * point.Longitude + B * point.Latitude + C) < 1e-13) {return 0; // point在直线上(pnt1_pnt2)} else {var distance = Math.abs(A * point.Longitude + B * point.Latitude + C) / Math.sqrt(A * A + B * B);return distance;}
}

 3. 计算点到线的距离(WGS84坐标)

/*** 点到线的距离*/
function getDistance_wgs84(p1_x, p1_y, p2_x, p2_y) {var lat1 = p1_x;var lon1 = p1_y;var lat2 = p2_x;var lon2 = p2_y;var earch_radius = 6371008.8; // 地球半径 平均值 米//用haversine公式计算球面两点间的距离//经纬度转换成弧度var h_lat1 = lat1 * Math.PI / 180.0;var h_lon1 = lon1 * Math.PI / 180.0;var h_lat2 = lat2 * Math.PI / 180.0;var h_lon2 = lon2 * Math.PI / 180.0;//差值var vlon = Math.abs(h_lon1 - h_lon2);var vlat = Math.abs(h_lat1 - h_lat2);//var h = HaverSin(vlat) + Math.cos(h_lat1) * Math.cos(h_lat2) * HaverSin(vlon);//var d = 2 * earch_radius * Math.asin(Math.sqrt(h));//return d;
}function HaverSin(theta) {var v = Math.sin(theta / 2);return v * v;
}

    4. 计算点到线的距离(笛卡尔坐标)

/*** 点到线的距离*/
function getDistanceByPointToLine_Coordinate(point, pnt1, pnt2) {var dis = 0;if (pnt1.x == pnt2.x) {if (pnt1.y == pnt2.y) {var dx = point.x - pnt1.x;var dy = point.y - pnt1.y;dis = Math.sqrt(dx * dx + dy * dy);} elsedis = Math.abs(point.x - pnt1.x);} else {var lineK = (pnt2.y - pnt1.y) / (pnt2.x - pnt1.x);var lineC = (pnt2.x * pnt1.y - pnt1.x * pnt2.y) / (pnt2.x - pnt1.x);dis = Math.abs(lineK * point.x - point.y + lineC) / (Math.sqrt(lineK * lineK + 1));}return dis;
}

通过上面的方法,将很短距离的球面坐标看做平面坐标,从而计算出点到直线的垂足。最后,使用计算的垂足点再进行处理,经过验证,定位效果基本上符合要求。

Cesium中点至直线的垂足点和距离计算相关推荐

  1. C++实现三维空间中点到点、点到直线、点到平面的距离计算

    https://blog.csdn.net/yang_deyuan/article/details/78799961

  2. 如何计算空间一条直线外一点到这条直线的垂足点坐标

    如何计算空间一条直线外一点到这条直线的垂足点坐标  示例代码: /计算空间一条直线外一点到这条直线的垂足点坐标. Point3f CoreAlgorithm::GetFootOfPerpendicul ...

  3. 牛客小白月赛2-B小马过河(求点到直线的垂足)

    题目链接 求点到直线的垂足分为 空间 .平面 原理: 空间: #include<iostream> #include<cmath> using namespace std; c ...

  4. 实验二 实现中点分割直线段裁剪算法

    一.目的 1. 了解直线裁剪的基本原理和常用方法. 2. 掌握中点分割直线段裁剪算法的基本原理和步骤. 3. 使用C++.OpenGL编程实现如下内容:输入直线段的起始点和终止点坐标位置.用四边形模拟 ...

  5. Opencv-python 计算点到直线的垂足点

    Opencv-python 计算点到直线的垂足点 代码 import numpy as np import cv2 as cv# 获取直线起始,结束点 def get_line_se(img, lin ...

  6. 对称复曲线(直线、缓曲、圆曲、缓曲、直线)中边桩坐标计算

    该程式主要适用于对称复曲线(直线.缓曲.圆曲.缓曲.直线)中边桩坐标计算,单次半算范围为前一交点HZ点到后一交点ZH点. E"JDK" F"JDX" G&quo ...

  7. Dynamo如何简单方便地计算点到直线或者平行直线之间的距离

    问题描述: 我们在Dynamo上面进行二次开发的时候可能遇到距离计算的问题,传统的python计算方式严格利用数学公式推导,但由于Revit是一个三维的工作空间,计算过程冗杂,其实利用Dynamo内置 ...

  8. c 空间点到直线的垂足及距离计算

    已知条件: 已知空间一个点的坐标a(x0,y0,z0),已知空间的另外两个点的坐标b(x1,y1,z1),c(x2,y2,z2),求a点到 b,c两点所在直线的 距离最近的点的坐标 可以说是a点到 过 ...

  9. 已知直线过两点,和线外一点,求直线和垂足及垂距

    //直线过P1,P2两点,P0为直线外一点,求P0到直线的距离和P0在直线上的垂足 void HelloWorld::initPoint(cocos2d::CCPoint point0,cocos2d ...

最新文章

  1. 过滤查询集中的空名称或NULL名称
  2. 微型计算机基础知识答案,计算机基础知识(答案已填)
  3. Android Studio安装插件提示was not installed: Cannot download的解决办法(仅限AS2.2版本以上)
  4. 一对多 java_mybatis一对多和多对一
  5. 使用dex2jar和luyten查看apk中的class代码
  6. Python 标准库 —— fractions
  7. 让A超链接无效的办法 阻止元素发生默认的行为
  8. android多线程计时器,Android 计时器Timer用法
  9. 拓端tecdat|R语言广义二次跳跃、非线性跳跃扩散过程转移函数密度的估计及其应用
  10. Rust : standford 操作系统课与rust各种指针图
  11. Git 远程仓库 git remote
  12. 常用键盘ASCⅡ码,方便查阅
  13. Mobile开发之meta篇
  14. 使用vlmcsd搭建KMS服务器激活环境
  15. 地址总线、数据总线、控制总线
  16. 雅虎邮箱pop服务器,使用Yahoo.com.cn的POP和SMTP
  17. Win10 Ubuntu 制作多系统U盘
  18. android仿微信红包动画,Android仿微信打开红包动画(逐帧动画)
  19. 135编辑器嵌入html,135编辑器教程|三步教你搞定表格样式
  20. 用通俗的话解释下offsetHeight

热门文章

  1. Android之 Bitmap使用
  2. Ubuntu_解决桌面右键无法创建文档的问题
  3. http://www.xueh188.top/index.php/archives/17/
  4. matlab 调日法,【图】手表调日期方法 教你各种表的使用教程_手表调日期_伊秀服饰网|yxlady.com...
  5. python标准库之timeit模块
  6. watch监听不到变化?
  7. bugku 听首音乐
  8. Github+PicGo+Jsdelivr 免费图床
  9. python iphone 爬虫_python爬取京东所有iphone的价格和名称
  10. P1847 轰炸II