经纬度转换

魔卡托--经纬度

1.墨卡托转经纬度

PI:3.1415926535897932384626;
mercatorTolonlat(mercator){
    let lonlat={lon:0,lat:0};
    
    let x = mercator.x/20037508.34*180;
    let y = mercator.y/20037508.34*180;
    
    y= 180/Math.PI*(2*Math.atan(Math.exp(y*Math.PI/180))-Math.PI/2);
    
    lonlat.lon = x;
    lonlat.lat = y;

    return lonlat;
};

2.经纬度转墨卡托

lonlatToMercator(lonlat){
    var mercator = {};
    
    let x = lonLat.lon * 20037508.34 / 180;
    let y = Math.log(Math.tan((90 + lonLat.lat) * Math.PI / 360)) / (Math.PI / 180);
    
    y = y * 20037508.34 / 180;
    
    mercator.x = x;
    mercator.y = y;
    
    return mercator;
}

案例

// 1.墨卡托转经纬度
var mercator = {
    x:12607101.238338,
    y:2648567.8723786
}
var lonlat = mercatorTolonlat(mercator);
console.log(lonlat);
/*
    {
        lon:113.25151732418,
        lat:23.136776742416
    }
*/

// 2.经纬度转墨卡托
var lonlat = {
    lon:113.25151732418,
    lat:23.136776742416
}
var mercator = lonlatToMercator(lonlat);
console.log(mercator);
/*
    {
        x:12607101.238338396,
        y:2648567.872378624
    }
*/


//---------------------------------------------------- 百度、火星(gjc02)、经纬度(WGS84)转换 -----------------------------------------

百度、火星(gjc02)、经纬度(WGS84)转换

const PI = 3.14159265358979324;
const a = 6378245.0;
const ee = 0.00669342162296594323;
const x_pi = 3.14159265358979324 * 3000.0 / 180.0;
let res = wgs2bd(118.71310935104153, 32.166782756709125)
console.log(res)

// 百度转经纬度
console.log('-----1')
let arr = bd2gcj(32.1665787232599, 118.7138173695657)
console.log(res)
let tcorr = gcj02towgs84(arr[1], arr[0])
console.log(tcorr)
console.log('-----2')

// 百度转经纬度批量
let arrs = [
[32.1665787232599, 118.7138173695657]
]// 纬度 经度
let tararrs = []
arrs.forEach(item => {
let arrgcj = bd2gcj(item[0], item[1])
let lnglat = gcj02towgs84(arrgcj[1], arrgcj[0])
tararrs.push(lnglat)
})
console.log('-----百度转经纬度批量 ---------')
console.log(tararrs)
let gcjarr = [
[32.16434658429, 118.71886238811834],
[32.16446173416, 118.71899460194776],
[32.1652286799, 118.71902672449072],
[32.16527149328, 118.71888050445426],
[32.16521805749, 118.71852595298368],
[28.1676, 113.008261875],
[28.1709249898026, 113.00259152038691],
[28.174267302499135, 112.99694192496541]
]
let gcjToLnglat = []
gcjarr.forEach(item => {
let lnglat = gcj02towgs84(item[1], item[0])
// gcjToLnglat.push(lnglat)
gcjToLnglat.push([lnglat[1], lnglat[0]])
})
console.log('-----gcj转经纬度批量 ---------')
console.log(gcjToLnglat)


// wgs84坐标转百度坐标
function wgs2bd(lat, lon) {
_wgs2gcj = wgs2gcj(lat, lon);
_gcj2bd = gcj2bd(_wgs2gcj[0], _wgs2gcj[1]);
return _gcj2bd;
}

function gcj2bd(lat, lon) {
x = lon, y = lat;
z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
bd_lon = z * Math.cos(theta) + 0.0065;
bd_lat = z * Math.sin(theta) + 0.006;
return [bd_lat, bd_lon];
}

