Eckkoordinaten der statischen Google-Kartenkachel

12

Wie berechnet man die Eckkoordinaten (Begrenzungsrahmen) eines statischen Google Map-Bildes, das beispielsweise mit http://maps.googleapis.com/maps/api/staticmap?center=40.714728,-73.998672&zoom=12&size=400x400&sensor=false abgerufen wird ?

Boocko
quelle
Können Sie erklären, warum Sie diese Eckkoordinaten für jedes Bild benötigen?
Mapperz
Ich bin nicht OP, habe aber ein ähnliches Bedürfnis. Ich habe GPS-Koordinaten, die ich zeichnen möchte, und benötige ein Hintergrundbild, um die Daten zu zeichnen. Damit die Diagramme funktionieren, muss ich sicherstellen, dass ich die genauen Koordinaten des Begrenzungsrahmens aus dem Google Map-Bild habe.
Joon

Antworten:

9

Ich denke, das ist kein so schwer zu lösendes Problem, aber ich habe meine Zweifel, ob die Genauigkeit absolut korrekt ist. Zunächst müssen Sie Ihr zentrales Lat / Lon in Pixel mit gdal2tiles-Codes konvertieren. Wenn ich etwas Zeit finde und wenn Sie möchten, kann ich es in stabilen Code konvertieren, um Eckkoordinaten zu finden.

Dies ist ein Python-Code:

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))

Dann können Sie Addition oder Subtraktion verwenden, indem Sie das folgende Bild betrachten:

MATHEMATIK

Wenn Sie Punkt A finden möchten:

x = pixel_x - 200
y = pixel_y + 200

oder Sie möchten Punkt B finden:

x = pixel_x + 200
y = pixel_y + 200

und das letzte, was Sie tun müssen, ist Ihre Pixel in lat / lon zu konvertieren.

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) )

Also das Ergebnis habe ich:

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

Ich hoffe es hilft dir ....

Aragon
quelle
Vielen Dank. Die Genauigkeit ist in Ordnung. Irgendeine einfache Möglichkeit zu berechnen Resolution(zoom)? Dies ist für OSM bekannt, aber ich kann es für Google Maps nicht finden.
Boocko
versuche es zu benutzen initialResolution / (2**zoom).
Aragon
Ich habe Zweifel am letzten Teil, wie konvertieren Sie Ihre Projektion (-73.998672, 40.714728) in EPSG: 900913 (-8237494.4864285, 4970354.7325767)?
norman784
Hier wird angedeutet, dass die Auflösung (Zoom) vom Breitengrad abhängt: gis.stackexchange.com/questions/108373/…
Arivero