In order to display shapefile data in Cartopy, we can first use the cartopy.io.shapereader
package to read the shape data and then convert the geometry we want to display to a cartopy.feature.ShapelyFeature
.
In the following example, we’ll read the Natural Earth ne_110m_admin_0_countries.shp
and
Note that there’s an easier way to plot Natural Earth data using shpreader.natural_earth
– see How to highlight a specific country using Cartopy and we’ll use the Natural Earth dataset just as an example!
import cartopy.io.shapereader as shpreader # Read shape file reader = shpreader.Reader("ne_110m_admin_0_countries.shp") # Filter for a specific country kenya = [country for country in reader.records() if country.attributes["NAME_LONG"] == "Kenya"][0] # Display Kenya's shape shape_feature = ShapelyFeature([kenya.geometry], ccrs.PlateCarree(), facecolor="lime", edgecolor='black', lw=1) ax.add_feature(shape_feature)
Complete code example
import cartopy.crs as ccrs import cartopy.feature as cf from cartopy.feature import ShapelyFeature from matplotlib import pyplot as plt proj = ccrs.PlateCarree() ax = plt.axes(projection=proj) # Show only Africa ax.set_extent([-23, 55, -35, 40]) ax.stock_img() ax.add_feature(cf.COASTLINE, lw=2) # Make figure larger plt.gcf().set_size_inches(20, 10) import cartopy.io.shapereader as shpreader # Read shape file reader = shpreader.Reader("ne_110m_admin_0_countries.shp") # Filter for a specific country kenya = [country for country in reader.records() if country.attributes["NAME_LONG"] == "Kenya"][0] # Display Kenya's shape shape_feature = ShapelyFeature([kenya.geometry], ccrs.PlateCarree(), facecolor="lime", edgecolor='black', lw=1) ax.add_feature(shape_feature) # Save figure as SVG plt.savefig("Africa-Highlight-Kenya.svg")