Coordenadas de las esquinas del mosaico del mapa estático de Google

12

¿Cómo calcular las coordenadas de esquina (cuadro delimitador) de una imagen estática de Google Map, obtenida con, por ejemplo, http://maps.googleapis.com/maps/api/staticmap?center=40.714728,-73.998672&zoom=12&size=400x400&sensor=false ?

Boocko
fuente
¿Puedes explicar por qué necesitas las coordenadas de las esquinas de cada imagen?
Mapperz
No soy OP, pero tengo una necesidad similar. Tengo coordenadas GPS que quiero trazar, y necesito una imagen de fondo para trazar los datos. Para que las parcelas funcionen, necesito asegurarme de tener las coordenadas precisas del cuadro delimitador de la imagen del mapa de Google.
Joon

Respuestas:

9

Creo que este no es un problema tan difícil de resolver, pero tengo mis dudas sobre si la precisión es absolutamente correcta. En primer lugar, debe convertir su lat / lon central a píxeles con códigos gdal2tiles. Si encuentro algo de tiempo y si lo desea, puedo convertirlo a código estable para encontrar coordenadas de esquina.

Este es un código de Python:

tileSize = 256
initialResolution = 2 * math.pi * 6378137 / tileSize
# 156543.03392804062 for tileSize 256 pixels
originShift = 2 * math.pi * 6378137 / 2.0
# 20037508.342789244

def LatLonToMeters( lat, lon ):
        "Converts given lat/lon in WGS84 Datum to XY in Spherical Mercator EPSG:900913"

        mx = lon * originShift / 180.0
        my = math.log( math.tan((90 + lat) * math.pi / 360.0 )) / (math.pi / 180.0)

        my = my * originShift / 180.0
        return mx, my


def MetersToPixels( mx, my, zoom):
        "Converts EPSG:900913 to pyramid pixel coordinates in given zoom level"

        res = Resolution( zoom )
        px = (mx + originShift) / res
        py = (my + originShift) / res
        return px, py


# Dont forget you have to convert your projection to EPSG:900913
mx = -8237494.4864285 #-73.998672
my = 4970354.7325767 # 40.714728
zoom = 12

pixel_x, pixel_y = LatLonToMeters(MetersToPixels( mx, my, zoom))

Luego puede usar la suma o la resta mirando la siguiente imagen:

MATEMÁTICAS

Si quieres encontrar el punto A:

x = pixel_x - 200
y = pixel_y + 200

o quieres encontrar el punto B:

x = pixel_x + 200
y = pixel_y + 200

y lo último que tienes que hacer es convertir tus píxeles a lat / lon.

def PixelsToMeters( px, py, zoom):
    "Converts pixel coordinates in given zoom level of pyramid to EPSG:900913"

    res = Resolution(zoom)
    mx = px * res - originShift
    my = py * res - originShift
    return mx, my

def MetersToLatLon( mx, my ):
    "Converts XY point from Spherical Mercator EPSG:900913 to lat/lon in WGS84 Datum"

    lon = (mx / originShift) * 180.0
    lat = (my / originShift) * 180.0

    lat = 180 / math.pi * (2 * math.atan(math.exp(lat * math.pi / 180.0)) - math.pi / 2.0)
    return lat, lon




#Result

llx, lly = MetersToLatLon( PixelsToMeters( x, y, zoom) )

entonces el resultado que tengo:

point A - UpperLeftLatLon = 40.7667530977 -74.0673365509
point B - UpperRightLatLon = 40.7667530977 -73.9300074493
point C - LowerRightLatLon = 40.6626622172 -73.9300074493
point D - LowerLeftLatLon = 40.6626622172 -74.0673365509

Espero que te ayude....

Aragón
fuente
Gracias. La precisión está bien. ¿Alguna forma fácil de calcular Resolution(zoom)? Esto es conocido por OSM, pero no puedo encontrarlo para los mapas de Google.
Boocko
Intenta usar initialResolution / (2**zoom).
Aragón
Tengo una duda con la última parte, ¿cómo convierte su proyección (-73.998672, 40.714728) a EPSG: 900913 (-8237494.4864285, 4970354.7325767)?
norman784
Aquí se insinúa que la Resolución (zoom) depende de la latitud: gis.stackexchange.com/questions/108373/…
arivero