Google 정적지도 타일의 모서리 좌표


12

정적 Google 맵 이미지의 모서리 좌표 (경계 상자)를 계산하는 방법 (예 : http://maps.googleapis.com/maps/api/staticmap?center=40.714728,-73.998672&zoom=12&size=400x400&sensor=false ?


왜 각 이미지의 모서리 좌표가 필요한지 설명 할 수 있습니까?
Mapperz

나는 OP가 아니지만 비슷한 요구가 있습니다. 플롯하려는 GPS 좌표가 있으며 데이터를 플롯하려면 배경 이미지가 필요합니다. 줄거리가 작동하려면 Google 맵 이미지에서 경계 상자의 정확한 좌표가 있는지 확인해야합니다.

답변:


9

나는 이것이 해결하기 어려운 문제가 아니라고 생각하지만 정확성이 절대적으로 정확한지에 대한 의심이 있습니다. 우선, glat2tiles 코드를 사용하여 중심 위도 / 경도를 픽셀로 변환해야합니다. 시간이 있고 원하는 경우 코너 좌표를 찾기 위해 안정적인 코드로 변환 할 수 있습니다.

이것은 파이썬 코드입니다.

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

마지막으로 픽셀을 위도 / 경도로 변환해야합니다.

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지도에서는 ​​찾을 수 없습니다.
Boocko

사용하려고합니다 initialResolution / (2**zoom).
Aragon

마지막 부분에 의문의 여지가 있습니다. 투영 (-73.998672, 40.714728)을 EPSG : 900913 (-8237494.4864285, 4970354.7325767)으로 어떻게 변환합니까?
norman784

여기에는 해상도 (줌) 위도에 의존한다는 것을 암시한다 : gis.stackexchange.com/questions/108373/...
arivero
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.