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

Php 转换/扭曲图像以匹配墨卡托投影,php,image,map,overlay,mercator,Php,Image,Map,Overlay,Mercator,我有一张图片,基本上只是谷歌地图的截图 我还有另一张图片,我想在我的地图上显示 我知道地图四个角的坐标lat/lon,它们与叠加图像的四个角相匹配 我的问题:地图是墨卡托投影,这意味着从赤道到极点的比例增加,而我的叠加图像不是。因此,我的叠加图像在地图的顶部和底部都是准确的,但在中心有点偏离 我的问题:如何转换/扭曲叠加图像,使其与地图的墨卡托投影匹配?我希望能够在PHP中实现这一点 如果需要其他信息,请告诉我 任何帮助都将不胜感激。下面是我如何将生成的图像叠加到谷歌或必应地图上的。 在我的例子

我有一张图片,基本上只是谷歌地图的截图

我还有另一张图片,我想在我的地图上显示

我知道地图四个角的坐标lat/lon,它们与叠加图像的四个角相匹配

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

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

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


任何帮助都将不胜感激。

下面是我如何将生成的图像叠加到谷歌或必应地图上的。 在我的例子中,我正在创建一个多边形的GD图像,该图像将作为覆盖。在GD库中执行多边形比在map providers API中执行多边形要快得多

首先,设置从标准经纬度到WGS84投影的缩放。墨卡托x-y坐标的度数,单位为米

//$minlat=最小图像纬度

//$minlon=最小图像经度

//$maxlat=最大图像纬度

//$maxlon=最大图像经度

//$latbounds=以像素为单位的图像高度

$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;
//$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库中的示例显示覆盖

在您的例子中,这可能相当慢,因为您必须计算每个图像像素坐标的lat/lon,然后将像素值映射到新坐标处的新图像中。但是,在这种情况下,您不必在每次计算结束时翻转Y,但您可能会看到一些奇怪的锯齿,其中两个像素映射到同一坐标,而另一个像素从未获得数据值