2009-10-20 9 views
7

Próbuję stworzyć stronę w ASP.NET, która będzie działać jako dachówka-serwer dla Google MapKonwersja długo/szer do piksela x/y, biorąc pod uwagę powiększenia poziomu

będzie ciągnąć zbiór punktów szerokości/długości geograficznej z bazy danych, a następnie renderuj je jako małe czerwone kropki na przezroczystym tle, z uwzględnieniem poziomu zoomu (domyślnie: 15).

Następnie wynik zostanie zwrócony jako obraz typu GIF.

Czy opracowano jakieś algorytmy lub biblioteki, które pozwalają mi zastosować ten zbiór szerokości i długości geograficznej i przekonwertować je na zbiór współrzędnych pikseli 2D, biorąc pod uwagę poziom powiększenia?

(To wszystko jest robione po stronie serwera, więc nie mogę korzystać z interfejsu API Map Google.)


Aktualizacja: Znaleziono kod-próbki w Perlu, że robi coś podobnego:

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

Problem polega na tym, że nie znam Perla i nie mam czasu, aby otworzyć książkę i uczyć się jej.

Czy ktoś może mi pomóc rozszyfrować to, co się dzieje w tej funkcji?

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) ; 
} 

Odpowiedz

2

„Jeśli jest to projekcja Mercator, nie ma potrzeby martwić się o krzywizny ziemi od wszystkich lat/lon linie są w równych odstępach”

Być może myślisz projekcji Geograficznej (alias Plate Carree)? Projekcja Mercatora ma równomiernie rozmieszczone linie długości geograficznej, ale ma , a nie równomiernie rozmieszczone linie szerokości geograficznej (lat = atan (sinh (y)), więc 90 ° jest w nieskończoności).

BTW, matematyka dla projekcji Mercatora na kuli to here, ale jeśli Google Maps używa elipsoidy WGS84 i trzeba ją uzyskać dokładnie, staje się bardziej skomplikowana. W takim przypadku patrzę na this, ale uwaga: nie dla osób o słabym sercu.

+0

Ach tak, masz rację. Usuwam moją odpowiedź. –

9

Oto kod, którego aktualnie używam. Jest w 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); 
} 

podstawie kodu z this page, napisany przez this guy.

Powodzenia!

Aktualizacja:This map jest doskonałym sposobem, aby pomóc zrozumieć, jak płytki pracować w Google Maps

Edit: Oto równoważny zestaw funkcji w 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 

I 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

+ ½ - chociaż pierwotne pytanie dotyczyło.Rozwiązanie NET, jest to doskonałe i łatwe do wdrożenia rozwiązanie i powinno być trywialne dla czytelnika, aby przekonwertować to na C# lub VB.NET. –

Powiązane problemy