Chuyển đổi GeoTiff dự kiến ​​thành WGS84 bằng GDAL và Python


16

Xin lỗi nếu câu hỏi sau đây hơi ngu ngốc, nhưng tôi chỉ RẤT mới đối với toàn bộ điều này.

Tôi đang cố gắng chuyển đổi một số hình ảnh GeoTiff dự kiến ​​sang WGS84 bằng gdal trong python. Tôi đã tìm thấy một bài đăng phác thảo quá trình biến đổi các điểm trong các GeoTiff được chiếu bằng cách sử dụng một cái gì đó tương tự như sau:

from osgeo import osr, gdal

# get the existing coordinate system
ds = gdal.Open('path/to/file')
old_cs= osr.SpatialReference()
old_cs.ImportFromWkt(ds.GetProjectionRef())

# create the new coordinate system
wgs84_wkt = """
GEOGCS["WGS 84",
    DATUM["WGS_1984",
        SPHEROID["WGS 84",6378137,298.257223563,
            AUTHORITY["EPSG","7030"]],
        AUTHORITY["EPSG","6326"]],
    PRIMEM["Greenwich",0,
        AUTHORITY["EPSG","8901"]],
    UNIT["degree",0.01745329251994328,
        AUTHORITY["EPSG","9122"]],
    AUTHORITY["EPSG","4326"]]"""
new_cs = osr.SpatialReference()
new_cs .ImportFromWkt(wgs84_wkt)

# create a transform object to convert between coordinate systems
transform = osr.CoordinateTransformation(old_cs,new_cs) 

#get the point to transform, pixel (0,0) in this case
width = ds.RasterXSize
height = ds.RasterYSize
gt = ds.GetGeoTransform()
minx = gt[0]
miny = gt[3] + width*gt[4] + height*gt[5] 

#get the coordinates in lat long
latlong = transform.TransformPoint(x,y) 

Câu hỏi của tôi là, nếu tôi muốn chuyển đổi các điểm này và tạo một tệp GeoTiff WGS84 mới, đây có phải là cách tốt nhất để thực hiện không? Có một chức năng tồn tại sẽ làm như nhiệm vụ trong 1 bước?

Cảm ơn!

Câu trả lời:


21

Một cách đơn giản hơn là sử dụng các công cụ dòng lệnh GDAL:

gdalwarp infile.tif outfile.tif -t_srs "+proj=longlat +ellps=WGS84"

Điều đó có thể được gọi đủ dễ dàng thông qua kịch bản cho các công việc hàng loạt. Điều này sẽ đưa raster vào lưới mới và có các tùy chọn khác để kiểm soát các chi tiết.

http://www.gdal.org/gdalwarp.html

Hệ tọa độ đích (t_srs) có thể là PROJ.4 như được hiển thị hoặc một tệp thực tế với WKT, trong số các tùy chọn khác. Hệ thống tọa độ nguồn (-s_srs) được giả sử đã biết, nhưng có thể được đặt rõ ràng giống như mục tiêu.

Điều đó có thể dễ dàng hơn để hoàn thành công việc nếu bạn không phải sử dụng API GDAL thông qua Python.

Có một hướng dẫn để làm cong vênh với API ở đây, nó nói rằng sự hỗ trợ cho Python chưa hoàn chỉnh (tôi không biết chi tiết): http://www.gdal.org/warptut.html


1
Cảm ơn câu trả lời tuyệt vời mdsumner! Mặc dù giải pháp mà tôi đang theo sau được cho là được viết bằng python, nhưng có lẽ tôi có thể thoát khỏi việc chỉ cần lặp lệnh này trong một kịch bản python.
JT.WK

16

Như mdsumner đã nói, việc sử dụng dòng lệnh dễ dàng hơn nhiều so với các ràng buộc python, trừ khi bạn muốn thực thi rất các tác vụ phức tạp.

Vì vậy, nếu bạn thích python, giống như tôi, bạn có thể chạy công cụ dòng lệnh với:

import os  
os.sys('gdalwarp infile.tif outfile.tif -t_srs "+proj=longlat +ellps=WGS84"')

hoặc lặp qua danh sách các tệp:

listoffiles=['file1, file2, file3, filen']  
for file in listoffiles:
    os.system('gdalwarp %s %s -t_srs "+proj=longlat +ellps=WGS84"' %(file,'new_'+file))  

Và thậm chí sử dụng các công cụ đa xử lý sử dụng toàn bộ sức mạnh của máy để thực hiện các tác vụ lớn.


Cảm ơn Pablo. Các công cụ đa xử lý là thứ mà tôi chắc chắn sẽ xem xét!
JT.WK

Tại gdal 2.0, có hỗ trợ riêng cho đa xử lý - chỉ cần thêm -wo NUM_THREADS = ALL_CPUS vào lệnh gdalwarp của bạn.
vanLondon

3
os.syslà một mô-đun tích hợp; bạn muốn os.systemlệnh
Mike T

1
Câu trả lời của tôi đã lỗi thời, sub process.call là một cách tiếp cận tốt hơn.
Pablo
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.