Python GDAL: Viết raster mới bằng phép chiếu từ cũ


8

Nếu tôi đọc trong một hình ảnh raster dưới dạng một mảng, sau đó thực hiện một số thay đổi cho các giá trị trong mảng, làm thế nào để tôi lưu mảng đó dưới dạng một raster có cùng thông tin chiếu như mảng ban đầu?

Cụ thể, tôi đang tiến hành xử lý trên một số khối ISIS3 từ Sao Hỏa. Chúng không được chiếu trong bất kỳ tùy chọn SetWellKnownGeogCS đẹp nào. Có lẽ điều này làm cho vấn đề của tôi hơi bất thường, nhưng tôi nghĩ rằng nó đáng để ghi lại tất cả các giải pháp của tôi.

Câu trả lời:


16

Đây là thói quen tôi đã phát triển để chuyển đổi các khối ISIS3 thành GTiff. Tôi hy vọng một cách tiếp cận tương tự sẽ hoạt động giữa bất kỳ loại trình điều khiển nào (mặc dù tôi nghĩ rằng phương thức driver.Create () có thể giới hạn sự lựa chọn của tệp đầu ra).

import numpy as np
import gdal
from gdalconst import *
from osgeo import osr

# Function to read the original file's projection:
def GetGeoInfo(FileName):
    SourceDS = gdal.Open(FileName, GA_ReadOnly)
    NDV = SourceDS.GetRasterBand(1).GetNoDataValue()
    xsize = SourceDS.RasterXSize
    ysize = SourceDS.RasterYSize
    GeoT = SourceDS.GetGeoTransform()
    Projection = osr.SpatialReference()
    Projection.ImportFromWkt(SourceDS.GetProjectionRef())
    DataType = SourceDS.GetRasterBand(1).DataType
    DataType = gdal.GetDataTypeName(DataType)
    return NDV, xsize, ysize, GeoT, Projection, DataType

# Function to write a new file.
def CreateGeoTiff(Name, Array, driver, NDV, 
                  xsize, ysize, GeoT, Projection, DataType):
    if DataType == 'Float32':
        DataType = gdal.GDT_Float32
    NewFileName = Name+'.tif'
    # Set nans to the original No Data Value
    Array[np.isnan(Array)] = NDV
    # Set up the dataset
    DataSet = driver.Create( NewFileName, xsize, ysize, 1, DataType )
            # the '1' is for band 1.
    DataSet.SetGeoTransform(GeoT)
    DataSet.SetProjection( Projection.ExportToWkt() )
    # Write the array
    DataSet.GetRasterBand(1).WriteArray( Array )
    DataSet.GetRasterBand(1).SetNoDataValue(NDV)
    return NewFileName

# Open the original file
FileName = 'I29955002trim.cub'    # This is the ISIS3 cube file
                                  # It's an infra-red photograph
                                  # taken by the 2001 Mars Odyssey orbiter.
DataSet = gdal.Open(FileName, GA_ReadOnly)
# Get the first (and only) band.
Band = DataSet.GetRasterBand(1)
# Open as an array.
Array = Band.ReadAsArray()
# Get the No Data Value
NDV = Band.GetNoDataValue()
# Convert No Data Points to nans
Array[Array == NDV] = np.nan

# Now I do some processing on Array, it's pretty complex 
# but for this example I'll just add 20 to each pixel.
NewArray = Array + 20  # If only it were that easy

# Now I'm ready to save the new file, in the meantime I have 
# closed the original, so I reopen it to get the projection
# information...
NDV, xsize, ysize, GeoT, Projection, DataType = GetGeoInfo(FileName)

# Set up the GTiff driver
driver = gdal.GetDriverByName('GTiff')

# Now turn the array into a GTiff.
NewFileName = CreateGeoTiff('I29955002trim', NewArray, driver, NDV, 
                            xsize, ysize, GeoT, Projection, DataType)

Và đó là nó. Tôi có thể mở cả hai hình ảnh trong QGIS. Và gdalinfo trên một trong hai tệp cho thấy rằng tôi có cùng thông tin chiếu và hội nghị địa lý.


1
Có vẻ như PyGDAL đã vượt ra ngoài việc sử dụng các chuỗi cho những thứ như kiểu dữ liệu và sử dụng Không có giá trị dữ liệu. Cần phải điều chỉnh một số thứ ở đây.
Ahmed Fasih
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.