4 votos

¿Cómo leer este archivo de datos y convertirlo en formato raster para su análisis?

Estoy tratando de introducir el conjunto de datos de 5 grados de aquí http://www.cru.uea.ac.uk/cru/data/precip/ (es el primer enlace). Y una vez que lo introduzco en el GIS para utilizarlo como entrada raster para calcular estadísticas zonales utilizando como feature zone las fronteras del mundo ( http://thematicmapping.org/downloads/world_borders.php ).

Mi primera pregunta es cómo introducir los datos en el SIG. Y la segunda, una vez introducidos, ¿puedo utilizarlos como un archivo raster normal y hacer estadísticas zonales?

¿Alguien puede ayudar? Utilizo ARCGIS 10.1

Gracias.

1voto

cjstehno Puntos 131

Se trata de un formato de archivo personalizado y único, por lo que no esperes que las herramientas habituales lo lean correctamente.

El archivo de documentación describe el contenido de forma clara y (en su mayor parte) precisa. Lógicamente, el archivo está organizado en "cuadrículas". Cada cuadro de rejilla contiene una tabla de información por año y mes, junto con información resumida por año (precipitación en 0,1 mm) e información resumida para el propio cuadro de rejilla. Físicamente, cada cuadro de cuadrícula está representado por una línea de cabecera seguida de una línea para cada año. Las líneas están en formato fijo ASCII (producido por un programa Fortran, evidentemente).

Aunque lógicamente hay tres tablas aquí -cuadros, años y meses-, lo más sencillo sería "aplanar" todo como si se hubieran unido todos los datos, con un registro por mes. Esto podría añadirse a cualquier SIG como una capa de "eventos puntuales XY", que podría consultarse para cualquier mes y convertirse en formato raster para su posterior análisis (o mantenerse tal cual para resúmenes estadísticos).

La tarea principal, pues, es hacer el reformateo. Python lo hará muy bien, pero sigo prefiriendo AWK por su rápido ciclo de desarrollo y su claridad, así que aquí está mi solución rápida y sucia (pero probada) para AWK. (El GNU AWK, GAWK, funciona en Windows y otros sistemas. Está disponible gratuitamente). Puedes ver que simplemente selecciona todos los campos dentro de los dos tipos de líneas físicas - "cabecera" y "datos"- y los escupe de vuelta, aplanados (es decir, mostrando todos los valores actuales de todos los campos en cada registro) y delimitados por tabulaciones. Realiza una comprobación de errores mínima, suponiendo que la entrada ha sido formateada correctamente y no está corrompida. Se ejecuta desde un shell o una línea de comandos de la siguiente manera

awk -f [name of file.awk] [name of input file.dat] > [name of output file]

Por ejemplo, en mi sistema nombré este archivo AWK y.awk extrajo el archivo de datos de precipitación comprimido en F:/temp/ y mi comando fue

awk -f y.awk f:\temp\g55wld0098.dat > y.txt

Después de simbolizar el tema del evento XY en ArcMap 10 por nombre de país, seleccionando los datos de diciembre de 1990 ( "Year" = 1990 AND "Month" = 12 ), y al convertirlo a formato shapefile (por eficiencia), quedó así, todo listo para el análisis o la conversión a formato raster.

Map

(Tenga en cuenta que todos los valores están en décimas de milímetro).

Como el intento de mostrar o procesar todos los datos (alrededor de 10^5 registros) hace que mi copia de ArcGIS 10 se ponga de rodillas, puede que tu SIG también se ralentice. Una solución es filtrar los datos que desea durante la conversión AWK para que su SIG tenga menos registros que tratar. Sólo tiene que modificar la prueba de los datos que faltan para omitir cualquier otra cosa que no quiera en la salida. (Esto es un orden de magnitud más rápido que filtrar los datos en el propio ArcGIS). También podría modificar este programa para dar salida a los datos directamente en un formato raster ASCII (como múltiples archivos, uno por mes y por año), pero eso requeriría un poco más de habilidad y podría ser poco fiable, porque no hay garantía de que la entrada esté físicamente ordenada por cuadrícula).

