首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换/失真图像以匹配Mercator投影

转换/失真图像以匹配Mercator投影
EN

Stack Overflow用户
提问于 2013-09-16 14:22:12
回答 1查看 1.6K关注 0票数 1

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

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

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

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

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

如果需要更多的信息,请告诉我。

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 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 =图像宽度(以像素为单位)

代码语言:javascript
复制
$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很容易

代码语言:javascript
复制
$x = (int) ((abs($lon1-$minlon)/$lonrange)*$lonbounds);

Y有点困难,首先计算到WGS84,然后映射到图像。最后一步,反转Y坐标,因为显示顺序是颠倒的。

代码语言:javascript
复制
$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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18830382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档