Pemetaan tematik sederhana shapefile menggunakan Python?

37

Saya ingin memvisualisasikan data geografis dengan Python, tanpa menggunakan ArcGIS / ArcPy, dan membuat peta.

Di internet saya menemukan cara membuat peta tematik menggunakan Python :

Berikut ini beberapa kode yang saya coba:

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

Namun, ketika saya menjalankan ini, itu memberi saya warna acak.

Jika saya ingin memvisualisasikan satu kolom tertentu dari shapefile saya, bagaimana saya bisa menerapkan ini menggunakan kode yang sama?

Ini sangat tidak jelas dalam tautan yang disediakan di atas di mana ia hanya membahas penggunaan warna ...

Apakah saya mungkin memerlukan modul tambahan untuk menyelesaikan ini, seperti deskrips dan PySAL ?

NYannickske
sumber

Jawaban:

62

Saya tidak tahu ArcPy, tapi saya bekerja dengan shapefile dan raster di Python selama bertahun-tahun

  1. Untuk memproses shapefile dengan Python, ada banyak modul seperti osgeo / ogr , Fiona , Pysal atau Pyshp ( shpUtils adalah salah satunya dan bukan yang paling banyak digunakan), dan yang lain, lihat Pypi: GIS dan contoh di gis.stackexchange dan banyak contoh di Web (tidak hanya dalam bahasa Inggris). Sebagian besar dari mereka jauh lebih tua dari ArcPy (atau arcgisscripting) ...
  2. untuk memproses raster, Anda dapat menggunakan osgeo / gdal , standar
  3. Untuk memproses geometri geospasial, ada rupanya
  4. Untuk memplot geometri Anda dapat menggunakan matplotlib dan mungkin descartes , "ekstensi" dari matplotlib untuk area, tetapi juga banyak, banyak modul lain, lihat Pypi: Plotting dan modul seperti mayavi untuk representasi 3D (matplotlib juga)
  5. Ada juga modul seperti mapnik yang memberi Anda secara langsung kemungkinan 1) membaca shapefile dan 4) merencanakan dengan modul Pycairo .

Setelah itu, itu seperti GIS:

  • Anda menggunakan modul 1) untuk membuka, menyimpan shapefile dan melakukan perawatan dengan modul lain seperti numpy atau scipy, jika Anda mau.
  • Anda dapat menggunakan bentuk untuk manipulasi dan analisis objek geometris (penyangga, dll.).
  • Anda dapat menggunakan matplotlib untuk memplot geometri, tetapi matplotlib tidak tahu apa yang ingin Anda plot. Ini adalah pekerjaan Anda dengan modul 1) atau 3) untuk menentukan apa yang akan plot (atribut, dll ,.) dan bagaimana.

Jika saya ingin memvisualisasikan satu kolom tertentu dari shapefile saya, bagaimana saya bisa menerapkan ini dalam kode?

Jadi, Anda harus mempelajari matplotib dan modul lainnya. Anda harus belajar ArcPy, sama saja ... (ada banyak tutorial bagus di web, terutama untuk matplolib, dan ArcPy lebih mudah karena itu murni Python).

Beberapa contoh hanya dengan Python

masukkan deskripsi gambar di sini

Peta geologis (bentuk poligon) dengan warna berdasarkan atribut

masukkan deskripsi gambar di sini

Poin 3D (PointZ shapefile) dengan warna berdasarkan atribut

masukkan deskripsi gambar di sini

Poin 3D (Point shapefile dengan z sebagai atribut) dan garis 3D (PolyLineZ shapefile) pada DEM, dan pada raster yang terbungkus ke permukaan DEM.

masukkan deskripsi gambar di sini

Profil topografi dengan nilai z dan warna berdasarkan atribut (formasi geologi = penampang) dari shapefile asli (Polyline shapefile)

masukkan deskripsi gambar di sini

DEM (GeoTIFF) dengan modul Mayavi2

masukkan deskripsi gambar di sini

DEM (ESRI ascii grid, .asc) dan Point shapefile (dengan z sebagai atribut) dengan modul visvis

masukkan deskripsi gambar di sini

Lubang bor (penyangga 3D dari polylineZ dengan warna berdasarkan atribut (formasi geologi), dengan permukaan kotak dihitung dengan modul numpy dan matplotlib dari titik shapefile (dengan z sebagai atribut), divisualisasikan dengan modul visvis

gen
sumber
16

Saya memiliki masalah serupa di mana saya ingin memvisualisasikan shapefile dengan cepat, dan saya selalu menemukan cara Matplotlib cara yang cukup panjang untuk menyelesaikan tugas sekecil itu. Sebaliknya saya mengembangkan modul "Python Geographic Visualizer" , atau GeoVis singkatnya. Pembaruan: v0.2.0 sekarang keluar dengan banyak fungsi baru.

Dengan itu memvisualisasikan shapefile menjadi lebih mudah:

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

Voila, Anda memetakan muncul sebagai gambar di jendela Tkinter dan Anda juga dapat menyimpan peta ke file gambar. Styling, mewarnai, dan menambahkan beberapa layer ke peta juga dimungkinkan, dan dalam versi terbaru Anda juga dapat mengklasifikasikan berdasarkan atribut dan memperbesar area tertentu. Dalam peta di bawah ini, geovis memuat dan dengan jelas mewarnai semua provinsi GADM dunia dalam waktu sekitar 5 menit. Anda dapat mengunduh GeoVis dari sini , di mana Anda juga dapat membaca lebih lanjut tentang cara menggunakannya.

masukkan deskripsi gambar di sini

Tujuannya adalah pada instalasi yang mudah dan kemudahan penggunaan, sehingga GeoVis dapat digunakan oleh siapa saja yang memiliki Python dan tidak memerlukan modul lain karena dapat menggunakan Kanvas Tkinter bawaan sebagai penyaji. Tetapi sangat disarankan agar Anda memiliki atau mendapatkan Aggdraw, PIL, atau PyCairo, yang juga dapat digunakan sebagai penyaji dan jauh lebih cepat dan berkualitas lebih tinggi.

Backdraw adalah shapefile Anda harus tidak diproyeksikan dengan sistem koordinat lat / long - itu belum menangani proyeksi atau transformasi.

Karim Bahgat
sumber
1

Pada 2019 cara paling sederhana untuk membuat peta tematik dari shapefile dengan python, adalah geopanda .

Contoh dari dokumentasi: 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
sumber