反转Web墨卡托方程以将像素转换为纬度经度

时间:2017-11-26 16:22:33

标签: javascript google-maps math

我正在使用等式将地球上的地理点转换为像素坐标,如Daniel Shiffman的教程中所述:https://gist.github.com/shiffman/a0d2fde31f571163c730ba0da4a01c82

那是:

function webMercX(lon, zoom) {
  lon = radians(lon);
  var w = 256; //width / 2;
  var a = (w / PI) * pow(2, zoom);
  var b = (lon + PI);
  var x = a * b;
  return x;
}

function webMercY(lat, zoom) {
  lat = radians(lat);
  var w = 256; //height / 2;
  var a = (w / PI) * pow(2, zoom);
  var c = tan(PI / 4 + lat / 2);
  var b = PI - log(c);
  var y = a * b;
  return y;
}

基于:https://en.wikipedia.org/wiki/Web_Mercator

现在,为了实现准确的鼠标互动,我试图做相反的事情;将像素转换为Lat和Lon。我设法颠倒了第一个等式,所以x到lon效果很好:

function inverseWebMercX(x,zoom) {
    var w = 256; //width / 2;
    var a = (w / PI) * pow(2, zoom);
    var b = x/a;
    var lon = b-PI;
    lon = degrees(lon);
    return lon;
}

可以通过

进行测试
  

inverseWebMercX(webMercX(10,2),2);

但到目前为止我还没有将y转换为lat,可能是因为我没有解决var c和var lat右边的偏微分方程:

function inverseWebMercY(y,zoom) {
    var w = 256; //width / 2;
    var a = (w / PI) * pow(2, zoom);
    var b = y/a;
    var c = -(exp(b) + PI);
    var lat = (atan2(c) - (PI / 4))*2;
    lat = degrees(lat);
    return lat;
}

所以,简单地说,也许有更好数学背景的人知道如何分别为lat和c解决这些方程:

var c = tan(PI / 4 + lat / 2); 
var b = PI - log(c);

赞赏

0 个答案:

没有答案