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

标签 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

现在,为了实现精确的鼠标交互,我正在尝试做相反的事情;将像素转换为纬度和经度。我已经设法反转第一个方程,因此 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 right 的偏方程:

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);

赞赏

最佳答案

@user3290797 找到了 cuplrit,我不得不将 atan2() 更改为 atan()。到目前为止,这效果很好:(顺便说一下,我在 P5js 中使用了它,所以这就是为什么数学函数看起来比应有的更简单)

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

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

关于javascript - 反转 Web 墨卡托方程以将像素转换为纬度经度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47498309/

相关文章:

javascript - Google map 项目不适用于移动设备

javascript - Tensorflow.js 中的内存泄漏 : How to clean up unused tensors?

javascript - 如何在javascript中定义嵌套数组?

php - 如何将位置过滤器添加到 php/mysql web 应用程序

java - 当 AsyncTask 完成 Activity 时调用 fragment 方法

Javascript 循环性能 : Counting occurrences of a number in a finite series

javascript - ASP :new listview javascript question

javascript - Google Maps API 启用 ScrollWheelZoom() - 为什么它不能正确缩小?

mysql - 以编程方式确定位置数据中的模式以导出列 - 标准差?

java - 需要有关寓教于乐游戏程序的帮助