2009-10-20 8 views
7

Je suis en train de développer une page ASP.NET qui agira comme une tuile serveur pour une carte Google MapConversion latitude/longitude à pixels x/y, étant donné un niveau de zoom

Il va tirer un collecte des points de latitude/longitude à partir de la base de données, puis les restituer sous la forme de petits points rouges sur un fond transparent, avec un niveau de zoom (par défaut: 15).

Il retournera ensuite le résultat sous la forme d'une image de type GIF.

Des algorithmes ou des bibliothèques ont-ils été développés pour me permettre de prendre cet ensemble de latitudes/longitudes et de les convertir en un ensemble de coordonnées de pixels 2D, compte tenu d'un niveau de zoom?

(Tout cela se fait côté serveur, donc je ne peux pas utiliser l'API Google Maps.)


Mise à jour: Trouvé un exemple de code en Perl qui fait quelque chose de similaire:

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

Le problème est, je ne connais pas Perl, et je n'ai pas vraiment le temps d'ouvrir un livre et de l'apprendre.

Quelqu'un peut-il m'aider à déchiffrer ce qui se passe dans cette fonction?

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

Répondre

2

« Si elle est une projection de Mercator, vous ne devriez pas avoir à vous soucier de la courbure de la terre depuis toutes les latitude/longitude lignes sont à égale distance »

Peut-être que vous pensez de la projection géographique (aka Plate Carree)? La projection de Mercator a des lignes de longitude équidistantes, mais et non ont des lignes de latitude équidistantes (lat = atan (sinh (y)), donc 90 ° est à l'infini).

BTW, le calcul pour la projection Mercator sur une sphère est here, mais si Google Maps utilise l'ellipsoïde WGS84 et que vous avez besoin de l'obtenir exactement, cela devient plus compliqué. Dans ce cas, je regarderais this, mais attention: ce n'est pas pour les faibles de cœur.

+0

Ah oui, vous avez raison. Je vais retirer ma réponse. –

9

Voici un code que j'utilise actuellement. C'est en 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); 
} 

Basé sur le code de this page, écrit par this guy.

Bonne chance!

Mise à jour:This map est un excellent moyen pour aider à comprendre comment fonctionnent les tuiles dans Google Maps

Edit: Voici un ensemble équivalent de fonctions 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 

Et 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

+ ½ - bien que la question originale était pour un.Solution NET, c'est une solution excellente et facile à implémenter, et il devrait être trivial pour le lecteur de la convertir en C# ou VB.NET. –

Questions connexes