Raster de georreferenciamento usando GDAL e Python?

10

Quero georreferenciar uma varredura usando pythone GDAL. Minha abordagem atual é chamar gdal_translatee gdalwarpusar os.systemuma lista feia de pontos de controle de solo. Eu realmente gostaria de uma maneira de fazer isso nativamente por dentro python.

Este é o processo atual que estou usando:

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

Há uma pergunta e resposta anteriores de 2012 que afirmam que gdal_translatepodem ser acessadas após a importação gdal. Não tenho certeza se está obsoleto ou se está errado, mas quando corro from osgeo import gdalnão vejo gdal.gdal_translatecomo uma opção.

Não sei se existe, mas adoraria poder traduzir e reprojetar rasters de maneira pitônica. Por exemplo:

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

Essa abordagem é possível?

djq
fonte
1
gdal_translate e gdalwarp e outros utilitários gdal não são pacotes / módulos python, são executáveis ​​independentes. Você pode usar os.system ou (de preferência) subprocesso.Popen para chamá-los.
user2856
@ Lucas, então não há como interagir com esses utilitários gdal? Ficaria feliz em explorar como escrever um wrapper python para eles, se não existir.
DJQ
Você pode usar a API gdal python para fazer quase tudo o que os utilitários gdal_translate e gdalwarp podem, é apenas um pouco mais complicado. Confira gdal.AutoCreateWarpedVRT e gdal Driver.CreateCopy.
usar o seguinte comando

Respostas:

17

Aqui está um exemplo que faz aproximadamente o que você pede. Os principais parâmetros são a geotransformmatriz que o gdal usa para descrever uma localização de varredura (posição, escala de pixels e inclinação) e o epsgcódigo da projeção. Com isso, o código a seguir deve georreferenciar adequadamente a varredura e especificar sua projeção.

Não testei muito, mas parecia funcionar para mim. Você precisaria ter certeza de que as coordenadas inseridas estão corretas e provavelmente mudam a projeção e a escala / tamanho de pixels. Espero que ajude.

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
fonte
2
Está certo, mas se você quiser ser mais preciso, em caso de rotação, use a Transformação Affine e calcule os parâmetros corretos com o pacote Affine (faça o download aqui ). Uso: 'Affine.scale (PARAMETER) * Affine.rotation (ANGLE)'. PARÂMETRO são da proporção de pixel das duas imagens, você pode usar 'gdalinfo' ou PIL para saber o tamanho do pixel, ANGLE é o ângulo.
CaMa