这些变量是从哪里来的
选择这些变量以将计算的坐标与地图的背景图像相匹配。如果地图的投影参数已知,则可以计算它们。但我相信它们更有可能是通过反复试验获得的。
如何计算墨卡托投影
如果您想要一种更通用的方法来描述给定(非横向)墨卡托地图显示的世界部分,您可以使用以下代码:
// This map would show Germany:
$south = deg2rad(47.2);
$north = deg2rad(55.2);
$west = deg2rad(5.8);
$east = deg2rad(15.2);
// This also controls the aspect ratio of the projection
$width = 1000;
$height = 1500;
// Formula for mercator projection y coordinate:
function mercY($lat) { return log(tan($lat/2 + M_PI/4)); }
// Some constants to relate chosen area to screen coordinates
$ymin = mercY($south);
$ymax = mercY($north);
$xFactor = $width/($east - $west);
$yFactor = $height/($ymax - $ymin);
function mapProject($lat, $lon) { // both in radians, use deg2rad if neccessary
global $xFactor, $yFactor, $west, $ymax;
$x = $lon;
$y = mercY($lat);
$x = ($x - $west)*$xFactor;
$y = ($ymax - $y)*$yFactor; // y points south
return array($x, $y);
}
此代码的演示运行可在http://ideone.com/05OhG6获得。
关于纵横比
一个设置$xFactor != $yFactor
会产生一种拉伸的墨卡托投影。这不再是保形的(保角)。如果想要一个真正的墨卡托投影,可以省略前六个变量分配中的任何一个,即那些定义边界框或描述结果地图大小的变量,然后使用一些计算来选择它满足$xFactor == $yFactor
。但是由于省略的选择有点随意,我觉得上面的代码是描述事物的最对称的方式。