Skip to content

Instantly share code, notes, and snippets.

@maptastik
Created April 4, 2019 03:34
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maptastik/dc3d3b4514546310500a13fb77663bb9 to your computer and use it in GitHub Desktop.
Save maptastik/dc3d3b4514546310500a13fb77663bb9 to your computer and use it in GitHub Desktop.
Using geopandas to find line intersection points within a dataset
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Find the intersection of lines with geopandas\n",
"\n",
"Can we get the intersection point of lines using geopandas? Let's try!"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"\n",
"import pandas as pd\n",
"import geopandas as gpd"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Load data"
]
},
{
"cell_type": "code",
"execution_count": 2,
"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>name</th>\n",
" <th>geometry</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>a</td>\n",
" <td>LINESTRING (-78.6434680223465 35.7785585760508...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>b</td>\n",
" <td>LINESTRING (-78.64380061626434 35.778414957962...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>c</td>\n",
" <td>LINESTRING (-78.64183723926544 35.778467182751...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>d</td>\n",
" <td>LINESTRING (-78.64378988742828 35.777065805674...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" name geometry\n",
"0 a LINESTRING (-78.6434680223465 35.7785585760508...\n",
"1 b LINESTRING (-78.64380061626434 35.778414957962...\n",
"2 c LINESTRING (-78.64183723926544 35.778467182751...\n",
"3 d LINESTRING (-78.64378988742828 35.777065805674..."
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gdf = gpd.read_file('intersecting_lines.geojson')\n",
"gdf.head()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"gdf['center_coords'] = gdf['geometry'].apply(lambda x: x.representative_point().coords[:])\n",
"gdf['center_coords'] = [coords[0] for coords in gdf['center_coords']]\n",
"gdf.plot()\n",
"for index, row in gdf.iterrows():\n",
" plt.annotate(s = row['name'], xy = row['center_coords'], horizontalalignment = 'center')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Intersection method"
]
},
{
"cell_type": "code",
"execution_count": 4,
"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>intersection</th>\n",
" <th>geometry</th>\n",
" <th>name_2</th>\n",
" <th>name</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>a-b</td>\n",
" <td>POINT (-78.64347650439859 35.77840678018742)</td>\n",
" <td>b</td>\n",
" <td>a</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>a-d</td>\n",
" <td>POINT (-78.64355183615231 35.7770586337169)</td>\n",
" <td>d</td>\n",
" <td>a</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>b-c</td>\n",
" <td>POINT (-78.64184254726409 35.77836555326976)</td>\n",
" <td>c</td>\n",
" <td>b</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>c-d</td>\n",
" <td>POINT (-78.6419133844406 35.77700927079604)</td>\n",
" <td>d</td>\n",
" <td>c</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" intersection geometry name_2 name\n",
"0 a-b POINT (-78.64347650439859 35.77840678018742) b a\n",
"1 a-d POINT (-78.64355183615231 35.7770586337169) d a\n",
"2 b-c POINT (-78.64184254726409 35.77836555326976) c b\n",
"3 c-d POINT (-78.6419133844406 35.77700927079604) d c"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# First we'll need a DataFrame to hold our results\n",
"# We'll make a GeoDataFrame later\n",
"intersections_gdf = pd.DataFrame()\n",
"\n",
"# Next, we'll iterate through each row in `gdf` and find out if and where it intersects with another line.\n",
"for index, row in gdf.iterrows():\n",
" # Get GeoSeries of intersections of row with all rows\n",
" row_intersections = gdf.intersection(row['geometry'])\n",
" # Exclude any rows that aren't a Point geometry\n",
" row_intersection_points = row_intersections[row_intersections.geom_type == 'Point']\n",
" # Create a DataFrame of the the row intersection points\n",
" row_intersections_df = pd.DataFrame(row_intersection_points)\n",
" # Create a field for the name (or some identifying value) of the row\n",
" row_intersections_df['name_2'] = row['name']\n",
" # Join the input gdf to the row intersections gdf. By default, this is a left join on the index.\n",
" # Because the row gdf is a derivative of gdf, the index of each intersecting row is the same as in gdf\n",
" row_intersections_df = row_intersections_df.join(gdf['name'])\n",
" # Append the row intersection gdf to results gdf\n",
" intersections_gdf = row_intersections_df.append(intersections_gdf)\n",
"\n",
"# Drop the geometry field. Because we joined directly to our input gdf, the geometry field is the Line for the feature at the joined row's index\n",
"# intersections_gdf = intersections_gdf.drop('geometry', axis = 1)\n",
"# Rename and set the point field as the geometry field\n",
"intersections_gdf = intersections_gdf.rename(columns={0: 'geometry'})\n",
"# There are two points for each intersection. We only want one. We'll create a new field to store an intersection name based on a sorted list of the name of the two intersecting lines\n",
"intersections_gdf['intersection'] = intersections_gdf.apply(lambda row: '-'.join(sorted([row['name_2'], row['name']])), axis = 1)\n",
"# We'll group the intersections by their name, returning only the first result for each unique value\n",
"intersections_gdf = intersections_gdf.groupby('intersection').first()\n",
"# The index is now the intersection field. We don't want that, so we'll reset the index\n",
"intersections_gdf = intersections_gdf.reset_index()\n",
"# Finally, we'll turn the DataFrame back into a GeoDataFrame and set the CRS\n",
"intersections_gdf = gpd.GeoDataFrame(intersections_gdf, geometry = 'geometry')\n",
"intersections_gdf.crs = {'init': 'epsg:4326'}\n",
"\n",
"intersections_gdf"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots()\n",
"ax.set_aspect('equal')\n",
"\n",
"gdf['center_coords'] = gdf['geometry'].apply(lambda x: x.representative_point().coords[:])\n",
"gdf['center_coords'] = [coords[0] for coords in gdf['center_coords']]\n",
"gdf.plot(ax = ax)\n",
"for index, row in gdf.iterrows():\n",
" plt.annotate(s = row['name'], xy = row['center_coords'], horizontalalignment = 'center')\n",
"intersections_gdf.plot(ax = ax, marker = 'o', color = 'orange', markersize = 100)\n",
"for x, y, label in zip(intersections_gdf.geometry.x, intersections_gdf.geometry.y, intersections_gdf['intersection']):\n",
" ax.annotate(label, xy=(x, y), xytext=(3, 3), textcoords=\"offset points\")\n",
" \n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'init': 'epsg:4326'}\n"
]
}
],
"source": [
"print(intersections_gdf.crs)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"geopandas.geodataframe.GeoDataFrame"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(intersections_gdf)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Function version"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"def get_intersections(gdf, name, geom = 'geometry', crs = 4326):\n",
" intersections_gdf = pd.DataFrame()\n",
" name_2 = '{}_2'.format(name)\n",
" crs_init = {'init': 'epsg:{}'.format(crs)}\n",
" for index, row in gdf.iterrows():\n",
" row_intersections = gdf.intersection(row[geom])\n",
" row_intersection_points = row_intersections[row_intersections.geom_type == 'Point']\n",
" row_intersections_df = pd.DataFrame(row_intersection_points)\n",
" row_intersections_df[name_2] = row[name]\n",
" row_intersections_df = row_intersections_df.join(gdf[name])\n",
" intersections_gdf = row_intersections_df.append(intersections_gdf)\n",
"\n",
" intersections_gdf = intersections_gdf.rename(columns={0: geom})\n",
" intersections_gdf['intersection'] = intersections_gdf.apply(lambda row: '-'.join(sorted([row[name_2], row[name]])), axis = 1)\n",
" intersections_gdf = intersections_gdf.groupby('intersection').first()\n",
" intersections_gdf = intersections_gdf.reset_index()\n",
" intersections_gdf = gpd.GeoDataFrame(intersections_gdf, geometry = 'geometry')\n",
" intersections_gdf.crs = crs_init\n",
"\n",
" return intersections_gdf"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x20b254b7c18>"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"get_intersections(gdf, 'name').plot()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment