2008-08-11 29 views
7

Recherche d'un exemple de code pour convertir un point en système de coordonnées WGS84 à une position de carte dans Google Maps (position de pixels), supportant également les niveaux de zoom.code Java pour WGS84 Google position carte et retour

Si les codes est bien commenté, il peut aussi être dans une autre langue.

Vous pouvez également me pointer vers un projet Java open source :)

Quelques ressources trouvées:

OpenLayer mise en œuvre.

JOSM projet

Excellente Java Map Projection Library de JH LABS. C'est un port java pur.4. Est-ce que la projection de WGS84 en mètres. De là, il est assez simple de convertir les compteurs en pixels.

Répondre

4

Tile utility code in Java sur mapki.com (grande ressource pour les développeurs Google map)

+2

Je l'ai trouvé avec la machine à remonter le temps: http://web.archive.org/web/20110809084551/http://mapki.com/wiki/Tile_utility_code_in_Java –

0

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

Je l'ai utilisé cela et il fonctionne très bien.

3

GeoTools a le code de transformer et d'environ à tout système de coordonnées que vous pouvez imaginer, et parmi eux aussi Google Map de. C'est aussi open source. Toutefois, il convient également de souligner que GeoTools est une grande bibliothèque, donc si vous cherchez quelque chose de petit, rapide et facile, il est sans doute pas la voie à suivre.

Je recommande vivement que si vous allez faire d'autres SIG/transformations de coordonnées, etc. ainsi.

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

+0

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

3

Voici les fonctions JAVASCRIPT ... Comme extraite 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]; 
    } 

assez facile à convertir en Java

2

Je Ported ce PHP - voici le code, si quelqu'un en aurait besoin:

Pour 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

J'ai vu quelques formules pour traduire le formulaire W GS84 à EPSG 3785 et ils demandent aussi l'hémisphère et le fuseau horaire (méridien)? –

+0

Cela ne fonctionne pas par exemple double [] c = MercatorTransform.forward (558832.516608631,180065.50201851176); retourne: 7291651.346660811 2.3810769326496765E8 –