2013-09-16 77 views
1

我有一個圖像,它基本上只是谷歌地圖的截圖。 (http://i.stack.imgur.com/Iufcw.jpg轉換/扭曲圖像以匹配墨卡託投影

而我有另一張圖片,我想在我的地圖上顯示。

我知道我的地圖所有四個角的座標(緯度/經度),他們匹配我的覆蓋圖像的四個角。

我的問題:地圖是在墨卡託投影(這意味着從赤道到極點的比例增加),而我的覆蓋圖像不是。因此,我的覆蓋圖像在我的地圖的頂部和底部是準確的,但在中心位置有點偏離。

我的問題:如何轉換/扭曲我的覆蓋圖像,以便它與我的地圖的墨卡託投影相匹配?我希望能夠在PHP

請讓我知道是否需要任何額外的信息。

任何幫助將不勝感激。

回答

0

嗯,這是我如何覆蓋生成的圖像到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-Y座標。

// $ lon1 =點的要被轉換成圖像的經度座標

// $ LAT1 =點的緯度以轉換成圖像coordates

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