Làm cách nào để gọi gdal_translate từ mã Python?


40

Có thể sử dụng một số API gdal để gọi gdal_translatetừ mã Python không? Tôi không có nghĩa là chỉ đơn giản là thực thi gdal_translate.exe từ hệ thống tệp, mà là gọi nó bằng cách nào đó trong mã để tôi không cần biết chính xác thư mục mà gdal_translate thực thi được?


4
Vâng, kể từ gdal-2.1. Câu trả lời này nên được chấp nhận là chính xác.
Pete

Câu trả lời:



23

Xem Hướng dẫn API GDAL .

#Import gdal
from osgeo import gdal

#Open existing dataset
src_ds = gdal.Open( src_filename )

#Open output format driver, see gdal_translate --formats for list
format = "GTiff"
driver = gdal.GetDriverByName( format )

#Output to new format
dst_ds = driver.CreateCopy( dst_filename, src_ds, 0 )

#Properly close the datasets to flush to disk
dst_ds = None
src_ds = None

Nếu bạn muốn kiểm soát đầu ra nhiều hơn, chẳng hạn như thay đổi kích thước, đặt lại, v.v ... hãy sử dụng VRT làm đầu vào, đây là cách gdal_translate thực hiện bên trong.


Thật không may, điều này không bao gồm sự từ chối, phải không?
Riccardo

1
@butcher - không. Bởi vì câu hỏi không đề cập đến sự từ chối. Tất nhiên, bạn có thể định hướng lại các trình quét với API gthon python. Nếu bạn muốn biết làm thế nào, hãy hỏi một câu hỏi mới.
dùng2856

