使用GDAL和Python进行地理配准栅格?


10

我想使用python和对栅格进行地理配准GDAL。我当前的方法是调用gdal_translategdalwarp使用os.system地面控制点列表。我真的很想在本地进行此操作python

这是我正在使用的当前过程:

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"')

有一个以前的问题答案在2012年里面写明了gdal_translate可以导入后进行访问gdal。我不确定是否已过时,或者是否错误,但是当我运行时,from osgeo import gdal我不认为这gdal.gdal_translate是一个选择。

我不知道它是否存在,但是如果我能以pythonic的方式翻译和重新投影栅格,我将不胜感激。例如:

# 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*)

这样的方法可行吗?


1
gdal_translate和gdalwarp以及其他gdal实用程序不是python软件包/模块,它们是独立的可执行文件。您可以使用os.system或(最好是)subprocess.Popen来调用它们。
user2856 2014年

@Luke,因此无法与这些gdal实用程序进行交互吗?如果不存在,我很乐意探索如何为这些编写一个python包装器。
djq 2014年

您可以使用gdal python API来执行gdal_translate和gdalwarp实用程序几乎可以做的所有事情,只是稍微复杂一点。查看gdal.AutoCreateWarpedVRT和gdal Driver.CreateCopy。
user2856 2014年

Answers:


17

这是一个大致满足您要求的示例。主要参数是geotransformgdal用于描述栅格位置(位置,像素比例和偏斜)的阵列以及epsg投影代码。这样,以下代码应正确地对栅格进行地理配准并指定其投影。

我没有做太多测试,但是它似乎对我有用。您必须确保输入的坐标正确无误,并且可能会更改投影和像素比例/大小。希望能帮助到你。

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
是的,但是如果您想更精确,则在旋转时必须使用Affine Transformation并使用Affine包计算正确的参数(从此处下载)。用法:“ Affine.scale(PARAMETER)* Affine.rotation(ANGLE)”。PARAMETER是从两个图像的像素比率得出的,可以使用'gdalinfo'或PIL来了解像素大小,ANGLE是角度。
CaMa 2017年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.