Proste mapowanie tematyczne pliku shapefile przy użyciu Pythona?

37

Chcę wizualizować dane geograficzne w Pythonie, bez korzystania z ArcGIS / ArcPy, i tworzyć mapę.

W Internecie znalazłem sposób tworzenia mapy tematycznej przy użyciu Pythona :

Oto kod, który próbowałem:

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

Jednak kiedy to uruchamiam, daje mi losowe kolory.

Jeśli chcę wizualizować jedną określoną kolumnę mojego pliku kształtu, jak mogę to zaimplementować przy użyciu podobnego kodu?

Jest to bardzo niejasne w powyższym linku, w którym omawia on tylko użycie kolorów ...

Czy może potrzebowałbym dodatkowych modułów, aby to osiągnąć, takich jak kartezjusz i PySAL ?

NYannickske
źródło

Odpowiedzi:

61

Nie znam ArcPy, ale od lat pracuję z plikami kształtu i rastrem w Pythonie

  1. Do przetwarzania plików kształtów w Pythonie istnieje wiele modułów, takich jak osgeo / ogr , Fiona , Pysal lub Pyshp ( shpUtils jest jednym z nich i nie jest najczęściej używany), i inne, patrz Pypi: GIS i przykłady na gis.stackexchange i wiele przykładów na sieć (nie tylko w języku angielskim). Większość z nich jest znacznie starsza niż ArcPy (lub arcgisscripting) ...
  2. dla przetwórstwa rastra można użyć OSGeo / gdal , standard
  3. Do przetwarzania geometrii geoprzestrzennych istnieje kształt
  4. Do wykreślania geometrii można użyć matplotlib i ewentualnie desartartów , „rozszerzenia” matplotlib dla obszarów, ale także wielu innych modułów, patrz Pypi: Rysowanie i moduły takie jak mayavi do reprezentacji 3D (także matplotlib)
  5. Istnieją również moduły, takie jak mapnik, które dają bezpośrednio możliwości 1) odczytania pliku kształtu i 4) kreślenia za pomocą modułu Pycairo .

Potem jest jak GIS:

  • korzystasz z modułów 1) do otwierania, zapisywania plików kształtów i przeprowadzania zabiegów z innymi modułami, takimi jak numpy lub scipy, jeśli chcesz.
  • możesz używać zgrabnie do manipulacji i analizy obiektów geometrycznych (buforów itp.).
  • możesz użyć matplotlib do wykreślenia geometrii, ale matplotlib nie wie, co chcesz narysować. Twoja praca z modułami 1) lub 3) polega na określeniu, co należy narysować (atrybuty itp.) I jak.

Jeśli chcę wizualizować jedną określoną kolumnę mojego pliku kształtu, jak mogę to zaimplementować w kodzie?

Musisz nauczyć się matplotib i innych modułów. Musisz nauczyć się ArcPy, to jest to samo ... (w sieci jest wiele doskonałych samouczków, szczególnie dla matplolib, i ArcPy jest łatwiejszy, ponieważ jest to czysty Python).

Niektóre przykłady tylko z Pythonem

wprowadź opis zdjęcia tutaj

Mapa geologiczna (plik kształtu wielokąta) z kolorami opartymi na atrybucie

wprowadź opis zdjęcia tutaj

Punkty 3D (plik kształtu PointZ) z kolorem opartym na atrybucie

wprowadź opis zdjęcia tutaj

Punkty 3D (Point shapefile z atrybutem z) i linia 3D (PolyLineZ shapefile) na DEM i na rastrze naniesionym na powierzchnię DEM.

wprowadź opis zdjęcia tutaj

Profil topograficzny z wartościami i kolorami na podstawie atrybutów (formacje geologiczne = przekrój) oryginalnego pliku kształtów (plik kształtów polilinii)

wprowadź opis zdjęcia tutaj

DEM (GeoTIFF) z modułem Mayavi2

wprowadź opis zdjęcia tutaj

DEM (ESRI ascii grid, .asc) i Point shapefiles (z atrybutem z) jako atrybut visvis modułu

wprowadź opis zdjęcia tutaj

Odwierty (bufor 3D polilinii Z kolorami opartymi na atrybucie (formacje geologiczne), z powierzchnią siatki obliczoną za pomocą modułów numpy i matplotlib z pliku kształtu punktów (z atrybutem z), wizualizowane za pomocą visvis modułu

gen
źródło
16

Miałem podobne problemy, gdy chciałem szybko wizualizować pliki kształtów i zawsze uważałem Matplotlib za dość długi sposób na wykonanie tak małego zadania. Zamiast tego opracowałem moduł „Python Geographic Visualizer” , w skrócie GeoVis. Aktualizacja: v0.2.0 jest teraz dostępny z dużą ilością nowych funkcji.

Dzięki wizualizacji plików kształtów nie może być łatwiej:

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

Voila, twoja mapa pojawia się jako obraz w oknie Tkintera, a także możesz zapisać mapę w pliku obrazu. Możliwe jest także stylizowanie, kolorowanie i dodawanie wielu warstw do mapy, aw najnowszej wersji można także klasyfikować na podstawie atrybutów i powiększać do określonego regionu. Na poniższej mapie Geovis załadował i kategorycznie pokolorował wszystkie prowincje GADM na świecie w około 5 minut. Możesz pobrać GeoVis stąd , gdzie możesz także przeczytać więcej o tym, jak z niego korzystać.

wprowadź opis zdjęcia tutaj

Celem jest zarówno łatwa instalacja, jak i łatwość użycia, więc GeoVis może być używany przez każdego, kto ma Python i nie wymaga żadnych innych modułów, ponieważ może korzystać z wbudowanego Tkinter Canvas jako renderer. Jednak zdecydowanie zaleca się posiadanie lub otrzymywanie Aggdraw, PIL lub PyCairo, które mogą być również używane jako renderery i są znacznie szybsze i lepszej jakości.

Wycofanie jest to, że Twój plik kształtu nie musi być rzutowany za pomocą układu współrzędnych długości / szerokości - nie obsługuje on jeszcze rzutów ani przekształceń.

Karim Bahgat
źródło
1

W 2019 r . Najprostszym sposobem na utworzenie mapy tematycznej z pliku kształtu w pythonie jest geopandas .

Przykład z dokumentacji: 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
źródło