JS计算两个经纬度坐标与正北方向夹角

news/2024/7/7 12:55:21

/**

 * 获取两个经纬度坐标正北方向夹角

 * @param {Array} o_latlngs 原点经纬度坐标 [经度, 纬度]

 * @param {Array} latlngs 经纬度坐标

 * @return {Number} 返回角度

 */

function getTwoPointAngle(o_latlngs, latlngs) {

    let A = new MyLatLng(o_latlngs[0], o_latlngs[1]);

    let B = new MyLatLng(latlngs[0], latlngs[1]);

    // console.log(getAngle(B, A));

    return getAngle(B, A);

}

/**

 * 求B点经纬度

 * @param A 已知点的经纬度,

 * @param distance   AB两地的距离  单位km

 * @param angle  AB连线与正北方向的夹角(0~360)

 * @return  B点的经纬度

 */

function getMyLatLng(A, distance, angle) {

    let dx = distance * 1000 * Math.sin(Math.toRadians(angle));

    let dy = distance * 1000 * Math.cos(Math.toRadians(angle));

    let bjd = ((dx / A.Ed + A.m_RadLo) * 180.0) / Math.PI;

    let bwd = ((dy / A.Ec + A.m_RadLa) * 180.0) / Math.PI;

    return new MyLatLng(bjd, bwd);

}

/**

 * 获取AB连线与正北方向的角度

 * @param A  A点的经纬度

 * @param B  B点的经纬度

 * @return  AB连线与正北方向的角度(0~360)

 */

function getAngle(A, B) {

    let dx = (B.m_RadLo - A.m_RadLo) * A.Ed;

    let dy = (B.m_RadLa - A.m_RadLa) * A.Ec;

    let angle = 0.0;

    angle = (Math.atan(Math.abs(dx / dy)) * 180.0) / Math.PI;

    let dLo = B.m_Longitude - A.m_Longitude;

    let dLa = B.m_Latitude - A.m_Latitude;

    if (dLo > 0 && dLa <= 0) {

        angle = 90.0 - angle + 90;

    } else if (dLo <= 0 && dLa < 0) {

        angle = angle + 180.0;

    } else if (dLo < 0 && dLa >= 0) {

        angle = 90.0 - angle + 270;

    }

    return angle;

}

class MyLatLng {

    constructor(lng, lat) {

        const Rc = 6378137; // 赤道半径

        const Rj = 6356725; // 极半径

        // 经度转为度分秒

        this.m_LoDeg = lng;

        this.m_LoMin = (lng - this.m_LoDeg) * 60;

        this.m_LoSec = (lng - this.m_LoDeg - this.m_LoMin / 60.0) * 3600;

        // 纬度转为度分秒

        this.m_LaDeg = lat;

        this.m_LaMin = (lat - this.m_LaDeg) * 60;

        this.m_LaSec = (lat - this.m_LaDeg - this.m_LaMin / 60.0) * 3600;

        this.m_Longitude = lng;

        this.m_Latitude = lat;

        this.m_RadLo = (lng * Math.PI) / 180.0; // 经度弧度

        this.m_RadLa = (lat * Math.PI) / 180.0; // 纬度弧度

        this.Ec = Rj + ((Rc - Rj) * (90.0 - this.m_Latitude)) / 90.0;

        this.Ed = this.Ec * Math.cos(this.m_RadLa);

    }

}

function getrst(sPoint, ePoint) {

    let rst = getTwoPointAngle(ePoint, sPoint);

    return rst;

}


http://www.niftyadmin.cn/n/4115355.html

相关文章

ubuntu 14.04 hadoop eclipse 0配置基本环境

动人的hadoop第二天。构造hadoop该环境还花了两天时间&#xff0c;在这里写自己配置的过程&#xff0c;我希望能帮助&#xff01; 我将文中用到的全部资源都分享到了 这里&#xff0c;点开就能下载&#xff0c;不须要一个个的找啦&#xff01; 当中有《Hadoop 技术内幕》这本书…

python gutter area / 设置断点、行号右边代码左边的空白栏

最后通过在设置里搜索 关键词&#xff1a;show Edito > General > Gutter Icons Show gutter icons转载于:https://www.cnblogs.com/IDRI/p/6082106.html

cesium绑定鼠标事件,及清除事件

1.绑定事件方法 说明&#xff1a; 方式一&#xff1a;方式一是每次都创建一个实例&#xff0c;可以多个共存且根据名字&#xff08;变量比如&#xff1a;下面的handler&#xff09;可以清除指定事件&#xff08;推荐使用&#xff09;。 方式二&#xff1a;方式二是直接在vie…

[logstash-input-log4j]插件使用详解

Log4j插件可以通过log4j.jar获取Java日志&#xff0c;搭配Log4j的SocketAppender和SocketHubAppender使用&#xff0c;常用于简单的集群日志汇总。 最小化的配置 input {log4j {host>"localhost"port>4560} } output {stdout {} } log4j插件配置host以及port就…

Maven项目中配置MyBatis Generator插件生成代码

2019独角兽企业重金招聘Python工程师标准>>> 参考&#xff1a; 官网&#xff1a;http://www.mybatis.org/generator/index.html 官网配置文件&#xff1a;http://www.mybatis.org/generator/configreference/xmlconfig.html 《 OSC-蛙牛的博客——数据库逆向框架代码…

cesium 获取多边形polygon中心点

//创建面 支持球面和平面坐标 var polygon viewer.entities.add({ polygon: { hierarchy: { positions: Cesium.Cartesian3.fromRadiansArray([ ]), }, outline: true, outlineColor: Cesium.Color.RED, outlineWidth: 3, material: Cesium.Color.YELLOW, }, }); var pyPosi…

vue离线状态创建项目

通过vue-cli工具命令vue init webpack vuedemo创建vue项目的时候报错&#xff0c;提示连接超时&#xff0c;应该是下载某个package的时候&#xff0c;需要翻墙&#xff0c;导致出现连接超时。超时错误截图如下&#xff1a; 按照网络上的提示&#xff0c;解决办法是改为离线创建…

Android-MVP架构

MVP 简介 MVP是模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;、主持人&#xff08;Presenter&#xff09;的缩写&#xff0c;分别代表项目中3个不同的模块。如图所示&#xff1a;imageView 对应于Activity、Fragment&#xff0c;负责界面的绘制以及与用…