要考虑的重要事项之一是投影的“缩放”级别(尤其是对于Google地图)。
正如Google解释的那样:
在缩放级别1时,地图由4个256x256像素的图块组成,因此像素空间为512x512。在缩放级别19时,可以使用0到256 * 2 ^ 19之间的值引用地图上的每个x和y像素
(请参阅https://developers.google.com/maps/documentation/javascript/maptypes?hl=zh-CN#MapCoordinates)
为了考虑“缩放”值,我建议以下简单有效的deltaLonPerDeltaX和deltaLatPerDeltaY函数。尽管x像素和经度严格成正比,但对于y像素和纬度却不是这种情况,因为y像素和纬度的公式需要初始纬度。
window.geo = {
glOffset: Math.pow(2,28),
glRadius: Math.pow(2,28) / Math.PI,
a: Math.pow(2,28),
b: 85445659.4471,
c: 0.017453292519943,
d: 0.0000006705522537,
e: Math.E,
p: Math.PI / 180,
lonToX: function(lon) {
return Math.round(this.glOffset + this.glRadius * lon * this.p);
},
XtoLon: function(x) {
return -180 + this.d * x;
},
latToY: function(lat) {
return Math.round(this.glOffset - this.glRadius *
Math.log((1 + Math.sin(lat * this.p)) /
(1 - Math.sin(lat * this.p))) / 2);
},
YtoLat: function(y) {
return Math.asin(Math.pow(this.e,(2*this.a/this.b - 2*y/this.b)) /
(Math.pow(this.e, (2*this.a/this.b - 2*y/this.b))+1) -
1/(Math.pow(this.e, (2*this.a/this.b - 2*y/this.b))+1)
) / this.c;
},
deltaLonPerDeltaX: function(deltaX, zoom) {
return deltaX * 180 / Math.pow(2, 7+zoom);
},
deltaLatPerDeltaY: function(deltaY, zoom, startLat) {
var startY = this.latToY(startLat),
endY = startY + deltaY * Math.pow(2, 28-7-zoom),
endLat = this.YtoLat(endY);
return ( endLat - startLat );
}
}