How to get bounding box of a country using Natural Earth data and Cartopy
In this example, we’ll determine the bounding box of Kenya using the public domain Natural Earth dataset and the Cartopy library.
Rendering just the bounding box of Kenya (with the actual country being highlighted in green) looks like this:
How to get the bounding box
First we use Cartopy’s cartopy.io.shapereader.natural_earth()
function that will automatically download Natural Earth data (if it has already been downloaded, the cached data will be used):
shpfilename = shpreader.natural_earth(resolution='10m',
category='cultural',
name='admin_0_countries')
reader = shpreader.Reader(shpfilename)
Now we can filter for Kenya just like we did in our previous post on How to highlight a specific country using Cartopy:
kenya = [country for country in reader.records() if country.attributes["NAME_LONG"] == "Kenya"][0]
and get the bounding box using kenya.bounds
:
lon_min, lat_min, lon_max, lat_max = kenya.bounds
Complete example code
This code will render the image shown above:
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
shpfilename = shpreader.natural_earth(resolution='10m',
category='cultural',
name='admin_0_countries')
reader = shpreader.Reader(shpfilename)
# Filter for a specific country
kenya = [country for country in reader.records() if country.attributes["NAME_LONG"] == "Kenya"][0]
# Determine bounding box
lon_min, lat_min, lon_max, lat_max = kenya.bounds
ax.set_extent([lon_min, lon_max, lat_min, lat_max])
# 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("Kenya-Bounding-Box-Tight.svg")