火星坐标系(高德)和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));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mf_717714

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值