Question

Recherche d'un exemple de code pour convertir un point dans le système de coordonnées WGS84 en une position sur la carte dans Google Maps (position du pixel), prenant également en charge les niveaux de zoom.

Si le code est bien commenté, il peut également l'être dans une autre langue.

Vous pouvez également m'indiquer un projet Java open source :)

Quelques ressources trouvées :

Couche ouverte mise en œuvre.

JOSM projet

Excellent Bibliothèque de projection de cartes Java de JH LABS.Il s'agit d'un pur port Java PROJ.4.Effectue une projection du WGS84 aux mètres.À partir de là, il est assez simple de convertir des mètres en pixels de tuile.

Était-ce utile?

La solution

Code utilitaire de tuile en Java sur mapki.com (excellente ressource pour les développeurs de Google Maps)

Autres conseils

Voici les fonctions de JavaSCript...Extrait d'OpenLayers

function toMercator (lon, lat) {
  var x = lon * 20037508.34 / 180;
  var y = Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180);
  y = y * 20037508.34 / 180;

  return [x, y];
  }

function inverseMercator (x, y) {
  var lon = (x / 20037508.34) * 180;
  var lat = (y / 20037508.34) * 180;

  lat = 180/Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2);

  return [lon, lat];
  }

Assez simple à convertir en Java

GéoOutils a du code à transformer vers et depuis n'importe quel système de coordonnées que vous pourriez imaginer, et parmi eux également celui de Google Map.C'est aussi open source.Cependant, il convient également de souligner que GeoTools est un grand bibliothèque, donc si vous recherchez quelque chose de petit, rapide et facile, ce n'est probablement pas la voie à suivre.

Je le recommanderais fortement si vous envisagez d'effectuer d'autres transformations SIG/coordonnées, etc.aussi.

Si vous utilisez GeoTools ou quelque chose de similaire, vous pourriez également être intéressé de savoir que le système de coordonnées de Google Map s'appelle EPSG 3785.

Je l'ai porté en PHP - voici le code, si quelqu'un en a besoin :

À Mercator :

$lon = ($lon * 20037508.34) / 180;
$lat = log(tan((90 + $lat) * M_PI / 360)) / (M_PI / 180);
$lat = $lat * 20037508.34 / 180;

De Mercator :

$lon = ($lon / 20037508.34) * 180;
$lat = ($lat / 20037508.34) * 180;
$lat = 180/M_PI * (2 * atan(exp($lat * M_PI / 180)) - M_PI / 2);
/*
 * Utility functions to transform between wgs84 and google projection coordinates
 * Derived from openmap http://openmap.bbn.com/
 */

public class MercatorTransform {
    public final static double NORTH_POLE = 90.0;
    public final static double SOUTH_POLE = -NORTH_POLE;
    public final static double DATELINE = 180.0;
    public final static double LON_RANGE = 360.0;

    final public static transient double wgs84_earthEquatorialRadiusMeters_D = 6378137.0;
    private static double latfac = wgs84_earthEquatorialRadiusMeters_D;
    private static double lonfac = wgs84_earthEquatorialRadiusMeters_D;

    final public static transient double HALF_PI_D = Math.PI / 2.0d;

    /**
     * Returns google projection coordinates from wgs84 lat,long coordinates
     */
    public static double[] forward(double lat, double lon) {

        lat = normalizeLatitude(lat);
        lon = wrapLongitude(lon);

        double latrad = Math.toRadians(lat);
        double lonrad = Math.toRadians(lon);

        double lat_m = latfac * Math.log(Math.tan(((latrad + HALF_PI_D) / 2d)));
        double lon_m = lonfac * lonrad;

        double[] x = { lon_m, lat_m };
        return x;
    }

    /**
     * Returns wgs84 lat,long coordinates from google projection coordinates
     */
    public static float[] inverse(float lon_m, float lat_m) {
        double latrad = (2d * Math.atan(Math.exp(lat_m / latfac))) - HALF_PI_D;
        double lonrad = lon_m / lonfac;

        double lat = Math.toDegrees(latrad);
        double lon = Math.toDegrees(lonrad);

        lat = normalizeLatitude(lat);
        lon = wrapLongitude(lon);
        float[] x = { (float) lat, (float) lon };

        return x;
    }

    private static double wrapLongitude(double lon) {
        if ((lon < -DATELINE) || (lon > DATELINE)) {
            lon += DATELINE;
            lon = lon % LON_RANGE;
            lon = (lon < 0) ? DATELINE + lon : -DATELINE + lon;
        }
        return lon;
    }

    private static double normalizeLatitude(double lat) {
        if (lat > NORTH_POLE) {
            lat = NORTH_POLE;
        }
        if (lat < SOUTH_POLE) {
            lat = SOUTH_POLE;
        }
        return lat;
    }

}

Quelqu'un a pris le code javascript de Google Maps et l'a porté sur python : gmerc.py

Je l'ai utilisé et ça fonctionne très bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top