38 votos

¿Mapeo temático simple de shapefile usando Python?

Deseo visualizar datos geográficos en Python, sin usar ArcGIS/ArcPy, y hacer un mapa.

En Internet encontré cómo hacer un mapa temático con Python :

Aquí hay un código que he probado:

import shpUtils
import matplotlib.pyplot as plt

shpRecords = shpUtils.loadShapefile('C:\\Users\\shapefile.shp')

for i in range(0,len(shpRecords)):
    x = []
    y = []
    for j in range(0,len(shpRecords[i]['shp_data']['parts'][0]['points'])):

    tempx = float(shpRecords[i]['shp_data']['parts'][0]['points'][j]['x'])
    tempy = float(shpRecords[i]['shp_data']['parts'][0]['points'][j]['y'])
    x.append(tempx)
    y.append(tempy)
    plt.fill(x,y)

plt.axis('equal')
plt.title("Testing")
plt.show()

Sin embargo, cuando ejecuto esto, me da colores aleatorios.

Si quiero visualizar una determinada columna de mi shapefile, ¿cómo puedo implementarlo utilizando un código similar?

Esto es muy poco claro en el enlace proporcionado arriba donde sólo habla del uso de los colores...

¿Quizás necesitaría módulos adicionales para lograr esto, como descartes y PySAL ?

65voto

GreyCat Puntos 146

No conozco ArcPy, pero trabajo con shapefiles y raster en Python desde hace años

  1. Para procesar shapefiles en Python, hay muchos módulos como osgeo/ogr , Fiona , Pysal o Pyshp ( shpUtils es uno de ellos y no el más utilizado), y otros, véase Pypi: GIS y ejemplos en gis.stackexchange y muchos ejemplos en la web (no sólo en inglés). La mayoría de ellos son mucho más antiguos que ArcPy (o arcgisscripting)...
  2. para el tratamiento de las tramas se puede utilizar osgeo/gdal La norma
  3. Para el tratamiento de las geometrías geoespaciales, existe elegante
  4. Para trazar las geometrías se puede utilizar matplotlib y posiblemente descartes La "extensión" de matplotlib para áreas, pero también muchos, muchos otros módulos, ver Pypi: Trazando y módulos como mayavi para la representación en 3D (también con matplotlib)
  5. También hay módulos como mapnik que le dan directamente las posibilidades de 1) leer un shapefile y 4) trazar con el módulo Pycairo .

Después de eso, es como un SIG:

  • se utilizan los módulos 1) para abrir, guardar los shapefiles y realizar los tratamientos con otros módulos como numpy o scipy, si se desea.
  • puede utilizar shapely para la manipulación y el análisis de los objetos geométricos (buffer, etc.).
  • puedes usar matplotlib para trazar las geometrías, pero matplotlib no sabe lo que quieres trazar. Es su trabajo con los módulos 1) o 3) para especificar qué trazar (atributos, etc,.) y cómo.

Si quiero visualizar una determinada columna de mi shapefile, ¿cómo puedo implementarlo en el código?

Por lo tanto, debes aprender matplotib y los otros módulos. Tienes que aprender ArcPy, es lo mismo...(hay un montón de excelentes tutoriales en la web, especialmente para matplolib, y es más fácil que ArcPy porque es puro Python).

Algunos ejemplos sólo con Python

enter image description here

Mapa geológico (shapefile poligonal) con colores basados en un atributo

enter image description here

Puntos 3D (shapefile PointZ) con color basado en un atributo

enter image description here

Puntos 3D (shapefile Point con z como atributo) y línea 3D (shapefile PolyLineZ) en un MDE, y en un ráster drapeado sobre la superficie del MDE.

enter image description here

Perfil topográfico con valores z y colores basados en los atributos (formaciones geológicas = sección transversal) del shapefile original (Polyline shapefile)

enter image description here

DEM (GeoTIFF) con el módulo Mayavi2

enter image description here

DEM (ESRI ascii grid, .asc) y Point shapefiles (con z como atributo) con el módulo vis vis

enter image description here

Sondeos (buffer 3D de una polilíneaZ con colores basados en un atributo (formaciones geológicas), con una superficie cuadriculada calculada con los módulos numpy y matplotlib a partir de un shapefile de puntos (con z como atributo), visualizado con el módulo vis vis

18voto

Adrian Wible Puntos 1027

He tenido problemas similares en los que quiero visualizar shapefiles rápidamente, y siempre me ha parecido que la forma de Matplotlib es bastante larga para realizar una tarea tan pequeña. En su lugar desarrollé el "Módulo "Visualizador geográfico de Python o GeoVis para abreviar. Actualización: La versión 0.2.0 ya está disponible con muchas nuevas funciones.

Con él, visualizar los shapefiles no puede ser más fácil:

import geovis
geovis.ViewShapefile("C:/yourshapefile.shp")

Voilà, tu mapa aparece como una imagen en una ventana de Tkinter y también puedes guardar el mapa en un archivo de imagen. También es posible estilizar, colorear y añadir múltiples capas a un mapa, y en la versión más reciente también se puede clasificar en función de los atributos y zoom en una región determinada. En el siguiente mapa, Geovis cargó y coloreó categóricamente todas las provincias GADM del mundo en unos 5 minutos. Se puede descargue GeoVis desde aquí donde también puedes leer más sobre cómo utilizarlo.

enter image description here

El objetivo es tanto la facilidad de instalación como la facilidad de uso, por lo que GeoVis puede ser utilizado por cualquier persona que tenga Python y no requiere ningún otro módulo, ya que puede utilizar el lienzo incorporado Tkinter como un renderizador. Pero es muy recomendable tener o conseguir Aggdraw, PIL o PyCairo, que también pueden ser utilizados como renderizadores y son mucho más rápidos y de mayor calidad.

Backdraw es su shapefile tiene que ser sin proyectar con el sistema de coordenadas lat/long - todavía no maneja proyecciones o transformaciones.

14voto

auramo Puntos 161

He encontrado una serie de tutoriales sobre este tema que quería compartir:

También puedes considerar el uso de R: ¿Cómo crear un mapa coropleto atractivo en R?

2voto

Tom D Puntos 21

En 2019 la forma más sencilla de hacer un mapa temático a partir de un shapefile en python, es geopandas .

Un ejemplo de la documentación: http://geopandas.org/mapping.html

import geopandas
world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
world['gdp_per_cap'] = world.gdp_md_est / world.pop_est
world.plot(column='gdp_per_cap')

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X