Tôi đã thực hiện nó ở đây: gis.stackexchange.com/questions/103874/, nhưng thius đã được đánh dấu là một bản sao :-(
Riccardo

2
@butcher - đã bị đóng như một bản sao của câu hỏi này. Câu hỏi của bạn cũng hỏi về gdal_translate. Bạn có biết rằng gdal_translate không phản hồi? Nếu bạn muốn từ chối, hãy sử dụng gdalwarp hoặc phương thức API python gdal - gdal.ReprojectImage
user2856

10

Có, bạn có thể gọi Tiện ích GDAL từ bên trong Python. Có một số khác biệt rất nhỏ trong cách tiếp cận tùy thuộc vào việc tiện ích là exe theo đúng nghĩa của nó hay cũng là một đoạn mã trăn. Dù bằng cách nào bạn cũng cần sử dụng mô đun quy trình con :

import subprocess

# constants
gdalTranslate = r'C:\Program Files\GDAL\gdal_translate.exe'
src = r"C:\somefolder\somefile.tif"
dst = r"C:\someotherfolder\myresul.tif"
cmd = "-ot float32 -outsize 25 25"  # just for example!

# see note below
def youCanQuoteMe(item):
    return "\"" + item + "\""

fullCmd = ' '.join([gdalTranslate, cmd, youCanQuoteMe(src), youCanQuoteMe(dst)])
subprocess.popen(fullCmd)

Bạn sẽ nhận thấy rằng tôi thêm dấu ngoặc kép thoát xung quanh đường dẫn của tôi. Điều này là do, trên Windows, tôi đã gặp rắc rối với các đường dẫn, đặc biệt là các đường dẫn có khoảng trắng hoặc khi một trong các ký tự '\' tạo một ký tự thoát ngẫu nhiên khác. Vì vậy, tôi chỉ bảo tồn con đường thích hợp trong aspec như nó đã được.

Nếu bạn đang sử dụng một trong các tiện ích python, chỉ cần thực hiện tương tự ngoại trừ exe của bạn khi bắt đầu chuỗi lệnh của quy trình con bây giờ là "C: \ python32 \ python.exe" (hoặc bất kỳ phiên bản nào bạn có) và phần tử thứ hai của bạn là tiện ích python bạn muốn sử dụng.

Rõ ràng bạn cũng có thể lặp lại trên hệ thống tệp của mình thay vì sử dụng các hằng số được mã hóa cứng, nhưng đây chỉ là một ví dụ.

EDIT - Tổng quát hóa cho các plugin
QGIS QGIS tạo / sửa đổi một số biến môi trường khi khởi động. Vì vậy, bạn có thể xây dựng các biến đường dẫn tổng quát cho các thư viện / tiện ích GDAL bằng cách sử dụng các biến này (xem Cài đặt-> Tùy chọn-> Hệ thống) thay vì các đường dẫn được mã hóa cứng trong ví dụ trên.


Vì vậy, tôi không thể làm điều này? nhập gdal_translate và sau đó gọi .main ()?
Katie E.

Không - điều đó sẽ không hiệu quả. gdal_translate không phải là gói Python, vì vậy python sẽ không biết gì về nó. Bạn sẽ gặp lỗi khi nói "ImportError No Module có tên gdal_translate". Sử dụng mô-đun quy trình con để gọi nó thay thế.
MappaGnosis

ok một câu hỏi tương tự với việc sử dụng gdal_retile.py .. Tôi đã thử làm như sau: nhập gdal_retile gdal_retile.main ("- v -r bilinear -levels 4 -ps 2048 2048 -co \" tiled = YES \ "-targetDir -optfile files.txt ") nhưng tôi gặp lỗi: Tùy chọn lệnh không được nhận dạng: - Có biết tại sao không?
Katie E.

Tôi không thể nhìn thấy vấn đề ngoại trừ dự đoán của tôi là nó có thể không giống như công tắc '--optfile'. Cái sau không được ghi lại.
MappaGnosis

@MappaGnosis Có sự thay thế gdal_translate trong thư viện gdal Python không?
đa cấp

7

Tôi làm điều này với các lệnh gdal khác nhau bằng os.system mà bạn có thể sử dụng để gọi các hàm giống như từ dòng lệnh:

os.system("gdal_translate -of GTiff " + sourcefile + " " +  destinationfile)

Nó cũng được mô tả trong bài giảng 7 ở đây: http://www.gis.usu.edu/~chrisg/python/2009/


Các lệnh GDAL có sẵn dưới dạng các hàm python trong GDAL 2.1 đến RFC 59.1 . Cũng subprocess.callan toàn hơn os.system.
Dmitri Chubarov

1
Ai đó cần viết một ví dụ hay về các hàm Python đó; Tôi đã vật lộn gdal.Warp()trong một vài giờ để có được PG:nguồn dữ liệu chính xác cutlineDSNameđể lái xe cutlineSQL. (Tôi biết, phải không? Một vài giờ thực sự làm việc gì đó ? Kinh dị! </ Đùa giỡn>). Cuối cùng nó đã hoạt động, và nó dường như nhanh hơn đáng kể so với os.system()hoặc subprocess.call(). Nó đang thực hiện ~ 2 triệu đường cắt, vì vậy tôi sẽ không biết liệu nó có thực sự nhanh hơn cho đến tối nay không ... nhưng nó hoạt động chính xác.
GT.

3

Đây là một mã nhanh chóng cho bất kỳ ai muốn lưu các băng tần từ TIF đa băng tần tổng hợp vào các tệp riêng lẻ bằng GDAL Translate trong Python.

import gdal

in_path = 'C:/GIS/Sample.tif' #input composite raster
out_path = 'C:/GIS/Output/' #output directory for individual bands as files

#Open existing raster ds
src_ds = gdal.Open(in_path)

for i in range(1,src_ds.RasterCount +1): #Save bands as individual files
    out_ds = gdal.Translate(out_path + 'band' + str(i) + '.tiff', src_ds, format='GTiff', bandList=[i])
    out_ds=None

Điều này có thể hữu ích để xử lý thêm (ví dụ: sử dụng Rasterio, như ở đây ).

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.