Reproyectar script en Python con GDAL

10

Estoy teniendo muchos problemas con GDAL. Además de la falta de documentación, parece haber poco soporte en Python. De todos modos, esto es solo un script de reproyección por lotes que va así:

source_file = gdal.Open(filepath.encode("ascii"))
source_wkt = source_file.GetProjectionRef()
source_srs = osr.SpatialReference()
source_srs.ImportFromWkt(source_wkt)                            

reproj_file = gdal.AutoCreateWarpedVRT(source_file, source_wkt, dest_wkt)
gdal.ReprojectImage(source_file, reproj_file, source_wkt, dest_wkt)
reproj_attributes = reproj_file.GetGeoTransform()

driver = gdal.GetDriverByName("GTiff")
dest_file = driver.CreateCopy(outputpath.encode("ascii"), reproj_file, 0)

La parte dest_srs y des_wkt no están definidas en este fragmento de código, pero está en algún lugar fuera del bucle (ya que solo necesita definirse una vez). Parece que funciona una vez, puedo obtener un aspecto bonito de él, luego darme un 'ERROR 6 WriteBlock () no compatible' y Python se bloquea. Todos son GeoTIFF creados de la misma manera con los mismos datos básicos (solo en diferentes momentos).

También debido a la naturaleza de la reproyección (de GCS a PCS), el AutoCreateWarpedVRT tiende a crear mucho espacio en blanco, pero le da un valor de 0, que es un problema ya que podría ser un valor de datos real. ¿Hay alguna forma de establecer el valor de nodata en -99 en su lugar?

wowohweewah
fuente
66
Supongo que tiene una razón para hacer esto en Python, pero solo para asegurarse: ¿sabe que el propósito principal de la utilidad gdalwarp es reproyectar rásteres? por ej gdalwarp -t_srs '+proj=utm +zone=11 +datum=WGS84' raw_spot.tif utm11.tif. Ha existido desde hace mucho tiempo, tiene muchas funciones, está bien probado y probablemente sea más rápido que un enfoque de Python puro.
matt wilkie
Al eliminar el orden ReprojectImage, mi computadora reproyecta la imagen sin el error.
Roger Veciana

Respuestas:

3

Sobre AutoCreateWarpedVRTel espacio en blanco.

Echa un vistazo a este ticket de error gdal .

En particular se afirma allí:

Si agrego esta línea en el rgbwarped.vrt generado en el segundo paso, todo está bien:

<Option name="UNIFIED_SRC_NODATA">YES</Option>

Las aplicaciones C ++ pueden configurar esta opción directamente. Las aplicaciones que utilizan AutoCreateWarpedVRT del enlace SWIG deben agregar esta línea al texto del VRT producido manualmente.

Alex Markov
fuente
Yo no probar la Optionsolución, pero el cambio a llamar gdalwarpa través subprocessresuelto el problema con NoData desenmascarado.
j08lue