我使用公式将地球上的地理点转换为像素坐标,正如Daniel的教程: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;
}基于:Mercator
现在,为了实现精确的鼠标交互,我试图做相反的事情:将像素转换为Lat和Lon。我已经成功地反演了第一个方程,所以x to 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);感谢
发布于 2017-11-27 18:22:41
@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;
}https://stackoverflow.com/questions/47498309
复制相似问题