Koordinat sudut ubin peta statis Google

12

Bagaimana cara menghitung koordinat sudut (kotak pembatas) dari gambar Google Map statis, diambil dengan mis. Http://maps.googleapis.com/maps/api/staticmap?center=40.714728,-73.998672&zoom=12&size=400x400&sensor=false ?

Boocko
sumber
dapatkah Anda menjelaskan mengapa Anda membutuhkan koordinat sudut setiap gambar?
Mapperz
Saya bukan OP, tetapi memiliki kebutuhan serupa. Saya memiliki koordinat GPS yang ingin saya plot, dan perlu gambar latar belakang untuk memplot data. Agar plot berfungsi, saya perlu memastikan bahwa saya memiliki koordinat akurat kotak pembatas dari gambar google map.
Joon

Jawaban:

9

Saya pikir ini bukan masalah yang sulit untuk dipecahkan, tetapi saya ragu apakah akurasinya benar-benar benar. Pertama-tama, Anda harus mengubah lat / lon pusat Anda menjadi piksel dengan kode gdal2tiles. Jika saya menemukan waktu dan jika Anda mau, saya dapat mengubahnya menjadi kode stabil untuk menemukan koordinat sudut.

Ini adalah kode 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))

Kemudian Anda dapat menggunakan penjumlahan atau substraksi dengan melihat gambar berikut:

MATI

Jika Anda ingin menemukan titik A:

x = pixel_x - 200
y = pixel_y + 200

atau Anda ingin menemukan titik B:

x = pixel_x + 200
y = pixel_y + 200

dan hal terakhir yang harus Anda lakukan adalah mengonversi piksel Anda ke 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) )

jadi hasilnya saya punya:

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

Saya harap ini membantu Anda ....

Aragon
sumber
Terima kasih. Akurasinya OK. Adakah cara mudah untuk menghitung Resolution(zoom)? Ini dikenal untuk OSM, tetapi saya tidak dapat menemukannya untuk Google maps.
Boocko
coba gunakan initialResolution / (2**zoom).
Aragon
Saya ragu dengan bagian terakhir, bagaimana Anda mengubah proyeksi Anda (-73.998672, 40.714728) menjadi EPSG: 900913 (-8237494.4864285, 4970354.7325767)?
norman784
Di sini diisyaratkan bahwa Resolusi (zoom) tergantung pada garis lintang: gis.stackexchange.com/questions/108373/…
arivero