You are here:GeoTux»Geo-Blogs»Libraries for Geomatics»Los módulos Python con finalidad espacial: ¿qué, por qué, para qué y cómo?

Statistics

Invitados: 24
Usuarios registrados: 3145
Usuarios en línea:
-
Registrados hoy:
-

Register

RSS

Blogs and News:
Recibe las actualizaciones en Geo-Noticias y Geo-Blogs

Get them by e-mail
Recibir Geo-Noticias y Geo-Blogs por e-mail

¿What is this about?

Latest Geo-Tweets

Thursday, 26 December 2013 13:27

Los módulos Python con finalidad espacial: ¿qué, por qué, para qué y cómo?

Written by  martin Laloux
Rate this item
(3 votes)

Pasa algo extraño en el mundo GIS, es cómo si la gente descubriera de repente el poder de Python. Observen por ejemplo las preguntas Python Script examples for geoprocessing shapefiles without using arcpy y Visualize shapefile in Python en GIS StackExchange.

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 qsirven 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:

¿ Cómo instalarlos ?

imagen de http://www.theroadtosiliconvalley.com/technology/attention-python-comrades/

Es la primera pregunta que se plantea:

¿ 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 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:

  1. se abren o se escriben los datos espaciales con módulos específicos.
  2. se tratan con otros  (o los mismos que en 1.).
  3. 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:

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 sons 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:

Otros:

Quiero leer datos de un servicio WFS:

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:

  • Hay que señalar rasterio, el nuevo módulo de Sean Gillies para tratar los rasters de manera mas "pythonesca" (traducción libre de pythonic) , basado sobre GDAL/OGR (igual que Fiona para los ficheros vectoriales) y es compatible con numpy.

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:

Quiero hacer estadísticas espaciales:

El módulo PySAL:

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:

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:

  1. osgeo.ogr o Fiona para leer el fichero shapefile linea
  2. shapely para generar puntos equidistantes sobre la linea
  3. osgeo.gdal para leer y extraer los valores de altitud (z) y los valores de color (RGB)  del DEM y del mapa
  4. 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.

 

Last modified on Thursday, 26 December 2013 23:07

comments  

 
0 # Procesamiento de Mapas en 3dJosé Ramos 2017-03-14 17:59
Buenas tardes, soy alumno de ultimo curso de ingeniería aeroespacial y me encuentro actualmente realizando mi trabajo de fin de grado, en el cual necesito aprender a procesar mapas en 3d en Python para obtener información útil de ellos para posteriormente usarla para dar distintas instrucciones a un UAV. Mi pregunta era acerca de si me podrían facilitar alguna librería que cumpliese dicha función o me explicasen como podría acceder a ella.

Un saludo y gracias de adelantado
Reply | Reply with quote | Quote
 

Add comment


Security code
Refresh

 

On-line users

Latest Geo-Forums

More Topics »

Latest Comments