2012-06-04 33 views
0

我已經谷歌搜索自己死亡.. 我試圖編寫2個PHP函數,將從Lat和Long,在墨卡託投影和平面非投影(網格)地圖中返回X和Y. 問題是我跑過的每一個計算都假設你的地圖在角上有相同的經度和緯度,然後結果以米爲單位。呃PHP地圖投影

這裏是我有..不同大小的地圖,不同的拉特,長在四個角落。 我下載了Proj4的PHP端口,但零文件和更多的代碼,然後我需要,我是在whelmed ...

幫助!

+0

只是爲了澄清 - 你有一個表示圖,其中經/緯度線是完全垂直/水平的圖像,你要麼知道經/緯在各個角落,或在一個角落裏知道並知道規模?並且您希望獲取落入該區域的緯度/經度,並將其轉換爲該圖像的X-Y座標? – Death

+0

正確的是,經緯度是完美的水平/垂直,我有在所有角落的經緯度,並需要找到一個X-Y給一個經緯度 – user1409054

回答

0

這假定你的緯度/經度座標是十進制值,並且不會在地圖的可見範圍內從北/南或東/西改變方向。如果他們這樣做,這些值應該保持爲一種格式,並且做成negativel(例如:1.0 S將變成-1.0 N)

首先,您將設置以下變量,或者使用PHP查找它們,或者如果您知道他們已經在腳本:

$width=//width of image 
$height=//height of image 

$long_at_left=//Longitude of left-hand coordinates 
$long_at_right=//Longitude of right-hand coordinates 
$lat_at_left=//Latitude of left-hand coordinates 
$lat_at_right=//Latitude of right-hand coordinates 

$target_long=//Longitude you want to find 
$target_lat=//Latitude you want to find 

然後使用:

$xtarget=$target_long-$long_at_left; 
$ytarget=$target_lat-$lat_at_top; 

$xdist=$long_at_left-$long_at_right; 
$ydist=$lat_at_top-$lat_at_bottom; 

$x=round(($xtarget/$xdist)*$width); //Percentage of distance times width 
$y=round(($ytarget/$ydist)*$height); //Percentage of distance times height 

或者一些形式的應該做的伎倆。

+0

完美...作品像一個冠軍!謝謝 – user1409054

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​​庫中的示例顯示覆蓋圖。

https://developers.google.com/maps/documentation/javascript/examples/overlay-simple