2009-10-21 5 views
2

Je souhaite générer dynamiquement une superposition de Google Maps, qui consiste en une seule image GIF/PNG transparente avec plusieurs points à différents emplacements.Utilisation de la bibliothèque SharpMap pour générer une superposition Google Maps

Il y aura une grande quantité de points et si j'utilise des marqueurs normaux, les performances seront inacceptables. Je suis tombé sur la bibliothèque SharpMap et il ressemble à une excellente bibliothèque complète pour traiter les cartes.

Problème est, c'est aussi très grand et je ne sais pas par où commencer.

Pour commencer, je ne pense pas avoir besoin d'utiliser tout le framework, et je n'ai même pas besoin d'instancier un objet 'Map'. Tout ce que je dois faire est de convertir une collection de coordonnées de latitude/longitude en une collection de coordonnées de pixels, étant donné le niveau de zoom actuel et la taille de la fenêtre (qui est fixe). Est-ce que quelqu'un qui a de l'expérience avec SharpMap peut me diriger vers les classes/espaces de noms que je pourrais/devrait utiliser pour faire cela?


Vous avez trouvé un article en rapport avec ceci, mais appliqué à Google Earth plutôt qu'à l'API Maps.

http://web.archive.org/web/20080113140326/http://www.sharpgis.net/PermaLink,guid,f5bf2808-4cda-4f41-9ae5-98109efeb8b0.aspx

Essayer d'obtenir le fonctionnement de l'échantillon.

Répondre

2

J'utilise la classe suivante pour convertir lat/long à x/y:

public static class StaticMapHelper 
{ 
    private const long offset = 268435456; 
    private const double radius = offset/Math.PI; 

    private static double LongitudeToX(double longitude) 
    { 
     return Math.Round(offset + radius * longitude * Math.PI/180); 
    } 

    private static double LatitudeToY(double latitude) 
    { 
     return Math.Round(offset - radius * Math.Log((1 + Math.Sin(latitude * Math.PI/180))/(1 - Math.Sin(latitude * Math.PI/180)))/2); 
    } 

    private static double XToLongitude(double x) 
    { 
     return ((Math.Round(x) - offset)/radius) * 180/Math.PI; 
    } 

    private static double YToLatitude(double y) 
    { 
     return (Math.PI/2 - 2 * Math.Atan(Math.Exp((Math.Round(y) - offset)/radius))) * 180/Math.PI; 
    } 

    public static GeoPoint XYToLongitudeLatitude(int offsetX, int offsetY, double centerLongitude, double centerLatitude, int googleZoom) 
    { 
     double zoom_factor = Math.Pow(2, 21 - googleZoom); 
     double longitude = XToLongitude(LongitudeToX(centerLongitude) + (offsetX * zoom_factor)); 
     double latitude = YToLatitude(LatitudeToY(centerLatitude) + (offsetY * zoom_factor)); 
     return new GeoPoint(longitude, latitude); 
    } 

    public static GeoPoint LongitudeLatitudeToXY(int offsetX, int offsetY, double centerLongitude, double centerLatitude, int googleZoom) 
    { 
     double zoom_factor = Math.Pow(2, 21 - googleZoom); 
     double x = (LongitudeToX(offsetX) - LongitudeToX(centerLongitude))/zoom_factor; 
     double y = (LatitudeToY(offsetY) - LatitudeToY(centerLatitude))/zoom_factor; 
     return new GeoPoint(x, y); 
    } 

} 
Questions connexes