前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >根据经纬度、方向、距离求终点位置

根据经纬度、方向、距离求终点位置

作者头像
sunsky
发布2023-09-13 08:21:06
4050
发布2023-09-13 08:21:06
举报
文章被收录于专栏:sunskysunsky

假设方位角是α, 那从点1到点2的平移距离分别如下所示d*sinα, d*cosα。 这里正北为0度。基中点1经纬度(long1, lat1)和距离d是已知的。 求点2的经纬度(long2,lat2)

还有一个隐藏的信息,就是点1所在的纬度,其实也是一个有用的角度,通过它可以知道当前纬度的那个切面的半径长度,下图红线所示用arc表示。这里假设地球是近似球体,赤道圆的半径是ARC,侧从下图中可以得出:

就是知道φ是当前点1的纬度。则当前的纬度的切面半径 arc = ARC*cos(φ) ,其中φ其实就是当前的方位的纬度值,即arc = ARC*cos(lat1)

这里还要再讨论下地球半径,其实地球是一个椭球体。

极半径 从地心到北极或南极的距离,大约3950英里(6356.9088千米)(两极的差极小,可以忽略)。

赤道半径 是从地心到赤道的距离,大约3963英里(6377.830千米)。

如果只是做近似计算的,我们这里取平均距离,平均半径 大约3959英里(6371.393千米) 。这个数字是地心到地球表面所有各点距离的平均值。

这里取平均半径那么ARC=6371393(米)

通过上面的知识铺垫后, 计算就简单化了,

【计算思路】

1. 计算第二点的经度,就是 水平平移的距度(d*sinα)除以 当前纬度切面周长(2π*arc),再每乘以360度) ,就知道了水平横向平移了多少度,再加上long1,就是long2的值了。

 2. 计算第二点的纬度,比较简单,就是, 垂直平移的距离d(d*cosα)除以 地球纵向周长,再乘上360度,就知道纵向平移了多少度,再加上lat1,就知道lat2的值了。

long2 = long1 + d*sinα/[ARC*cos(lat1)*2π/360]

lat2 = lat1 +d*cosα/ (ARC *2π/360)

注意:所有的三角函数中使用的不是角度,必须是弧度,必须是弧度,必须是弧度。原因是弧度制统一了度量弧与半径的单位,从而大大简化了有关公式及运算,尤其在物理、数学中,其优点就格外明显。 例如: 当采用弧度时 Lim(x->0)sin(x)=x 当采用角度时 Lim(x->0)sin(x)=x*pi/180 微积分就更明显了.

伪代码:

代码语言:javascript
复制
        /// <summary>
        /// 计算移动后的经纬度
        /// </summary>
        /// <param name="lon">经度</param>
        /// <param name="lat">纬度</param>
        /// <param name="a">方位角(弧度)</param>
        /// <param name="dst">移动距离</param>
        /// <returns></returns>
        public double[] LongLatOffset(double lon, double lat, double a, double dst)
        {
            double arc = 6371.393 * 1000;
            lon += dst * Math.Sin(a) / (arc * Math.Cos(lat) * 2 * Math.PI / 360);
            lat += dst * Math.Cos(a) / (arc * 2 * Math.PI / 360);
 
            return new[] { lon, lat };
        }

优化后:

代码语言:javascript
复制
// 比之前快30%
func CalibrateByDistance(distance, heading, lat, lng float64) (nLat, nLng float64) {
	const earthRadius = 6371393
	const earthGirth = earthRadius * 2 * math.Pi
	const radianPerAngel = math.Pi / 180
	rad := heading * radianPerAngel
	angelPerMeter := distance / earthGirth * 360

	nLat = lat + angelPerMeter*math.Cos(rad)
	nLng = lng + angelPerMeter*math.Sin(rad)/math.Cos(lat*radianPerAngel)
	return
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【计算思路】
  • long2 = long1 + d*sinα/[ARC*cos(lat1)*2π/360]
  • lat2 = lat1 +d*cosα/ (ARC *2π/360)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档