Created
August 23, 2017 09:08
-
-
Save sliwey-zz/0c62dbf4b8bd0fc8893bf112e59bbfea to your computer and use it in GitHub Desktop.
gps transform
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const pi = Math.PI; | |
const a = 6378245.0; | |
const ee = 0.006693421622965943; | |
function gps2Mars(lng, lat) { | |
if (outOfChina(lng, lat)) { | |
return { | |
lng: lng, | |
lat: lat | |
}; | |
} | |
let dLat = transformLat(lng - 105.0, lat - 35.0); | |
let dLng = transformLng(lng - 105.0, lat - 35.0); | |
let radLat = lat / 180.0 * pi; | |
let magic = Math.sin(radLat); | |
let sqrtMagic; | |
let mgLat; | |
let mgLng; | |
magic = 1 - ee * magic * magic; | |
sqrtMagic = Math.sqrt(magic); | |
dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi); | |
dLng = (dLng * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi); | |
mgLat = lat + dLat; | |
mgLng = lng + dLng; | |
return { | |
lng: mgLng, | |
lat: mgLat | |
}; | |
} | |
function mars2Gps(lng, lat) { | |
const position = gps2Mars(lng, lat); | |
return { | |
lng: lng * 2 - position.lng, | |
lat: lat * 2 - position.lat | |
}; | |
} | |
function outOfChina(lng, lat) { | |
if (lng < 72.004 || lng > 137.8347) { | |
return true; | |
} | |
if (lat < 0.8293 || lat > 55.8271) { | |
return true; | |
} | |
return false; | |
} | |
function transformLng(x, y) { | |
let ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x)); | |
ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0; | |
ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0; | |
ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0 * pi)) * 2.0 / 3.0; | |
return ret; | |
} | |
function transformLat(x, y) { | |
let ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x)); | |
ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0; | |
ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0; | |
ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0; | |
return ret; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment