Pasando de la lista de correo de gdal-dev:
El lunes 2 de septiembre de 2013 a las 7:09 p.m., David Shean escribió:
Hola lista, estoy tratando de empaquetar una serie temporal de rásteres GTiff con idéntica proyección / extensión / resolución como un único archivo NetCDF para su distribución. Pasé la última hora consultando el documento en línea y jugando con gdal_translate, gdalbuildvrt y gdalwarp sin ningún éxito.
¿Hay una manera fácil de hacer esto utilizando las utilidades de línea de comando gdal existentes? Pensé en preguntar antes de recurrir a una solución personalizada usando la API Python de NetCDF.
Gracias. -David
El martes 3 de septiembre de 2013 a las 10:15 a.m., Etienne Tourigny escribió:
lo que quieres probablemente esté fuera del alcance de gdal. Requeriría una gestión inteligente de metadatos para que gdal_translate los ponga en un solo archivo ...
Te aconsejaría que los conviertas todos a netcdf usando gdal_translate y luego uses python-netcdf4 (no el de numpy / scipy) para apilarlos en la dimensión temporal.
El martes 3 de septiembre de 2013 a las 7:55 a.m., "Signell, Richard" escribió:
David, si publicas tu pregunta en el grupo GIS stackexchange /gis// te proporcionaré un código de ejemplo que debería ser útil.
-Rico
====================
Actualización 3/3/13 17:04 PDT
Aquí está la salida de gdalinfo para uno de mis conjuntos de datos de entrada:
gdalinfo 20120901T2024_align_x+22.19_y+3.68_z+14.97_warp.tif
Driver: GTiff/GeoTIFF
Files: 20120901T2024_align_x+22.19_y+3.68_z+14.97_warp.tif
Size is 10666, 13387
Coordinate System is:
PROJCS["unnamed",
GEOGCS["WGS 84",
DATUM["WGS_1984",
SPHEROID["WGS 84",6378137,298.257223563,
AUTHORITY["EPSG","7030"]],
AUTHORITY["EPSG","6326"]],
PRIMEM["Greenwich",0],
UNIT["degree",0.0174532925199433],
AUTHORITY["EPSG","4326"]],
PROJECTION["Polar_Stereographic"],
PARAMETER["latitude_of_origin",70],
PARAMETER["central_meridian",-45],
PARAMETER["scale_factor",1],
PARAMETER["false_easting",0],
PARAMETER["false_northing",0],
UNIT["metre",1,
AUTHORITY["EPSG","9001"]]]
Origin = (-211346.063781524338992,-2245136.291794800199568)
Pixel Size = (5.000000000000000,-5.000000000000000)
Metadata:
AREA_OR_POINT=Area
Image Structure Metadata:
COMPRESSION=LZW
INTERLEAVE=BAND
Corner Coordinates:
Upper Left ( -211346.064,-2245136.292) ( 50d22'39.70"W, 69d23'55.59"N)
Lower Left ( -211346.064,-2312071.292) ( 50d13'22.38"W, 68d48'10.75"N)
Upper Right ( -158016.064,-2245136.292) ( 49d 1'33.33"W, 69d26'16.42"N)
Lower Right ( -158016.064,-2312071.292) ( 48d54'35.06"W, 68d50'27.28"N)
Center ( -184681.064,-2278603.792) ( 49d38' 1.32"W, 69d 7'17.04"N)
Band 1 Block=256x256 Type=Float32, ColorInterp=Gray
NoData Value=-32767
Seguir el enfoque sugerido de Luke.
La generación vrt funciona bien:
gdalbuildvrt -separate newtest.vrt *warp.tif
<VRTDataset rasterXSize="10666" rasterYSize="13387">
<SRS>PROJCS["unnamed",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433],AUTHORITY["EPSG","4326"]],PROJECTION["Polar_Stereographic"],PARAMETER["latitude_of_origin",70],PARAMETER["central_meridian",-45],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]]]</SRS>
<GeoTransform> -2.1134606378152434e+05, 5.0000000000000000e+00, 0.0000000000000000e+00, -2.2451362917948002e+06, 0.0000000000000000e+00, -5.0000000000000000e+00</GeoTransform>
<VRTRasterBand dataType="Float32" band="1">
<NoDataValue>-3.27670000000000E+04</NoDataValue>
<ComplexSource>
<SourceFilename relativeToVRT="1">20110619T2024_align_x+15.51_y+1.15_z+12.10_warp.tif</SourceFilename>
<SourceBand>1</SourceBand>
<SourceProperties RasterXSize="10666" RasterYSize="13387" DataType="Float32" BlockXSize="256" BlockYSize="256" />
<SrcRect xOff="0" yOff="0" xSize="10666" ySize="13387" />
<DstRect xOff="0" yOff="0" xSize="10666" ySize="13387" />
<NODATA>-32767</NODATA>
</ComplexSource>
</VRTRasterBand>
<VRTRasterBand dataType="Float32" band="2">
<NoDataValue>-3.27670000000000E+04</NoDataValue>
<ComplexSource>
<SourceFilename relativeToVRT="1">20110802T2024_align_x+16.33_y+2.14_z+12.02_warp.tif</SourceFilename>
<SourceBand>1</SourceBand>
<SourceProperties RasterXSize="10666" RasterYSize="13387" DataType="Float32" BlockXSize="256" BlockYSize="256" />
<SrcRect xOff="0" yOff="0" xSize="10666" ySize="13387" />
<DstRect xOff="0" yOff="0" xSize="10666" ySize="13387" />
<NODATA>-32767</NODATA>
</ComplexSource>
</VRTRasterBand>
...
Pero cuando intento traducir a nc, aparece el siguiente error:
gdal_translate -of netcdf newtest.vrt newtest.nc
Input file size is 10666, 13387
Warning 1: Variable has 0 dimension(s) - not supported.
0...10...20...30...40...50ERROR 1: netcdf error #-62 : NetCDF: One or more variable sizes violate format constraints .
at (netcdfdataset.cpp,SetDefineMode,1574)
ERROR 1: netcdf error #-39 : NetCDF: Operation not allowed in define mode .
at (netcdfdataset.cpp,IWriteBlock,1435)
ERROR 1: netCDF scanline write failed: NetCDF: Operation not allowed in define mode
ERROR 1: An error occured while writing a dirty block
...ERROR 1: netcdf error #-39 : NetCDF: Operation not allowed in define mode .
at (netcdfdataset.cpp,IWriteBlock,1435)
ERROR 1: netCDF scanline write failed: NetCDF: Operation not allowed in define mode
ERROR 1: netcdf error #-62 : NetCDF: One or more variable sizes violate format constraints .
at (netcdfdataset.cpp,~netCDFDataset,1548)
Entonces, después de una inspección más cercana, parece que gdal no está contento con la proyección estereográfica polar que estoy usando (EPSG: 3413). Ver líneas 1570-1582 de netcdfdataset.cpp:
Mi proyección tiene un latitude_of_origin especificado pero no hay paralelos estándar como se esperaba por el controlador netcdf.
Respuestas:
Aquí hay un código de Python que hace lo que desea: leer archivos GDAL que representan datos en momentos específicos y escribir en un solo archivo NetCDF que cumple con CF
GDAL y NetCDF4 Python pueden ser un poco difíciles de construir, pero la buena noticia es que son parte de la mayoría de las distribuciones científicas de Python (Python (x, y), Enthought Python Distribution, Anaconda, ...)
Actualización: Todavía no he hecho estereografía polar en NetCDF compatible con CF, pero debería parecerme a esto. Aquí he asumido que
central_meridian
ylatitude_of_origin
en GDAL son los mismos questraight_vertical_longitude_from_pole
ylatitude_of_projection_origin
en la FQ:fuente
Es fácil ponerlos en un solo NetCDF con utilidades GDAL, ejemplo a continuación. Pero no obtienes la dimensión temporal / otros metadatos de la respuesta de @ RichSignell. Los tiffs simplemente son arrojados a subdatasets.
fuente