const PI = 3.14159265358979324;
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;
}
const PI = 3.14159265358979324;
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) {
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];
}