2008-08-11 9 views
7

Búsqueda de código de muestra para convertir un punto en el sistema de coordenadas WGS84 a una posición del mapa en Google Maps (posición de píxel), también admite niveles de zoom.Código Java para WGS84 a la posición del mapa de Google y

Si los códigos están bien comentados, también pueden estar en otro idioma.

También me puede apuntar a un proyecto de código abierto de Java :)

Algunos recursos que se encuentran:

OpenLayer aplicación.

JOSM proyecto

Excelente Java Map Projection Library de JH LABS. Este es un puerto java PROJ.4 puro. Hace la proyección de WGS84 a metros. A partir de ahí, es bastante sencillo convertir metros a píxeles de mosaico.

Respuesta

4

Tile utility code in Java en mapki.com (gran recurso para los desarrolladores mapa de Google)

+2

Lo encontré con la máquina de retorno: http://web.archive.org/web/20110809084551/http://mapki.com/wiki/Tile_utility_code_in_Java –

0

Alguien tomó el código JavaScript de Google Maps y portado a Python: gmerc.py

He utilizado este y funciona muy bien.

3

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

Sin embargo, lo recomendaría encarecidamente si también vas a hacer otras transformaciones GIS/coordenadas, etc.

Si utiliza GeoTools o algo similar, que también puede estar interesado en saber que el mapa de Google sistema de coordenadas se llama EPSG 3785.

+0

Nueva URL http: // www.geotools.org/ – Jan

3

Estas son las funciones en JavaScript ... Como 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 para convertir a Java

2

me portado este a PHP - aquí está el código, si alguien que necesitaría:

Para 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); 
1
/* 
* 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; 
    } 

} 
+0

He visto algunas fórmulas para traducir la forma W GS84 a EPSG 3785 y preguntan también por el hemisferio y la zona horaria (meridiano)? –

+0

Esto no funciona, por ejemplo, double [] c = MercatorTransform.forward (558832.516608631,180065.50201851176); devoluciones: 7291651.346660811 2.3810769326496765E8 –

Cuestiones relacionadas