首页 > 其他分享 >根据经纬度、方向、距离求终点位置

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

时间:2023-09-12 10:55:08浏览次数:42  
标签:cos 终点 经纬度 double 距离 半径 arc lat 360

假设方位角是α, 那从点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
微积分就更明显了.

伪代码:
        /// <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 };
        }

优化后:

// 比之前快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
}
 

标签:cos,终点,经纬度,double,距离,半径,arc,lat,360
From: https://www.cnblogs.com/sunsky303/p/17695597.html

相关文章

  • 简单的经纬度点聚类
    importlogginglogging.basicConfig(level=logging.INFO,format='%(asctime)s-%(filename)s[line:%(lineno)d]-%(levelname)s:%(message)s',datefmt='%Y-%m-%d%H:%M:%S')fromgeopy.distanceimportgeod......
  • 曼哈顿距离矩阵
    曼哈顿距离矩阵码题集OJ-曼哈顿距离矩阵(matiji.net)这道题主要是寻找规律然后总结出对应的表达式求解。从图中可以看出数字的增加是一层一层增长,每次的增加量为4。在图中分别标出来每个象限的推导点。我们有题目可知,我们需要求得的曼哈顿距离都是输入的(x,y)到原点(0,0)的距......
  • 使用JavaScript计算两点经纬度之间的弧线点经纬度数组
    前言地球是一个近似于椭球体的三维物体,因此在计算两个经纬度点之间的距离时,不能简单地将其视为平面上的直线距离。相反,我们需要考虑地球的曲率,并使用球面三角法来计算两点之间的弧线距离及其中的插值点。通过本篇博客,我们将使用JavaScript来实现根据两个经纬度点返回两点之间的弧......
  • VIM更改TAB距离
    linux下使用vim编程是比較常见的事情,但vim默认的tab是8个空格。但一般的编辑器是4个空格,所以希望改动下。详细方法例如以下:1.创建文件名称为.vimrc的系统文件首先切换到用户根文件夹,然后创建文件。$cd~$vim.vimrc2.在文件里输入以下的内容并保存settabstop=4setshiftwid......
  • 全局多项式(趋势面)与IDW逆距离加权插值:MATLAB代码
      本文介绍基于MATLAB实现全局多项式插值法与逆距离加权法的空间插值的方法,并对不同插值方法结果加以对比分析。目录1背景知识2实际操作部分2.1空间数据读取2.2异常数据剔除2.3验证集筛选2.4最小二乘法求解2.5逆距离加权法求解2.6插值精度检验2.7数据导出与专题地图制......
  • ELT已死,EtLT才是现代数据处理架构的终点!
    提到数据处理,经常有人把它简称为“ETL”。但仔细说来,数据处理经历了ETL、ELT、XXETL(例如,ReverseETL、Zero-ETL)到现在流行的EtLT架构几次更迭。目前大家使用大数据Hadoop时代,主要都是ELT方式,也就是加载到Hadoop里进行处理,但是实时数据仓库、数据湖的流行,这个ELT已经过时了,EtLT才......
  • Java中使用JTS对空间几何计算(读取WKT、距离、点在面内、长度、面积、相交等)
    场景基于GIS相关的集成系统,需要对空间数据做一些判断处理。比如读取WKT数据、点到点、点到线、点到面的距离,线的长度、面的面积、点是否在面内等处理。JTS(JavaTopologySuite)Java拓扑套件,是Java的处理地理数据的API。github地址:https://github.com/locationtech/jtsAPI......
  • google Map经纬度坐标取得方法
        谷歌地图(交通地图)上并没有显示某个地址的经纬度,实际上,我们已经想到了一个办法,可以找到在谷歌地图上任意地点的经度和纬度。 首先打开Google地图,在上面寻找一个地址,然后上下左右移动地图,让这个地址正好处于地图的正中心位置,当您想寻找坐标位置已经处于地图的中心位......
  • vue微信H5项目使用腾讯地图获取当前位置经纬度
    1.在index.html引入js文件<scriptsrc="https://3gimg.qq.com/lightmap/components/geolocation/geolocation.min.js"></script>2.在需要页面中你自己的key要去腾讯地图工具去申请https://lbs.qq.com/webApi/component/componentGuide/componentPickercreated(){this.getM......
  • 编辑距离
    题目描述设\(A\)和\(B\)是两个字符串。我们要用最少的字符操作次数,将字符串\(A\)转换为字符串\(B\)。这里所说的字符操作共有三种:删除一个字符;插入一个字符;将一个字符改为另一个字符。\(A,B\)均只包含小写字母。输入格式第一行为字符串\(A\);第二行为字符串\(B......