2012-05-04 10 views
12

Aclaración: de alguna manera omití el aspecto clave: no usar os.system o subprocess, solo la API de python.¿Cómo proyectar y volver a muestrear una cuadrícula para que coincida con otra cuadrícula con GDAL python?

Estoy tratando de convertir una sección de una cuadrícula de compensación NOAA GTX para transformaciones verticales de datum y no seguir totalmente cómo hacer esto en GDAL con python. Me gustaría tomar una grilla (en este caso, una Grilla Atribuida de Batimetría, pero podría ser un geotif) y usarla como la plantilla que me gustaría hacer. Si puedo hacer esto bien, tengo la sensación de que será de gran ayuda que las personas hagan uso de este tipo de datos.

Esto es lo que tengo que definitivamente no funciona. Cuando ejecuto gdalinfo en el conjunto de datos de destino resultante (dst_ds), no coincide con la BAG de la cuadrícula de origen.

from osgeo import gdal, osr 

bag = gdal.Open(bag_filename) 
gtx = gdal.Open(gtx_filename) 

bag_srs = osr.SpatialReference() 
bag_srs.ImportFromWkt(bag.GetProjection()) 

vrt = gdal.AutoCreateWarpedVRT(gtx, None, bag_srs.ExportToWkt(), gdal.GRA_Bilinear, 0.125) 

dst_ds = gdal.GetDriverByName('GTiff').Create(out_filename, bag.RasterXSize, bag.RasterYSize, 
              1, gdalconst.GDT_Float32) 
dst_ds.SetProjection(bag_srs.ExportToWkt()) 
dst_ds.SetGeoTransform(vrt.GetGeoTransform()) 

def warp_progress(pct, message, user_data): 
    return 1 

gdal.ReprojectImage(gtx, dst_ds, None, None, gdal.GRA_NearestNeighbour, 0, 0.125, warp_progress, None) 

archivos de ejemplo (pero ningún dos rejillas donde se superponen, pero se encuentran en diferentes proyecciones haría):

La línea de comando equivale a lo que estoy tratando de hacer:

gdalwarp -tr 2 -2 -te 369179 4773093 372861 4775259 -of VRT -t_srs EPSG:2960 \ 
    MENHMAgome01_8301/mllw.gtx mllw-2960-crop-resample.vrt 
gdal_translate mllw-2960-crop-resample.{vrt,tif} 
+0

¿Cuál es la salida de la WKT para bag_srs? ¿Has verificado que es el mismo SRS que da "bolsa"? He encontrado algo de WKT que ... bueno, no está bien formateado ... Noté que la versión de línea de comandos especifica EPSG: 2960 (¿cuál es NAD83?). No he usado GDAL en mucho tiempo, pero si me encuentro con esto, supongo que comenzaré asegurándome de que la reproyección usa los valores SRS correctos. Lo siento, no es una buena respuesta ... es por eso que es un comentario. – Kasapo

Respuesta

20

Gracias a Jamie por la respuesta.

#!/usr/bin/env python 

from osgeo import gdal, gdalconst 

# Source 
src_filename = 'MENHMAgome01_8301/mllw.gtx' 
src = gdal.Open(src_filename, gdalconst.GA_ReadOnly) 
src_proj = src.GetProjection() 
src_geotrans = src.GetGeoTransform() 

# We want a section of source that matches this: 
match_filename = 'F00574_MB_2m_MLLW_2of3.bag' 
match_ds = gdal.Open(match_filename, gdalconst.GA_ReadOnly) 
match_proj = match_ds.GetProjection() 
match_geotrans = match_ds.GetGeoTransform() 
wide = match_ds.RasterXSize 
high = match_ds.RasterYSize 

# Output/destination 
dst_filename = 'F00574_MB_2m_MLLW_2of3_mllw_offset.tif' 
dst = gdal.GetDriverByName('GTiff').Create(dst_filename, wide, high, 1, gdalconst.GDT_Float32) 
dst.SetGeoTransform(match_geotrans) 
dst.SetProjection(match_proj) 

# Do the work 
gdal.ReprojectImage(src, dst, src_proj, match_proj, gdalconst.GRA_Bilinear) 

del dst # Flush 
+0

Funciona a la perfección: podría envolverlo en un script que obtenga los nombres de archivo de sys.argv para mayor nitidez. – Spacedman

3

Si entiendo la pregunta correctamente, puede lograr su objetivo ejecutando gdalwarp y gdal_translate como subprocesos. Sólo montar sus opciones a continuación, haga lo siguiente, por ejemplo:

import subprocess 

param = ['gdalwarp',option1,option2...] 
cmd = ' '.join(param) 
process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
stdout = ''.join(process.stdout.readlines()) 
stderr = ''.join(process.stderr.readlines()) 

if len(stderr) > 0: 
    raise IOError(stderr) 

puede no ser la solución más elegante, pero va a hacer el trabajo. Una vez que se ejecuta, simplemente cargue sus datos en numpy usando gdal y siga su camino.

+0

subproceso definitivamente obtendría la imagen corregida. Sin embargo, de alguna manera me olvidé de mencionar que estaba buscando una solución GDAL python API only. –

+0

Sería bueno ver las opciones necesarias para hacer lo que el script de Python hace de todos modos. – Spacedman

Cuestiones relacionadas