Pregunta

Buscando algún código de muestra para convertir un punto en el sistema de coordenadas WGS84 a una posición de mapa en Google Maps (posición de píxeles), que también admita niveles de zoom.

Si el código está bien comentado, entonces también puede estar en algún otro idioma.

También puedes indicarme un proyecto Java de código abierto :)

Algunos recursos encontrados:

Capa abierta implementación.

josm proyecto

Excelente Biblioteca de proyección de mapas de Java de JH LABORATORIOS.Este es un puerto Java PROJ.4 puro.Hace proyección desde WGS84 a metros.A partir de ahí, es bastante sencillo convertir metros en píxeles en mosaico.

¿Fue útil?

Solución

Código de utilidad Tile en Java en mapki.com (excelente recurso para desarrolladores de mapas de Google)

Otros consejos

Aquí están las funciones en JavaSScript...Extraído de 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];
  }

Bastante sencillo de convertir a Java

GeoHerramientas tiene código para transformar hacia y desde cualquier sistema de coordenadas que puedas imaginar, y entre ellos también el de Google Map.También es de código abierto.Sin embargo, también cabe señalar que GeoTools es una grande biblioteca, por lo que si buscas algo pequeño, rápido y fácil, probablemente no sea el camino a seguir.

Sin embargo, lo recomendaría encarecidamente si va a realizar otras transformaciones de coordenadas/SIG, etc.también.

Si utilizas GeoTools o algo similar, quizás también te interese saber que el sistema de coordenadas de Google Map se llama EPSG 3785.

Porté esto a PHP; aquí está el código, por si alguien lo necesita:

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

}

Alguien tomó el código javascript de Google Maps y lo transfirió a Python: gmerc.py

He usado esto y funciona muy bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top