React中使用地图时一些常用方法总结

  • WGS84转换为火星
 	const PI = 3.14159265358979324;
    /**
     * 从84转火星
     * @param {Number} wgsLng 经度
     * @param {Number} wgsLat 纬度
     * @return {[Number,Number]} point
     */
    getWGS2Mars(wgsLng, wgsLat) {
        if (this._outofChina(wgsLat, wgsLng)) {
            return [wgsLng, wgsLat];
        }

        let marLat = 0.0;
        let marLng = 0.0;

        let lat = this._transformLat(wgsLng - 105.0, wgsLat - 35.0);
        let lng = this._transformLng(wgsLng - 105.0, wgsLat - 35.0);

        let radLat = wgsLat / 180.0 * PI;
        let magic = Math.sin(radLat);
        magic = 1 - EE * magic * magic;
        let sqrtMagic = Math.sqrt(magic);

        lat = (lat * 180.0) / ((A * (1 - EE)) / (magic * sqrtMagic) * PI);
        lng = (lng * 180.0) / (A / sqrtMagic * Math.cos(radLat) * PI);

        marLat = wgsLat + lat;
        marLng = wgsLng + lng;

        return [marLng, marLat];
    }

	_outofChina(lat, lng) {
        if (lng < 72.004 || lng > 137.8347) {
            return true;
        }

        if (lat < 0.8293 || lat > 55.8271) {
            return true;
        }

        return false;
    }

 	_transformLat(wgsLng, wgsLat) {
        let ret = -100.0 + 2.0 * wgsLng + 3.0 * wgsLat
            + 0.2 * wgsLat * wgsLat + 0.1 * wgsLng * wgsLat
            + 0.2 * Math.sqrt(Math.abs(wgsLng));

        ret += (20.0 * Math.sin(6.0 * wgsLng * PI) + 20.0 * Math.sin(2.0 * wgsLng * PI)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(wgsLat * PI) + 40.0 * Math.sin(wgsLat / 3.0 * PI)) * 2.0 / 3.0;
        ret += (160.0 * Math.sin(wgsLat / 12.0 * PI) + 320 * Math.sin(wgsLat * PI / 30.0)) * 2.0 / 3.0;
        return ret;
    }

    _transformLng(wgsLng, wgsLat) {
        let ret = 300.0 + wgsLng + 2.0 * wgsLat + 0.1 * wgsLng * wgsLng
            + 0.1 * wgsLng * wgsLat + 0.1 * Math.sqrt(Math.abs(wgsLng));
        ret += (20.0 * Math.sin(6.0 * wgsLng * PI) + 20.0 * Math.sin(2.0 * wgsLng * PI)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(wgsLng * PI) + 40.0 * Math.sin(wgsLng / 3.0 * PI)) * 2.0 / 3.0;
        ret += (150.0 * Math.sin(wgsLng / 12.0 * PI) + 300.0 * Math.sin(wgsLng / 30.0 * PI)) * 2.0 / 3.0;
        return ret;
    }
  • 从火星坐标转换为wgs84
	const PI = 3.14159265358979324;
    /**
     * 从火星转84
     * @param {Number} lng
     * @param {Number} lat
     * @return {[Number,Number]} point
     */
    getMars2WGS(marsLng, marsLat) {
        let prec = 0.000000001;
        let minx = marsLng - 0.5;
        let miny = marsLat - 0.5;
        let maxx = marsLng + 0.5;
        let maxy = marsLat + 0.5;

        let dis = 1.0;
        let curx = marsLng;
        let cury = marsLat;
        let calx = 0.0;
        let caly = 0.0;

        let count = 0;

        let wgsLat = 0.0;
        let wgsLng = 0.0;

        while (true) {
            if (dis <= prec) {
                break
            } else {
                curx = (minx + maxx) / 2;
                cury = (miny + maxy) / 2;

                let mid = this._transform(cury, curx);
                caly = mid[0];
                calx = mid[1];

                if (caly >= marsLat) {
                    maxy = cury;
                } else {
                    miny = cury;
                }

                if (calx >= marsLng) {
                    maxx = curx;
                } else {
                    minx = curx;
                }

                dis = Math.abs(calx - marsLng) + Math.abs(caly - marsLat);
                count++;
                if (count >= 3) {
                    //fmt.Println("count:", count)
                    if (Math.abs(maxx - minx) < prec / 5 && Math.abs(calx - marsLng) > prec / 2) {
                        if (calx >= marsLng) {
                            minx -= 0.01;
                        } else {
                            maxx += 0.01;
                        }
                    }

                    if (Math.abs(maxy - miny) < prec / 5 && Math.abs(caly - marsLat) > prec / 2) {
                        if (caly >= marsLat) {
                            miny -= 0.01;
                        } else {
                            maxy += 0.01;
                        }
                    }

                    if (minx > maxx || miny > maxy || count > 300) {
                        wgsLng = 1.368660281996339E-7 * marsLng * marsLng * marsLng
                            + -1.180928130750135E-8 * marsLng * marsLng * marsLat
                            + -2.8882557135286497E-8 * marsLng * marsLat * marsLat
                            + -1.9701061211739227E-8 * marsLat * marsLat * marsLat
                            + -4.3871816410430085E-5 * marsLng * marsLng
                            + 2.312263036974062E-6 * marsLng * marsLat
                            + 3.524130062939154E-6 * marsLat * marsLat
                            + 1.0045663287213806 * marsLng
                            + -1.3931706059903598E-4 * marsLat
                            + -0.15629046141059658;

                        wgsLat = 1.9633521507503826E-10 * marsLng * marsLng * marsLng
                            + 5.042926958596946E-12 * marsLng * marsLng * marsLat
                            + 1.4343237310979937E-10 * marsLng * marsLat * marsLat
                            + 1.7413852403156825E-7 * marsLat * marsLat * marsLat
                            + -7.126752970697697E-8 * marsLng * marsLng
                            + -9.092793512456868E-7 * marsLng * marsLat
                            + -1.8936576425611334E-5 * marsLat * marsLat
                            + 2.1967158739942877E-5 * marsLng
                            + 1.0006054151828006 * marsLat
                            + -0.003172773997829536;

                        let mid = this._transform(wgsLat, wgsLng);
                        let calx1 = mid[0];
                        let caly1 = mid[1];

                        let dis1 = Math.abs(calx1 - marsLng) + Math.abs(caly1 - marsLat);
                        if (dis1 < dis) {

                            return [wgsLng, wgsLat];
                        }
                        wgsLat = cury;
                        wgsLng = curx;
                        return [wgsLng, wgsLat];
                    }
                }
            }
        }


        wgsLat = cury;
        wgsLng = curx;

        return [wgsLng, wgsLat];
    }

	_outofChina(lat, lng) {
        if (lng < 72.004 || lng > 137.8347) {
            return true;
        }

        if (lat < 0.8293 || lat > 55.8271) {
            return true;
        }

        return false;
    }

 _transform(wgLat, wgLon) {
        let mglat = 0.0;
        let mglng = 0.0;
        if (this._outofChina(wgLat, wgLon)) {
            mglat = wgLat;
            mglng = wgLon;
            return [mglat, mglng];
        }

        let dLat = this._transformLat(wgLon - 105.0, wgLat - 35.0);
        let dLon = this._transformLng(wgLon - 105.0, wgLat - 35.0);

        let radLat = wgLat / 180.0 * PI;
        let magic = Math.sin(radLat);
        magic = 1 - EE * magic * magic;
        let sqrtMagic = Math.sqrt(magic);

        dLat = (dLat * 180.0) / ((A * (1 - EE)) / (magic * sqrtMagic) * PI);
        dLon = (dLon * 180.0) / (A / sqrtMagic * Math.cos(radLat) * PI);

        mglat = wgLat + dLat;
        mglng = wgLon + dLon;
        return [mglat, mglng];
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值