1

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

我还有另一个图像,我想在我的地图上显示。

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

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

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

如果需要任何其他信息,请告诉我。

任何帮助将不胜感激。

4

1 回答 1

0

这就是我将生成的图像叠加到 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

于 2017-11-24T19:20:07.993 回答