Растр с геопривязкой с использованием GDAL и Python?

10

Я хочу привязать растр с помощью pythonи GDAL. Мой текущий подход состоит в том, чтобы вызвать gdal_translateи gdalwarpиспользовать 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в качестве варианта.

Я не знаю, существует ли он, но я бы хотел, чтобы я мог переводить и перепроектировать растры с помощью питона. Например:

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

Возможен ли такой подход?

djq
источник
1
gdal_translate, gdalwarp и другие утилиты gdal не являются пакетами / модулями python, а являются автономными исполняемыми файлами . Вы можете использовать os.system или (предпочтительно) subprocess.Popen для их вызова.
user2856
@ Люк, нет ли способа взаимодействовать с этими утилитами gdal? Я был бы рад изучить, как написать обертку для Python, если таковой не существует.
DJQ
Вы можете использовать API Python gdal, чтобы сделать почти все, что могут утилиты gdal_translate и gdalwarp, это немного сложнее. Проверьте gdal.AutoCreateWarpedVRT и gdal Driver.CreateCopy.
user2856

Ответы:

17

Вот пример, который делает примерно то, что вы просите. Основными параметрами являются geotransformмассив, который gdal использует для описания местоположения растра (положение, масштаб в пикселях и перекос) и 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
yellowcap
источник
2
Это правильно, но если вы хотите быть более точным, в случае ротации вы должны использовать Affine Transformation и вычислять правильные параметры с помощью пакета Affine ( скачать здесь ). Использование: «Affine.scale (PARAMETER) * Affine.rotation (ANGLE)». ПАРАМЕТР - это соотношение пикселей двух изображений, вы можете использовать «gdalinfo» или «PIL», чтобы узнать размер пикселя, «ANGLE» - это угол.
CaMa