Google statik harita döşemesinin köşe koordinatları


12

Örneğin, http://maps.googleapis.com/maps/api/staticmap?center=40.714728,-73.998672&zoom=12&size=400x400&sensor=false ile getirilen statik bir Google Map görüntüsünün köşe koordinatlarını (sınırlama kutusu) nasıl hesaplayabilirim ?


her bir görüntünün köşe koordinatlarına neden ihtiyacınız olduğunu açıklayabilir misiniz?
Mapperz

Ben OP değilim, ama benzer bir ihtiyacım var. Çizmek istediğim GPS koordinatları var ve verileri çizmek için bir arka plan resmine ihtiyacım var. Arsaların çalışması için, google harita görüntüsünden sınırlayıcı kutunun doğru koordinatlarına sahip olduğumdan emin olmalıyım.
Joon

Yanıtlar:


9

Bence bu çözülmesi çok zor bir sorun değil ama doğruluğun kesinlikle doğru olup olmadığı konusunda şüphelerim var. Her şeyden önce, merkez lat / lon'nuzu gdal2tiles kodlarıyla piksele dönüştürmelisiniz. Biraz zaman bulursam ve isterseniz, köşe koordinatlarını bulmak için sabit koda dönüştürebilirim.

Bu bir Python kodu:

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

Ardından aşağıdaki resme bakarak toplama veya çıkarma kullanabilirsiniz:

MATEMATİK

A noktasını bulmak istiyorsanız:

x = pixel_x - 200
y = pixel_y + 200

veya B noktasını bulmak istiyorsanız:

x = pixel_x + 200
y = pixel_y + 200

ve son yapmanız gereken piksellerinizi lat / lon'a dönüştürmektir.

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

böylece sonuç var:

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

Umarım sana yardımcı olur ....


Teşekkürler. Doğruluk tamam. Hesaplamanın kolay bir yolu var Resolution(zoom)mı? Bu OSM için bilinir, ancak Google haritaları için bulamıyorum.
Boocko

kullanmaya çalışın initialResolution / (2**zoom).
Aragon

Son kısımla ilgili bir şüphem var, projeksiyonunuzu (-73.998672, 40.714728) EPSG'ye nasıl dönüştürüyorsunuz: 900913 (-8237494.4864285, 4970354.7325767)?
norman784

Burada Çözünürlük (yakınlaştırma) enlemine bağlıdır: gis.stackexchange.com/questions/108373/…
arivero
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.