พิกัดมุมของไทล์แผนที่แบบคงที่ของ Google


12

วิธีการคำนวณพิกัดมุม (กล่องขอบ) ของรูปภาพ Google แผนที่แบบคงที่ซึ่งดึงมาด้วยเช่นhttp://maps.googleapis.com/maps/api/staticmap?center=40.714728,-73.998672&zoom=12&size=400x400&sensor=false ?


คุณช่วยอธิบายได้ไหมว่าทำไมคุณจึงต้องการพิกัดมุมของแต่ละภาพ
Mapperz

ฉันไม่ได้เป็น OP แต่มีความต้องการที่คล้ายกัน ฉันมีพิกัด GPS ที่ฉันต้องการลงจุดและต้องการภาพพื้นหลังเพื่อลงจุดข้อมูล เพื่อให้แผนการทำงานฉันต้องแน่ใจว่าฉันมี coords ที่ถูกต้องของกล่อง bounding จากภาพแผนที่ google
Joon

คำตอบ:


9

ฉันคิดว่านี่ไม่ใช่ปัญหาที่แก้ไขได้ยาก แต่ฉันมีข้อสงสัยเกี่ยวกับความถูกต้องที่แน่นอน ก่อนอื่นคุณต้องแปลง lat lat / lon ของคุณเป็นพิกเซลด้วยรหัส gdal2tiles ถ้าฉันหาเวลาและถ้าคุณต้องการฉันสามารถแปลงเป็นรหัสที่เสถียรสำหรับการค้นหาพิกัดมุม

นี่คือรหัส 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))

จากนั้นคุณสามารถใช้การเพิ่มหรือการแทนที่โดยดูภาพต่อไปนี้

คณิตศาสตร์

หากคุณต้องการหาจุด A:

x = pixel_x - 200
y = pixel_y + 200

หรือคุณต้องการค้นหาจุด B:

x = pixel_x + 200
y = pixel_y + 200

และสิ่งสุดท้ายที่คุณต้องทำคือแปลงพิกเซลเป็น 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) )

ดังนั้นฉันมีผล:

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

ฉันหวังว่ามันจะช่วยคุณ ....


ขอบคุณ ความแม่นยำก็โอเค วิธีง่ายๆในการคำนวณResolution(zoom)? เป็นที่รู้จักกันดีสำหรับ OSM แต่ฉันหามันไม่เจอใน Google maps
Boocko

initialResolution / (2**zoom)พยายามที่จะใช้
Aragon

ฉันมีข้อสงสัยในส่วนสุดท้ายคุณจะแปลงการฉาย (-73.998672, 40.714728) เป็น EPSG ได้อย่างไร: 900913 (-8237494.4864285, 4970354.7325767)?
norman784

ที่นี่มีคำใบ้
arivero
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.