I'm trying to draw a map of some regions in a shapefile in Python. My basic approach is this:
shp = fiona.open("C:/Users/nils/Documents/Maps/my_shapefile.shp")
bds = shp.bounds
ll = (bds[0], bds[1])
ur = (bds[2], bds[3])
coords = list(ll + ur)
w, h = coords[2] - coords[0], coords[3] - coords[1]
# Make figure instance, add Basemap and CCG boundaries from shapefile
fig, ax = plt.subplots(figsize=(12,10))
m = Basemap(projection="tmerc", lon_0 = -2., lat_0 = 49., ellps="WGS84",
llcrnrlon = coords[0], llcrnrlat = coords[1],
urcrnrlon = coords[2], urcrnrlat = coords[3],
lat_ts = 0, resolution="i", suppress_ticks=True)
m.readshapefile("C:/Users/nils/Documents/Maps/my_shapefile.shp", "Regions")
# Extract polygon coordinates of and names of regions to plot from shapefile
to_plot = ["region_A", "region_B", "region_C"]
poly = []; name = []
for coordinates, region in zip(m.Regions, m.Regions_info):
if any(substr in region["name"] for substr in to_plot):
poly.append(Polygon(coordinates))
name.append(region["name"])
# Turn polygons into patches using descartes
patches = []
for i in poly:
patches.append(PolygonPatch(i, facecolor='#006400', edgecolor='#787878', lw=0.25, alpha=0.5))
# Add PatchCollection to basemap
ax.add_collection(PatchCollection(patches, match_original=True))
Now my problem with this is that the shapefile covers a larger geographical area, but I only want to plot a subset of this area (think e.g. I have a UK shapefile, but want to plot a map of all regions in Wales). Now I can identify the correct regions and only add those patches as in the example above, but matplotlib will still plot the boundaries of all regions in the shapefile, and the boundaries identified by fiona's bounds
method are obviously independent of the subset of patches I've chosen.
I have two questions relating to this:
How can I get matplotlib to only draw the boundaries of a subset of patches defined in the shapefile?
How can I get the bounds of a subset of patches, similar to what fiona's
bound
method does to the entire shapefile?