Georeferences raster sử dụng GDAL và Python?


10

Tôi muốn địa lý một raster sử dụng pythonGDAL. Cách tiếp cận hiện tại của tôi là gọi gdal_translategdalwarpsử dụng os.systemvà một danh sách các điểm kiểm soát mặt đất xấu xí. Tôi thực sự muốn một cách để làm điều này tự nhiên trong python.

Đây là quy trình hiện tại tôi đang sử dụng:

import os

os.system('gdal_translate -of GTiff -gcp 1251.92 414.538 -7.9164e+06 5.21094e+06 -gcp 865.827 107.699 -7.91651e+06 5.21104e+06  "inraster.tif" "outraster1.tif"')
os.system('gdalwarp -r bilinear -tps -co COMPRESS=NONE "outraster2.tif" "outraster3.tif"')

Có một câu hỏicâu trả lời trước đó từ năm 2012, trạng thái gdal_translatecó thể được truy cập sau khi nhập gdal. Tôi không chắc liệu nó có bị lỗi thời hay không, nhưng khi tôi chạy, from osgeo import gdaltôi không thấy đó gdal.gdal_translatelà một lựa chọn.

Tôi không biết nó có tồn tại hay không nhưng tôi rất thích nếu tôi có thể dịch và từ chối các trình raster theo cách pythonic. Ví dụ:

# translate
gcp_points = [(1251.92, 414.538), (-7.9164e+06, 5.21094e+06)]
gdal.gdal_translate(in_raster, gcp_points, out_raster1)

# warp
gdal.gdalwarp(out_raster1, out_raster2, 'bilinear', args*)

Là một cách tiếp cận như vậy có thể?


1
gdal_translate và gdalwarp và các tiện ích gdal khác không phải là các gói / mô-đun python, chúng là các tệp thực thi độc lập. Bạn có thể sử dụng os.system hoặc (tốt nhất) sub process.Popen để gọi chúng.
dùng2856

@Luke vậy có cách nào tương tác với các tiện ích gdal này không? Tôi rất vui khi khám phá cách viết trình bao bọc trăn cho những thứ này nếu không tồn tại.
djq

Bạn có thể sử dụng API gthon python để làm gần như mọi thứ mà các tiện ích gdal_translate và gdalwarp có thể, nó chỉ phức tạp hơn một chút. Kiểm tra gdal.AutoCreateWarpedVRT và gdal Driver.CreateCopy.
dùng2856

Câu trả lời:


17

Đây là một ví dụ mà gần như những gì bạn yêu cầu. Các tham số chính là geotransformmảng mà gdal sử dụng để mô tả vị trí raster (vị trí, tỷ lệ pixel và độ nghiêng) và epsgmã của hình chiếu. Cùng với đó, đoạn mã sau sẽ định vị chính xác raster và chỉ định phép chiếu của nó.

Tôi đã không kiểm tra điều này nhiều, nhưng nó dường như làm việc cho tôi. Bạn sẽ phải đảm bảo tọa độ tôi đặt là chính xác và có thể thay đổi hình chiếu và tỷ lệ / kích thước pixel. Hy vọng nó giúp.

from osgeo import gdal, osr

src_filename ='/path/to/source.tif'
dst_filename = '/path/to/destination.tif'

# Opens source dataset
src_ds = gdal.Open(src_filename)
format = "GTiff"
driver = gdal.GetDriverByName(format)

# Open destination dataset
dst_ds = driver.CreateCopy(dst_filename, src_ds, 0)

# Specify raster location through geotransform array
# (uperleftx, scalex, skewx, uperlefty, skewy, scaley)
# Scale = size of one pixel in units of raster projection
# this example below assumes 100x100
gt = [-7916400, 100, 0, 5210940, 0, -100]

# Set location
dst_ds.SetGeoTransform(gt)

# Get raster projection
epsg = 3857
srs = osr.SpatialReference()
srs.ImportFromEPSG(epsg)
dest_wkt = srs.ExportToWkt()

# Set projection
dst_ds.SetProjection(dest_wkt)

# Close files
dst_ds = None
src_ds = None

2
Điều này đúng nhưng nếu bạn muốn chính xác hơn, trong trường hợp xoay vòng, bạn phải sử dụng Biến đổi affine và tính toán các tham số đúng với gói Affine ( tải xuống từ đây ). Cách sử dụng: 'Affine.scale (PARAMETER) * Affine.rotation (ANGLE)'. PARAMETER là từ tỷ lệ pixel của hai hình ảnh, bạn có thể sử dụng 'gdalinfo' hoặc PIL để biết kích thước pixel, ANGLE là góc.
CaMa
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.