function bd2gcj(lat, lon) {
x = lon - 0.0065, y = lat - 0.006;
z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
gg_lon = z * Math.cos(theta);
gg_lat = z * Math.sin(theta);
return [gg_lat, gg_lon];
}

function wgs2gcj(lat, lon) {
dLat = transformLat(lon - 105.0, lat - 35.0);
dLon = transformLon(lon - 105.0, lat - 35.0);
radLat = lat / 180.0 * PI;
magic = Math.sin(radLat);
magic = 1 - ee * magic * magic;
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 = lat + dLat;
mgLon = lon + dLon;
return [mgLat, mgLon];
}

function gcj02towgs84(lng, lat) {
var dlat = transformLat(lng - 105.0, lat - 35.0);
var dlng = transformLon(lng - 105.0, lat - 35.0);
var radlat = lat / 180.0 * PI;
var magic = Math.sin(radlat);
magic = 1 - ee * magic * magic;
var sqrtmagic = Math.sqrt(magic);
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
var mglat = lat + dlat;
var mglng = lng + dlng;
return [lng * 2 - mglng, lat * 2 - mglat]
}

function transformLat(lon, lat) {
ret = -100.0 + 2.0 * lon + 3.0 * lat + 0.2 * lat * lat + 0.1 * lon * lat + 0.2 * Math.sqrt(Math.abs(lon));
ret += (20.0 * Math.sin(6.0 * lon * PI) + 20.0 * Math.sin(2.0 * lon * PI)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
return ret;
}

function transformLon(lon, lat) {
ret = 300.0 + lon + 2.0 * lat + 0.1 * lon * lon + 0.1 * lon * lat + 0.1 * Math.sqrt(Math.abs(lon));
ret += (20.0 * Math.sin(6.0 * lon * PI) + 20.0 * Math.sin(2.0 * lon * PI)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(lon * PI) + 40.0 * Math.sin(lon / 3.0 * PI)) * 2.0 / 3.0;
ret += (150.0 * Math.sin(lon / 12.0 * PI) + 300.0 * Math.sin(lon / 30.0 * PI)) * 2.0 / 3.0;
return ret;
}

// ---------------------- 凯立德 -- 经纬度

凯立德 - 经纬度

var codes = "0123456789abcdefghijkmnpqrstuvwxyz";

function __decode(pch) {
var v = 0;
for (var i = 3; i >= 0; --i)
v = v * 34 + (codes.indexOf(pch.charAt(i)));
v = v * 250 / 9;
return v;
}

function __encode(v) {
var pch = "";
v = v * 9 / 250;
for (var i = 0; i < 4; ++i) {
pch += codes.charAt(v % 34);
v /= 34;
}
return pch;
}

function DecodeLon(k) {
var lon = __decode(k.substring(1, 5));
if (k.charAt(0) == '5' || k.charAt(0) == '8')
lon += 35000000;
lon += 70000000;
return lon / 1000000.0;
}

function DecodeLat(k) {
var lat = __decode(k.substring(5, 9));
if (k.charAt(0) <= '6')
lat += 35000000;
lat += 5000000;
return lat / 1000000.0;
}

function Encode(lat, lon) {
lat = parseInt(lat * 1000000);
lon = parseInt(lon * 1000000);
var k;
lon -= 70000000;
lat -= 5000000;
if (lat > 35000000)
if (lon <= 35000000)
k = "6";
else
k = "5";
else if (lon <= 35000000)
k = "7";
else
k = "8";
if (lon > 35000000)
lon -= 35000000;
if (lat > 35000000)
lat -= 35000000;
k += __encode(lon);
k += __encode(lat);
return k;
}

let k = Encode(38.22, 106.288)
console.log(k)
console.log('------------')
let lon = DecodeLon(k)
let lat = DecodeLat(k)
console.log(lon, lat)
凯立德 -- 经纬度
posted @ 2022-10-15 16:15  A影子放風箏  阅读(204)  评论(0编辑  收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css