Geopandas Polygon để matplotlib vá Chuyển đổi đa giác


8

Thật không may, geopandas âm mưu là cực kỳ chậm và tốn rất nhiều tài nguyên, do đó tôi muốn sử dụng thay vì matplotlib cho âm mưu.

Khi tôi sử dụng Fiona thuần túy để mở và đọc shapefile, tôi không gặp khó khăn gì trong việc trích xuất các Polygons dưới dạng các bản vá matplotlib nhưng bây giờ tôi muốn sử dụng làm điểm bắt đầu của cơ sở dữ liệu geopandas để lấy các đa giác matplotlib của tôi.

Tôi hiện đang sử dụng một cái gì đó như:

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

Đối với âm mưu đa giác với matplotlib:

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

Câu trả lời:


7

Có một mô-đun Python cho điều đó: Descartes (xem Plot shapefile với matplotlib chẳng hạn)

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

Loại hình học là một đa giác có hình dạng:

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

Bây giờ bạn có thể sử dụng Descartes để vẽ trực tiếp một đa giác có hình dạng

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

nhập mô tả hình ảnh ở đây


3

Sau câu trả lời đơn giản và dễ hiểu, tôi đã nghĩ ra một cách đơn giản để vẽ toàn bộ shp với matplotlib. Tôi cảm thấy geopandas chỉ nên cập nhật chức năng vẽ đồ thị của họ bởi vì cái này đơn giản nhưng nhanh hơn rất nhiều bao gồm tính linh hoạt hoàn toàn của matplotlib - thêm huyền thoại, tiêu đề, v.v.

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

Và cho âm mưu:

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

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.