计算经纬度中的拐弯点

该博客介绍了如何从行车轨迹中识别拐弯点。通过将经纬度视为平面坐标并计算连续三点形成的角度,利用直线斜率和三角函数计算夹角。在遇到斜率为无穷大时,用特定值替代以避免NaN。当斜率相等表示线段平行,角度设为0。最终,根据角度阈值筛选拐点,实现轨迹的可视化分析。
摘要由CSDN通过智能技术生成

给定一段行车轨迹,要求将所有拐弯点找出来,拐弯有个明显的特征就是前后轨迹点的朝向会发生明显的变化,我们只要将角度变化的轨迹点找出来即可。

怎么做呢?首先我们可以把地球的经纬度网格视为一个平面直角坐标系,经纬度就是这个坐标系上的一个个点,我们只要计算轨迹上连续的三个点组成的两个线段的夹角即可,上过初中的小伙伴都知道,坐标系上的直线可以用以下公式计算:

y = ax + b

其中 ( x , y ) 就是我们已知的经纬度,b是直线的偏移量,a是直线的斜率,也就是说只要我们知道两条直线的斜率,就有办法计算它们形成的夹角。

比如我们有经纬度分别如下:

[{"x":0,"y":0},{"x":1,"y":1},{"x":2,"y":0},{"x":3,"y":1},{"x":4,"y":0}]

在地图上它长这样子:

可以看出,这个麦当劳的汉堡还是很..啊呸,这组经纬度形成了一个M形折线,按照需求我们需要将其中的3个拐弯点找出来(BCD),我们先取出ABC三个点,即:

JSONObject aPoint = JSONObject.parseObject("{\"x\":0,\"y\":0}");
JSONObject bPoint = JSONObject.parseObject("{\"x\":1,\"y\":1}");
JSONObject cPoint = JSONObject.parseObject("{\"x\":2,\"y\":0}");

运用一下远古时期学过的小学知识:两点确定一条直线!我们可以得到AB线段和BC线段,并且通过上图我们可以看出这两个线段形成了一个夹角B。上面提到了我们需要计算这两条线段对应的斜率,直接套公式:

k = ( y1 - y2 ) / ( x1 - x2 )

AB的斜率k1 = ( 0 - 1 ) / ( 0 - 1 ) = 1

BC的斜率k2 = ( 1 - 0 ) / ( 1 - 2 ) = -1

有了斜率,我们就可以通过三角函数 tan 来表示角B:

tanB = (k1 - k2) / ( 1 + ( k1 * k2 ) )

再通过Java的反正切函数算出其角度值:

double angle = Math.atan(tanB) * 180 / 3.1415926;

到这里我们就可以得出其角度值为 90.0 度,循环已有的轨迹列表,即可算出所有的角度,再根据角度值来判断是否满足拐弯的特征,比如目前我们采用的是角度的绝对值在 45 ~ 135 之间。

在具体处理真实的轨迹的时候,我们还要考虑一些特殊的情况,比如众所周知正切函数的取值范围是负无穷 到 正无穷之间的,两个无穷值分别是 负90度 和 正90度,即角度是90的整数倍时计算得到的斜率会等于无穷大,此时如果将无穷大套用上面的公式得出结果是NaN,我们只要简单判断一下如果斜率是负无穷或者正无穷时,将其赋予一个足够大或者足够小的数,后面计算角度值的时候通过四舍五入保留小数,因为我们不需要计算一个特别精准的角度值,客观事实是我们的GPS设备采集回来的经纬度其实也达不到这样的精度,附上处理无穷大的代码:

k1 = Double.NEGATIVE_INFINITY == k1 ? -1000000.0 : k1;
k1 = Double.POSITIVE_INFINITY == k1 ? 1000000.0 : k1;
k2 = Double.NEGATIVE_INFINITY == k2 ? -1000000.0 : k2;
k2 = Double.POSITIVE_INFINITY == k2 ? 1000000.0 : k2;

还有一个情况就是,当 k1 = k2 时,表示两条线段平行,此时可以直接返回角度值 = 0

通过上面的逻辑,我们将真实的轨迹导进去运行,并将切割点前后分成不同的颜色,效果如下:

 局部特写:

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 21
    评论
经纬度计算间距离的公式可以根据不同的需求和精度进行选择。其一种常用的公式是根据两间距离公式计算,公式为:距离 = sqrt( (lat2-lat1) * (lat2-lat1) + (lon2-lon1) * (lon2-lon1) )。其,lat2和lat1分别表示两个的纬度差,lon2和lon1表示两个的经度差。这个公式适用于一般的计算,但在ArcGis等软件,还需要考虑弧度和地球离心率的问题,以提高计算的准确性。\[1\] 另外,还有其他推导过程和公式可以用于经纬度计算间距离,比如根据经纬度计算之间的距离的公式推导过程以及google.maps的测距函数。这些公式的推导过程可以在网上找到,如果感兴趣的话可以了解一下。\[2\] 总之,根据经纬度计算间距离的公式有多种选择,可以根据具体需求和精度要求来选择适合的公式进行计算。 #### 引用[.reference_title] - *1* [计算两个经纬度之间的距离](https://blog.csdn.net/READLEAF/article/details/106896900)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [根据经纬度计算之间的距离](https://blog.csdn.net/Gan_1314/article/details/125800224)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [经纬度计算两地之间的距离(原理与方法)](https://blog.csdn.net/u011964285/article/details/40428527)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘尾田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值