@@ -1134,36 +1134,44 @@ def _robust_transform(element: Any, cs: str) -> Any:
1134
1134
1135
1135
def _split_multipolygon_into_outer_and_inner (mp : shapely .MultiPolygon ): # type: ignore
1136
1136
# https://stackoverflow.com/a/21922058
1137
- if len (mp .geoms ) > 1 :
1138
- raise NotImplementedError ("Currently, lists of Polygons are not supported. Only Polygons with holes." )
1139
-
1140
- geom = mp .geoms [0 ]
1141
- if geom .type == "Polygon" :
1142
- exterior_coords = geom .exterior .coords [:]
1143
- interior_coords = []
1144
- for interior in geom .interiors :
1145
- interior_coords += interior .coords [:]
1146
- elif geom .type == "MultiPolygon" :
1147
- exterior_coords = []
1148
- interior_coords = []
1149
- for part in geom :
1150
- epc = _split_multipolygon_into_outer_and_inner (part ) # Recursive call
1151
- exterior_coords += epc ["exterior_coords" ]
1152
- interior_coords += epc ["interior_coords" ]
1153
- else :
1154
- raise ValueError ("Unhandled geometry type: " + repr (geom .type ))
1137
+
1138
+ for geom in mp .geoms :
1139
+ if geom .geom_type == "Polygon" :
1140
+ exterior_coords = geom .exterior .coords [:]
1141
+ interior_coords = []
1142
+ for interior in geom .interiors :
1143
+ interior_coords += interior .coords [:]
1144
+ elif geom .geom_type == "MultiPolygon" :
1145
+ exterior_coords = []
1146
+ interior_coords = []
1147
+ for part in geom :
1148
+ epc = _split_multipolygon_into_outer_and_inner (part ) # Recursive call
1149
+ exterior_coords += epc ["exterior_coords" ]
1150
+ interior_coords += epc ["interior_coords" ]
1151
+ else :
1152
+ raise ValueError ("Unhandled geometry type: " + repr (geom .type ))
1155
1153
1156
1154
return interior_coords , exterior_coords
1157
1155
1158
1156
1159
1157
def _make_patch_from_multipolygon (mp : shapely .MultiPolygon ) -> mpatches .PathPatch :
1160
1158
# https://matplotlib.org/stable/gallery/shapes_and_collections/donut.html
1161
1159
1162
- inside , outside = _split_multipolygon_into_outer_and_inner (mp )
1163
- codes = np .ones (len (inside ), dtype = mpath .Path .code_type ) * mpath .Path .LINETO
1164
- codes [0 ] = mpath .Path .MOVETO
1165
- vertices = np .concatenate ((outside , inside [::- 1 ]))
1166
- all_codes = np .concatenate ((codes , codes ))
1167
- path = mpath .Path (vertices , all_codes )
1160
+ patches = []
1161
+ for geom in mp .geoms :
1162
+ if len (geom .interiors ) == 0 :
1163
+ # polygon has no holes
1164
+ patches += [mpatches .Polygon (geom .exterior .coords , closed = True )]
1165
+ else :
1166
+ inside , outside = _split_multipolygon_into_outer_and_inner (mp )
1167
+ if len (inside ) > 0 :
1168
+ codes = np .ones (len (inside ), dtype = mpath .Path .code_type ) * mpath .Path .LINETO
1169
+ codes [0 ] = mpath .Path .MOVETO
1170
+ all_codes = np .concatenate ((codes , codes ))
1171
+ vertices = np .concatenate ((outside , inside [::- 1 ]))
1172
+ else :
1173
+ all_codes = []
1174
+ vertices = np .concatenate (outside )
1175
+ patches += [mpatches .PathPatch (mpath .Path (vertices , all_codes ))]
1168
1176
1169
- return mpatches . PathPatch ( path )
1177
+ return patches
0 commit comments