IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 火星坐标系(高德)和84坐标系互换 -> 正文阅读

[JavaScript知识库]火星坐标系(高德)和84坐标系互换

/**
 * @params: lnglat  []
 * @desc:用于回显地图点、线、面。 地图分为3类,高德地图、ArcGis地图、GeoServer地图。
 * @return: lnglat  []
 *
 */

export class TransformLngLat {
    constructor() {
        // π
        this.PI = 3.1415926535897932384626;
        // 长半轴
        this.a = 6378245.0;
        // 扁率
        this.ee = 0.00669342162296594323;
    }

    // 84转高德 coordinate 84坐标
    wgs84ToGcj02(coordinate = []) {
        const [lng, lat] = this.createStringToNumber(coordinate);
        if (!lng || !lat || this.verifyOutOfChina(lng, lat)) return coordinate;
        let dlat = this.createTransFormLat(lng - 105.0, lat - 35.0);
        let dlng = this.createTransFormLng(lng - 105.0, lat - 35.0);
        const radlat = lat / 180.0 * this.PI;
        let magic = Math.sin(radlat);
        magic = 1 - this.ee * magic * magic;
        const sqrtmagic = Math.sqrt(magic);
        dlat = (dlat * 180.0) / ((this.a * (1 - this.ee)) / (magic * sqrtmagic) * this.PI);
        dlng = (dlng * 180.0) / (this.a / sqrtmagic * Math.cos(radlat) * this.PI);
        const mglat = lat + dlat;
        const mglng = lng + dlng;
        return [mglng, mglat];
    }

    // 高德转84 coordinate 高德坐标
    gcj02ToWgs84(coordinate = []) {
        const [lng, lat] = this.createStringToNumber(coordinate);
        if (!lng || !lat || this.verifyOutOfChina(lng, lat)) return coordinate;
        let dlat = this.createTransFormLat(lng - 105.0, lat - 35.0);
        let dlng = this.createTransFormLng(lng - 105.0, lat - 35.0);
        const radlat = lat / 180.0 * this.PI;
        let magic = Math.sin(radlat);
        magic = 1 - this.ee * magic * magic;
        const sqrtmagic = Math.sqrt(magic);
        dlat = (dlat * 180.0) / ((this.a * (1 - this.ee)) / (magic * sqrtmagic) * this.PI);
        dlng = (dlng * 180.0) / (this.a / sqrtmagic * Math.cos(radlat) * this.PI);
        const mglat = lat + dlat;
        const mglng = lng + dlng;
        return [lng * 2 - mglng, lat * 2 - mglat];
    }


    // 判断是否在国内,不在国内则不做偏移,true: 不在国内;false: 在国内;
    verifyOutOfChina(lng, lat) {
        // 纬度3.86~53.55,经度73.66~135.05
        return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false);
    }

    // 生成经度
    createTransFormLng(lng, lat) {
        let ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
        ret += (20.0 * Math.sin(6.0 * lng * this.PI) + 20.0 * Math.sin(2.0 * lng * this.PI)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(lng * this.PI) + 40.0 * Math.sin(lng / 3.0 * this.PI)) * 2.0 / 3.0;
        ret += (150.0 * Math.sin(lng / 12.0 * this.PI) + 300.0 * Math.sin(lng / 30.0 * this.PI)) * 2.0 / 3.0;
        return ret;
    }

    // 生成纬度
    createTransFormLat(lng, lat) {
        let ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
        ret += (20.0 * Math.sin(6.0 * lng * this.PI) + 20.0 * Math.sin(2.0 * lng * this.PI)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(lat * this.PI) + 40.0 * Math.sin(lat / 3.0 * this.PI)) * 2.0 / 3.0;
        ret += (160.0 * Math.sin(lat / 12.0 * this.PI) + 320 * Math.sin(lat * this.PI / 30.0)) * 2.0 / 3.0;
        return ret;
    }

    // 一维数组,二维数组,三维数组中的值全部转化为数值
    createStringToNumber(coordinates = []) {
        if (!Array.isArray(coordinates) || coordinates.length === 0) return [];
        return coordinates.map((v) => Array.isArray(v) ? this.createStringToNumber(v) : Number(v));
    }
}

/**
 *
 * 单个坐标互转
 *
 * @params: coordinate       Array   坐标
 *          coordinateType:  String  坐标类型,高德:gcj02  84:Wgs84
 * @returns {*[]}
 * @desc:   高德坐标转换84坐标,用于提交后端
 *          84坐标转换高德坐标,用于高德地图回显
 *
 */
export function createSingleLnglat(coordinate = [], coordinateType = "gcj02") {
    const transformLngLat = new TransformLngLat();
    const transformFunc = coordinateType === "gcj02" ? "gcj02ToWgs84" : "wgs84ToGcj02";
    return transformLngLat[transformFunc](coordinate);
}

/**
 *
 * 多个坐标互转
 *
 * @params: coordinates       Array   坐标
 *          coordinateType:  String  坐标类型,高德:gcj02  84:Wgs84
 * @returns {*[]}
 * @desc:   高德坐标转换84坐标,用于提交后端
 *          84坐标转换高德坐标,用于高德地图回显
 *
 */
export function createMultipleLnglat(coordinates = [], coordinateType = "gcj02") {
    return coordinates.map(v => createSingleLnglat(v));
}
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-10 11:48:02  更:2022-05-10 11:49:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/30 12:28:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码