我有一张图片,基本上是谷歌地图上的截图。(http://i.stack.imgur.com/Iufcw.jpg)
我有另一张图片,我想在地图上展示。
我知道地图所有四个角的坐标(lat/lon),它们与重叠图像的四个角相匹配。
我的问题:地图在墨卡托投影(这意味着从赤道到极点的比例增加),而我的重叠图像不是。因此,我的叠加图像是准确的,在我的地图顶部和底部,但在中心有点偏离。
我的问题:,我如何转换/扭曲我的叠加图像,以便它将匹配我的地图的墨卡托投影?我希望能够在PHP中做到这一点。
如果需要更多的信息,请告诉我。
任何帮助都将不胜感激。
发布于 2017-11-24 19:20:07
下面是我如何将生成的图像叠加到Google或Bing地图上。在我的例子中,我正在创建一个GD图像的多边形,这将是覆盖。在GD库中实现多边形比地图提供程序API快得多。
首先,设置从标准纬度经度到WGS84投影的比例。以米为单位与mercator 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坐标。
// $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库中的示例来显示覆盖。
在您的示例中,这可能非常慢,因为您必须计算每个图像像素坐标的lat / lon,然后在新坐标下将像素值映射到新图像中。但是,在这种情况下,您不必在每次计算结束时翻转Y,但是您可能会看到一些奇怪的混叠,其中两个像素映射到相同的坐标,而另一个像素从未得到数据值。
https://developers.google.com/maps/documentation/javascript/examples/overlay-simple
https://stackoverflow.com/questions/18830382
复制相似问题