GRASS GIS for ArcGIS users/es: Difference between revisions
(GRASS GIS for ArcGIS users/es) |
No edit summary |
||
Line 1: | Line 1: | ||
''Esta es una guía para aquellas peronas que quieren migrar de ArcGIS a GRASS GIS, o que quieren aprender GRASS GIS pero ya están familiarizados con ArcGIS'' | |||
''Esta es una guía para aquellas peronas que quieren migrar de ArcGIS a GRASS GIS, o que quieren aprender GRASS GIS pero ya están familiarizados con ArcGIS.'' | |||
Line 116: | Line 116: | ||
En ArcGIS los operadores de álgebra de mapas deben estar separados por espacios e blanco. En GRASS GIS, los espacios alrededor de los operadores son opcionales, sin embargo, es una buena práctica el usarlos (lo mismo que en Python o C). | En ArcGIS los operadores de álgebra de mapas deben estar separados por espacios e blanco. En GRASS GIS, los espacios alrededor de los operadores son opcionales, sin embargo, es una buena práctica el usarlos (lo mismo que en Python o C). | ||
=== Operadores === | |||
{| class="wikitable sortable" | |||
|- | |||
! ArcGIS | |||
! GRASS GIS | |||
! Notas | |||
|- | |||
| & | |||
| && | |||
| El operador booleano (lógico) Y es un ampersand (<tt>&</tt>) en ArcGIS. En GRASS GIS, el operador booleano Y son dos (<tt>&&</tt>), lo mismo que en C. Note que <tt>&</tt> es el operador Y bitwise en GRASS GIS (también en Python o en C). También está el operador <tt>&&&</tt> en GRASS GIS que no propaga los valores nulos (que es el comportamiento estándar), los trata como falsos. | |||
|- | |||
| <nowiki>|</nowiki> | |||
| <nowiki>||</nowiki> | |||
| La diferencia entre ArcGIS y GRASS GIS en cuando al operador booleano (lógico) O es igual a la del operador booleano Y. En GRASS GIS hay un operador bitwise <tt><nowiki>|</nowiki></tt> uno booleano (logico) <tt><nowiki>||</nowiki></tt> y <tt><nowiki>|||</nowiki></tt>. El operador <tt><nowiki>||</nowiki></tt> preserva los valores nulos (como se espera de manera predeterminada), y el operador <tt><nowiki>|||</nowiki></tt> evalúa los valores nulos como falsos, lo que a veces es ventajoso. | |||
|- | |||
| ~ | |||
| ! | |||
| En GRASS GIS el operador NO es (un) signo de exclamación (<tt>!</tt>), lo cual es igual a C. El equivalente en ArcGIS es la tilde (<tt>~</tt>), mientras que en GRASS GIS la tilde es el operador NO bitwise, lo mismo que en C o Python. | |||
|- | |||
| ^ | |||
| xor() | |||
| En ArcGIS el gorrito (<tt>^</tt>) representa el operador booleano O excluyente (XOR), mientras que en GRASS GIS este representa el exponencial (una operación matemática). En GRASS GIS el operador booleano O excluyente se obtiene con la función <tt>xor()</tt>. | |||
|} | |||
La expresión de álgebra de mapas en ArcGIS que calcula el NDVI, para la Calculadora ráster en la GUI (el nombre de salida se ingresa de maera separada): | |||
Float("lsat7_40" - "lsat7_30") / Float("lsat7_40" + "lsat7_30") | |||
La misma expresión en GRASS GIS para la calculadora de ráster en la GUI (el nombre de salida se ingresa de manera separada): | |||
float(lsat7_2002_40 - lsat7_2002_30) / float(lsat7_2002_40 + lsat7_2002_30) | |||
La misma expresión escrita en la línea de comandos: | |||
r.mapcalc "ndvi = float(lsat7_2002_40 - lsat7_2002_30) / float(lsat7_2002_40 + lsat7_2002_30)" | |||
Consulte la lista de operadores disponibles en GRASS GIS en el manual de {{cmd|r.mapcalc}}. | |||
=== Funciones === | |||
{| class="wikitable sortable" | |||
|- | |||
! ArcGIS | |||
! GRASS GIS | |||
! Notas | |||
|- | |||
| Con(a, b, c), Con(a, b, c, d) | |||
| if(a, b, c) | |||
| La sentencia condicional más usada (la sentencia si, ''if'') tanto en ArcGIS como en GRASS GIS son funciones de álgebra de mapas tres parámetros, primero está la condición (condition), luego el valor que se usará si se cumple la condición ("if-part") y en tercer lugar el valor que se usará si la condición no se cumple ("else-part"). ArcGIS soporta también una sintaxis con cuatro parámetros cuando el primero solo es un ráster y el cuarto es una sentencia condicional SQL. GRASS GIS también tiene una versión de cuatro parámetros, pero esta es conveniente para el caso en donde se necesita decidir etre tres valores basandose en el primer parámetro (ráster o expresió) menor, mayor o igual a cero. <!-- the other difference might be that SQL where might go to raster attribute table --> | |||
|- | |||
| Con(a, b) | |||
| if(a, b, null()) | |||
| En ArcGIS la expresión <tt>Con(a, b)</tt> dará un dato nulo (sin dato, ''NULL''), si <tt>a</tt> es verdadero (o no cero). En GRASS GIS, la expresion <tt>if(a, b)</tt> dará 0 (un número cero) en este caso. Así, se hace explícito el valor <tt>null()</tt> cuando <tt>a</tt> sea falso (o cero) usando un tercer parámetro. La sintaxis general es <tt>if(a, b, c)</tt> y esta es preferida por que es explícita y no es necesario recordar el valor especial de otras versiones cuando se lee la expresión. | |||
|- | |||
| SetNull(a, b), SetNull(a, b, c) | |||
| if(a, null(), b) | |||
| La función de ArcGIS <tt>SetNull</tt> da un valor nulo cuando su primer parámetro es verdadero. El tercer parámetro, opcional, es una sentencia SQL que es usada en vez de la expresión (primer parámetro). La función GRASS GIS para dar valores nulos cuando no se cumple la condición es la función estándar <tt>if</tt>, función usada con tres parámetros cuando el segundo es <tt>null()</tt>. | |||
|- | |||
| IsNull() | |||
| isnull() | |||
| | |||
|- | |||
| Int() | |||
| int() | |||
| | |||
|- | |||
| Float() | |||
| float(), double() | |||
| GRASS GIS tiene dos tipos de números de punto flotante. El primero es el de single precision que corresponde al mapa tipo FCELL. El segundo es el double precision que corresponde al mapa DCELL. | |||
|} | |||
Una expresión en ArcGIS a usar con el valor ''landclass'' cuando ''ladclass'' es 1 o 2 y nulo (SinDato) de otro modo: | |||
Con( ("landclass" == 1) | ("landclass" == 2), "landclass", null()) | |||
La misma expresión en álgebra de mapas de GRASS GIS, en la GUI: | |||
if(landclass == 1 || landclass == 2, landclass, null()) | |||
En la línea de comandos se usa el módulo {{cmd|r.mapcalc}}, empieza con el nombre de la salida y toda la expresión entre comillas (como necesita la línea de comandos). | |||
Una expresión en ArgGIS que usa los valores del ráster ''landclass'' cuando ''lakes'' contiene valores nulos (SinDatos) y usa los valores del ráster ''lakes'' de otro modo: | |||
Con(IsNull("lakes"), "landclass", "lakes") | |||
La misma expresión en la línea de comandos de GRASS GIS: | |||
r.mapcalc "land = if(isnull(lakes), landclass, lakes)" | |||
En este caso las expresiones son muy similares. La diferencia son las minúsculas <code>isnull</code>. Para la línea de comandos se añaden comillas al inicio y final de la expresión. | |||
Vea la lista de funciones disponibles en GRASS GIS en el manual de {{cmd|r.mapcalc}}. | |||
=== Más notas === | |||
Note que hay diferentes álgebras en GRASS GIS, esto es, hay un álgebra 3D que es similar a la 2D con algunas diferencias, y hay también una adaptada a datos temporales (álgebra temporal), que contiene sintaxis adicionales para funcionar con datos espacio temporales. Hay también un módulo de Complemento que soporta álgebra de mapas vectoriales, y está disponible en el repositorio de complementos de extensión. | |||
== Interfaz Python == | |||
=== Importando cajas de herramientas y revisar una licencia === | |||
Un script de Python en ArcGIS revisa si una determinada extensión está disponible, i.e. si la licencia para usarla es adecuada. En GRASS GIS, todos los módulos disponibles están incluidos en la instalación estándar y no es necesario revisar si la extensión está presente o si se tiene la licencia para usarla. Consecuentemente, lo siguiente no tiene equivalente en GRASS GIS: | |||
<source lang=Python> | |||
# revisar si se tiene la licencia de la extensión de Análisis espacial (''Spatial Analyst'') | |||
arcpy.CheckOutExtension("Spatial") | |||
</source> | |||
En ArcGIS las herramientas de otras fuentes pueden ser usadas en Python luego de llamar la función <code>ImportToolbox()</code>. En GRASS GIS, las herramientas de otras fuentes (módulos o conjuntos de módulos) están previamente instaladas con el módulo {{cmd|g.extension}}. Lo siguiente usualmente no se hace e GRASS GIS: | |||
<source lang=Python> | |||
arcpy.ImportToolbox("d:/toolsdir/sometools.tbx") | |||
</source> | |||
Sin embargo, cualquier módulo en GRASS GIS puede ser llamado desde Python, así que si se quisiera instalar alguna herramienta o solamente asegurarse de que esté instalada y actualizada, se puede llamar {{cmd|g.extension}} desde Python: | |||
<source lang=Python> | |||
gscript.run_command('g.extension', extension='v.sometool') | |||
</source> | |||
El módulo {{cmd|g.extension}} puede instalar módulos (extensiones, complementos) desde diferentes fuentes. Sin embargo, la fuente más usual es el repositorio oficial de Complementos de GRASS GIS que contiene un rango amplio de módulos contribuidos por los usuarios. Vea el manual de {{cmd|g.extension}} para su versión de GRASS GIS. | |||
== Análisis de costes == | |||
Las superficies de coste son definidas de modo diferente en GRASS GIS y en ArcGIS. La superficie de coste en GRASS GIS es ''a través de una celda'' (''cross a cell'') mientras que en ArcGIS es el coste ''a través de una unidad de mapa'' (''cross one map unit''). Por ejemplo definimos el coste como tiempo y tenemos celdas de 30 m y la velocidad es de 5 m/s. El coste de una celda es de 6 s e GRASS mientras que es de 0.2 s e ArcGIS. | |||
== Direcciones de flujo == | |||
Como la función FLOWDIRECTION de ArcGIS, GRASS también puede crear un ráster de dirección de flujo, dando a cada celda un valor entero que representa una de las 8 direcciones de flujo de la celda. En ambos programas la dirección de flujo es determinada encontrando cual de las celdas que la rodean tiene la menor elevación. Sin embargo, el valor que cada software utiliza es diferente. En ArcGIS, las direcciones de flujo son numeradas desde el este en dirección de las manecillas del reloj, y cada dirección es dos veces la anterior. Así, cuando la dirección de flujo es al este de la celda, la celda tiene un valor de 1. Cuando es al sur este de 2. Una celda con dirección de flujo al este tiene un valor de 4, y así hasta el noreste, que tiene un valor de 128. Los detalles de este procedimiento se presentan en [http://resources.arcgis.com/en/help/main/10.1/index.html#//009z00000052000000 el sitio web de ArcGIS]). | |||
GRASS numera las direcciones de flujo en contra de las manecillas del reloj, con el noreste tomando el valor de 1, el norte 2, noreste 3, oeste 4, y así hasta el 8 (este). | |||
Dos diferencias adicionales entre la implementación de GRASS y la de Arc: | |||
* ¿Qué pasa cuando dos o más celdas de los alrededores tienen la misma elevación y la dirección de flujo es ambigua? GRASS usa el algoritmo de búsqueda de Ruta del menor coste (''Least Cost Path'') para "ver hacia adelante" más allá de las celdas que rodea al punto, para encontrar una tendencia. Este procedimiento da resultados más reales en áreas planas. De manera similar el procedimiento de GRASS trabaja bien con sumideros, sin que sea necesario un procedimiento de "llenado de sumideros". ArcGIS requiere un MDE sin sumideros, y las celdas con dirección de flujo ambiguas se les da el valor de la suma de las direcciones ambiguas. | |||
* ¿Qué pasa en la región del borde, cuando la dirección de flujo va más allá del mapa? En este caso GRASS escoge la dirección de flujo pero establece su valor como negativo. ArcGIS no indica de ninguna manera espcial que el flujo está fuera de la región. Sin embargo hay una bandera en ArcGIS que fuerza a las celdas del borde a fluir fuera del mapa. | |||
Supongamos que necesita convertir un ráster de direcciónes de flujo creado con GRASS al esquema numérico de ArcGIS. Esto se consigue definiendo una tabla de valores de reclasificación y corriedo el módulo <nowiki>r.reclass</nowiki>. Por ejemplo con esta tabla de reclasificación: | |||
{| class="wikitable" | |||
|- | |||
|- | |||
| 1 -1 || = 128 | |||
|- | |||
| 2 -2 || =64 | |||
|- | |||
| 3 -3 || =32 | |||
|- | |||
| 4 -4 || =16 | |||
|- | |||
| 5 -5 || =8 | |||
|- | |||
| 6 -6 || =4 | |||
|- | |||
| 7 -7 || =2 | |||
|- | |||
| 8 -8 || =1 | |||
|- | |||
| 0 || =255 | |||
|} | |||
(Descrito con más detalle en [http://www.surfaces.co.il/flow-direction-from-grass-to-arcgis/ Flow Directions from GRASS to ArcGIS]) | |||
== Ver también == | |||
* [[Terminology comparison between ArcGIS and GRASS GIS]] | |||
* [[Tips for Arc users]] | |||
* [[GRASS migration hints]] | |||
* [[Performance comparison GRASS vs. ArcGIS]] | |||
== Enlaces externos == | |||
* [http://gracilis.carleton.ca/CUOSGwiki/index.php/Comparative_Analysis_of_Cost_Path_Analysis_In_Grass_GIS_and_ArcMap Comparative Analysis of Cost Path Analysis In Grass GIS and ArcMap] at Carleton University Open Source GIS | |||
[[Category: Documentation]] | [[Category: Documentation]] |
Latest revision as of 20:06, 26 July 2016
Esta es una guía para aquellas peronas que quieren migrar de ArcGIS a GRASS GIS, o que quieren aprender GRASS GIS pero ya están familiarizados con ArcGIS.
Proyecciones
ArcGIS soporta proyecciones al vuelo de los datos, GRASS GIS considera que ésta es una mala práctica y por tanto es necesario que los usuarios sean consistentes en el uso de la información de la proyección de los datos que ingresan al programa. Esta es una de las maneras en que GRASS GIS ayuda al usuario a facilitar la integridad de sus datos. Otras maneras son el mantener los datos geoespaciales ordenados y que sea necesario que todos los datos estén en un solo formato, por ej. el guardar los datos vectoriales en el formato topológico de GRASS. Sin embargo, tanto para datos ráster, como para vectoriales es posible enlazar los datos (r.external, v.external), en vez de importarlos y usar diferentes formatos de entrada, siempre y cuando respeten la proyección determinada.
Cuando los datos estén en una proyección diferente estos pueden ser importados a GRASS GIS usado los módulos r.import y v.import. Cuando los datos estén en otra Localización GRASS cuya proyección sea diferente a la deseada, se puede crear una Localización con la proyección deseada y usar los módulos r.proj y v.proj.
Una vez que se hayan importado los datos a la base de datos de GRASS GIS con la proyección adecuada, el usuario no tendrá que preocuparse de conversiones de proyección o incinsistencias y se puede concentrar en el análisis. En los módulos analíticos de GRASS GIS no es necesario definir la proyección de salida del resultado, cosa común en las herramientas de ArcGIS.
Datos, base de datos y formatos de archivos
En ArcGIS, el usuario generalemente tiene los datos en diferentes directorios dentro del disco. Básicamente todos los datos geoespaciales para GRASS GIS están en una base de datos GRASS GIS (un folder en un disco) Esta base de datos está dividida en Localizaciones (Locations) y las Localizaciones están divididas a su vez en Directorios de mapas (Mapsets). Cuando se inicializa GRASS GIS, el programa se conecta a ua base de datos, localizaciones y directorios de mapas especificados por el usuario.
Al hacer esto, GRASS GIS es capaz de aplicar un sistema específico de organización de los datos. El sistema está diseñado para acomodar proyectos grandes y múltiples usuarios en un localización pero también es útil para individuos que desean tener sus datos bien organizados. Primero, los datos deben estar en un directorio llamado Directorio de bases de datos GRASS GIS. Puede tener uno o muchos de estos directorios en su disco. Este directorio contiene Localizaciones GRASS. Todos los datos en una localización tienen la misma proyección (sistema de coordenadas, datum). Una localización es un directorio que contiene Directorios de mapas GRASS. Un directorio de mapas contiene mapas (capas) ráster y vectoriales y otra información geoespacial.
Para evitar cambios no deseados en los datos existentes, los módulos de GRASS GIS manejan la creación, modificación, cambio, copia o eliminación de aquellos datos que están guardados en el directorio de mapas en que se encutra el usuario (el directorio acutal). Cuando es necesario, los datos pueden ser copiados de otro directorio de mapas al directorio de mapas actual usando g.copy, por ejemplo, cuando uno necesita cambiar los atributos de un mapa vectorial que no le pertenece a uno(a).
Los datos de otros Directorios de mepas están disponibles para lectura, así que se pueden usar para visualizar. De manera predeterminada, puede ver los datos del directorio de mapas actual y del directorio de mapas especial llamado PERMANENT, que debe estar presete en toda Localización. Si se desea, puede ver los datos de otros directorios de mapas (en la localización actual) usando Configuraciones > Entorno de trabajo GRASS > Acceso a Directorio de mapas, o usando el módulo g.mapsets. Los datos e otras localizaciones son accesibles solamente si inicia GRASS GIS en esa localización. El acceso a datos de múltiples localizaciones no sería seguro por quqe los datos en diferentes localizaciones pueden estar en diferentes proyecciones (mientras que todos los directorios de mapas de una localización contienen datos en una proyección particular).
También es posible enlazar datos de diferentes fuentes como por ejemplo GeoTIFF o bases de datos PostGIS.
El sistema usado por GRASS GIS resulta en que siempre está definido dónde se van a crear los datos nuevos (el directorio de mapas actual). Todos los datos están en una sola proyección y en un formato consistente. El resultado es que una vez que los datos son importados, uno se puede concentrar en los análisis, y no en los formatos.
Los usuarios pueden seleccionar diferentes estrategias de cómo usar el directorio de bases de datos, localizaciones y directorios de mapas. Es común que los usuarios tengan un directorio de bases de datos GRASS GIS llamado grassdata
. Entonces cada localización es un proyecto mayor o un área de interés. Los directorios de mapas son proyectos menores, subproyectos, o tareas individuales. El directorio de mapas PERMANENT es usado para guardar los datos comunes a todos los directorios de mapas.
La Localización y Directorio de mapas de GRASS GIS es en cierto sentido similar al archivo Geodatabase o al Personal Geodatabase, en que guardan todos los datos dentro en un solo formato.
Cartografía
ArcGIS tiene dos modos en la pantalla, uno es el estándar para ver e interactuar con los datos. El otro es un modo que es una herramienta de diseño de mapas. El Visualizador de mapas (Map Display) en la interfaz gráfica de usuario (GUI) de GRASS también está hecha para interactuar, pero contiene algunos elementos cartográficos básicos. La cartografía avanzada en GRASS GIS se hace en una aplicación separada (disponible desde la GUI) llamada Diseñador cartográfico o desde la línea de comados g.gui.psmap. Esta aplicación es la GUI para el módulo ps.map. Algunos usuarios de GRASS GIS prefieren la GUI por que es conveniente y sencilla, otros prefieren ps.map, otros prefieren combinar con la visualización estándar con un editor de gráficas profesional como Inkscape, y otros más prefieren usar QGIS para realizar tareas cartográficas.
El visualizador estádar en GRASS GIS está bien adaptado a visualización estándar y exploración de los datos geoespaciales. También es posible usarlo para crear salidas cartográficas básicas, por ej. para publicaciones científicas, dado que se pueden visualizar elementos básicos como la escala, la leyenda de datos ráster. Esta funcionalidad está disponible desde la GUI en el Visualizador de mapas y es controlada también en el Administrador de capas. La funcionalidad también está disponible desde la línea de comandos, por ejemplo:
d.rast elevation
mostrará un mapa de elevación en el visualizador. Comandos como este pueden ser usados para controlar el visualizador en la GUI, para controlar visualizadores gráficos independientes, o para automatizar la creación de mapas. Para las últimas dos opciones se usa el módulo d.mon. Por ejemplo,
d.mon wx0
abre una ventana nueva que es similar al Visualizador de mapas en la GUI, pero es controlado principalmente por los módulos de visualización (d.*
), como el ya mencionado d.rast. Adicionalmente, d.mon puede ser usado para crear imágenes directamente, por ejemplo la siguiente serie de comandos crea una imagen PNG de un mapa ráster con un vectorial de arroyos sobre él:
g.region raster=elevation
d.mon start=cairo output=map.png
d.rast map=elevation
d.vect map=streams
d.mon stop=cairo
Esto se puede escribir para Python como:
import grass.script as script
gscript.run_command('g.region', raster='elevation')
gscript.run_command('d.mon', start='cairo', output='map.png')
gscript.run_command('d.rast', map='elevation')
gscript.run_command('d.vect', map='streams')
gscript.run_command('d.mon', stop='cairo')
Aun cuando no se use la línea de comandos o Python uno puede sacar provecho de la línea de comandos dado que en la GUI los comandos son mostrados, y pueden ser copiados y guardados o compartidos. Por ejemplo, uno puede definir un estilo en la GUI, copiar el comando y obtener algo como la siguiente línea:
d.vect map=streets color=255:165:0 width_column=SPEED width_scale=0.07
Esto puede ser guardado en un archivo de texto, y compartido por correo electrónico o incluido en un material de estudio para clases. Al final, el comando puede ser usado en la GUI para obtener exactamente la misma salida previamente obtenida.
El visualizador estándar tiene sus limitaciones, pero pueden ser sobrepasadas. Por ejemplo, las líneas solamente pueden tener un color, así, cuando se quiere visualizar las líneas de contorno de un color diferente, es es necesario mostrar la línea dos veces, una como una línea gruesa con el color de borde, y otra un poco más delgada con el color interno.
d.vect map=streets color=255:204:109 width=4 d.vect map=streets color=255:165:0 width=8
Algunos usuarios también combinan el visualizador estándar con programas de manipulación de vectores como Inkscape, que les da mayores capacidades gŕaficas. Cuando se automatiza la creación de mapas en Python, se pueden combinar múltiples imágenes y luego editarlas usando paquetes de procesamiento de imagenes de Python como PIL (o Pillow) o ImageMagic.
Visualización 3D
En GRASS GIS, la vista 3D está integrada a la GUI principal mientras que en ArcGIS está separada en una herramienta llamada ArcScene. La librería que está detrás de la vista 3D se llama NVIZ. La integración de NVIZ a la GUI wxGUI se llama wxNVIZ. La visualización 3D también se puede llamar desde la línea de comandos o en Python con el módulo m.nviz.image.
En GRASS GIS, cuando se está en una visualización 2D se puede cambiar a una 3D, todas las capas de mapa ráster son añadidas automaticamete como superficies en la vista 3D. Esto significa que si tiene un modelo de elevación 2D, lo verá como 3D. El color es igual al color que tiene en 2D. Esto es diferente de ArcScene donde las capas ráster son planas inicialmente y se tienen que especificar en propiedades cuál ráster se va a usar para crear la superficie.
Raster algebra
Actualmente la calculadora ráster de ArcGIS está implementada en Python. Algunas partes de la sintaxis son similares, mientras que otras difieren. En GRASS GIS el álgebra de mapas ráster se hace a través del módulo r.mapcalc (implementado en C) o a través de la GUI con la Calculadora de Mapas Ráster. La sintaxis de r.mapcalc está diseñada específicamente para álgebra de mapas ráster y está basada en la sintáxis de C (Python también es un lenguaje tipo C). Ambas sintaxis son sensibles a mayúsulas y minúsculas, como es usual en los lenguajes tipo C.
Comillas
En ArcGIS los nombres de las capas para el álgebra de mapas deben estar entrecomilladas. En GRASS GIS, las comillas son opcionales y generalmente no se usan. Hay algunos pocos caos en donde son necesarias y esto es cuando los nombres de los mapas ráster contienen guiones ("-"), que pueden ser confundidos con el operador menos. Sin embargo, la mejor pŕactica es no usar guines en los nombres de los mapas (dado que el nombre debe ser utilizable en SQL sin necesidad de entrecomillado). Cuando se escribe un script de Python y quiere que sea realmente robusto, quizás quiera usar el entrecomillado.
Espacios en blanco
En ArcGIS los operadores de álgebra de mapas deben estar separados por espacios e blanco. En GRASS GIS, los espacios alrededor de los operadores son opcionales, sin embargo, es una buena práctica el usarlos (lo mismo que en Python o C).
Operadores
ArcGIS | GRASS GIS | Notas |
---|---|---|
& | && | El operador booleano (lógico) Y es un ampersand (&) en ArcGIS. En GRASS GIS, el operador booleano Y son dos (&&), lo mismo que en C. Note que & es el operador Y bitwise en GRASS GIS (también en Python o en C). También está el operador &&& en GRASS GIS que no propaga los valores nulos (que es el comportamiento estándar), los trata como falsos. |
| | || | La diferencia entre ArcGIS y GRASS GIS en cuando al operador booleano (lógico) O es igual a la del operador booleano Y. En GRASS GIS hay un operador bitwise | uno booleano (logico) || y |||. El operador || preserva los valores nulos (como se espera de manera predeterminada), y el operador ||| evalúa los valores nulos como falsos, lo que a veces es ventajoso. |
~ | ! | En GRASS GIS el operador NO es (un) signo de exclamación (!), lo cual es igual a C. El equivalente en ArcGIS es la tilde (~), mientras que en GRASS GIS la tilde es el operador NO bitwise, lo mismo que en C o Python. |
^ | xor() | En ArcGIS el gorrito (^) representa el operador booleano O excluyente (XOR), mientras que en GRASS GIS este representa el exponencial (una operación matemática). En GRASS GIS el operador booleano O excluyente se obtiene con la función xor(). |
La expresión de álgebra de mapas en ArcGIS que calcula el NDVI, para la Calculadora ráster en la GUI (el nombre de salida se ingresa de maera separada):
Float("lsat7_40" - "lsat7_30") / Float("lsat7_40" + "lsat7_30")
La misma expresión en GRASS GIS para la calculadora de ráster en la GUI (el nombre de salida se ingresa de manera separada):
float(lsat7_2002_40 - lsat7_2002_30) / float(lsat7_2002_40 + lsat7_2002_30)
La misma expresión escrita en la línea de comandos:
r.mapcalc "ndvi = float(lsat7_2002_40 - lsat7_2002_30) / float(lsat7_2002_40 + lsat7_2002_30)"
Consulte la lista de operadores disponibles en GRASS GIS en el manual de r.mapcalc.
Funciones
ArcGIS | GRASS GIS | Notas |
---|---|---|
Con(a, b, c), Con(a, b, c, d) | if(a, b, c) | La sentencia condicional más usada (la sentencia si, if) tanto en ArcGIS como en GRASS GIS son funciones de álgebra de mapas tres parámetros, primero está la condición (condition), luego el valor que se usará si se cumple la condición ("if-part") y en tercer lugar el valor que se usará si la condición no se cumple ("else-part"). ArcGIS soporta también una sintaxis con cuatro parámetros cuando el primero solo es un ráster y el cuarto es una sentencia condicional SQL. GRASS GIS también tiene una versión de cuatro parámetros, pero esta es conveniente para el caso en donde se necesita decidir etre tres valores basandose en el primer parámetro (ráster o expresió) menor, mayor o igual a cero. |
Con(a, b) | if(a, b, null()) | En ArcGIS la expresión Con(a, b) dará un dato nulo (sin dato, NULL), si a es verdadero (o no cero). En GRASS GIS, la expresion if(a, b) dará 0 (un número cero) en este caso. Así, se hace explícito el valor null() cuando a sea falso (o cero) usando un tercer parámetro. La sintaxis general es if(a, b, c) y esta es preferida por que es explícita y no es necesario recordar el valor especial de otras versiones cuando se lee la expresión. |
SetNull(a, b), SetNull(a, b, c) | if(a, null(), b) | La función de ArcGIS SetNull da un valor nulo cuando su primer parámetro es verdadero. El tercer parámetro, opcional, es una sentencia SQL que es usada en vez de la expresión (primer parámetro). La función GRASS GIS para dar valores nulos cuando no se cumple la condición es la función estándar if, función usada con tres parámetros cuando el segundo es null(). |
IsNull() | isnull() | |
Int() | int() | |
Float() | float(), double() | GRASS GIS tiene dos tipos de números de punto flotante. El primero es el de single precision que corresponde al mapa tipo FCELL. El segundo es el double precision que corresponde al mapa DCELL. |
Una expresión en ArcGIS a usar con el valor landclass cuando ladclass es 1 o 2 y nulo (SinDato) de otro modo:
Con( ("landclass" == 1) | ("landclass" == 2), "landclass", null())
La misma expresión en álgebra de mapas de GRASS GIS, en la GUI:
if(landclass == 1 || landclass == 2, landclass, null())
En la línea de comandos se usa el módulo r.mapcalc, empieza con el nombre de la salida y toda la expresión entre comillas (como necesita la línea de comandos).
Una expresión en ArgGIS que usa los valores del ráster landclass cuando lakes contiene valores nulos (SinDatos) y usa los valores del ráster lakes de otro modo:
Con(IsNull("lakes"), "landclass", "lakes")
La misma expresión en la línea de comandos de GRASS GIS:
r.mapcalc "land = if(isnull(lakes), landclass, lakes)"
En este caso las expresiones son muy similares. La diferencia son las minúsculas isnull
. Para la línea de comandos se añaden comillas al inicio y final de la expresión.
Vea la lista de funciones disponibles en GRASS GIS en el manual de r.mapcalc.
Más notas
Note que hay diferentes álgebras en GRASS GIS, esto es, hay un álgebra 3D que es similar a la 2D con algunas diferencias, y hay también una adaptada a datos temporales (álgebra temporal), que contiene sintaxis adicionales para funcionar con datos espacio temporales. Hay también un módulo de Complemento que soporta álgebra de mapas vectoriales, y está disponible en el repositorio de complementos de extensión.
Interfaz Python
Importando cajas de herramientas y revisar una licencia
Un script de Python en ArcGIS revisa si una determinada extensión está disponible, i.e. si la licencia para usarla es adecuada. En GRASS GIS, todos los módulos disponibles están incluidos en la instalación estándar y no es necesario revisar si la extensión está presente o si se tiene la licencia para usarla. Consecuentemente, lo siguiente no tiene equivalente en GRASS GIS:
# revisar si se tiene la licencia de la extensión de Análisis espacial (''Spatial Analyst'')
arcpy.CheckOutExtension("Spatial")
En ArcGIS las herramientas de otras fuentes pueden ser usadas en Python luego de llamar la función ImportToolbox()
. En GRASS GIS, las herramientas de otras fuentes (módulos o conjuntos de módulos) están previamente instaladas con el módulo g.extension. Lo siguiente usualmente no se hace e GRASS GIS:
arcpy.ImportToolbox("d:/toolsdir/sometools.tbx")
Sin embargo, cualquier módulo en GRASS GIS puede ser llamado desde Python, así que si se quisiera instalar alguna herramienta o solamente asegurarse de que esté instalada y actualizada, se puede llamar g.extension desde Python:
gscript.run_command('g.extension', extension='v.sometool')
El módulo g.extension puede instalar módulos (extensiones, complementos) desde diferentes fuentes. Sin embargo, la fuente más usual es el repositorio oficial de Complementos de GRASS GIS que contiene un rango amplio de módulos contribuidos por los usuarios. Vea el manual de g.extension para su versión de GRASS GIS.
Análisis de costes
Las superficies de coste son definidas de modo diferente en GRASS GIS y en ArcGIS. La superficie de coste en GRASS GIS es a través de una celda (cross a cell) mientras que en ArcGIS es el coste a través de una unidad de mapa (cross one map unit). Por ejemplo definimos el coste como tiempo y tenemos celdas de 30 m y la velocidad es de 5 m/s. El coste de una celda es de 6 s e GRASS mientras que es de 0.2 s e ArcGIS.
Direcciones de flujo
Como la función FLOWDIRECTION de ArcGIS, GRASS también puede crear un ráster de dirección de flujo, dando a cada celda un valor entero que representa una de las 8 direcciones de flujo de la celda. En ambos programas la dirección de flujo es determinada encontrando cual de las celdas que la rodean tiene la menor elevación. Sin embargo, el valor que cada software utiliza es diferente. En ArcGIS, las direcciones de flujo son numeradas desde el este en dirección de las manecillas del reloj, y cada dirección es dos veces la anterior. Así, cuando la dirección de flujo es al este de la celda, la celda tiene un valor de 1. Cuando es al sur este de 2. Una celda con dirección de flujo al este tiene un valor de 4, y así hasta el noreste, que tiene un valor de 128. Los detalles de este procedimiento se presentan en el sitio web de ArcGIS).
GRASS numera las direcciones de flujo en contra de las manecillas del reloj, con el noreste tomando el valor de 1, el norte 2, noreste 3, oeste 4, y así hasta el 8 (este).
Dos diferencias adicionales entre la implementación de GRASS y la de Arc:
- ¿Qué pasa cuando dos o más celdas de los alrededores tienen la misma elevación y la dirección de flujo es ambigua? GRASS usa el algoritmo de búsqueda de Ruta del menor coste (Least Cost Path) para "ver hacia adelante" más allá de las celdas que rodea al punto, para encontrar una tendencia. Este procedimiento da resultados más reales en áreas planas. De manera similar el procedimiento de GRASS trabaja bien con sumideros, sin que sea necesario un procedimiento de "llenado de sumideros". ArcGIS requiere un MDE sin sumideros, y las celdas con dirección de flujo ambiguas se les da el valor de la suma de las direcciones ambiguas.
- ¿Qué pasa en la región del borde, cuando la dirección de flujo va más allá del mapa? En este caso GRASS escoge la dirección de flujo pero establece su valor como negativo. ArcGIS no indica de ninguna manera espcial que el flujo está fuera de la región. Sin embargo hay una bandera en ArcGIS que fuerza a las celdas del borde a fluir fuera del mapa.
Supongamos que necesita convertir un ráster de direcciónes de flujo creado con GRASS al esquema numérico de ArcGIS. Esto se consigue definiendo una tabla de valores de reclasificación y corriedo el módulo r.reclass. Por ejemplo con esta tabla de reclasificación:
1 -1 | = 128 |
2 -2 | =64 |
3 -3 | =32 |
4 -4 | =16 |
5 -5 | =8 |
6 -6 | =4 |
7 -7 | =2 |
8 -8 | =1 |
0 | =255 |
(Descrito con más detalle en Flow Directions from GRASS to ArcGIS)
Ver también
- Terminology comparison between ArcGIS and GRASS GIS
- Tips for Arc users
- GRASS migration hints
- Performance comparison GRASS vs. ArcGIS
Enlaces externos
- Comparative Analysis of Cost Path Analysis In Grass GIS and ArcMap at Carleton University Open Source GIS