#
#    Global precipitation data (http://www.cru.uea.ac.uk/cru/data/precip/)
#
#    Header (I7,I5,I6,I5,A15,I4,A14,2I4,I7,I9):
#    388-6250 -4250    4ANTARCTICA        1  85% 85%  0% 19001998    388        1
#
#    Data (I4,12I5,I6):
#1900  -10  -10  -10  -10  -10  -10  -10  -10  -10  -10  -10  -10   -10
#
#   ("-10" is the null value.  It will be output unchanged.)
#
#    NB: the final data record may have some invisible non-numeric characters and
#        so is left unconverted; it is in 0.1 mm.
#----------------------------------------------------------------------------------#
BEGIN {
    nrecs = 0     # Number of records output
    maxerr = 20   # max error messages
    errcount = 0
    OFS = "\t"    # Output field separator
    #
    # Print a header line of field names.
    #
    print "Gridbox", "Lat", "Lon", "Altitude", "Country", "N", "Start", "End", 
        "Diag1", "Diag2", "Precip", "Year", "Month", "Value"
}
length($0)!=70 && substr($0, 1, 7) == substr($0, 65, 7) { # Possible header
    gridbox = substr($0, 1, 7) + 0
    lat = substr($0, 8, 5)/100.0
    lon = substr($0, 13, 6)/100.0
    alt = substr($0, 19, 5) + 0
    country = "\"" substr($0, 24, 15) "\""
    n = substr($0, 39, 4) + 0
    diagnostic = substr($0, 43, 14)
    start = substr($0, 57, 4) + 0
    end = substr($0, 61, 4) + 0
    gridbox2 = substr($0, 65, 7) + 0
    diagnostic2 = substr($0, 72, 9)
    nrecs++
    printf("\rGrid box %-8d", nrecs) > "/dev/stderr"
    next
}
length($0)!=70 && errcount <= maxerr {
    print "Unable to interpret record " NR >> "/dev/stderr"
    errcount ++ 
    next
}
{   # Data record
    year = substr($0, 1, 4)
    precip = substr($0, 65) # (There are problems treating this value as numeric...)
    #
    # Print a data line for each month.
    #
    for (month = 1; month  <= 12; month ++) {
        value = substr($0, 5*month , 5) + 0 # In 0.1 mm
        if (value != -10) { # Skip missing values
            print gridbox, lat, lon, alt, country, n, start, end, 
            diagnostic, diagnostic2, precip, year, month, value
        }
    }
}
END {
    print "\r" nrecs " gridbox records output." > "/dev/stderr"
    if (errcount > 0) print errcount " errors encountered." > "/dev/stderr"
}

0voto

Bruce Westbury Puntos 6382

Se trata de datos binarios cuadriculados en lat/lon. Así que necesitas un archivo de cabecera como:

ncols xxx
nrows xxx
xllcorner xxx
yllcorner xxx
cellsize xxx
nodata_value -999999
byteorder xxx

A continuación, puede utilizar la herramienta de conversión de flotante a ráster en ArcGIS en la caja de herramientas de conversión. De este modo, obtendrá un archivo GRID rasterizado normal que podrá utilizar para el análisis de las estadísticas zonales.

0voto

alasdairg Puntos 1518

Mirando la documentación, este archivo .dat parece ser una tabla en lugar de una trama. Es posible que le resulte mucho más fácil crear un raster (o puntos) que cubra el área apropiada, y luego unir los datos a él, y luego exportar un raster con los datos que desea.

-3voto

Pavel Lishin Puntos 88

No sé cómo se puede realizar este análisis con ArcGIS pero se puede manejar fácilmente con QGIS. Soporta muchos formatos de datos y puede convertir entre diferentes formatos de datos. Y tiene una herramienta para las estadísticas zonales. Deberías probarlo. Pero si usted quiere realizar este análisis en el entorno de ArcGIS en primer lugar convertir su conjunto de datos a formato de datos raster conocido como TIFF para ArcGIS puede leerlo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X