2009-10-20 102 views
7

我想開發一個ASP.NET頁面,將作爲拼貼服務器的谷歌地圖轉換經度/緯度像素X/Y,給定一個縮放級別

它會拉從數據庫中收集緯度/經度點,然後在給定縮放級別(默認值:15)的情況下,將它們呈現爲透明背景上的小紅點。

它將然後返回結果爲GIF型圖像。

已經開發的任何算法或庫,允許我藉此集緯度/經度並將其轉換爲一組二維像素座標的,給定一個縮放級別?

(這是所有正在做服務器端,所以我不能使用谷歌地圖API)


更新:發現在Perl,做類似的事情代碼樣本:

http://blog.barros.ws/2009/03/06/convert-lat-lng-and-zoom-values-to-pixel-xy-on-a-map/

問題是,我不知道Perl,也沒有時間打開一本書並學習它。

誰能幫我破解怎麼回事這個功能呢?

sub Google_Coord_to_Pix 
{ 
    my $value = shift ; 
    my $lat = shift ; 
    my $lng = shift ; 
    my @d  = () ; 
    my $e  = 0 ; 

    $d[1] = sprintf("%0.0f", $$value{'bmO'} + $lng * $$value{'pixLngDeg'}) ; 

    $e = sin($lat * $$value{'Wa'}) ; 

    if($e > 0.99999) 
    { 
     $e = 0.99999 ; 
    } 

    if($e < -0.99999) 
    { 
     $e = -0.99999 ; 
    } 

    $d[0] = sprintf("%0.0f", $$value{'bmO'} + 0.5 * log((1 + $e)/(1 - $e)) * (-1) * $$value{'pixLngRad'}) ; 

    return (@d) ; 
} 

回答

2

「如果這是一個墨卡託投影,你不應該需要,因爲所有的經/緯度線的擔心地球的曲率是相等的間距」

也許你會想的地理(又名板卡里)投影?墨卡託投影具有等距的經線,但是而不是具有等距的緯線(lat = atan(sinh(y)),所以90°在無窮遠處)。

順便說一句,球面上的墨卡託投影數學公式爲here,但如果谷歌地圖使用WGS84橢圓體,並且您需要準確得出它,那麼它會變得更加複雜。在那種情況下,我會看看this,但要小心:它不適合心臟不好的人。

+0

啊,是的,你是正確的。我會刪除我的答案。 – 2009-10-21 13:03:40

9

這是我目前使用的一些代碼。它在PHP中。基於代碼

// Returns longitude in pixels at a certain zoom level 
function lonToX($lon, $zoom) { 
    $offset = 256 << ($zoom-1); 
    return round($offset + ($offset * $lon/180)); 
} 
// Returns latitude in pixels at a certain zoom level 
function latToY($lat, $zoom) { 
    $offset = 256 << ($zoom-1); 
    return round($offset - $offset/pi() * log((1 + sin($lat * pi()/180))/(1 - sin($lat * pi()/180)))/2); 
} 

this page,通過this guy寫入。

祝你好運!

更新:This map是一個偉大的方式來幫助理解瓷磚在谷歌地圖是如何工作的

編輯:下面是VB.NET同等的功能集:

Public Function LonToX(Lon As Double, Zoom as UInteger) As UInteger 
    Dim Offset = 256 << (Zoom - 1) 
    Return Math.Round(Offset + (Offset * Lon/180)) 
End Function 

Public Function LatToY(Lat As Double, Zoom as UInteger) As UInteger 
    Dim Offset = 256 << (Zoom - 1) 
    Return Math.Round(Offset - Offset/Math.Pi * Math.Log((1 + Math.Sin(Lat * Math.Pi/180))/(1 - Math.Sin(Lat * Math.Pi/180)))/2) 
End Function 

而且在C#:

public uint lonToX(double lon, uint zoom) { 
    uint offset = 256 << (zoom - 1); 
    return Math.Round(offset + (offset * lon/180)); 
} 

public uint latToY(double lat, uint zoom) { 
    uint offset = 256 << (zoom - 1); 
    return Math.Round(offset - offset/Math.Pi * Math.Log((1 + Math.Sin(lat * Math.Pi/180))/(1 - Math.Sin(lat * Math.Pi/180)))/2); 
} 
+0

+½ - 雖然原來的問題是爲了一個。NET解決方案,這是一個優秀且易於實現的解決方案,讀者將其轉換爲C#或VB.NET應該是微不足道的。 – 2012-07-23 15:18:28