Tọa độ góc của gạch bản đồ tĩnh Google


12

Làm cách nào để tính tọa độ góc (hộp giới hạn) của hình ảnh Google Map tĩnh, được tìm nạp với ví dụ: http://maps.googleapis.com/maps/api/staticmap?center=40.714728,-73.998672&zoom=12&size=400x400&sensor=fal ?


bạn có thể giải thích tại sao bạn cần tọa độ góc của mỗi hình ảnh không?
Mapperz

Tôi không phải là OP, nhưng có một nhu cầu tương tự. Tôi có các dây GPS mà tôi muốn vẽ và cần một hình nền để vẽ dữ liệu. Để các lô hoạt động, tôi cần đảm bảo rằng tôi có các chuỗi chính xác của khung giới hạn từ hình ảnh bản đồ google.
Joon

Câu trả lời:


9

Tôi nghĩ rằng đây không phải là một vấn đề quá khó để giải quyết nhưng tôi nghi ngờ về việc liệu độ chính xác có hoàn toàn chính xác hay không. Trước hết, bạn phải chuyển đổi lat / lon trung tâm của mình thành pixel bằng mã gdal2tiles. Nếu tôi tìm thấy một chút thời gian và nếu bạn muốn, tôi có thể chuyển đổi nó thành mã ổn định để tìm tọa độ góc.

Đây là mã 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))

Sau đó, bạn có thể sử dụng phép cộng hoặc phép con bằng cách xem hình ảnh sau:

MÔN TOÁN

Nếu bạn muốn tìm điểm A:

x = pixel_x - 200
y = pixel_y + 200

hoặc bạn muốn tìm điểm B:

x = pixel_x + 200
y = pixel_y + 200

và điều cuối cùng là bạn phải làm là chuyển đổi pixel của mình thành 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) )

vì vậy kết quả tôi có:

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

Tôi hy vọng nó sẽ giúp bạn....


Cảm ơn. Độ chính xác là OK. Bất kỳ cách dễ dàng để tính toán Resolution(zoom)? Điều này được biết đến với OSM, nhưng tôi không thể tìm thấy nó cho bản đồ Google.
Boocko

cố gắng sử dụng initialResolution / (2**zoom).
Aragon

Tôi nghi ngờ với phần cuối cùng, làm thế nào để bạn chuyển đổi hình chiếu của mình (-73,998672, 40,714728) sang EPSG: 900913 (-8237494.4864285, 4970354.7325767)?
Norman784

Ở đây có gợi ý rằng Độ phân giải (thu phóng) phụ thuộc vào vĩ độ: gis.stackexchange.com/questions/108373/ chủ
arivero
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.