Геореференційний растр за допомогою 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*)

Чи можливий такий підхід?


1
gdal_translate та gdalwarp та інші утиліти gdal не є пакетами / модулями python, вони є автономними виконуваними файлами. Ви можете використовувати os.system або (бажано) підпроцес. Відкрийте їх для виклику.
user2856

@Luke, чи не існує способу взаємодії з цими утилітами gdal? Я був би радий вивчити, як написати обгортку для пітона, якщо такої немає.
djq

Ви можете використовувати API gdal python, щоб зробити майже все, що можуть утиліти gdal_translate та gdalwarp, це просто трохи складніше. Перевірте gdal.AutoCreateWarpedVRT та gdal Driver.CreateCopy.
користувач2856

Відповіді:


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

2
Це правильно, але якщо ви хочете бути більш точними, у разі обертання вам доведеться скористатися Affine Transformation і обчислити правильні параметри за допомогою пакету Affine ( завантажити звідси ). Використання: 'Affine.scale (PARAMETER) * Affine.rotation (ANGLE)'. PARAMETER - це співвідношення пікселів двох зображень, ви можете використовувати "gdalinfo" або PIL, щоб знати розмір пікселя, ANGLE - кут.
CaMa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.