¿Mapeo temático simple de shapefile usando Python?

37

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 usando Python :

Aquí hay un código que probé:

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 archivo de forma, ¿cómo puedo implementar esto usando un código similar?

Esto no está muy claro en el enlace proporcionado anteriormente, donde solo analiza el uso de colores ...

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

NYannickske
fuente

Respuestas:

62

No conozco ArcPy, pero trabajo con archivos de forma y ráster en Python durante años

  1. Para procesar archivos shape 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, vea Pypi: GIS y ejemplos en gis.stackexchange y muchos ejemplos en la web (no solo en inglés). La mayoría de ellos son mucho más antiguos que ArcPy (o arcgisscripting) ...
  2. para procesar ráster puede usar osgeo / gdal , el estándar
  3. Para procesar geometrías geoespaciales, hay bien proporcionado
  4. Para trazar las geometrías puede usar matplotlib y posiblemente descartes , "extensión" de matplotlib para áreas, pero también muchos, muchos otros módulos, vea Pypi: Trazado y módulos como mayavi para representación 3D (también matplotlib)
  5. También hay módulos como mapnik que le brindan directamente las posibilidades de 1) leer un archivo shape y 4) trazar con el módulo Pycairo .

Después de eso, es como un SIG:

  • usa los módulos 1) para abrir, guardar los archivos de forma y llevar a cabo los tratamientos con otros módulos como numpy o scipy, si lo desea.
  • Puede utilizarlo para manipular y analizar los objetos geométricos (búfer, etc.).
  • puede usar matplotlib para trazar las geometrías, pero matplotlib no sabe lo que quiere trazar. Es su trabajo con los módulos 1) o 3) especificar qué trazar (atributos, etc.) y cómo.

Si quiero visualizar una determinada columna de mi archivo de forma, ¿cómo puedo implementar esto en el código?

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

Algunos ejemplos solo con Python

ingrese la descripción de la imagen aquí

Mapa geológico (archivo de forma poligonal) con colores basados ​​en un atributo

ingrese la descripción de la imagen aquí

Puntos 3D (archivo de forma PointZ) con color basado en un atributo

ingrese la descripción de la imagen aquí

Puntos 3D (archivo de forma de punto con z como atributo) y línea 3D (archivo de forma PolyLineZ) en un DEM y en un ráster desplegado sobre la superficie del DEM.

ingrese la descripción de la imagen aquí

Perfil topográfico con valores z y colores basados ​​en atributos (formaciones geológicas = sección transversal) del archivo de forma original (archivo de forma de polilínea)

ingrese la descripción de la imagen aquí

DEM (GeoTIFF) con el módulo Mayavi2

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

Perforaciones (búfer 3D de una polylineZ con colores basados ​​en un atributo (formaciones geológicas), con una superficie de cuadrícula calculada con los módulos numpy y matplotlib a partir de un archivo de forma de puntos (con z como atributo), visualizado con el visvis del módulo

gene
fuente
16

He tenido problemas similares en los que quiero visualizar los archivos de forma rápidamente, y siempre he encontrado que el modo Matplotlib es bastante largo para lograr una tarea tan pequeña. En cambio, desarrollé el módulo "Python Geographic Visualizer" , o GeoVis para abreviar. Actualización: v0.2.0 ya está disponible con muchas funcionalidades nuevas.

Con esto, visualizar archivos de forma no podría ser más fácil:

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

Voila, su mapa aparece como una imagen en una ventana de Tkinter y también puede guardar el mapa en un archivo de imagen. También es posible diseñar, colorear y agregar varias capas a un mapa, y en la versión más reciente también puede clasificar según los atributos y hacer zoom en una región en particular. En el siguiente mapa, Geovis cargó y coloreó categóricamente todas las provincias GADM del mundo en aproximadamente 5 minutos. Puede descargar GeoVis desde aquí , donde también puede leer más sobre cómo usarlo.

ingrese la descripción de la imagen aquí

El objetivo es una instalación fácil tanto como la facilidad de uso, por lo que GeoVis puede ser utilizado por cualquier persona que tenga Python y no requiera ningún otro módulo, ya que puede usar el Tkinter Canvas incorporado como renderizador. Pero es muy recomendable que tenga u obtenga Aggdraw, PIL o PyCairo, que también se pueden usar como renderizadores y son mucho más rápidos y de mayor calidad.

Backdraw es su archivo de forma que no se debe proyectar con el sistema de coordenadas lat / long; todavía no maneja las proyecciones o transformaciones.

Karim Bahgat
fuente
1

En 2019, la forma más sencilla de hacer un mapa temático a partir de un archivo de forma 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')
pez espada
fuente