开发中如何计算A、B两点连线延长线D、F点的经纬度坐标
AB连线延长线坐标计算实现方案
方案选型
- 短距离场景(单城市内,两点距离<10km):用平面比例增量法即可,和你现有正切值计算逻辑完全适配,计算量极小,误差在可接受范围
- 长距离场景(两点距离>10km):用椭球模型下的方位角正算方法,避免平面投影带来的误差,精度可达米级
短距离快速实现(适配你现有代码)
你已经通过辅助直角三角形算出了AB线的正切斜率,不需要额外做三角函数计算,直接按经纬度增量比例推算即可:
- 先提取AB两点的经纬度增量
// 经纬度方向增量 val deltaLat = pointB.latitude - pointA.latitude val deltaLng = pointB.longitude - pointA.longitude
- 按目标延长距离算缩放系数:假设你需要在AB延长线上取离B点距离为
targetDistance(单位:km,和你现有distanceAB单位保持一致)的点P,缩放系数为目标距离和AB长度的比值
val scale = targetDistance / distanceAB
- 直接计算P点坐标
val pointP = LatLng( latitude = pointB.latitude + deltaLat * scale, longitude = pointB.longitude + deltaLng * scale )
如果需要取BA方向的反向延长线点,把scale设为负数即可
高精度长距离实现
如果业务场景对坐标精度要求高,直接用地理坐标标准算法:
- 计算A点到B点的初始正北方位角(方位角取值范围0~360度,正北为0,顺时针递增)
- 以B点为起点,沿AB的方位角方向,传入目标延长距离,直接通过大圆航迹正算公式得到目标点坐标
大部分地图SDK都内置了这两个计算方法,不需要自己实现椭球模型计算逻辑,直接调用对应工具类即可,精度远高于平面近似法。
参考示意图
你当前的调试代码
val pointA = LatLng(a.latitude, a.longitude) val pointB = LatLng(b.latitude, b.longitude) val pointC = LatLng(a.latitude, b.longitude)// 直角辅助计算点 val polylineOptions = PolylineOptions() .add(pointA) .add(pointB) .add(pointC) .add(pointA) val distanceAB = getKmFromLatLong(pointA.latitude, pointA.longitude, pointB.latitude, pointB.longitude) val distanceBC = getKmFromLatLong(pointB.latitude, pointB.longitude, pointC.latitude, pointC.longitude) val distanceCA = getKmFromLatLong(pointC.latitude, pointC.longitude, pointA.latitude, pointA.longitude) val tang = distanceBC/distanceCA println("__ distanceAB $distanceAB") println("__ distanceBC $distanceBC") println("__ distanceCA $distanceCA") println("__ tang $tang")
内容的提问来源于stack exchange,提问作者ArchkWay
相关产品推荐
相关产品推荐


