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

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

经纬度坐标和投影坐标的转换

CGCS2000投影转换工具

ol 接入百度地图

火星坐标百度坐标WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版

快速搭建简单的LBS程序——地图服务