Domanda

Ricerca di codice di esempio per convertire un punto nel sistema di coordinate WGS84 in una posizione sulla mappa in Google Maps (posizione pixel), supportando anche i livelli di zoom.

Se i codici sono ben commentati, possono essere anche in un'altra lingua.

Puoi anche indicarmi un progetto Java open source :)

Alcune risorse trovate:

OpenLayer implementazione.

JOSM progetto

Eccellente Libreria di proiezione di mappe Java da JH LAB.Questa è una porta Java PROJ.4 pura.Proiezione da WGS84 a metri.Da lì è abbastanza semplice convertire i metri in pixel piastrellati.

È stato utile?

Soluzione

Codice dell'utilità Tile in Java su mapki.com (ottima risorsa per gli sviluppatori di Google Map)

Altri suggerimenti

Ecco le funzioni in JavaSCript...Come estratto da 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];
  }

Abbastanza semplice da convertire in Java

Strumenti geografici ha un codice per trasformare da e verso qualsiasi sistema di coordinate tu possa immaginare, e tra questi anche quello di Google Map.È anche open source.Va però anche sottolineato che GeoTools è un grande libreria, quindi se stai cercando qualcosa di piccolo, veloce e facile, probabilmente non è la strada da percorrere.

Lo consiglio vivamente se hai intenzione di eseguire altre trasformazioni GIS/coordinate, ecc.anche.

Se utilizzi GeoTools o qualcosa di simile, potrebbe interessarti anche sapere che il sistema di coordinate di Google Map si chiama EPSG 3785.

L'ho portato su PHP: ecco il codice, se qualcuno ne avesse bisogno:

A Mercatore:

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

Da Mercatore:

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

}

Qualcuno ha preso il codice Javascript da Google Maps e lo ha portato su Python: gmerc.py

Ho usato questo e funziona benissimo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top