Làm cách nào để chuyển đổi tọa độ affine thành lat / lng?


14

Tôi cực kỳ mới đối với GIS.

Tôi đang sử dụng gdalđể đọc trong bản đồ sử dụng đất / bản đồ và tôi cần chọn lat / lng của một số loại che phủ đất nhất định để lập chỉ mục thành một tập dữ liệu khác nhau chỉ được thể hiện bằng lat / lng. Thật không may, tôi không hiểu dạng tọa độ x và y được cung cấp cho tôi từ geotransform, cụ thể là originXoriginYbên dưới:

geotransform = dataset.GetGeoTransform()
originX = geotransform[0]
originY = geotransform[3]

In những giá trị này cho tôi tọa độ như thế nào (447466.693808, 4952570.40529). Làm thế nào để những điều này liên quan đến vĩ độ và kinh độ ban đầu?

Biên tập:

Đây là một ví dụ python đơn giản cho tôi những gì tôi đang tìm kiếm:

srs = osr.SpatialReference()
srs.ImportFromWkt(dataset.GetProjection())

srsLatLong = srs.CloneGeogCS()
ct = osr.CoordinateTransformation(srs,srsLatLong)
print ct.TransformPoint(originX,originY)

Bị đánh cắp từ: tolatlong.py


Dường như dữ liệu của bạn được chiếu (ví dụ: UTM) và bạn sẽ cần biết phép chiếu là gì để "không dự đoán" nó trở lại tọa độ dài / lat.

@Dan Cảm ơn, vì vậy tôi biết tôi có thể nhận được phép chiếu qua a dataset.GetProjectionRef()và tìm hiểu tôi đang sử dụng "UTM Khu vực 10", nhưng sau đó thì sao? Tôi đang loay hoay tìm kiếm các phương pháp như "không dự đoán" nhưng sắp thành null.
Giàu

xin lỗi vì đã sử dụng thuật ngữ unproject (trong ngoặc kép) vì dữ liệu ở độ thập phân không được chiếu, nhưng nếu bạn muốn lấy dữ liệu được chiếu trở lại độ thập phân từ bất kỳ phép chiếu nào, thì bạn phải (lưu ý dấu ngoặc kép) "dự án" nó trở lại một hệ tọa độ địa lý, còn gọi là dữ liệu độ thập phân.

2
Chủ đề (mới hơn) này cung cấp một ví dụ rõ ràng và một giải pháp khác: gis.stackexchange.com/questions/8430/ mẹo
whuber

Câu trả lời:


10

gdal_translate sẽ định hướng lại dữ liệu của bạn từ bất kỳ phép chiếu nào sang bất kỳ hình thức nào khác (trong trường hợp này bạn muốn EPSG: 4326) bằng cách sử dụng:

gdal_translate -a_srs epsg:4326 srcfile new_file 

hoặc bạn có thể sử dụng gdaltrasform để chuyển đổi các điểm (và tôi chắc chắn bạn cũng có thể truy cập từ Python (?))


.
whuber

gdal_translate sẽ không hoạt động theo cách bạn có (hoặc đúng hơn là nó chỉ gán EPSG: 4326 cho dữ liệu), bạn cần phải làm cong dữ liệu bằng một cái gì đó như: gdalwarp -s_srs EPSG: 32610 -t_srs EPSG: 4326 src dữ liệu đã có siêu dữ liệu proj rồi, bạn có thể bỏ tham số -s_srs.
MerseyViking

Có lẽ đây là những gì tôi đang theo đuổi. Là "epsg: 4326" có phải là biến đổi thành lat / lng toàn cầu không? Tôi nghĩ rằng tôi thấy một số lớp học mà tôi có thể cung cấp một phép chiếu, tôi đã nghĩ "WGS: 84", nhưng tôi không biết sự khác biệt.
Giàu

1
@Rich Nhấp vào thẻ "hệ thống tọa độ" trong câu hỏi của bạn, sắp xếp trang kết quả theo phiếu bầu và bắt đầu đọc. Nhiều câu hỏi của bạn sẽ được trả lời trong vòng vài phút.
whuber

7

Geotransform được ghi lại tại https://gdal.org/user/raster_data_model.html . Ý tưởng là bạn lấy tọa độ (x, y) trực tiếp từ tập dữ liệu, áp dụng phép biến đổi tuyến tính để lấy (u, v) với

