转换/扭曲图像以匹配墨卡托投影

时间:2013-09-16 14:22:12

标签: php image map overlay mercator

我有一张图片,基本上只是Google地图的截图。 (http://i.stack.imgur.com/Iufcw.jpg

我有另一张图片,我想在地图上显示。

我知道地图所有四个角的坐标(lat / lon),它们与我的叠加图像的四个角匹配。

我的问题:地图是墨卡托投影(这意味着比例从赤道增加到极点),而我的叠加图像不是。因此,我的叠加图像在我的地图的顶部和底部是准确的,但在中心稍微偏离。

我的问题:如何转换/扭曲我的叠加图像,使其与地图的墨卡托投影相匹配?我希望能够在 PHP 中实现这一目标。

如果需要任何其他信息,请与我们联系。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

这里是我如何将生成的图像叠加到Google或Bing地图上。 就我而言,我正在创建一个多边形的GD图像,它将成为叠加层。在GD库中执行多边形比使用地图提供程序API要快得多。

首先,设置从标准纬度经度到WGS84投影的缩放比例。度数为墨卡托x-y坐标,单位为米。

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;

然后,对于每个纬度/经度,我想计算图像上的实际X-Y坐标。

// $ 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