ubicacion - Código de Java para WGS84 a la posición del mapa de Google y viceversa
obtener localizacion en android (6)
Alguien tomó el código javascript de Google Maps y lo portó a python: gmerc.py
Lo he usado y funciona genial.
Búsqueda de un código de muestra para convertir un punto en el sistema de coordenadas WGS84 en una posición del mapa en Google Maps (posición de píxel), que también admite niveles de zoom.
Si los códigos están bien comentados, también pueden estar en otro idioma.
También puedes dirigirme a un proyecto Java de código abierto :)
Algunos recursos encontrados:
Implementación de OpenLayer .
Proyecto JOSM
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.
GeoTools tiene un código para transformar desde y hacia cualquier sistema de coordenadas que puedas 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 gran biblioteca, por lo que si buscas 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 SIG / coordenadas, etc.
Si usa GeoTools o algo similar, también podría estar interesado en saber que el sistema de coordenadas de Google Map se llama EPSG 3785.
Aquí están las funciones en JavaSCript ... Como se extrae 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 convertir a Java
Transmití esto a PHP: aquí está el código, si alguien lo necesitara:
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);
/*
* 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;
}
}
Código de utilidad de mosaico en Java en mapki.com (gran recurso para desarrolladores de mapas de google)