Đọc, sửa đổi và viết một geotiff với GDAL bằng python


11

Tôi đang thử tìm hiểu các quy trình xử lý hình ảnh Viễn thám bằng cách sử dụng các ràng buộc Python GDAL và gọn gàng. Lần thử đầu tiên, tôi đang đọc tệp địa lý Landsat8, thực hiện một thao tác đơn giản và ghi kết quả vào một tệp mới. Mã dưới đây có vẻ hoạt động tốt, ngoại trừ raster ban đầu được đổ vào tệp đầu ra, thay vì raster thao tác.

Bất kỳ ý kiến ​​hoặc đề xuất đều được hoan nghênh, nhưng đặc biệt lưu ý về lý do tại sao raster bị thao túng không hiển thị trong kết quả.

import os
import gdal

gdal.AllRegister()

file = "c:\~\LC81980242015071LGN00.tiff"
(fileRoot, fileExt) = os.path.splitext(file)
outFileName = fileRoot + "_mod" + fileExt

ds = gdal.Open(file)
band = ds.GetRasterBand(1)
arr = band.ReadAsArray()

[cols, rows] = arr.shape
arr_min = arr.Min()
arr_max = arr.Max()
arr_mean = int(arr.mean())

arr_out = numpy.where((arr < arr_mean), 10000, arr)

driver = gdal.GetDriverByName("GTiff")
outdata = driver.Create(outFileName, rows, cols, 1, gdal.GDT_UInt16)
outband = outdata.GetRasterBand(1)
outband.WriteArray(arr_out)
outdata = None

print arr_min
> 0
print arr_max
> 65535
print arr_mean
> 4856

Tôi sử dụng Python 2.7.1 trên máy Windows 7 32 bit.


Tôi đã làm cho nó hoạt động trên một DEM (Ubuntu, python 2.7.1) và nó đã tạo ra kết quả như mong đợi, với mọi thứ dưới giá trị trung bình được đặt thành 10000 và được viết thành một tiff mới. Bạn không sao chép geotransform sang hình ảnh mới để nó không được cung cấp, vì vậy bạn có thể cần phải tính đến điều đó khi cố gắng xem nó (có một lớp lót để làm điều này nhưng tôi sẽ cần phải khai thác nó). Nếu bạn có thể chỉnh sửa câu hỏi của mình với đầu ra từ gdainfo -stats original.tiffgdal-config --versioncũng có thể giúp ích.
Steven Kay

Xin chào, cảm ơn vì đã xem xét điều này! Tôi biết tôi đã bỏ qua geotransform, nghĩ rằng sẽ nhai nó sau. Tôi thấy toàn bộ hình ảnh đầu ra (sử dụng Irfanview), vì vậy đó không phải là tôi nghĩ. Tôi sẽ tạo thông tin bạn yêu cầu khi tôi trở lại chỗ ngồi tối nay.
HDR

Xin chào, tôi đang vật lộn để cung cấp thông tin bạn yêu cầu. Tôi đang sử dụng liên kết Python GDAL và tôi không chắc các lệnh bạn chỉ định tương ứng với lệnh Python như thế nào. Trong mọi trường hợp, tôi đang sử dụng GDAL-1.11.2-cp27-none-win32, như được mua từ đây . Tôi sẽ cập nhật bài viết của mình với một số thống kê trên .tiff gốc.
HDR

Array_min sẽ là gì?
Flumotion

Array_min = 0. Tôi đã cập nhật bài viết để hiển thị điều này. Cảm ơn!
HDR

Câu trả lời:


13

Tập lệnh của bạn thiếu phương thức ds.FlushCache, lưu vào đĩa những gì bạn có trong bộ nhớ khi kết thúc sửa đổi. Xem bên dưới một phiên bản sửa chữa của ví dụ của bạn. Lưu ý rằng tôi cũng đã thêm hai dòng để đặt phép chiếu và geotransform làm đầu vào

import os
import gdal

file = "path+filename"
ds = gdal.Open(file)
band = ds.GetRasterBand(1)
arr = band.ReadAsArray()
[cols, rows] = arr.shape
arr_min = arr.min()
arr_max = arr.max()
arr_mean = int(arr.mean())
arr_out = numpy.where((arr < arr_mean), 10000, arr)
driver = gdal.GetDriverByName("GTiff")
outdata = driver.Create(outFileName, rows, cols, 1, gdal.GDT_UInt16)
outdata.SetGeoTransform(ds.GetGeoTransform())##sets same geotransform as input
outdata.SetProjection(ds.GetProjection())##sets same projection as input
outdata.GetRasterBand(1).WriteArray(arr_out)
outdata.GetRasterBand(1).SetNoDataValue(10000)##if you want these values transparent
outdata.FlushCache() ##saves to disk!!
outdata = None
band=None
ds=None

Các outfile không được chiếu. Tôi đang đọc tệp HDF5 và chọn phép chiếu từ băng tần mà tôi muốn xuất GetProjection()cung cấp EPSG chính xác, nhưng dường như nó không được áp dụng. Thiếu sợi dọc GDAL? Cảm ơn!
Michael
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.