Coordenadas de canto do bloco de mapas estáticos do Google

12

Como calcular as coordenadas dos cantos (caixa delimitadora) de uma imagem estática do Google Map, obtida com, por exemplo, http://maps.googleapis.com/maps/api/staticmap?center=40.714728,-73.998672&zoom=12&size=400x400&sensor=false ?

Boocko
fonte
você pode explicar por que precisa das coordenadas de canto de cada imagem?
Mapperz
Não sou OP, mas tenho uma necessidade semelhante. Tenho cabos GPS que quero plotar e preciso de uma imagem de fundo para plotar os dados. Para que as plotagens funcionem, preciso garantir que eu tenha as cordas precisas da caixa delimitadora da imagem do mapa do Google.
Joon

Respostas:

9

Acho que esse não é um problema tão difícil de resolver, mas tenho minhas dúvidas sobre se a precisão está absolutamente correta. Primeiro de tudo, você precisa converter o centro de lat / lon em pixels com os códigos gdal2tiles. Se eu encontrar algum tempo e se quiser, posso convertê-lo em código estável para encontrar as coordenadas dos cantos.

Este é um 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))

Em seguida, você pode usar adição ou subtração olhando a seguinte imagem:

MATEMÁTICA

Se você deseja encontrar o ponto A:

x = pixel_x - 200
y = pixel_y + 200

ou você deseja encontrar o ponto B:

x = pixel_x + 200
y = pixel_y + 200

e a última coisa que você precisa fazer é converter seus pixels em 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) )

então o resultado que tenho:

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 ajude você ....

Aragão
fonte
Obrigado. A precisão está boa. Alguma maneira fácil de calcular Resolution(zoom)? Isso é conhecido pelo OSM, mas não consigo encontrá-lo no Google Maps.
Boocko 10/01
tente usar initialResolution / (2**zoom).
Aragon
Tenho uma dúvida com a última parte, como converter sua projeção (-73.998672, 40.714728) em EPSG: 900913 (-8237494.4864285, 4970354.7325767)?
norman784
Aqui é sugerido que resolução (zoom) depende da latitude: gis.stackexchange.com/questions/108373/...
arivero