Skip to content

Instantly share code, notes, and snippets.

@bartaelterman
Created June 29, 2018 14:05
Show Gist options
  • Save bartaelterman/145deb8e361668b54e6ccbfcd098f1ec to your computer and use it in GitHub Desktop.
Save bartaelterman/145deb8e361668b54e6ccbfcd098f1ec to your computer and use it in GitHub Desktop.
GIS join with multiprocessing
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here I will demonstrate three different approaches to perform a geospatial join between a set of occurrences and a set of hexagonal polygons."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import geopandas as gpd\n",
"import numpy as np\n",
"import os\n",
"import pandas as pd\n",
"import time\n",
"from geopandas.tools import sjoin\n",
"from multiprocessing import Pool\n",
"from pympler import asizeof\n",
"from shapely.geometry import Point\n",
"from rtree.core import RTreeError\n",
"from pyproj import Proj, transform"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I have a shapefile that contains hexagonal polygons. We can read it with geopandas to create a GeoDataFrame. That will create geometries with the correct projection."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"hexbin_file = os.path.join(os.environ['HOME'], 'Projects/Antabif/data_biodiversity_aq/shapefiles/grids/grid25000')\n",
"gdf = gpd.read_file(hexbin_file)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x119737630>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nsMGrTbX+ftMAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x119731668>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"gdf.plot()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"300\" height=\"300\" viewBox=\"-7951333.333955 -7680095.4944007145 36000.01678501163 31534.194828969426\" preserveAspectRatio=\"xMinYMin meet\"><g transform=\"matrix(1,0,0,-1,0,-15328656.793972459)\"><path fill-rule=\"evenodd\" fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"240.0001119000775\" opacity=\"0.6\" d=\"M -7950000.0,-7664328.39698623 L -7941666.662781247,-7649894.633526745 L -7924999.988343742,-7649894.633526745 L -7916666.651124989,-7664328.39698623 L -7924999.988343742,-7678762.160445714 L -7941666.662781247,-7678762.160445714 L -7950000.0,-7664328.39698623 z\" /></g></svg>"
],
"text/plain": [
"<shapely.geometry.polygon.Polygon at 0x11968bb70>"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gdf.iloc[0].geometry"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'init': 'epsg:3031'}"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gdf.geometry.crs"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's read a bunch of occurrences. I'm falling back to the default `pandas.read_csv` here as there doesn't seem to be a way to create a GeoDataFrame from a csv right away."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/bartaelterman/miniconda3/envs/vex3/lib/python3.6/site-packages/IPython/core/interactiveshell.py:2785: DtypeWarning: Columns (121,122,234) have mixed types. Specify dtype option on import or set low_memory=False.\n",
" interactivity=interactivity, compiler=compiler, result=result)\n"
]
}
],
"source": [
"f = os.path.join(os.environ['HOME'], 'Downloads/occurrence.txt')\n",
"df = pd.read_csv(f, sep='\\t')"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>gbifID</th>\n",
" <th>abstract</th>\n",
" <th>accessRights</th>\n",
" <th>accrualMethod</th>\n",
" <th>accrualPeriodicity</th>\n",
" <th>accrualPolicy</th>\n",
" <th>alternative</th>\n",
" <th>audience</th>\n",
" <th>available</th>\n",
" <th>bibliographicCitation</th>\n",
" <th>...</th>\n",
" <th>genusKey</th>\n",
" <th>subgenusKey</th>\n",
" <th>speciesKey</th>\n",
" <th>species</th>\n",
" <th>genericName</th>\n",
" <th>typifiedName</th>\n",
" <th>protocol</th>\n",
" <th>lastParsed</th>\n",
" <th>lastCrawled</th>\n",
" <th>repatriated</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>684011295</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>2285488.0</td>\n",
" <td>NaN</td>\n",
" <td>6533236.0</td>\n",
" <td>Yoldia eightsii</td>\n",
" <td>Yoldia</td>\n",
" <td>NaN</td>\n",
" <td>DIGIR</td>\n",
" <td>NaN</td>\n",
" <td>2013-09-07T09:17Z</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>684011294</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>2285488.0</td>\n",
" <td>NaN</td>\n",
" <td>6533236.0</td>\n",
" <td>Yoldia eightsii</td>\n",
" <td>Yoldia</td>\n",
" <td>NaN</td>\n",
" <td>DIGIR</td>\n",
" <td>NaN</td>\n",
" <td>2013-09-07T09:17Z</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>684011293</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>2285533.0</td>\n",
" <td>NaN</td>\n",
" <td>6533092.0</td>\n",
" <td>Yoldiella indolens</td>\n",
" <td>Yoldia</td>\n",
" <td>NaN</td>\n",
" <td>DIGIR</td>\n",
" <td>NaN</td>\n",
" <td>2013-09-07T09:17Z</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>684011292</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>2285488.0</td>\n",
" <td>NaN</td>\n",
" <td>6533236.0</td>\n",
" <td>Yoldia eightsii</td>\n",
" <td>Yoldia</td>\n",
" <td>NaN</td>\n",
" <td>DIGIR</td>\n",
" <td>NaN</td>\n",
" <td>2013-09-07T09:17Z</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>684011291</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>2285533.0</td>\n",
" <td>NaN</td>\n",
" <td>4374805.0</td>\n",
" <td>Yoldiella sabrina</td>\n",
" <td>Yoldiella</td>\n",
" <td>NaN</td>\n",
" <td>DIGIR</td>\n",
" <td>NaN</td>\n",
" <td>2013-09-07T09:17Z</td>\n",
" <td>False</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 235 columns</p>\n",
"</div>"
],
"text/plain": [
" gbifID abstract accessRights accrualMethod accrualPeriodicity \\\n",
"0 684011295 NaN NaN NaN NaN \n",
"1 684011294 NaN NaN NaN NaN \n",
"2 684011293 NaN NaN NaN NaN \n",
"3 684011292 NaN NaN NaN NaN \n",
"4 684011291 NaN NaN NaN NaN \n",
"\n",
" accrualPolicy alternative audience available bibliographicCitation \\\n",
"0 NaN NaN NaN NaN NaN \n",
"1 NaN NaN NaN NaN NaN \n",
"2 NaN NaN NaN NaN NaN \n",
"3 NaN NaN NaN NaN NaN \n",
"4 NaN NaN NaN NaN NaN \n",
"\n",
" ... genusKey subgenusKey speciesKey species \\\n",
"0 ... 2285488.0 NaN 6533236.0 Yoldia eightsii \n",
"1 ... 2285488.0 NaN 6533236.0 Yoldia eightsii \n",
"2 ... 2285533.0 NaN 6533092.0 Yoldiella indolens \n",
"3 ... 2285488.0 NaN 6533236.0 Yoldia eightsii \n",
"4 ... 2285533.0 NaN 4374805.0 Yoldiella sabrina \n",
"\n",
" genericName typifiedName protocol lastParsed lastCrawled \\\n",
"0 Yoldia NaN DIGIR NaN 2013-09-07T09:17Z \n",
"1 Yoldia NaN DIGIR NaN 2013-09-07T09:17Z \n",
"2 Yoldia NaN DIGIR NaN 2013-09-07T09:17Z \n",
"3 Yoldia NaN DIGIR NaN 2013-09-07T09:17Z \n",
"4 Yoldiella NaN DIGIR NaN 2013-09-07T09:17Z \n",
"\n",
" repatriated \n",
"0 False \n",
"1 False \n",
"2 False \n",
"3 False \n",
"4 False \n",
"\n",
"[5 rows x 235 columns]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"df.dropna(subset=['decimalLatitude', 'decimalLongitude'], inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"26874"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(df)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2 Approaches for a spatial join\n",
"\n",
"There seem to be two different approaches to perform a spatial join between our two data sets. The first approach is to create an RTree index of the bounding boxes of the hexagons and perform a first join with each of the occurrences on this index. As the bounding boxes can overlap, each occurrence could be contained in several bounding boxes while we don't expect that to be true if we would join with the real polygons. Therefore we still need to do a second - more precise - spatial join of each occurrence with its set of candidate hexagons. An advantage of this approach could be that the occurrences don't need to be geometries. When you are joining with an RTree index, you need to provide it a bounding box of the element you want to search with. For a point, that means left = right and top = bottom. If you look at the implementation below though, you'll notice that I'm looping over the rows of the DataFrame. A pattern that is actually known to be avoided at all times.\n",
"\n",
"The second approach uses geopandas' `sjoin` function. Apparently, that should use an RTree index under the hood so let's see whether there is any noticable difference between the two.\n",
"\n",
"### Using an RTree index\n",
"\n",
"Let's first try to join the two data sets by constructing an RTree index ourselves. The inspiration from this approach comes from [this blogpost](http://geoffboeing.com/2016/10/r-tree-spatial-index-python/).\n",
"\n",
"Initially I thought it would be a good idea to reproject the hexagons to a WGS84 projection, but then we end up with issues joining objects that cross the anti-meridian. Therefore, I am keeping the 3031 project and will have to reproject the occurrences."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Took 23 seconds to build the index\n"
]
}
],
"source": [
"start = time.time()\n",
"spatial_index = gdf.sindex\n",
"end = time.time()\n",
"print(f'Took {round(end - start)} seconds to build the index')\n",
"wgs84 = Proj(init='epsg:4326')\n",
"antarctic = Proj(init='epsg:3031')"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Took 1.225 seconds to join 1000 occurrences with the index\n"
]
}
],
"source": [
"def join_rtree(points_chunk_df):\n",
" \"\"\"\n",
" join points and hexbins using the rtree index as described here:\n",
" http://geoffboeing.com/2016/10/r-tree-spatial-index-python/\n",
" \"\"\"\n",
" results = []\n",
" for row in points_chunk_df.itertuples():\n",
" lon, lat = transform(wgs84, antarctic, row.decimalLongitude, row.decimalLatitude)\n",
" bbox = (lon, lat, lon, lat)\n",
" possible_matches_index = list(spatial_index.intersection(bbox))\n",
" possible_matches = gdf.loc[possible_matches_index]\n",
" precise_matches = possible_matches[possible_matches.intersects(Point(lon, lat))]\n",
" results.append((row.Index, precise_matches.index))\n",
" return results\n",
"\n",
"start = time.time()\n",
"results = join_rtree(df[:1000])\n",
"end = time.time()\n",
"print(f'Took {round(end - start, 3)} seconds to join 1000 occurrences with the index')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The timing is quite ok. Let's plot some results to see if they are correct too?"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x11a28b128>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def plot_point_and_hexagons(point_index, hexagons_found_index):\n",
" base = gdf.loc[hexagons_found_index].plot() # create a plot of hexagon from result 0\n",
" lon, lat = transform(wgs84, antarctic, df.loc[point_index].decimalLongitude, df.loc[point_index].decimalLatitude) # Get point 0 and plot it\n",
" gpd.GeoSeries([Point(lon, lat)]).plot(ax=base, color='red')\n",
"\n",
"plot_point_and_hexagons(results[0][0], results[0][1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Using geopandas `sjoin`\n",
"\n",
"Now, let's perform the geospatial join using geopandas `sjoin` function. For this operation, we do need two GeoDataFrames so we'll have to create one from our occurrences hexbins. I'm looping over the rows and creating a `Point` (from the `shapely` package) for each of them. I don't think that's the best way to do it, but we can optimize that later.\n",
"\n",
"In [this StackExchange question](https://gis.stackexchange.com/questions/175228/geopandas-spatial-join-extremely-slow) someone suggests to use the `op='within'` parameter to _dramatically upspeed the point-in-polygon operation_. Let's see."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Took 0.367 seconds to create a GeoDataFrame\n",
"Took 15.043 seconds to do the join with op=\"intersects\"\n",
"Took 14.935 seconds to do the join without op=\"intersects\"\n"
]
}
],
"source": [
"start = time.time()\n",
"geometry = [Point(transform(wgs84, antarctic, xy[0], xy[1])) for xy in zip(df.decimalLongitude, df.decimalLatitude)]\n",
"crs = {'init': 'epsg:3031'}\n",
"geo_df = gpd.GeoDataFrame(df, crs=crs, geometry=geometry)\n",
"end = time.time()\n",
"print(f'Took {round(end - start, 3)} seconds to create a GeoDataFrame')\n",
"\n",
"start = time.time()\n",
"merged = sjoin(geo_df[:100], gdf, how='left', op='intersects')\n",
"end = time.time()\n",
"print(f'Took {round(end - start, 3)} seconds to do the join with op=\"intersects\"')\n",
"\n",
"start = time.time()\n",
"merged = sjoin(geo_df[:100], gdf, how='left')\n",
"end = time.time()\n",
"print(f'Took {round(end - start, 3)} seconds to do the join without op=\"intersects\"')\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that we are only joining 100 occurrences with the hexbins here. This is clearly way slower then using the RTree index directly.\n",
"\n",
"# Parallellize the computation\n",
"\n",
"In a next step, I will show how to use pythons multiprocessing module to parallellize the computation. To do so, we'll need a function that will do the spatial join on a subset of the occurrences, but with the full set of hexbins.\n",
"\n",
"As a benchmark, let's time the execution of joining all occurrences in 1 process"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Took 32.662 seconds to join 26874 occurrences\n"
]
},
{
"data": {
"text/plain": [
"26874"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"start = time.time()\n",
"result = join_rtree(df) # run the join on all occurrences\n",
"end = time.time()\n",
"print(f'Took {round(end - start, 3)} seconds to join {len(df)} occurrences')\n",
"len(result)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Took 9.062 seconds to join 26874 occurrences\n"
]
}
],
"source": [
"df_chunks = np.array_split(df, 8)\n",
"start = time.time()\n",
"with Pool(8) as p:\n",
" chunk_results = p.map(join_rtree, df_chunks)\n",
"end = time.time()\n",
"print(f'Took {round(end - start, 3)} seconds to join {len(df)} occurrences')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that although we use 8 processes, the computation time only goes down by a factor of ~3. There seems to be quite some overhead in this approach. However, we now have something that we can scale (albeit vertically: with bigger machines). The more CPUs you have at your disposal, the faster the overall process will go."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"8"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(chunk_results)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0, Int64Index([116188], dtype='int64', name='index_right'))"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"chunk_results[0][0]"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x119795c50>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_point_and_hexagons(*chunk_results[0][0])"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x11b4e6630>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_point_and_hexagons(*chunk_results[-1][-1])"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment