转换/扭曲图像以匹配墨卡托投影
Posted
技术标签:
【中文标题】转换/扭曲图像以匹配墨卡托投影【英文标题】:Convert/distort image to match Mercator projection 【发布时间】:2013-09-16 14:22:12 【问题描述】:我有一张图片,它基本上只是谷歌地图的截图。 (http://i.stack.imgur.com/Iufcw.jpg)
我还有另一张图片,我想在我的地图上显示。
我知道地图所有四个角的坐标(纬度/经度),它们与我的叠加图像的四个角相匹配。
我的问题:地图是墨卡托投影(这意味着从赤道到极点的比例增加),而我的叠加图像不是。因此,我的叠加图像在地图的顶部和底部是准确的,但在中心有点偏离。
我的问题:如何转换/扭曲我的叠加图像,使其与我的地图的墨卡托投影相匹配?我希望能够在 PHP 中做到这一点。
如果需要任何其他信息,请告诉我。
任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:下面是我将生成的图像叠加到 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
【讨论】:
以上是关于转换/扭曲图像以匹配墨卡托投影的主要内容,如果未能解决你的问题,请参考以下文章
谷歌墨卡托投影不是真正的墨卡托,如何在 SVG 上更正将 lat long 转换为 x,y