12 votos

Coordenadas de la esquina del mosaico del mapa estático de Google

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

0 votos

¿puede explicar por qué necesita las coordenadas de las esquinas de cada imagen?

0 votos

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 los gráficos funcionen necesito asegurarme de que tengo las coordenadas exactas del cuadro delimitador de la imagen del mapa de Google.

9voto

texai Puntos 178

Creo que no es un problema tan difícil de resolver, pero tengo mis dudas sobre si la precisión es absolutamente correcta. En primer lugar, usted tiene que convertir su centro lat / lon a los píxeles con los códigos gdal2tiles. Si encuentro algo de tiempo y si quieres, puedo convertirlo en código estable para encontrar las coordenadas de las esquinas.

Este es un código 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))

Entonces puedes utilizar la suma o la resta mirando la siguiente imagen:

MATH

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 hay que hacer es convertir los píxeles en 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) )

así que 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....

0 votos

Gracias. La precisión está bien. Alguna forma fácil de calcular Resolution(zoom) ? Esto se sabe para OSM, pero no lo encuentro para Google maps.

0 votos

intente utilizar initialResolution / (2**zoom) .

0 votos

Tengo una duda con la última parte, ¿cómo conviertes tu proyección (-73,998672, 40,714728) a EPSG:900913 (-8237494,4864285, 4970354,7325767)?

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X