Einfaches thematisches Mapping von Shapefile mit Python?

37

Ich möchte geografische Daten in Python ohne Verwendung von ArcGIS / ArcPy visualisieren und eine Karte erstellen.

Im Internet fand ich heraus, wie man mit Python eine thematische Karte erstellt :

Hier ist ein Code, den ich ausprobiert habe:

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

Wenn ich dies jedoch ausführe, erhalte ich zufällige Farben.

Wenn ich eine bestimmte Spalte meines Shapefiles visualisieren möchte, wie kann ich dies mit ähnlichem Code implementieren?

Dies ist in dem obigen Link, in dem er nur die Verwendung von Farben behandelt, sehr unklar.

Brauche ich dafür vielleicht zusätzliche Module wie Descartes und PySAL ?

NYannickske
quelle

Antworten:

61

Ich kenne ArcPy nicht, arbeite aber seit Jahren mit Shapefiles und Raster in Python

  1. Für die Verarbeitung von Shapefiles in Python gibt es viele Module wie osgeo / ogr , Fiona , Pysal oder Pyshp ( shpUtils ist eines davon und nicht das am häufigsten verwendete). Weitere Informationen finden Sie unter Pypi: GIS und Beispiele in gis.stackexchange das Web (nicht nur in Englisch). Die meisten von ihnen sind viel älter als ArcPy (oder arcgisscripting) ...
  2. Für die Verarbeitung von Raster können Sie den Standard osgeo / gdal verwenden
  3. Für die Bearbeitung von Raumgeometrien gibt es formschöne
  4. Zum Zeichnen der Geometrien können Sie matplotlib und möglicherweise descartes verwenden , "extension" von matplotlib für Bereiche, aber auch viele, viele andere Module, siehe Pypi: Plotten und Module wie mayavi für die 3D-Darstellung (matplotlib auch)
  5. Es gibt auch Module wie mapnik, die Ihnen direkt die Möglichkeiten geben, 1) ein Shapefile zu lesen und 4) mit dem Modul Pycairo zu plotten .

Danach ist es wie bei einem GIS:

  • Sie verwenden die Module 1), um die Shapefiles zu öffnen, zu speichern und die Behandlungen mit anderen Modulen wie numpy oder scipy durchzuführen, wenn Sie möchten.
  • Sie können Shapely für die Manipulation und Analyse der geometrischen Objekte (Puffer usw.) verwenden.
  • Sie können matplotlib verwenden, um die Geometrien zu zeichnen, aber matplotlib weiß nicht, was Sie zeichnen möchten. Sie arbeiten mit Modulen 1) oder 3), um festzulegen, was (Attribute usw.) und wie geplottet werden soll.

Wenn ich eine bestimmte Spalte meines Shapefiles visualisieren möchte, wie kann ich dies im Code implementieren?

Sie müssen also Matplotib und die anderen Module lernen. Sie müssen ArcPy lernen, es ist dasselbe ... (Es gibt viele hervorragende Tutorials im Internet, insbesondere für Matplolib, und es ist einfacher, ArcPy zu verwenden, da es sich um reines Python handelt.)

Einige Beispiele nur mit Python

Bildbeschreibung hier eingeben

Geologische Karte (Polygon Shapefile) mit Farben basierend auf einem Attribut

Bildbeschreibung hier eingeben

3D-Punkte (PointZ-Shapefile) mit Farbe basierend auf einem Attribut

Bildbeschreibung hier eingeben

3D-Punkte (Punkt-Shapefile mit dem Attribut z) und 3D-Linien (PolyLineZ-Shapefile) auf einem DEM und auf einem Raster, das auf der DEM-Oberfläche drapiert ist.

Bildbeschreibung hier eingeben

Topografisches Profil mit Z-Werten und Farben basierend auf Attributen (geologische Formationen = Querschnitt) des ursprünglichen Shapefiles (Polyline-Shapefile)

Bildbeschreibung hier eingeben

DEM (GeoTIFF) mit dem Modul Mayavi2

Bildbeschreibung hier eingeben

DEM (ESRI ASCII Grid, .asc) und Point Shapefiles (mit z als Attribut) mit dem Modul visvis

Bildbeschreibung hier eingeben

Bohrlöcher (3D-Puffer einer PolylinieZ mit Farben basierend auf einem Attribut (geologische Formationen), mit einer Rasterfläche, die mit den Modulen numpy und matplotlib aus einem Punkt-Shapefile (mit dem Attribut z) berechnet und mit dem Modul visvis visualisiert wird

Gen
quelle
16

Ich hatte ähnliche Probleme, bei denen ich Shapefiles schnell visualisieren möchte, und ich fand die Matplotlib-Methode immer recht langwierig, um eine so kleine Aufgabe zu erledigen. Stattdessen habe ich das Modul "Python Geographic Visualizer" , kurz GeoVis, entwickelt. Update: v0.2.0 ist jetzt mit vielen neuen Funktionen erhältlich.

Die Visualisierung von Shapefiles könnte nicht einfacher sein:

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

Voila, Ihre Karte erscheint als Bild in einem Tkinter-Fenster und Sie können die Karte auch in einer Bilddatei speichern. Styling, Färben und das Hinzufügen von mehreren Schichten auf eine Karte ist auch möglich und in der neuesten Version können Sie auch anhand von Attributen klassifizieren und vergrößern , um eine bestimmte Region. In der Karte darunter werden alle GADM-Provinzen der Welt in ca. 5 Minuten geladen und kategorisch eingefärbt. Sie können GeoVis von hier herunterladen. Dort erfahren Sie auch, wie Sie es verwenden.

Bildbeschreibung hier eingeben

Das Ziel ist die einfache Installation und die Benutzerfreundlichkeit. GeoVis kann daher von jedem verwendet werden, der über Python verfügt, und benötigt keine weiteren Module, da das integrierte Tkinter Canvas als Renderer verwendet werden kann. Es wird jedoch dringend empfohlen, entweder Aggdraw, PIL oder PyCairo zu verwenden oder zu erwerben, die auch als Renderer verwendet werden können und viel schneller und von höherer Qualität sind.

Backdraw ist, dass Ihr Shapefile mit dem Lat / Long-Koordinatensystem nicht projiziert werden muss - es verarbeitet noch keine Projektionen oder Transformationen.

Karim Bahgat
quelle
1

2019 ist Geopanda die einfachste Möglichkeit, eine thematische Karte aus einem Shapefile in Python zu erstellen .

Ein Beispiel aus der Dokumentation: 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')
Davemfish
quelle