2009-10-20 10 views
7

Ich versuche, eine Seite in ASP.NET zu entwickeln, die als Kachel-Server für eine Google MapKonvertieren von long/lat Pixel x/y, da eine Zoom-Ebene

Es wird ziehen ein handeln Sammlung von Breiten-/Längenpunkten aus der Datenbank, dann render sie als kleine rote Punkte auf einem transparenten Hintergrund, gegeben eine Zoom-Ebene (Standard: 15).

Es wird dann das Ergebnis als GIF-Bild zurückgeben.

Sind Algorithmen oder Bibliotheken entwickelt worden, die es mir erlauben, diese Breiten- und Längengraden zu übernehmen und sie in einen Satz von 2D-Pixelkoordinaten zu konvertieren, wenn ein Zoomlevel gegeben ist?

(Dies alles geschieht serverseitige ist, so kann ich nicht die Google Maps API verwenden.)


Update: Gefunden ein Code-Beispiel in Perl, die etwas ähnliches tut:

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

Problem ist, ich weiß nicht Perl, und habe nicht wirklich die Zeit, ein Buch zu öffnen und es zu lernen.

Kann mir jemand helfen zu entziffern, was in dieser Funktion vor sich geht?

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

Antwort

2

„Wenn es eine Mercator-Projektion ist, sollten Sie nicht da alle der über die Krümmung der Erde kümmern lat/lon Linien sind mit gleichem Abstand“

Vielleicht sind Sie denken der Projektion von Geographic (alias Plate Carree)? Die Mercator-Projektion hat gleichmßig beabstandete Längenlinien, aber hat nicht gleichmäßig beabstandete Breitengrade (lat = atan (sinh (y)), also 90 ° ist im Unendlichen). Die Mathematik für die Mercator-Projektion auf einer Kugel ist

, aber wenn Google Maps das WGS84-Ellipsoid verwendet und Sie es genau erhalten müssen, wird es komplizierter. In diesem Fall würde ich mir this ansehen, aber Vorsicht: Es ist nichts für schwache Nerven.

+0

Ah ja, Sie haben Recht. Ich werde meine Antwort entfernen. –

9

Hier ist ein Code, den ich gerade verwende. Es ist in 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); 
} 

auf Code-Basis von this page durch this guy geschrieben.

Viel Glück!

Update:This map ist eine gute Möglichkeit, um zu verstehen, wie Fliesen in Google Maps

arbeiten Edit: Hier ist eine äquivalente Menge von Funktionen in 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 

Und in 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

+ ½ - obwohl die ursprüngliche Frage für a war.NET-Lösung, dies ist eine ausgezeichnete und einfach zu implementierende Lösung, und es sollte für den Leser trivial sein, dies in C# oder VB.NET zu konvertieren. –