Skip to content

Instantly share code, notes, and snippets.

@pelson
Created July 16, 2014 12:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pelson/b5658b718bbf3a97e125 to your computer and use it in GitHub Desktop.
Save pelson/b5658b718bbf3a97e125 to your computer and use it in GitHub Desktop.
Demonstration of constructing a geometry based mask
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "",
"signature": "sha256:df2dc2085c9d74cbb0dbc5dcc380e292a6b4dc0d5d5b9a0b5a660cb6dc05c9e2"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Constructing a land-sea (or other geometry based) mask"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Building a land-sea (or any other geometry based) mask is a common operation which can be achieved easily using Shapely.\n",
"\n",
"Shapely gives us primitive geometries which have a method for testing whether a point is contained within the respective geometry. I recently added a ``shapely.vectorized.contains`` function for really efficient construction of these kinds of mask (see http://nbviewer.ipython.org/gist/pelson/9785576), but this has not yet made it into a release, so I will talk through doing this without that function.\n",
"\n",
"First, let's import shapely:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import shapely.geometry as sgeom"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's define a region based on those defined by http://tntcat.iiasa.ac.at/RcpDb/dsd?Action=htmlpage&page=welcome#regiondefs:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"MAF_names = ['Bahrain', 'Iran (Islamic Republic of)', 'Iraq', 'Israel', 'Jordan',\n",
" 'Kuwait', 'Lebanon', 'Oman', 'Qatar', 'Saudi Arabia',\n",
" 'Syrian Arab Republic', 'United Arab Emirates', 'Yemen']"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, load all of the country geometries into memory:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import cartopy.io.shapereader as shpreader\n",
"\n",
"shpfilename = shpreader.natural_earth(resolution='50m',\n",
" category='cultural',\n",
" name='admin_0_countries')\n",
"reader = shpreader.Reader(shpfilename)\n",
"countries = list(reader.records())"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"MAF_shapes = filter(lambda country: country.attributes['name'] in MAF_names,\n",
" countries)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Unfortunately, this hasn't quite captured all of the countries that we were expecting,\n",
"so let's look at the missing countries:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print len(MAF_shapes), len(MAF_names)\n",
"country_names = set(country.attributes['name'] for country in MAF_shapes)\n",
"print 'Missing countries: ', list(set(MAF_names) - country_names)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"11 13\n",
"Missing countries: ['Iran (Islamic Republic of)', 'Syrian Arab Republic']\n"
]
}
],
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can determine how these names are defined by filtering the whole of the countries list:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import re\n",
"\n",
"def print_matching_countries(pattern, flags=re.IGNORECASE):\n",
" for country in countries:\n",
" name = country.attributes['name']\n",
" result = re.search(pattern, name, flags)\n",
" if result is not None:\n",
" print name\n",
"\n",
"print_matching_countries('Iran')\n",
"print '-----'\n",
"print_matching_countries('Syria')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Iran\n",
"-----\n",
"Syria\n"
]
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now that we have found the \"name\" in the associated country's attributes dictionary, we can map from the\n",
"names defined in http://tntcat.iiasa.ac.at/RcpDb/dsd?Action=htmlpage&page=welcome#regiondefs to the names defined by the shapefile:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"name_mapping = {'Iran': 'Iran (Islamic Republic of)',\n",
" 'Syria': 'Syrian Arab Republic'}"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def country_name(country):\n",
" name = country.attributes['name']\n",
" # Replace the name with that mapped by name_mapping,\n",
" # if such an entry exists.\n",
" return name_mapping.get(name, name)\n",
" \n",
"MAF_shapes = filter(lambda country: country_name(country) in MAF_names, countries)\n",
"\n",
"# Now check we have the correct number of countries.\n",
"assert len(MAF_shapes) == len(MAF_names)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Finally we have all the geometries which we would like to use in a single list, we can join them into a single geometry with the ``cascaded_union`` function:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from shapely.ops import cascaded_union\n",
"\n",
"MAF_region = cascaded_union([country.geometry for country in MAF_shapes])"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 9
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This can be used for containment checking at any given point, so we now have the building blocks for constructing a mask.\n",
"\n",
"Let's just define a grid of 180x360 points:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"\n",
"y, x = grid_points = np.mgrid[-90:90:180j, -180:180:360j]\n",
"\n",
"mask = np.empty(x.shape, dtype=np.bool)\n",
"\n",
"print mask.shape"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"(180, 360)\n"
]
}
],
"prompt_number": 10
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We \"prepare\" the region for (major) optimisation of the containment test:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from shapely.prepared import prep\n",
"\n",
"MAF_prep = prep(MAF_region)\n",
"\n",
"for index in np.ndindex(x.shape):\n",
" contains = MAF_prep.contains(sgeom.Point(x[index], y[index]))\n",
" mask[index] = contains"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 11
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To confirm that the mask is as expected, we can visualise it, coloring the ROI in red, and everywhere else in green:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%matplotlib inline\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import cartopy.crs as ccrs\n",
"\n",
"ax = plt.axes(projection=ccrs.Robinson())\n",
"plt.contourf(x, y, mask, transform=ccrs.PlateCarree(),\n",
" levels=[0, 0.5, 1], colors=['green', 'red'])\n",
"ax.coastlines()\n",
"plt.show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n6xbZ7gAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x3146390>"
]
}
],
"prompt_number": 12
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment