Geopandas Polygon ke matplotlib menambal konversi Polygon

9

Sayangnya geopanda merencanakan sangat lambat dan membutuhkan banyak sumber daya, maka saya ingin menggunakan matplotlib untuk merencanakan.

Ketika saya menggunakan Fiona murni untuk membuka dan membaca shapefile saya tidak memiliki masalah untuk mengekstrak Poligon sebagai patch matplotlib tapi sekarang saya ingin menggunakan sebagai titik awal dataframe geopanda untuk mendapatkan Poligon matplotlib saya.

Saat ini saya menggunakan sesuatu seperti:

with FI.open(df_map_elements, 'r') as layer:
    for element in layer:
        key = int(element['id'])
        if key not in dict_mapindex_mpl_polygon.keys():
            dict_mapindex_mpl_polygon[key]=[]
        for tp in element['geometry']['coordinates']:
            q = np.array(tp)
            polygon = Polygon(q) # matplotlib Polygon NOT Shapely

Untuk merencanakan poligon dengan matplotlib:

from matplotlib import pyplot as plt
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection
Philipp Schwarz
sumber

Jawaban:

8

Ada modul Python untuk itu: Descartes (lihat contoh Plot shapefile dengan matplotlib )

from geopandas import GeoDataFrame
test = GeoDataFrame.from_file('poly1.shp')
test.set_index('id', inplace=True)
test.sort()
test['geometry']
testid
0    POLYGON ((1105874.411110075 -6125459.381061088...
1    POLYGON ((1106076.359169902 -6125875.557806003...
2    POLYGON ((1106260.568548799 -6125410.258560049...
3    POLYGON ((1105747.511315724 -6125864.64169466,...
Name: geometry, dtype: object

Jenis geometri adalah poligon bentuk:

 type(test['geometry'][2])
 shapely.geometry.polygon.Polygon

Sekarang Anda dapat menggunakan Descartes untuk secara langsung memplot poligon yang indah

import matplotlib.pyplot as plt 
from descartes import PolygonPatch
BLUE = '#6699cc'
poly= test['geometry'][2]
fig = plt.figure() 
ax = fig.gca() 
ax.add_patch(PolygonPatch(poly, fc=BLUE, ec=BLUE, alpha=0.5, zorder=2 ))
ax.axis('scaled')
plt.show()

masukkan deskripsi gambar di sini

gen
sumber
3

Setelah jawaban yang sederhana dan mudah dimengerti, saya datang sendiri dengan cara mudah untuk merencanakan seluruh shp dengan matplotlib. Saya merasa geopanda hanya perlu memperbarui fungsi merencanakannya karena ini sederhana tetapi jauh lebih cepat termasuk fleksibilitas penuh matplotlib - menambahkan legenda, judul, dll.

from descartes import PolygonPatch
import geopandas as gp
import pysal as ps
import numpy as np

# Import libraries for visualization
from matplotlib import pyplot as plt
from matplotlib.patches import Polygon as mpl_Polygon
from matplotlib.collections import PatchCollection

shapefile = 'raw_data/shapefile/yourshapefile.shp'
df_map_elements = gp.GeoDataFrame.from_file(shapefile)

df_map_elements["mpl_polygon"] = np.nan
df_map_elements['mpl_polygon'] = df_map_elements['mpl_polygon'].astype(object)
for self_index, self_row_df in df_map_elements.iterrows():
    m_polygon = self_row_df['geometry']
    poly=[]
    if m_polygon.geom_type == 'MultiPolygon':
        for pol in m_polygon:
            poly.append(PolygonPatch(pol))
    else:
        poly.append(PolygonPatch(m_polygon))
    df_map_elements.set_value(self_index, 'mpl_polygon', poly)

dict_mapindex_mpl_polygon = df_map_elements['mpl_polygon'].to_dict()

Dan untuk merencanakan:

fig, ax = plt.subplots()
for c_l ,patches in dict_mapindex_mpl_polygon.items():
    p = PatchCollection(patches,color='white',lw=.3,edgecolor='k')
    ax.add_collection(p)
ax.autoscale_view()

plt.show()

masukkan deskripsi gambar di sini

Philipp Schwarz
sumber