Codul Java pentru WGS84 la poziția hărții Google și înapoi

Căutarea unui exemplu de cod pentru transformarea unui punct în sistemul de coordonate WGS84 într-o poziție a hărții în Hărți Google (poziția pixelilor), care susține și nivelurile de zoom.

Dacă codurile sunt bine comentate, atunci poate fi și în altă limbă.

De asemenea, puteți să mă îndreptați către un proiect Java open source :)

Unele resurse găsite:

OpenLayer implementation.

JOSM project

Excelentă Bibliotecă de proiectare Java Map de la JH LABS. Acesta este un port de PROJ.4 pur java. Are proiecția de la WGS84 la contoare. De acolo este destul de simplu să convertiți contoarele la pixeli de țiglă.

0
fr hi bn

6 răspunsuri

GeoTools has code to transform to and from about any coordinate system you could imagine, and among them also Google Map's. It's also open source. However, it should also be pointed out that GeoTools is a large library, so if you're looking something small, quick and easy, it's likely not the way to go.

Mi-ar recomanda foarte mult, deși dacă aveți de gând să facă alte transformări GIS/coordonate, etc, de asemenea.

Dacă utilizați GeoTools sau ceva similar, s-ar putea să fiți interesat de faptul că sistemul de coordonate Google Map este denumit EPSG 3785.

0
adăugat
Adresa URL nouă geotools.org
adăugat autor Jan, sursa
/*
 * 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
adăugat
Am văzut câteva formule care se traduc din WGS84 la EPSG 3785 și cer, de asemenea, emisfera și fusul orar (meridianul)?
adăugat autor Juan Diego, sursa
Acest lucru nu funcționează, de exemplu, dublu [] c = MercatorTransform.forward (558832.516608631,180065.5020185117 & zwnj; 6); returnează: 7291651.346660811 2.3810769326496765E8
adăugat autor Jeryl Cook, sursa

Someone took the JavaScript code from Google Maps and ported it to python: gmerc.py

Am folosit acest lucru și merge bine.

0
adăugat

Tile utility code in Java on mapki.com (great resource for Google map developers)

0
adăugat
adăugat autor Arthur Dent, sursa

Iată funcțiile din JavaSCript ... Cum este extras din 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];
  }

Destul de simplu de convertit la Java

0
adăugat

Am pornit acest lucru la PHP - iată codul, dacă cineva ar avea nevoie de el:

La mercator:

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

De la 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);
0
adăugat