Semplice mappatura tematica di shapefile usando Python?


37

Vorrei visualizzare i dati geografici in Python, senza usare ArcGIS / ArcPy, e creare una mappa.

Su internet ho scoperto come creare una mappa tematica usando Python :

Ecco un po 'di codice che ho provato:

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()

Tuttavia, quando eseguo questo, mi dà colori casuali.

Se voglio visualizzare una determinata colonna del mio shapefile, come posso implementarlo usando un codice simile?

Questo non è molto chiaro nel link fornito sopra in cui discute solo l'uso dei colori ...

Avrei forse bisogno di moduli extra per raggiungere questo obiettivo, come Descartes e PySAL ?

Risposte:


62

Non conosco ArcPy, ma lavoro con shapefile e raster in Python da anni

  1. Per l'elaborazione di shapefile in Python, ci sono molti moduli come osgeo / ogr , Fiona , Pysal o Pyshp ( shpUtils è uno di questi e non il più usato), e altri, vedi Pypi: GIS ed esempi su gis.stackexchange e molti esempi su il Web (non solo in inglese). Molti di loro sono molto più vecchi di ArcPy (o arcgisscripting) ...
  2. per l'elaborazione di raster è possibile utilizzare osgeo / gdal , lo standard
  3. Per la lavorazione di geometrie geospaziali, c'è formosa
  4. Per tracciare le geometrie puoi usare matplotlib e possibilmente descartes , "estensione" di matplotlib per aree, ma anche molti, molti altri moduli, vedi Pypi: Plotting e moduli come mayavi per la rappresentazione 3D (anche matplotlib)
  5. Ci sono anche moduli come mapnik che ti danno direttamente la possibilità di 1) leggere uno shapefile e 4) tracciare con il modulo Pycairo .

Dopodiché, è come un GIS:

  • si utilizzano i moduli 1) per aprire, salvare gli shapefile ed eseguire i trattamenti con altri moduli come numpy o scipy, se si desidera.
  • puoi usare ben fatto per la manipolazione e l'analisi degli oggetti geometrici (buffer, ecc.).
  • puoi usare matplotlib per tracciare le geometrie, ma matplotlib non sa cosa vuoi tracciare. È il tuo lavoro con i moduli 1) o 3) specificare cosa tracciare (attributi, ecc.) E come.

Se voglio visualizzare una determinata colonna del mio shapefile, come posso implementarlo nel codice?

Quindi, devi imparare matplotib e gli altri moduli. Devi imparare ArcPy, è lo stesso ... (ci sono molti tutorial eccellenti sul web, specialmente per matplolib, ed è più facile che ArcPy perché sia ​​Python puro).

Alcuni esempi solo con Python

inserisci qui la descrizione dell'immagine

Mappa geologica (poligono shapefile) con colori basati su un attributo

inserisci qui la descrizione dell'immagine

Punti 3D (PointZ shapefile) con colore basato su un attributo

inserisci qui la descrizione dell'immagine

Punti 3D (Point shapefile con z come attributo) e linea 3D (PolyLineZ shapefile) su un DEM e su un raster drappeggiato sulla superficie DEM.

inserisci qui la descrizione dell'immagine

Profilo topografico con valori e colori z basati su attributi (formazioni geologiche = sezione trasversale) del file di forma originale (file di forma polilinea)

inserisci qui la descrizione dell'immagine

DEM (GeoTIFF) con il modulo Mayavi2

inserisci qui la descrizione dell'immagine

DEM (ESRI ascii grid, .asc) e Point shapefile (con z come attributo) con il modulo visvis

inserisci qui la descrizione dell'immagine

Fori (buffer 3D di una polilinea Z con colori basati su un attributo (formazioni geologiche), con una superficie della griglia calcolata con i moduli numpy e matplotlib da un shapefile di punti (con z come attributo), visualizzati con il modulo visvis


16

Ho avuto problemi simili in cui desidero visualizzare rapidamente gli shapefile e ho sempre trovato il modo Matplotlib un modo piuttosto lungo per eseguire un compito così piccolo. Invece ho sviluppato il modulo "Python Geographic Visualizer" , o GeoVis in breve. Aggiornamento: v0.2.0 è ora disponibile con molte nuove funzionalità.

Con esso visualizzare gli shapefile non potrebbe essere più semplice:

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

Voilà, la mappa viene visualizzata come immagine in una finestra di Tkinter e puoi anche salvare la mappa in un file di immagine. È anche possibile creare stili, colorare e aggiungere più livelli a una mappa e nella versione più recente è anche possibile classificare in base agli attributi e ingrandire una determinata regione. Nella mappa sottostante i geovis hanno caricato e colorato categoricamente tutte le province GADM del mondo in circa 5 minuti. Puoi scaricare GeoVis da qui , dove puoi anche leggere di più su come usarlo.

inserisci qui la descrizione dell'immagine

L'obiettivo è una facile installazione tanto quanto la facilità d'uso, quindi GeoVis può essere utilizzato da chiunque abbia Python e non richiede altri moduli poiché può utilizzare Tkinter Canvas integrato come renderer. Ma si consiglia vivamente di avere o ottenere Aggdraw, PIL o PyCairo, che possono anche essere usati come renderer e sono molto più veloci e di qualità superiore.

Backdraw è che il tuo shapefile deve essere non proiettato con il sistema di coordinate lat / long - non gestisce ancora proiezioni o trasformazioni.



1

Nel 2019 il modo più semplice per creare una mappa tematica da un file di forma in pitone, è geopandas .

Un esempio dalla documentazione: 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')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.