Coordonnées de coin de la tuile de carte statique de Google

12

Comment calculer les coordonnées de coin (cadre de délimitation) d'une image statique de Google Map, récupérée avec, par exemple, http://maps.googleapis.com/maps/api/staticmap?center=40.714728,-73.998672&zoom=12&size=400x400&sensor=false ?

Boocko
la source
pouvez-vous expliquer pourquoi vous avez besoin des coordonnées de coin de chaque image?
Mapperz
Je ne suis pas OP, mais j'ai un besoin similaire. J'ai des coordonnées GPS que je veux tracer et j'ai besoin d'une image d'arrière-plan pour tracer les données. Pour que les tracés fonctionnent, je dois m'assurer d'avoir les coordonnées exactes du cadre de délimitation de l'image de la carte Google.
Joon

Réponses:

9

Je pense que ce n'est pas un problème si difficile à résoudre, mais j'ai des doutes quant à l'exactitude de la précision. Tout d'abord, vous devez convertir votre centre lat / lon en pixels avec les codes gdal2tiles. Si je trouve un peu de temps et si vous le souhaitez, je peux le convertir en code stable pour trouver les coordonnées des coins.

Ceci est un code 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))

Ensuite, vous pouvez utiliser l'addition ou la soustraction en regardant l'image suivante:

MATH

Si vous voulez trouver le point A:

x = pixel_x - 200
y = pixel_y + 200

ou vous voulez trouver le point B:

x = pixel_x + 200
y = pixel_y + 200

et la dernière chose à faire est de convertir vos pixels 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) )

donc le résultat que j'ai:

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

J'espère que ça t'aide....

Aragon
la source
Merci. La précision est correcte. Une façon simple de calculer Resolution(zoom)? Ceci est connu pour OSM, mais je ne le trouve pas pour Google maps.
Boocko
essayez d'utiliser initialResolution / (2**zoom).
Aragon
J'ai un doute avec la dernière partie, comment convertissez-vous votre projection (-73.998672, 40.714728) en EPSG: 900913 (-8237494.4864285, 4970354.7325767)?
norman784
Ici, il est laissé entendre que la résolution (zoom) dépend de la latitude: gis.stackexchange.com/questions/108373/…
arivero