Python para Geoprocesamiento en SIG

Gabriel Gaona
vie, 01 de abril, 2016

CONTENIDO

  • Introducción
  • Relación en Python y SIG
  • APIs Python para Geoprocesamiento
  • Ejemplos de scripting con python para gvSIG y QGIS

Introducción

El uso de Python en sistemas de información geográfica requiere por lo menos las siguientes bases de conocimiento:

  • La sintaxis de Python
  • Las bases de SIG:
    • Las estructuras de los datos espaciales; y,
    • La gestión de proyectos.
  • Los 'Cálculos' relacionados
  • La API que se ha de utilizar

Introducción: La sintaxis de Python

Aqui dejare que los expertos (La gente de Python Ecuador) les expliquen los detalles de la sintaxis de este lenguaje.

Introducción: Bases de SIG

Sistema de

Información

Geográfica

Componentes de un SIG Componentes de un SIG

Introducción: Bases de SIG

El problema fundamental que intenta resolver una herramienta de SIG es el analisis de la información con relacion al espacio.

plot of chunk unnamed-chunk-1

Introducción: Bases de SIG

El espacio es la superficie de la tierra en donde se produce la información.

La información puede referirse a objetos o a procesos que se desarrollen en esa superficie.

plot of chunk unnamed-chunk-2

Introducción: Bases de SIG

Modelos de datos en SIG

Modelos de datos en SIG

La información es organizada en estructuras especiales conocidas como capas ~y estas pueden ser almacenadas en ficheros o bases de datos~

Dentro de una capa se encuentran las entidades. Cada entidad posee atributos intrínsecos y agregados

Introducción: Bases de SIG

Toda la información es gestionada a diferentes niveles.

Importante! diferenciar entre la gestión información a nivel de software y la gestión a nivel de datos


Niveles de gestión de información

Relacion Python y SIG: Scripting

El uso principal de python en Sistemas de información geográfica está relacionado con “Scripting”.

Recientemente se han introducido intérpretes python para la ampliación de algoritmos y herramientas desde la interfaz de los SIG. Algunos permiten combinar Python con otros lenguajes (ej. bash, C++, Fortan, java, …)

APIs python para SIG: Algunas de las disponibles

Ejemplos python en SIG:

gvSIG.py

El problema a resolver es la visualización de estadísticas a partir de los atributos de las entidades que se muestran en la vista.

El ejemplo fue tomado del taller de Scripting con gvSIG de las 11as. Jornadas Internacionales ()

gvSIG.py

Necesitamos el módulo de scripting de gvSIG que se importará con las siguientes líneas:

from gvsig import *
from commonsdialog import *

gvSIG.py

Luego, empieza el juego de las líneas de código. Una buena práctica es el reciclaje del código, para los cual definimos las Clases y métodos necesarios.

def cal_suma(mapContext, layer, fieldname):
  canv = mapContext.getViewPort()
  rect = canv.getEnvelope().getGeometry()
  tabla = layer.getFeatureStore()
  ents = tabla.getFeatureSet().iterator()
  suma = 0
  for ent in ents:
    g = ent.getDefaultGeometry()
    if rect.intersects(g) :
      suma += int(ent.get(fieldname))
  print "Sumatorio de %s: %s" % (fieldname, suma)

gvSIG.py

De esta manera obtenemos la vista y su contexto

mapContext = currentView().getMapContext()

Por otro lado así obtenemos la capa activa y solo es cuestión de decir cual campo..

layer = currentLayer()
fieldname = 'Total'

gvSIG.py

Solo queda llamar a la función para hacer

mapContext = currentView().getMapContext()

…a partir de esto queda poner algunos “adornos” para hacerlo mas interactivo. Para eso usamos el modulo de commonsdialog

El resultado les mostraré en seguida…

gvSIG.py

PyQgis

En este ejemplo intentaremos calcular un indice de vegetación a partir de una escena Landsat obtenida de http://earthexplorer.usgs.gov/.

PyQgis

Calcularemos el índice de vegetación de diferencia normalizada (NDVI).

Se requiere las bandas que contengan la reflectancia Roja (R ) e Infrarroja cercana (IRC).

  • Rojo = Banda 3 de Landsat
  • Infrarrojo cercano = Banda 4 de Landsat

La ecuación que usaremos es la siguiente:

\[ NDVI = \frac{IRC-R}{IRC+R} \]

Como resultado obtendremos valores entre -1 y 1

PyQgis

De la API de PyQgis importaremos solo las clases RasterCalculator y RasterCalculatorEntry

from qgis.analysis import QgsRasterCalculator, QgsRasterCalculatorEntry

PyQgis

De la API de PyQgis importaremos solo las clases RasterCalculator y RasterCalculatorEntry

# Función para registrar las capas de entrada

def rasterCalcEntry(EntLst,band,refNam,bNum):
    raster = QgsRasterCalculatorEntry()
    raster.ref = refNam
    raster.raster = band
    raster.bandNumber = bNum
    EntLst.append(raster)

PyQgis

De la API de PyQgis importaremos solo las clases RasterCalculator y RasterCalculatorEntry

# Definimos el método que calcule el NDVI

def ndvi(R, IRC, output):
    Ent = []
    rasterCalcEntry(Ent, R, 'R@1', 1)
    rasterCalcEntry(Ent, IRC, 'IRC@1', 1)
    calc = QgsRasterCalculator(
        '(IRC@1-R@1)/(IRC@1+R@1)', 
        output, 'GTiff', band3.extent(), 
        band3.width(), band3.height(),Ent)
    calc.processCalculation()

PyQgis

Finalmente definimos las entradas y llamamos a las funciones definidas:

# Haremos un listado de capas disponibles 
# en el proyecto actual

lyrs = iface.mapCanvas().layers()

# Definirmos la ruta y nombre de salida

output = '../datos/geodata/Landsat/ndvi.tif'

# Llamamos a la función

ndvi(lyrs[1], lyrs[0], output)

PyQgis

Ahora lo veremos en acción…

ArcPy

En este caso no haremos un script de python, sino que emplearemos el lenguaje dentro de una herramienta de un GIS.

La herramienta será la Calculadora de campos de ArcGIS.

El ejemplo fue una práctica dentro del Programa UNIGIS para América Latina.

ArcPy

Consolidaremos los valores de varios campos en uno solo.

ArcPy

Solo escribiremos nuestra función y la ejecutaremos desde la calculadora de campos.

def consolide(*args):
    value0 = "-"
    for arg in args:
        val = str(arg).strip()
        if val == "-":
            continue
        elif val == "":
            value0 += " "
        else:
            value0 += val
    return value0.strip("-")

Conclusiones:

Conclusiones:

  • El scripting con Python permite implementar tareas automáticas que pueden dar mayor valor agregado a los análisis de información goegráfica.
  • Además se pueden ampliar las funcionalidades de los diferentes software.
  • Con la tendencia de los nuevos análisis en aplicaciones web, se han desarrollado librerías para implementar geoprocesos y herramientas de análisis geoespacial en línea.

Agradecimientos:

Gabriel V. Gaona


Universidad Regional Amazónica IKIAM gabriel.gaona@ikiam.edu.ec
gabriel.gaona@gvsigecuador.com
gavg712@gmail.com
Twitter: gavg712