Geopandasポリゴンからmatplotlibパッチへのポリゴン変換


8

残念ながら、ジオパンダのプロットは非常に遅く、多くのリソースを必要とするため、プロットには代わりにmatplotlibを使用したいと思います。

純粋なフィオナを使用してシェープファイルを開いて読み取る場合、matplotlibパッチとしてポリゴンを抽出するのに問題はありませんが、今度はgeopandasデータフレームを使用してmatplotlibポリゴンを取得します。

私は現在次のようなものを使用しています:

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

matplotlibでポリゴンをプロットする場合:

from matplotlib import pyplot as plt
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection

回答:


7

そのためのPythonモジュールがあります:デカルト(たとえば、matplotlibPlotシェープファイルを見てください)

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

ジオメトリのタイプは、形の良いポリゴンです。

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

デカルトを使用して、形の良いポリゴンを直接プロットできるようになりました

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

ここに画像の説明を入力してください


3

シンプルで理解できる答えの後、私はmatplotlibでshp全体をプロットする簡単な方法を思いつきました。これはシンプルですが、凡例やタイトルなどを追加するmatplotlibの完全な柔軟性を含め、非常に高速であるため、ジオパンダはプロット関数を更新するだけでよいと思います。

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

そしてプロットのために:

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

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.