这就是我将生成的图像叠加到 Google 或 Bing 地图上的方法。就我而言,我正在创建一个将作为叠加层的多边形的 GD 图像。在 GD 库中处理多边形比地图提供程序 API 快得多。
首先,设置从标准纬度经度到 WGS84 投影的比例。度数以米为单位的墨卡托 xy 坐标。
http://gisgeography.com/wgs84-world-geodetic-system/
// $minlat = 最小图像纬度
// $minlon = 最小图像经度
// $maxlat = 最大图像纬度
// $maxlon = 最大图像经度
// $latbounds = 图像高度(以像素为单位)
// $lonbounds = 图像宽度(以像素为单位)
$lonrange = abs($maxlon - $minlon);
$WGS84min = log(tan((90.+$minlat)*M_PI/360.))/(M_PI/180.);
$WGS84min = (int) ($WGS84min * 2037598.34/180);
$WGS84max = log(tan((90.+$maxlat)*M_PI/360.))/(M_PI/180.);
$WGS84max = (int) ($WGS84max * 2037598.34/180);
$WGS84diff = $WGS84max - $WGS84min;
$WGS84factor = $latbounds/$WGS84diff;
然后对于每个纬度/经度,我想计算图像上的实际 XY 坐标。
// $lon1 = 要转换为图像坐标的点的经度
// $lat1 = 要转换为图像坐标的点的纬度
X 很简单
$x = (int) ((abs($lon1-$minlon)/$lonrange)*$lonbounds);
Y有点难,先计算到WGS84,然后映射到图像。最后一步,反转 Y 坐标,因为显示顺序是倒置的。
$y1 = log(tan((90.+$lat1)*M_PI/360.))/(M_PI/180.);
$y1 = $y1 * 2037598.34/180;
$y1 = (int) (($y1- $WGS84min)*$WGS84factor);
$y = $latbounds - $y1;
图像文件完成后,使用 GD 保存图像,然后使用 API 库中的示例显示您的叠加层。
在您的情况下,这可能会相当慢,因为您必须计算每个图像像素坐标的纬度/经度,然后将像素值映射到新坐标处的新图像中。但是,在这种情况下,您不必在每次计算结束时翻转 Y,但您可能会看到一些奇怪的混叠,其中两个像素映射到同一坐标,而另一个像素从未获得数据值。
https://developers.google.com/maps/documentation/javascript/examples/overlay-simple