[GRASS-ES] Como construir un DEM a partir de un archivo importado conr.in.xyz?

Roberto Antolín rantolin.geo en gmail.com
Jue Dic 11 10:30:56 EST 2008


Hola Jhon y todos:

2008/12/11 Jhon Ortiz <eljhonjhon en hotmail.com>:
> Roberto, estoy utilizando el modulo r.in.xyz que se que le has trabajado
> duro. Este modulo me funciona muy bien, no estoy trabajando con datos LIDAR,
> si no con datos X,Y,Z proporcionados por adquisicion sismica del fondo
> marino. Mi objetivo es reconstruir la superficie del fondo marino en un DEM,
> para realizar analisis topograficos (geomorfometria).

Unos más densos que otros, pero son puntos igualmente ;-)

> Lo que hago es
>
> r.in.xyz input="/home/john/Desktop/Superficies/sea_floor_profundidad.txt"
> output=r_seafloor_res10m fs="|" x=2 y=3 z=4
>
> y agregando la opcion meth=n, en una region con resolucion de 10m,  obtengo
> la figura que adjunte en el correo anterior.
>
> Ahora lo que creo que debo hacer, es a partir de estos datos interpolar
> y generar la superficie, adjunte la figura para ilustrar la geometria del
> area de trabajo y poder explicar, que deseo interpolar solo el
> rectangulo donde estan los datos y no toda la region de GRASS.
>
> Alguna idea de como delimitar la zona que deseo interpolar?

Es una cuestión difícil, en el sentido de que tu zona de interés está
girada con respecto a los ejes XY. Entonces creo que lo que mejor
puedes hacer es considerar una máscara para trabajar con raster. Por
normal general, los módulos r.* deberían respetarlas, pero los v.* no
tienen por qué hacerlo.

Lo que te preguntaría ahora es... ¿cómo quieres interpolar los datos?
Lo primero que me viene a la cabeza es considerar v.surf.rst o
v.surf.bspline utilizando splines en formato vectorial, v.surf.idw o
r.surf.idw con el inverso de la distancia (para vectoria y raster); o
r.surf.nnbathy (add-ons) utilizando el formato raster y el método de
vecino más próximo.

Para el caso vectorial y como es un rectángulo bastante regular
podrías hacer la máscara así:

$ v.in.xyz input="/home/john/Desktop/Superficies/sea_floor_profundidad.txt"
output=v_seafloor_res10m fs="|" x=2 y=3 z=4 -ztb
$ v.hull in=v_seafloor_res10m out=v_seafloor_res10m_HULL
$ v.to.rast in=v_seafloor_res10m_HULL out=MASK

No lo he probado pero debería funcionar :-P. Si no te funciona o o si
el resultado de v.hull te sale un churro vuelve a escribir para ver
cómo podemos crear una máscara mejor. Ahora deberías utilizar el
vectorial que has importado con v.in.xyz para crear la máscara
anterior. Si no recuerdo mal v.surf.rst sí que respeta las máscaras,
en el caso de v.surf.bspline NO las respeta. Por ejemplo, para el caso
de v.surf.bspline (que es el que he programado yo :-P):

$ v.surf.bspline in=v_seafloor_res10m raster=r_seafloor_res10m sie=50 sin=50

NOTA: Deja el paso de spline bastante grande. Vista tu imágen y
conociendo la resolución de tu región (10m) te aconsejaría que
escogieras un paso de spline al menos dos veces la resolución o algo
así. Si no el programa se eternizará.

Si quieres interpolar partiendo de raster, que lo que supongo que hace
es rellenar las celdas con valor NULL, lo que yo haría sería una
primera máscara para importar los datos de la misma manera que has
creado el anterior (pero sin 'meth='), y después interpolar con la
máscara creada para el caso vectorial. Es decir:

# Crear la primera máscara
$ r.mapcalc MASK="if(v_seafloor_res10m=0,null(),v_seafloor_res10m)"
$ r.in.xyz input="/home/john/Desktop/Superficies/sea_floor_profundidad.txt"
output=r_seafloor_res10m fs="|" x=2 y=3 z=4

# Cambiar de máscara:
$ g.remove MASK #eliminar la anterior
$ v.to.rast in=v_seafloor_res10m_HULL out=MASK # crear la nueva
máscara con el procedimiento descrito más arriba

# Interpolar:
$ r.surf.* ....

Espero no haber liado a nadie y que sea correcto todo lo que he
puesto, jejejeje. Por cierto, queremos "feedback" ;-)

Un saludo,
Roberto.


Más información sobre la lista de distribución grass-es