u = a*x + b*y
v = c*x + d*y

(bạn có thể coi đây là định nghĩa của phép biến đổi tuyến tính), sau đó chuyển nguồn gốc bằng cách thêm geotransform [0] vào u và geotransform [3] thành v. Nó thực sự có ý định xoay, thay đổi tỷ lệ, có lẽ sửa một chút cho một số lỗi sai và đặt lại tọa độ cụ thể của dữ liệu (x, y) để khớp với hệ tọa độ đã biết. Kết quả được cho là tạo ra tọa độ dự kiến. Điều này đơn giản có nghĩa là có một thủ tục toán học lấy (kinh độ, vĩ độ) và biến chúng thành tọa độ đã biết: đây được gọi là "phép chiếu". "Không dự đoán" là làm ngược lại; vì vậy, nếu bạn biết phép chiếu nào là cần thiết, bạn áp dụng điều đó cho tọa độ biến đổi affine (x, y) để có được vĩ độ và kinh độ.

Nhân tiện, các giá trị của các hằng số a, b, c, d được cho bởi các mục 1, 2, 4 và 5 trong mảng geotransform.


1
Tôi đã đọc phần geotransform của liên kết bạn cung cấp, nhưng tôi không nghĩ đây là những gì tôi đang theo đuổi. Xin lỗi nếu tôi đang bị làm phiền, nhưng điều này không mô tả cách chiếu các chỉ số x và y (0 đến XSize hoặc YSize) cho các tọa độ được chiếu? Tôi tò mò về cách bạn dịch tọa độ dự kiến ​​thành vĩ độ và kinh độ. Một ví dụ đơn giản, geotransform xác định nguồn gốc x / y của góc trên bên trái của raster theo tọa độ dự kiến ​​(447466.693808, 4952570.40529). Làm thế nào tôi có thể biến các tọa độ đó trở lại lat / lng (đại loại như lat: 44, lng: -122).
Giàu

@Rich Không, liên kết đó không mô tả một phép chiếu. Nó chỉ mô tả sự thay đổi tọa độ giữa hai bản đồ, không phải giữa thế giới và bản đồ. Phép chiếu không biến phép biến đổi affine của tọa độ thành (lat, lon). Bạn không muốn viết mã cho điều đó nếu bạn có thể giúp nó! Việc từ chối hầu như luôn luôn là vấn đề xác định dự báo nào là cần thiết và gọi phần mềm phù hợp để thực hiện công việc cho bạn (như được đề xuất trong câu trả lời của @ iant).
whuber

Liên kết bị hỏng. @whuber Tôi có đúng rằng biến đổi affine (từ GetGeoTransform của GDAL) là một biến đổi giữa các pixel và tọa độ CRS không? Vì vậy, ví dụ, nếu dữ liệu nằm trong phép chiếu GDA, các điểm cần được chuyển đổi từ WGS84 / lat / lon sang GDAXX bằng cách sử dụng, ví dụ như Tọa độ, và sau đó thành pixel bằng cách sử dụng GeoTransform? Quá trình hai bước này là một điều gì đó đã làm tôi vấp ngã khá nhiều và tôi nghi ngờ cũng đang gây ra sự cố cho OP. Không giúp xarray / rasterio có vẻ có lỗi làm hỏng các giá trị
GeoTransform

@naught Tôi tìm thấy URL mới và cập nhật bài viết của mình.
whuber

0

Bạn có thể sử dụng như sau:

import gdal, numpy as n
def coord(file):
    padfTransform = file.GetGeoTransform()
    indices = n.indices(file.ReadAsArray().shape)
    xp = padfTransform[0] + indices[1]*padfTransform[1] + indices[1]*padfTransform[2]   
    yp = padfTransform[3] + indices[0]*padfTransform[4] + indices[0]*padfTransform[5]  
    return xp,yp
file = gdal.Open('Yourfile.tif') # A GeoTiff file
x,y = coord(file)

tọa độ sẽ trả về kinh độ (x) và vĩ độ (y) của tất cả các pixel. Hãy nhớ rằng tọa độ là góc bên trái của pixel


Không nên là indixes [1] * padfTransform [1] + chỉ số [0] * padfTransform [2] và ngược lại cho yp?
CMCDragonkai
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.