GRASS raster semantics/es

From GRASS-Wiki
Revision as of 09:52, 27 September 2019 by Neteler (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

<! A quick summary c/o Glynn Clements:>

Tipos de precisión de mapas ráster

  • CELL DATA TYPE: un mapa ráster de tipo INTEGER (enteros) (solamente números enteros).
  • FCELL DATA TYPE: un mapa ráster de tipo FLOAT (flotante) (4 bytes, precisión de 7-9 dígitos).
  • DCELL DATA TYPE: un mapa ráster de tipo DOUBLE (doble) (8 bytes, precisión de 15-17 dígitos).
  • NULL: representa "sin dato" en mapas ráster, debe distinguirse del valor 0.
  • INTEGER MAP: ver CELL DATA TYPE
  • FLOAT MAP: ver FCELL DATA TYPE
  • DOUBLE MAP: ver DCELL DATA TYPE

Region Calculations

La "región actual" o "región computacional" es la configuración actual de los bordes de la región y de la resolución ráster actual. Note que la región computacional no está limitada por los datos ráster; puede también afectar algunas operaciones vectoriales.

Los bordes de la región computacional describen un rectángulo en un espacio de dos dimensiones. Para operaciones ráster, este rectángulo es subdividido en una malla de celdas rectangulares, así, los bordes de la región están alineados con los límites de las celdas exteriores.

Para más detalles, vea lo relativo a la Región computacional.

Localizaciones de la celda

Las celdas son áreas, no puntos, así que no tienen una ubicación. Sus esquinas tienen ubicaciones, también sus centros.

Una celda con un índice (i,j) (este, norte) corresponde al rectángulo:

      { (x,y) : west + i * ewres <= x < west + (i+1) * ewres,
                north - (j+1) * nsres <= y < north - j * nsres }

cuyos centro está a:

      (west + (i+1/2) * ewres, north - (j+1/2) * nsres)

[Sujetos a wrapping de valores en localizaciones lat/lon]

Conversiones ráster a vectorial

IIRC, r.to.vect usa el punto medio de los contornos de la celda (i.e. una coordenada estará en una línea de la malla, la otra estará en medio de las líneas de la malla).


Remuestreo

(ver también Interpolation#Resampling_methods_and_interpolation_in_GRASS)

El método de remuestreo de datos ráster del vecino más cercano calcula el centro de cada celda y toma el valor de la celda ráster en que cayó el punto.

Si el punto cae exactamente sobre una línea de malla, el resultado extacto será determinado por la dirección del error de redondeo.

[Una consecuencia de esto es que disminuir la resolución por u factor que es un número entero par muestreará exactamente el borde entre las celdas, lo cual significa que el resultado estará mal definido]

El comando r.resample, módulo de remuestreo para datos discretos, utiliza el mismo método del vecino más cercano, así que produce resultados idénticos.

El comando r.resamp.interp method=nearest usa el mismo algoritmo, pero no el mismo código, así que no produce resultados idénticos en los casos que son decididos por el redondeo de números de punto flotante.

Para los métodos method=bilinear y method=bicubic, los valores ráster son tratados como muestras en cada centro de celda, definiendo una superficie continua por piezas. Los valores ráster resultantes son obtenidos al muestrear la superficie en cada centro de celda.

Dado que el algoritmo solamente interpola, y no extrapola, un margen de 0.5 (para bilineal) y 1.5 (para bicúbico) celdas se pierden de la extensión original del ráster. Cualquier muestra que se tome dentro de este margen será nula.

AFAIK, r.resamp.rst se comporta de manera similar, i.e. calcula una superficie asumiendo que los valores son muestras en cada centro de celda, y muestrea la superficie en cada centro de celda.

Para r.resamp.stats sin -w, el valor de cada región de celda es el agregado escogido de los valores a partir de todas las celdas ráster cuyos centros caen dentro de los bordes de la región de la celda.

Con -w, la muestra es ponderada de acuerdo a la proporción de la celda ráster que cae dentro de los bordes de la región de la celda, así el resultado normalmente [1] no es afectado por el error de redondeo (una minúscula diferencia en la posición del contorno resulta en una adición o substracción de una muestra ponderada por un factor minúsculo).

[1] El mínimo y máximo agregados no pueden usar pesos, así -w no tiene efecto para estos.


Reglas generales

Para la mayor parte, la interpretación es la "obvia", dado:

  1. Las celdas son áreas y no puntos.
  2. Las operaciones que necesitan un punto (por ej. interpolación) usan el centro de la celda.

Manejando datos nulos (NULL values)

Consideraciones generales

El manejo de los datos nulos (sin dato) depende del tipo de precisión. Para más detalles ver:

r.mapcalc

Casi todos los operadores y funciones regresan nulo si uno de sus argumentos es nulo.

Las principales excepciones son:

  • "isnull(x)" regresa 0 si x no es nulo y 1 si x es nulo.
  • "if(1,a,b)" regresa a aun si b es nulo.
  • "if(0,a,b)" regresa b aun si a es nulo.
  • "eval(a,b,c,...,x)" regresa x aun si alguno de a,b,c,... es nulo.
  • "0 &&& x" y "x &&& 0" regresa 0 aun si x es nulo.
  • "1 ||| x" y "x ||| 1" regresa 1 aun si x es nulo.
  • "graph(x,x1,y1,...,xn,yn)" regresará nulo si x es nulo o alguno de los x[i] es nulo, o si un y[i] "relevante" es nulo. Pero no en donde y[i] que no sea usado para el cálculo sea nulo.

Los operadores &&& y ||| son adiciones relativamente recientes, los antiguos operadores && y || siguen el comportamiento tradicional para los nulos, i.e. regresan nulo si alguno de los operando es nulo.

El comportamiento es intuitivo si se ve el nulo como representando una cantidad desconocida. Esto explica por qué tanto "x == null()" y "x !=null()" son siempre nulos, independientemente de si x es nulo o no nulo.

null() es un valor desconocido, y lo continua siendo si se le iguala a un valor particular (conocido). Si x es nulo también, entonces se tienen dos valores desconocidos, y es desconocido sean o no iguales los valores.

En muchos sentidos, el comportamiento es similar al de NaN (not a number, no es un número) de la aritmética de punto flotante.

Con la excepción de los casos listados más arriba, r.mapcalc no trata de detectar casos "especiales" donde el resultado pueda ser deducido aun si uno de los operando es nulo. Por ejemplo, si x es nulo "x * 0" es nulo y no es cero, "x == x" es nulo y no 1, "x != x" es nulo y no 0, etc.

Si tiene un mapa "booleano" en donde los valores son nulos o 1, normalmente quiere convertir los valores nulos a ceros (0), antes de realizar cualquier procesamiento. Puede reemplazar los nulos en un mapa existente usando por ejemplo "r.null null=0" o ajustar las pruebas con r.mapcalc.


Operaciones aritméticas

r.mapcalc: las operaciones aritméticas con tipos mixtos promueven el tipo menor al tipo mayor, donde CELL < FCELL < DCELL:


         |  CELL FCELL DCELL
   ------+------------------
    CELL |  CELL FCELL DCELL
   FCELL | FCELL FCELL DCELL
   DCELL | DCELL DCELL DCELL

Notas de reglas para programadores

Desde una perspectiva de programación, las funciones:


      G_row_to_northing()
      G_col_to_easting()
      G_northing_to_row()
      G_easting_to_col()

todas transforman valores de puntos flotante.

Pasar índices enteros de filas o columnas a las primeras dos funciones regresará las coordenadas de la celda de la esquina superior izquierda; para las coordenadas del centro, fila+0-5 y/o columna+0.5.

De manera similar, las últimas dos funciones normalmente regresarán valores no enteros; use floor() para descartar la parte fraccionaria y obtener el índice de fila o columna de la celda dentro de la cual cae el punto.