Pergunta

Procurando por algum código de exemplo para converter um ponto no sistema de coordenadas WGS84 em uma posição de mapa no Google Maps (posição de pixel), também com suporte a níveis de zoom.

Se os códigos estiverem bem comentados, também pode estar em outro idioma.

Você também pode me indicar um projeto Java de código aberto :)

Alguns recursos encontrados:

Camada aberta implementação.

JOSM projeto

Excelente Biblioteca de projeção de mapas Java do JH LABS.Esta é uma porta Java PROJ.4 pura.Faz projeção de WGS84 para metros.A partir daí, é bastante simples converter metros em pixels de ladrilho.

Foi útil?

Solução

Código utilitário de bloco em Java em mapki.com (ótimo recurso para desenvolvedores de mapas do Google)

Outras dicas

Aqui estão as funções em JavaSCRipt ...Conforme extraído do 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 simples de converter para Java

GeoFerramentas tem código para transformar de e para qualquer sistema de coordenadas que você possa imaginar, e entre eles também o Google Map.Também é de código aberto.No entanto, também deve ser salientado que o GeoTools é um grande biblioteca, então se você está procurando algo pequeno, rápido e fácil, provavelmente não é o caminho a percorrer.

Eu recomendo fortemente se você for fazer outras transformações de GIS/coordenadas, etc.também.

Se você usa GeoTools ou algo semelhante, também pode estar interessado em saber que o sistema de coordenadas do Google Map se chama EPSG 3785.

Eu portei isso para PHP - aqui está o código, se alguém precisar:

Para Mercador:

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

De Mercador:

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

}

Alguém pegou o código javascript do Google Maps e o portou para python: gmerc.py

Eu usei isso e funciona muito bem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top