Como ya se dijo en Sobre Python, módulos espaciales, programas SIG y controversias, la historia de Python para el procesamiento de datos espaciales es muy larga, más antigua que las de PyQGIS, ArcPy (o arcgisscripting) y otros.
Pero los que quieren utilizarlos están un poco desorientados ante la profusión de estos módulos: oyeron hablar de ellos, pero no ven para qué sirven y qué sentido tienen (ver PyPI:GIS, por ejemplo) .
Algunos también están un poco perdidos ante los mensajes o errores enviados por sus programas GIS cuando quieren instalar/usar una extensión/plugin:
"ImportError: No module named shapely.wkb"
"¿¡Vaya! qué es shapely.wkb? No está en los plugins de QGIS, rápidamente una pregunta sobre GIS StackExchange u otro para que me den una solución".
Y nada, porque shapely no es un plugin de QGIS, sino un simple módulo Python, utilizado por el plugin.
Recordamos que en la práctica:
- se puede utilizar Python cómo lenguaje de script para una aplicación con unicamente sus módulos propios (ArcPy, PyQGIS, grasscript,...).
- se puede utilizar Python solo con estos módulos.
- pero se puede también utilizar uno de estos módulos con el Python de sus programas SIG.
(Es una adaptación en español:
- del articulo presentado en francés en el Portail SIG: Les modules Python à finalités géospatiales: quid, quando, ubi ?.
- y, al final, para ilustrar la combinación de diferentes módulos sin utilizar un GIS o en complemento de un GIS:
- imágenes de un tratamiento geológico: establecer un corte geológico a partir de un fichero raster mapa geológico, de un fichero DEM y de una linea vectorial al formato shapefile presentado en francés en Python: utilisation des couches vectorielles et matricielles dans une perspective géologique, sans logiciel SIG y Python: traitement des couches vectorielles dans une perspective géologique, lecture et enregistrement des couches sous forme de dictionnaires avec le module Fiona.
- imagen de un tratamiento geológico utilizando uno de estos módulos en QGIS o, en GeoTux: QGIS, visualización 3D de capas vectoriales con Python)
¿ Cómo instalarlos ?
imagen de http://www.theroadtosiliconvalley.com/technology/attention-python-comrades/
Es la primera pregunta que se plantea:
- como premisa básica, hay que conocer Python...
- después, se instalan cómo los módulos Python clásicos (Instalar módulos de Python, Cómo instalar un paquete Python con pip, ...).
- algunos necesitan una fase de compilación porque utilizan librerías C o C++ y eso es difícil en Windows (porque no hay compiladores instalados cómo en Linux o Mac OS X), pero se pueden descargar versiones "listas" en el Unofficial Windows Binaries for Python Extension Packages de Christoph Gohlke.
¿ Cómo aprenderlos ?
Clase geometry del módulo Shapely
Lo menos que se puede decir es que conozco muy poca literatura en español sobre el tema, a parte de El Blog de José Guerrero que utiliza estos módulos solos o con PyQGIS (y sigo buscando)...
- el curso universitario de Chris Garrard de la Utah State University: Geoprocessing with Python using Open Source GIS.
- los libros Python Geospatial Development de Eric Westra y Learning Geospatial Analysis with Python de Joel Lawhead.
![]() |
|
- el Python GDAL/OGR Cookbook de Jared Erickson.
- los manuales de los módulos, mas o menos completos y fáciles de acceso.
- GIS StackExchange que se ha convertido en el referente internacional para las preguntas y respuestas.
- y muchos blogs o portales, en otras lenguas.
¿ Y por fin, cómo utilizarlos?
De la misma maneras que cuando utilizamos un programa GIS:
- se abren o se escriben los datos espaciales con módulos específicos.
- se tratan con otros (o los mismos que en 1.).
- y por fin, para visualizar los resultados, hay módulos específicos que permiten hacerlo.
A continuación, voy a tratar de clasificarlos de una manera práctica, limitándome a los fundamentales, es decir a los que más se usan actualmente:
¿ Qué módulo usar si quiero... ?
No obstante, existen unas constantes:
- la mayoría de ellos esta mas o menos relacionada con el principal módulo científico, numpy (basados en él, o compatibles con el tipo de datos de numpy: los arrays). Esto asegura los tratamientos posteriores.
- esta clasificación puede ser redundante, en el sentido que un modulo solo puede hacer muchas cosas mientras que otro se limita a un solo tratamiento (por ejemplo, PySAL puede leer los ficheros shapefiles y tratarlos, matplotlib.basemap puede también leerlos y representarlos gráficamente mientras que PyShp se limita a leerlos y escribirlos).
- para intercambiar datos entre todos estos módulos, un protocolo de normalización, la geo_interface, basada sobre el formato GeoJSON, ha sido propuesto por Sean Gillies. Esta utilizado cada vez mas (incluyendo ArcPy y PyQGIS, ver Python Geo_interface applications).
Existe sin embargo, un módulo 'universal' en el sentido que puede hacer casi todo y es uno de los mas antiguos, es decir que muchas veces sirvió de base para los otros:
El módulo osgeo:
- es la versión Python de la librería C/C++ GDAL/OGR (utilizada por QGIS, GRASS GIS entre otros, incluso ArcGIS...).
- esta subdividido en varios submódulos, osgeo.ogr, osgeo.gdal, y osgeo.osr , cuyo significado se verá posteriormente.
- es compatible con numpy.
Es relativamente de difícil acceso para un principiante.
1) Quiero leer mis datos o escribirlos
Quiero leer o escribir datos de ficheros vectoriales:
El módulo osgeo.ogr:
- Permite leer y escribir todos los formatos vectoriales soportados por la libreria OGR: Vector Formats.
- la geo_interface es fácil de implementar (ogr_geointerface.py).
El módulo Fiona:
Esta también basado sobre GDAL/OGR, pero utiliza diccionarios Python para hacerlo todo, siguiendo la opinión de Sean Gillies, su creador, para quien el procesamiento de datos espaciales no tiene nada de especial en comparación con el tratamiento de otros datos.
- su propósito es de leer y escribir todos los formatos soportados por osgeo.ogr (unicamente ficheros por ahora), pero de manera mas "pythonesca" (traducción libre de pythonic).
- es compatible con numpy y dispone de la geo_interface.
- una vez su lógica entendida, es muy fácil de utilizar.
El módulo PyShp (shapefile):
Está escrito en Python puro.
- su único propósito es de leer y escribir ficheros shapefiles.
- no tiene nada que ver con GDAL/OGR.
- es compatible con numpy y dispone de la geo_interface.
- es el más fácil para empezar.
Otros:
- cómo ya señalado, módulos cómo PySAL, matplotlib.basemap o mapnik permiten también de leer directamente los elementos vectoriales y los demás son más bien anecdóticos.
- Hay que señalar GeoPandas, en desarrollo, que permite utilizar los formatos de Pandas con datos espaciales.
Quiero leer o escribir datos de tablas espaciales (DBMS, NoSQL):
El módulo osgeo.ogr:
- tiene los pilotos (drivers) para tratar a la mayoría de las bases de datos espaciales.
- se puede usar solo.
El módulo psycopg2:
- es el más utilizado para tratar las bases PostgreSQL/PostGIS.
- hay otros (PyPI: PostgreSQL) pero menos usados.
El módulo sqlite3:
- para tratar la bases SQLite.
El módulo pyspatialite:
- para tratar la bases SQLite/Spatialite.
- se puede también usar sqlite3, ver SQLite - SpatiaLite: el porqué del cómo....
Otros:
- Hay módulos parar tratar cualquier base de datos, hasta las bases NoSQL espaciales cómo mongoDB con PyMongo o CouchDB/Geocouch con Couchdbkit.
Quiero leer datos de un servicio WFS:
- Aquí también, es el módulo osgeo.ogr.
Quiero leer y escribir datos de tipo raster (ficheros, base de datos espaciales, servicios WMS, ...):
Se pueden utilizar teóricamente todos los módulos que permiten tratar los imágenes (cómo la Python Imaging Library o PIL, "forkeada" en Pillow) pero no tienen cuenta la georeferenciación de una imagen.
El módulo osgeo.gdal:
- Permite leer y escribir todos los formatos soportados por la libreria GDAL Raster Formats.
- Toma en cuenta la georeferenciación.
- es compatible con numpy.
Otros:
Quiero leer datos «específicos»:
- Existen módulos más especializados, sin relación con los precedentes cómo OsmApi que permite trabajar con los datos de OpenStreetMap (pero hay otros, ver PyPI: OpenStreetMap) o los que permiten procesar los ficheros KML (simplekml, pykml o keytree).
Quiero ocuparme de las proyecciones de mis datos:
2) Quiero tratar mis datos
Quiero tratar las geometrías vectoriales:
El módulo Shapely:
- utiliza la libreria C++ GEOS.
- para simplificar , permite hacer todos los tratamientos geométricos de PostGIS en Python.
- no se ocupa de leer o de escribir ficheros ni de las proyecciones.
- como dispone de la geo_interface, se puede utilizar osgeo.ogr, Fiona, pyshp y pyproj para eso (su asociación con Fiona es perfecta, mismo autor).
- originalmente limitado al plano cartesiano 2D, las ultimas versiones permiten ahora las traslaciones, los cizallamientos y las rotaciones en 2D o 3D.
- es compatible con numpy.
Existe una versión muy simplificada de Shapely ("shapely ultralight"), el módulo PyGeoIf que dispone igualmente de la geo_interface.
El módulo osgeo.ogr:
- permite también hacerlo, pero de manera mas complicada.
- tiene la ventaja de poder leer o escribir los datos directamente.
Otros:
- como las geometrías se recuperan en formato Python, es posible utilizar todos los otros módulos cómo numpy o SciPy para realizar tratamientos específicos (Delaunay, Voronoi, etc.).
- igualmente se pueden utilizar módulos de indexación espacial cómo Rtree, scipy.spatial.KDTree o python-kdtree.
Quiero hacer geolocalizaciones:
- ver geopy, googlemaps o pymaps.
Quiero hacer estadísticas espaciales:
El módulo PySAL:
- ofrece una multitud de tratamientos estadísticos.
- permite leer y escribir ficheros shapefiles directamente.
- esta totalmente integrado con el módulo Shapely (Using PySAL with Shapely for GIS Operations).
- es compatible con numpy y dispone de la geo_interface.
Quiero tratar los datos de forma matricial (rasters):
Aquí se pueden utilizar numpy, SciPy u otros módulos científicos (como scikit-image) pero solo osgeo.gdal. se ocupa del aspecto espacial (proyección, georeferenciación).
El módulo osgeo.gdal:
- ofrece una multitud de tratamientos.
- la traslación al formato numpy es directa.
Los módulos científicos:
- cómo una imagen no es mas que una matriz de pixeles, se pueden utilizar para todos los tratamientos.
Otros:
- Existen otros módulos derivados cómo Python raster stats (basado sobre osgeo.gdal y numpy ) para hacer Estadística Zonal o Pyresample.
Quiero visualizar mis datos
Cómo los resultados son objetos Python, es teóricamente posible utilizar cualquier módulo que permite hacerlo (PyPI: Plotting ) y hay muchos... Pero de hecho, solo algunos se destacan para los tratamientos espaciales:
El módulo matplotlib:
- no es un módulo espacial y su finalidad es científica (el Matlab de Python) y se integra perfectamente con numpy.
- es el más completo
- permite la representaciones 2D o 3D de vectores y de matrices (imagenes).
- dispone también de tratamientos específicos (grid, Delaunay, ...).
El módulo matplotlib.basemap:
- es una extensión de matplotlib (Matplotlib Basemap Toolkit) que permite representar los datos con proyección sobre un mapa 2D o un globo 3D.
- permite la lectura de los ficheros shapefiles (solo la geometría).
El módulo Descartes:
- es una extensión de matplotlib para representar las superficies de los objetos geométricos (2D).
- es compatible con numpy y dispone de la geo_interface.
El módulo Cartopy:
- se presenta cómo una solución integrada porque se propone leer los ficheros shapefile con PyShp, tratar los datos con shapely y numpy y representarlos con matplotlib (2D).
- gestiona las proyecciones con su propia implementación basada en la librería PROJ4 (Cartopy projections), de una manera no estándar.
- por ahora, los únicos rasters que puede leer son los que provienen del servicio Mapquest.
El módulo mapnik:
- Mapnik es un mundo en sí mismo, cuyo único propósito es, de forma caricaturesca, proporcionar las representaciones cartográficas más guapas posibles (Mapnik is about making beautiful maps). Dar mas detalles aquí queda fuera de propósito.
- utiliza el módulo gráfico Pycairo y puede leer de forma nativa los ficheros shapefiles.
- es fácil de implementar la geo_interface (mapnik_geointerface.py).
El módulo Mayavi:
- no es un módulo espacial pero es EL módulo para la representación científica 3D.
- usa la biblioteca VTK para los datos y permite representar los vectores y rasters en 3D.
- tiene muchos tratamientos propios.
- es muy difícil de usar para un principiante.
Conclusiones
Espero haberles proporcionado algunas aclaraciones sobre lo que son los módulos espaciales, para que sirven y los intereses de usarlos. Se pueden utilizar solos o con el Python de un GIS como complemento:
Solos
Imágenes del tratamiento geológico. Para eso he utilizado:
- osgeo.ogr o Fiona para leer el fichero shapefile linea
- shapely para generar puntos equidistantes sobre la linea
- osgeo.gdal para leer y extraer los valores de altitud (z) y los valores de color (RGB) del DEM y del mapa
- matplotlib para las figuras
|
![]() |
el mapa geológico y el DEM con la linea de corte
representación en 3D
corte geológico X 10 con los colores del mapa geológico
corte geológico X 1 con valores de buzamiento extraídos con osgeo.ogr
ejemplo de DEM tratado con Mayavi
En complemento de un GIS:
ejemplo de utilización de PyQGIS, shapely y matplotlib en QGIS para construir un Down-plunge profile de un pliegue (proyección de estructuras paralelas al buzamiento del eje del pliegue)
Ver también QGIS, visualización 3D de capas vectoriales con Python en GeoTux.
comments
Un saludo y gracias de adelantado
RSS feed for comments to this post