Skip to content

Instantly share code, notes, and snippets.

@om-henners
Created September 6, 2020 02:11
Show Gist options
  • Select an option

  • Save om-henners/7d39e31a01b08a9ca30e1843d31ab28a to your computer and use it in GitHub Desktop.

Select an option

Save om-henners/7d39e31a01b08a9ca30e1843d31ab28a to your computer and use it in GitHub Desktop.
Quick bit of Python code to calculate a 5km travel buffer given as a talk at PyConlineAU 2020!
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Calculating 5km of travel distance in Python\n",
"\n",
"Henry Walshaw\n",
"\n",
"<img src=\"extras/Twitter_Social_Icon_Circle_Color.svg\" style=\"display:inline;height:48px\" /> @om_henners\n",
"\n",
"<img src=\"extras/gis_stackexchange.svg\" style=\"display:inline;height:48px\" />\n",
" @om_henners"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"A quick content warning - I'll be mentioning COVID-19 and some of the impacts at least here in Melbourne."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"In Melbourne we have a bit of a COVID-19 problem<sup>1</sup>.\n",
"\n",
"<img src=\"extras/Saturday_morning_degraves_street.jpg\" style=\"height:600px; margin-left: auto;margin-right: auto;\"/>\n",
"\n",
"Image credit: https://www.reddit.com/user/damn-croissants/ July 11, 2020\n",
"\n",
"<sup>1</sup>Of course it's not so bad for everyone. Without the boats Salvatore the fur-seal is having a great time in the Yarra!"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"At least until the 13th in Melbourne we're locked down to being with 5km of our homes.\n",
"\n",
"<img src=\"extras/from_the_government_website.png\" style=\"height:600px;margin-left: auto;margin-right: auto;\"/>\n",
"\n",
"Calculated at https://www.vic.gov.au/coronavirus-5km-from-home-map"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Because I love maps<sup>2</sup> on hearing the news about the lockdown and the 5km I wanted to see what it looked like for myself, and compare the \"as the crow flies\" distance to how far I could get by travelling 5km instead.\n",
"\n",
"<sup>2</sup>And let's be honest, I'm a pedant about spatial data"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"First, there's a few imports to get out of the way<sup>3</sup>"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [],
"source": [
"import alphashape\n",
"from descartes import PolygonPatch\n",
"import folium\n",
"import geopandas as gpd\n",
"from geopy.geocoders import Nominatim\n",
"import matplotlib.pyplot as plt\n",
"import networkx as nx\n",
"import numpy as np\n",
"import osmnx as ox\n",
"import pandas as pd\n",
"from shapely import geometry"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"slideshow": {
"slide_type": "skip"
}
},
"outputs": [],
"source": [
"%config InlineBackend.figure_format = 'retina'\n",
"plt.rcParams['figure.figsize'] = (10, 10)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"<sup>3</sup>Unfortunately spatial libraries in Python can be a bit of a pain to install - feel free to `@` me later if you'd like a hand."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Step 1: geocoding an address\n",
"\n",
"Geocoding is the process of converting an address into a geographic coordinate (latitude and longitude). For that `geopy` is great and wraps up a bunch of different geocoding APIs consistently. I'll use the Nominatim API as the service, and choose my local train station as my starting point."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"Location(Footscray, Hyde Street, Footscray, City of Maribyrnong, Victoria, 3011, Australia, (-37.8015202, 144.9025869, 0.0))"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"address = 'Footscray Railway Station Victoria, 3011, Australia'\n",
"geocoder = Nominatim(user_agent='5km buffer calculator')\n",
"location = geocoder.geocode(address)\n",
"location"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"As a side note, I can use this with the `folium`<sup>4</sup> library to embed a quick interactive map in my notebook so I can see the address is in the place that I expect:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"scrolled": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjYuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjYuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF8xMzczMzJhNjhmZmI0NGIzOTgwYTZlNTkyYjAzOWMzYSB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiA2MDAuMHB4OwogICAgICAgICAgICAgICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzEzNzMzMmE2OGZmYjQ0YjM5ODBhNmU1OTJiMDM5YzNhIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcF8xMzczMzJhNjhmZmI0NGIzOTgwYTZlNTkyYjAzOWMzYSA9IEwubWFwKAogICAgICAgICAgICAgICAgIm1hcF8xMzczMzJhNjhmZmI0NGIzOTgwYTZlNTkyYjAzOWMzYSIsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2VudGVyOiBbLTM3LjgwMTUyMDIsIDE0NC45MDI1ODY5XSwKICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgICAgICAgICAgICAgIHpvb206IDE2LAogICAgICAgICAgICAgICAgICAgIHpvb21Db250cm9sOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHByZWZlckNhbnZhczogZmFsc2UsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICAKCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfNzZlYzhjMTQzODI1NGI4MmI1ZDY1NjQ3MjcxMGY2MGQgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICJodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZyIsCiAgICAgICAgICAgICAgICB7ImF0dHJpYnV0aW9uIjogIkRhdGEgYnkgXHUwMDI2Y29weTsgXHUwMDNjYSBocmVmPVwiaHR0cDovL29wZW5zdHJlZXRtYXAub3JnXCJcdTAwM2VPcGVuU3RyZWV0TWFwXHUwMDNjL2FcdTAwM2UsIHVuZGVyIFx1MDAzY2EgaHJlZj1cImh0dHA6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvY29weXJpZ2h0XCJcdTAwM2VPRGJMXHUwMDNjL2FcdTAwM2UuIiwgImRldGVjdFJldGluYSI6IGZhbHNlLCAibWF4TmF0aXZlWm9vbSI6IDIwLCAibWF4Wm9vbSI6IDIwLCAibWluWm9vbSI6IDAsICJub1dyYXAiOiBmYWxzZSwgIm9wYWNpdHkiOiAxLCAic3ViZG9tYWlucyI6ICJhYmMiLCAidG1zIjogZmFsc2V9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzEzNzMzMmE2OGZmYjQ0YjM5ODBhNmU1OTJiMDM5YzNhKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzQ2MTJjMzEyZGNhOTQwMmE4ZWIzZTlmMTUyNDc4ZTgxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbLTM3LjgwMTUyMDIsIDE0NC45MDI1ODY5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzEzNzMzMmE2OGZmYjQ0YjM5ODBhNmU1OTJiMDM5YzNhKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9mNTlhZTFlM2Q0ODQ0ZTJjYjQ1OWQyY2IzYjk0ODYxNSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZDhkMDQxM2UxZTJmNGVkNjgxNmViZGY2ZGY3YjJjZWEgPSAkKGA8ZGl2IGlkPSJodG1sX2Q4ZDA0MTNlMWUyZjRlZDY4MTZlYmRmNmRmN2IyY2VhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Gb290c2NyYXkgUmFpbHdheSBTdGF0aW9uIFZpY3RvcmlhLCAzMDExLCBBdXN0cmFsaWE8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZjU5YWUxZTNkNDg0NGUyY2I0NTlkMmNiM2I5NDg2MTUuc2V0Q29udGVudChodG1sX2Q4ZDA0MTNlMWUyZjRlZDY4MTZlYmRmNmRmN2IyY2VhKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzQ2MTJjMzEyZGNhOTQwMmE4ZWIzZTlmMTUyNDc4ZTgxLmJpbmRQb3B1cChwb3B1cF9mNTlhZTFlM2Q0ODQ0ZTJjYjQ1OWQyY2IzYjk0ODYxNSkKICAgICAgICA7CgogICAgICAgIAogICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7fd851cce750>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m = folium.Map((location.latitude, location.longitude), max_zoom=20, zoom_start=16, height=600)\n",
"folium.Marker((location.latitude, location.longitude), popup=address).add_to(m)\n",
"m"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"<sup>4</sup>Though after Friday I really want to try out Sangarshanan's `geopatra` library for this."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"### Added bonus: geocoding is built into GeoPandas\n",
"\n",
"If you haven't run into GeoPandas yet it's fantastics for working with spatial vector data. One of the tools it includes is a way to geocode a Pandas Series of addresses and get you back a GeoDataFrame of points:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"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>geometry</th>\n",
" <th>address</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>POINT (144.90259 -37.80152)</td>\n",
" <td>Footscray, Hyde Street, Footscray, City of Mar...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" geometry \\\n",
"0 POINT (144.90259 -37.80152) \n",
"\n",
" address \n",
"0 Footscray, Hyde Street, Footscray, City of Mar... "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"home = pd.Series([address], name='address')\n",
"home = gpd.tools.geocode(home, Nominatim, user_agent='Isochrone calculator')\n",
"home"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"That's really handy, and we can easily put this on the same map as above:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjYuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjYuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF9iYWQzZTU5N2Y0NWY0NDBkYjRkZThjYzZlZGQxM2VkMCB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiA2MDAuMHB4OwogICAgICAgICAgICAgICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgICAgICAgICAuZm9saXVtdG9vbHRpcCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgIC5mb2xpdW10b29sdGlwIHRhYmxlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBhdXRvOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5mb2xpdW10b29sdGlwIHRyewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuZm9saXVtdG9vbHRpcCB0aHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDJweDsgcGFkZGluZy1yaWdodDogOHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KICAgICAgICAgICAgCjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvbGl1bS1tYXAiIGlkPSJtYXBfYmFkM2U1OTdmNDVmNDQwZGI0ZGU4Y2M2ZWRkMTNlZDAiID48L2Rpdj4KICAgICAgICAKPC9ib2R5Pgo8c2NyaXB0PiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFwX2JhZDNlNTk3ZjQ1ZjQ0MGRiNGRlOGNjNmVkZDEzZWQwID0gTC5tYXAoCiAgICAgICAgICAgICAgICAibWFwX2JhZDNlNTk3ZjQ1ZjQ0MGRiNGRlOGNjNmVkZDEzZWQwIiwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjZW50ZXI6IFstMzcuODAxNTIwMiwgMTQ0LjkwMjU4NjldLAogICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgICAgICAgICAgICAgem9vbTogMTYsCiAgICAgICAgICAgICAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgcHJlZmVyQ2FudmFzOiBmYWxzZSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIAoKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl9iM2U1OTAwMGZmYjM0NjA4OTQ5NTk4YTc5NjQ1ZjUzOCA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgImh0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nIiwKICAgICAgICAgICAgICAgIHsiYXR0cmlidXRpb24iOiAiRGF0YSBieSBcdTAwMjZjb3B5OyBcdTAwM2NhIGhyZWY9XCJodHRwOi8vb3BlbnN0cmVldG1hcC5vcmdcIlx1MDAzZU9wZW5TdHJlZXRNYXBcdTAwM2MvYVx1MDAzZSwgdW5kZXIgXHUwMDNjYSBocmVmPVwiaHR0cDovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHRcIlx1MDAzZU9EYkxcdTAwM2MvYVx1MDAzZS4iLCAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsICJtYXhOYXRpdmVab29tIjogMjAsICJtYXhab29tIjogMjAsICJtaW5ab29tIjogMCwgIm5vV3JhcCI6IGZhbHNlLCAib3BhY2l0eSI6IDEsICJzdWJkb21haW5zIjogImFiYyIsICJ0bXMiOiBmYWxzZX0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmFkM2U1OTdmNDVmNDQwZGI0ZGU4Y2M2ZWRkMTNlZDApOwogICAgICAgIAogICAgCiAgICAgICAgZnVuY3Rpb24gZ2VvX2pzb25fNmY3YzJiMTIwNmY5NDVkYjk2NDRjZWViZjc0MDg3Nzhfb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIG1hcF9iYWQzZTU5N2Y0NWY0NDBkYjRkZThjYzZlZGQxM2VkMC5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl82ZjdjMmIxMjA2Zjk0NWRiOTY0NGNlZWJmNzQwODc3OCA9IEwuZ2VvSnNvbihudWxsLCB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl82ZjdjMmIxMjA2Zjk0NWRiOTY0NGNlZWJmNzQwODc3OF9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICAKICAgICAgICB9KS5hZGRUbyhtYXBfYmFkM2U1OTdmNDVmNDQwZGI0ZGU4Y2M2ZWRkMTNlZDApOwoKICAgICAgICBmdW5jdGlvbiBnZW9fanNvbl82ZjdjMmIxMjA2Zjk0NWRiOTY0NGNlZWJmNzQwODc3OF9hZGQgKGRhdGEpIHsKICAgICAgICAgICAgZ2VvX2pzb25fNmY3YzJiMTIwNmY5NDVkYjk2NDRjZWViZjc0MDg3NzguYWRkRGF0YShkYXRhKTsKICAgICAgICB9CiAgICAgICAgICAgIGdlb19qc29uXzZmN2MyYjEyMDZmOTQ1ZGI5NjQ0Y2VlYmY3NDA4Nzc4X2FkZCh7ImJib3giOiBbMTQ0LjkwMjU4NjksIC0zNy44MDE1MjAyLCAxNDQuOTAyNTg2OSwgLTM3LjgwMTUyMDJdLCAiZmVhdHVyZXMiOiBbeyJiYm94IjogWzE0NC45MDI1ODY5LCAtMzcuODAxNTIwMiwgMTQ0LjkwMjU4NjksIC0zNy44MDE1MjAyXSwgImdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFsxNDQuOTAyNTg2OSwgLTM3LjgwMTUyMDJdLCAidHlwZSI6ICJQb2ludCJ9LCAiaWQiOiAiMCIsICJwcm9wZXJ0aWVzIjogeyJhZGRyZXNzIjogIkZvb3RzY3JheSwgSHlkZSBTdHJlZXQsIEZvb3RzY3JheSwgQ2l0eSBvZiBNYXJpYnlybm9uZywgVmljdG9yaWEsIDMwMTEsIEF1c3RyYWxpYSJ9LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9KTsKICAgICAgICAKICAgIAogICAgZ2VvX2pzb25fNmY3YzJiMTIwNmY5NDVkYjk2NDRjZWViZjc0MDg3NzguYmluZFRvb2x0aXAoCiAgICBmdW5jdGlvbihsYXllcil7CiAgICBsZXQgZGl2ID0gTC5Eb21VdGlsLmNyZWF0ZSgnZGl2Jyk7CiAgICAKICAgIGxldCBoYW5kbGVPYmplY3QgPSBmZWF0dXJlPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgbGV0IGZpZWxkcyA9IFsiYWRkcmVzcyJdOwogICAgbGV0IGFsaWFzZXMgPSBbImFkZHJlc3MiXTsKICAgIGxldCB0YWJsZSA9ICc8dGFibGU+JyArCiAgICAgICAgU3RyaW5nKAogICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgKHYsaSk9PgogICAgICAgIGA8dHI+CiAgICAgICAgICAgIDx0aD4ke2FsaWFzZXNbaV19PC90aD4KICAgICAgICAgICAgCiAgICAgICAgICAgIDx0ZD4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbdl0pfTwvdGQ+CiAgICAgICAgPC90cj5gKS5qb2luKCcnKSkKICAgICsnPC90YWJsZT4nOwogICAgZGl2LmlubmVySFRNTD10YWJsZTsKICAgIAogICAgcmV0dXJuIGRpdgogICAgfQogICAgLHsiY2xhc3NOYW1lIjogImZvbGl1bXRvb2x0aXAiLCAic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgICAgICAgICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7fd851e46c10>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m = folium.Map((location.latitude, location.longitude), max_zoom=20, zoom_start=16, height=600)\n",
"folium.GeoJson(home, tooltip=folium.GeoJsonTooltip(['address'])).add_to(m)\n",
"m"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Step 2: getting the street network within 5km of your home\n",
"\n",
"For now I'm going to gloss over projections, except to say that if you buffer a latitude and longitude point by 5000 you're buffering by a number of degrees - not so great - so you want to use a projection (GDA2020 MGA Zone 55 in this case, or EPSG:7855<sup>5</sup>) to get a projection measured in metres."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [],
"source": [
"buffer = home.to_crs(epsg=7855).buffer(5000).to_crs(epsg=4326) # this projects back to lat/lng after the buffer"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"<sup>5</sup>If you need somewhere to look up projection EPSG codes try https://epsg.io"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"It's definitely worth seeing this on a map - this will be a 5000 metre circle around your home. The same one we got before from the Victorian goverment website:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"scrolled": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjYuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjYuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF84ODE4MGZiNGU1ZTI0ZWJjOTE1ZDU0NDY2ZTJlY2IwZiB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiA2MDAuMHB4OwogICAgICAgICAgICAgICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAogICAgCiAgICAgICAgICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgICAgICAgICAuZm9saXVtdG9vbHRpcCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgIC5mb2xpdW10b29sdGlwIHRhYmxlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBhdXRvOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5mb2xpdW10b29sdGlwIHRyewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuZm9saXVtdG9vbHRpcCB0aHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDJweDsgcGFkZGluZy1yaWdodDogOHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KICAgICAgICAgICAgCjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvbGl1bS1tYXAiIGlkPSJtYXBfODgxODBmYjRlNWUyNGViYzkxNWQ1NDQ2NmUyZWNiMGYiID48L2Rpdj4KICAgICAgICAKPC9ib2R5Pgo8c2NyaXB0PiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFwXzg4MTgwZmI0ZTVlMjRlYmM5MTVkNTQ0NjZlMmVjYjBmID0gTC5tYXAoCiAgICAgICAgICAgICAgICAibWFwXzg4MTgwZmI0ZTVlMjRlYmM5MTVkNTQ0NjZlMmVjYjBmIiwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjZW50ZXI6IFstMzcuODAxNTIwMiwgMTQ0LjkwMjU4NjldLAogICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgICAgICAgICAgICAgem9vbTogMTIsCiAgICAgICAgICAgICAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgcHJlZmVyQ2FudmFzOiBmYWxzZSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIAoKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl9lNjE1Y2NiYzAyZjM0MWU3YWU2N2VlZmI0NWZkY2FiNCA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgImh0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nIiwKICAgICAgICAgICAgICAgIHsiYXR0cmlidXRpb24iOiAiRGF0YSBieSBcdTAwMjZjb3B5OyBcdTAwM2NhIGhyZWY9XCJodHRwOi8vb3BlbnN0cmVldG1hcC5vcmdcIlx1MDAzZU9wZW5TdHJlZXRNYXBcdTAwM2MvYVx1MDAzZSwgdW5kZXIgXHUwMDNjYSBocmVmPVwiaHR0cDovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHRcIlx1MDAzZU9EYkxcdTAwM2MvYVx1MDAzZS4iLCAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsICJtYXhOYXRpdmVab29tIjogMjAsICJtYXhab29tIjogMjAsICJtaW5ab29tIjogMCwgIm5vV3JhcCI6IGZhbHNlLCAib3BhY2l0eSI6IDEsICJzdWJkb21haW5zIjogImFiYyIsICJ0bXMiOiBmYWxzZX0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODgxODBmYjRlNWUyNGViYzkxNWQ1NDQ2NmUyZWNiMGYpOwogICAgICAgIAogICAgCiAgICAgICAgZnVuY3Rpb24gZ2VvX2pzb25fNWM3NGFhYTk5ZDI5NDYwMmFkZmNhNmI0MDdmOTU0OGRfb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIG1hcF84ODE4MGZiNGU1ZTI0ZWJjOTE1ZDU0NDY2ZTJlY2IwZi5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl81Yzc0YWFhOTlkMjk0NjAyYWRmY2E2YjQwN2Y5NTQ4ZCA9IEwuZ2VvSnNvbihudWxsLCB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl81Yzc0YWFhOTlkMjk0NjAyYWRmY2E2YjQwN2Y5NTQ4ZF9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICAKICAgICAgICB9KS5hZGRUbyhtYXBfODgxODBmYjRlNWUyNGViYzkxNWQ1NDQ2NmUyZWNiMGYpOwoKICAgICAgICBmdW5jdGlvbiBnZW9fanNvbl81Yzc0YWFhOTlkMjk0NjAyYWRmY2E2YjQwN2Y5NTQ4ZF9hZGQgKGRhdGEpIHsKICAgICAgICAgICAgZ2VvX2pzb25fNWM3NGFhYTk5ZDI5NDYwMmFkZmNhNmI0MDdmOTU0OGQuYWRkRGF0YShkYXRhKTsKICAgICAgICB9CiAgICAgICAgICAgIGdlb19qc29uXzVjNzRhYWE5OWQyOTQ2MDJhZGZjYTZiNDA3Zjk1NDhkX2FkZCh7ImJib3giOiBbMTQ0Ljg0NTgyOTg3NzA3OTcsIC0zNy44NDY1NTU3NjE5NTc4MiwgMTQ0Ljk1OTM0Njc2MTEwOTA2LCAtMzcuNzU2NDg0MjU2Mjk1MDc0XSwgImZlYXR1cmVzIjogW3siYmJveCI6IFsxNDQuODQ1ODI5ODc3MDc5NywgLTM3Ljg0NjU1NTc2MTk1NzgyLCAxNDQuOTU5MzQ2NzYxMTA5MDYsIC0zNy43NTY0ODQyNTYyOTUwNzRdLCAiZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1tbMTQ0Ljk1OTM0Njc2MTEwOTA2LCAtMzcuODAyNTE3NDc0NjExNTA2XSwgWzE0NC45NTg5NTE5MDI2NDY0OCwgLTM3LjgwNjkyNzE2ODcyMTddLCBbMTQ0Ljk1ODAxNDA4MjU0MDA1LCAtMzcuODExMjg0OTA5ODc1MTRdLCBbMTQ0Ljk1NjU0MjI0MTcyMzgsIC0zNy44MTU1NDg3MTUzMDgwMDVdLCBbMTQ0Ljk1NDU1MDQ3MjcxNjI1LCAtMzcuODE5Njc3NTAwMzQ1MjZdLCBbMTQ0Ljk1MjA1Nzg4NzA2NzQ0LCAtMzcuODIzNjMxNDc0OTA1ODRdLCBbMTQ0Ljk0OTA4ODQzNDAxNzI2LCAtMzcuODI3MzcyNTI3NzYxOTk1XSwgWzE0NC45NDU2NzA2NzIwMDU5MiwgLTM3LjgzMDg2NDU5NDgxMDk2XSwgWzE0NC45NDE4Mzc0OTUxNTM3MiwgLTM3LjgzNDA3NDAwNzc2NTYxNV0sIFsxNDQuOTM3NjI1ODE3Mjg0NCwgLTM3LjgzNjk2OTgxOTg1MjJdLCBbMTQ0LjkzMzA3NjIxNjUwMjc0LCAtMzcuODM5NTI0MTA1MzIzMzVdLCBbMTQ0LjkyODIzMjU0Mzc0NjEsIC0zNy44NDE3MTIyMjk4NDQwN10sIFsxNDQuOTIzMTQxNDk5MTAzOCwgLTM3Ljg0MzUxMzA4OTA5MTE4XSwgWzE0NC45MTc4NTIxODAwMzczLCAtMzcuODQ0OTA5MzEzMjE1MzU0XSwgWzE0NC45MTI0MTU2MDU5MzA0MiwgLTM3Ljg0NTg4NzQzNTE0OThdLCBbMTQ0LjkwNjg4NDIyMzY0ODcyLCAtMzcuODQ2NDM4MDIxMTA0NDRdLCBbMTQ0LjkwMTMxMTM5ODk5MDA2LCAtMzcuODQ2NTU1NzYxOTU3ODJdLCBbMTQ0Ljg5NTc1MDg5OTA1NzYyLCAtMzcuODQ2MjM5NTI0NjQ1NTc2XSwgWzE0NC44OTAyNTYzNzA2ODI2NiwgLTM3Ljg0NTQ5MjM2MzA0MDUxXSwgWzE0NC44ODQ4ODA4MjAwNjcwNSwgLTM3Ljg0NDMyMTQ4ODIyMDQzXSwgWzE0NC44Nzk2NzYwOTg3OTk2LCAtMzcuODQyNzM4MTk4NDIyODhdLCBbMTQ0Ljg3NDY5MjQwMTMzMjY4LCAtMzcuODQwNzU3NzY5Mzg0MzNdLCBbMTQ0Ljg2OTk3Nzc3ODg4MDksIC0zNy44MzgzOTkzMDYxNTMzNV0sIFsxNDQuODY1NTc3Njc0NTI3LCAtMzcuODM1Njg1NTU3ODQ2MTVdLCBbMTQ0Ljg2MTUzNDQ4NDA5NTQsIC0zNy44MzI2NDI2OTcxNzc2MDRdLCBbMTQ0Ljg1Nzg4NzE0NzA3ODI2LCAtMzcuODI5MzAwMDY2OTQ0MzM0XSwgWzE0NC44NTQ2NzA3NzE1ODQwNywgLTM3LjgyNTY4OTg5NTk1NzkxXSwgWzE0NC44NTE5MTYyOTY5MjA3NiwgLTM3LjgyMTg0Njk4NzIyMTI0XSwgWzE0NC44NDk2NTAxOTcwMzU3MSwgLTM3LjgxNzgwODM4MTQwNzAyXSwgWzE0NC44NDc4OTQyMjc2MTMxOCwgLTM3LjgxMzYxMjk5ODkzMDYxXSwgWzE0NC44NDY2NjUyMTkxODUzLCAtMzcuODA5MzAxMjY0MTExM10sIFsxNDQuODQ1OTc0OTE4MTQ2MDYsIC0zNy44MDQ5MTQ3MTUwNzk5M10sIFsxNDQuODQ1ODI5ODc3MDc5NywgLTM3LjgwMDQ5NTYwMzIxOTUzXSwgWzE0NC44NDYyMzEzOTUzMjY0NCwgLTM3Ljc5NjA4NjQ4NjAxNjQ2XSwgWzE0NC44NDcxNzU1MTAyMTYxMiwgLTM3Ljc5MTcyOTgxNzI1MTk4XSwgWzE0NC44NDg2NTMwMzg5MTAyMSwgLTM3Ljc4NzQ2NzUzODQ3ODczXSwgWzE0NC44NTA2NDk2NzAzMDg2LCAtMzcuNzgzMzQwNjc1NzAzMjY1XSwgWzE0NC44NTMxNDYxMDYwMDIyNywgLTM3Ljc3OTM4ODk0NTEzNTM1XSwgWzE0NC44NTYxMTgyNDg3OTYxLCAtMzcuNzc1NjUwMzcxNzY3NjI1XSwgWzE0NC44NTk1Mzc0MzY4ODQsIC0zNy43NzIxNjA5MjQ0MTc1ODRdLCBbMTQ0Ljg2MzM3MDcyMTM0MTgyLCAtMzcuNzY4OTU0MTcwNjk4OTI2XSwgWzE0NC44Njc1ODExODQyMDk5NywgLTM3Ljc2NjA2MDk1NTE5MjQzXSwgWzE0NC44NzIxMjgyOTQwNzQ3NCwgLTM3Ljc2MzUwOTEwMzg2MDMyXSwgWzE0NC44NzY5NjgyOTU3MjI4NiwgLTM3Ljc2MTMyMzE1NzQ5NDgxNF0sIFsxNDQuODgyMDU0NjMwMTQzMzMsIC0zNy43NTk1MjQxMzY3MTM2NV0sIFsxNDQuODg3MzM4MzgwODg1OCwgLTM3Ljc1ODEyOTM0MDcxNDc1XSwgWzE0NC44OTI3Njg3NDI1NTQzMiwgLTM3Ljc1NzE1MjE4MTY4MjYzXSwgWzE0NC44OTgyOTM1MDcwMjQzLCAtMzcuNzU2NjAyMDU2NDAzNDVdLCBbMTQ0LjkwMzg1OTU2MjgxNzIsIC0zNy43NTY0ODQyNTYyOTUwNzRdLCBbMTQ0LjkwOTQxMzQwMjk1NDI0LCAtMzcuNzU2Nzk5OTE2Njk4OTk1XSwgWzE0NC45MTQ5MDE2MzY1MzcwMiwgLTM3Ljc1NzU0NjAwNTkxMjczXSwgWzE0NC45MjAyNzE0OTkyNjk1NSwgLTM3Ljc1ODcxNTM1NDA3MDAxXSwgWzE0NC45MjU0NzEzNTgxNDU0NCwgLTM3Ljc2MDI5NjcyMTYwMjI5NV0sIFsxNDQuOTMwNDUxMjA1NTcxMywgLTM3Ljc2MjI3NDkwNjY0NDgzXSwgWzE0NC45MzUxNjMxMzgyODczLCAtMzcuNzY0NjMwODkwMzg0OF0sIFsxNDQuOTM5NTYxODE2NTc1MjQsIC0zNy43NjczNDIwMTg5OTE1NTZdLCBbMTQ0Ljk0MzYwNDg5OTQxMzA2LCAtMzcuNzcwMzgyMjIwNDIzOTNdLCBbMTQ0Ljk0NzI1MzQ1MTQ0MjYzLCAtMzcuNzczNzIyMjU0MDc4M10sIFsxNDQuOTUwNDcyMzE3ODYyNiwgLTM3Ljc3NzMyOTk5MDkyODA3NF0sIFsxNDQuOTUzMjMwNDYzNjM5NjQsIC0zNy43ODExNzA3MjE1MTI2OF0sIFsxNDQuOTU1NTAxMjczNzQ3MywgLTM3Ljc4NTIwNzQ4ODg2NDQ3XSwgWzE0NC45NTcyNjI4MTE0OSwgLTM3Ljc4OTQwMTQ0MzIxODk0XSwgWzE0NC45NTg0OTgwMzIzNDg0MiwgLTM3Ljc5MzcxMjIxNTEzODUxXSwgWzE0NC45NTkxOTQ5NTExODg3OCwgLTM3Ljc5ODA5ODMwMzQ5NTkzXSwgWzE0NC45NTkzNDY3NjExMDkwNiwgLTM3LjgwMjUxNzQ3NDYxMTUwNl1dXSwgInR5cGUiOiAiUG9seWdvbiJ9LCAiaWQiOiAiMCIsICJwcm9wZXJ0aWVzIjoge30sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0pOwogICAgICAgIAogICAgCiAgICAgICAgZnVuY3Rpb24gZ2VvX2pzb25fNDFhMWZmOTEyMjZlNDI3MTkwMDMxZWNlNTVmYWJmNDhfb25FYWNoRmVhdHVyZShmZWF0dXJlLCBsYXllcikgewogICAgICAgICAgICBsYXllci5vbih7CiAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIG1hcF84ODE4MGZiNGU1ZTI0ZWJjOTE1ZDU0NDY2ZTJlY2IwZi5maXRCb3VuZHMoZS50YXJnZXQuZ2V0Qm91bmRzKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIHZhciBnZW9fanNvbl80MWExZmY5MTIyNmU0MjcxOTAwMzFlY2U1NWZhYmY0OCA9IEwuZ2VvSnNvbihudWxsLCB7CiAgICAgICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBnZW9fanNvbl80MWExZmY5MTIyNmU0MjcxOTAwMzFlY2U1NWZhYmY0OF9vbkVhY2hGZWF0dXJlLAogICAgICAgICAgICAKICAgICAgICB9KS5hZGRUbyhtYXBfODgxODBmYjRlNWUyNGViYzkxNWQ1NDQ2NmUyZWNiMGYpOwoKICAgICAgICBmdW5jdGlvbiBnZW9fanNvbl80MWExZmY5MTIyNmU0MjcxOTAwMzFlY2U1NWZhYmY0OF9hZGQgKGRhdGEpIHsKICAgICAgICAgICAgZ2VvX2pzb25fNDFhMWZmOTEyMjZlNDI3MTkwMDMxZWNlNTVmYWJmNDguYWRkRGF0YShkYXRhKTsKICAgICAgICB9CiAgICAgICAgICAgIGdlb19qc29uXzQxYTFmZjkxMjI2ZTQyNzE5MDAzMWVjZTU1ZmFiZjQ4X2FkZCh7ImJib3giOiBbMTQ0LjkwMjU4NjksIC0zNy44MDE1MjAyLCAxNDQuOTAyNTg2OSwgLTM3LjgwMTUyMDJdLCAiZmVhdHVyZXMiOiBbeyJiYm94IjogWzE0NC45MDI1ODY5LCAtMzcuODAxNTIwMiwgMTQ0LjkwMjU4NjksIC0zNy44MDE1MjAyXSwgImdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFsxNDQuOTAyNTg2OSwgLTM3LjgwMTUyMDJdLCAidHlwZSI6ICJQb2ludCJ9LCAiaWQiOiAiMCIsICJwcm9wZXJ0aWVzIjogeyJhZGRyZXNzIjogIkZvb3RzY3JheSwgSHlkZSBTdHJlZXQsIEZvb3RzY3JheSwgQ2l0eSBvZiBNYXJpYnlybm9uZywgVmljdG9yaWEsIDMwMTEsIEF1c3RyYWxpYSJ9LCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9KTsKICAgICAgICAKICAgIAogICAgZ2VvX2pzb25fNDFhMWZmOTEyMjZlNDI3MTkwMDMxZWNlNTVmYWJmNDguYmluZFRvb2x0aXAoCiAgICBmdW5jdGlvbihsYXllcil7CiAgICBsZXQgZGl2ID0gTC5Eb21VdGlsLmNyZWF0ZSgnZGl2Jyk7CiAgICAKICAgIGxldCBoYW5kbGVPYmplY3QgPSBmZWF0dXJlPT50eXBlb2YoZmVhdHVyZSk9PSdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgOiBmZWF0dXJlOwogICAgbGV0IGZpZWxkcyA9IFsiYWRkcmVzcyJdOwogICAgbGV0IGFsaWFzZXMgPSBbImFkZHJlc3MiXTsKICAgIGxldCB0YWJsZSA9ICc8dGFibGU+JyArCiAgICAgICAgU3RyaW5nKAogICAgICAgIGZpZWxkcy5tYXAoCiAgICAgICAgKHYsaSk9PgogICAgICAgIGA8dHI+CiAgICAgICAgICAgIDx0aD4ke2FsaWFzZXNbaV19PC90aD4KICAgICAgICAgICAgCiAgICAgICAgICAgIDx0ZD4ke2hhbmRsZU9iamVjdChsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbdl0pfTwvdGQ+CiAgICAgICAgPC90cj5gKS5qb2luKCcnKSkKICAgICsnPC90YWJsZT4nOwogICAgZGl2LmlubmVySFRNTD10YWJsZTsKICAgIAogICAgcmV0dXJuIGRpdgogICAgfQogICAgLHsiY2xhc3NOYW1lIjogImZvbGl1bXRvb2x0aXAiLCAic3RpY2t5IjogdHJ1ZX0pOwogICAgICAgICAgICAgICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7fd851e790d0>"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m = folium.Map((location.latitude, location.longitude), max_zoom=20, zoom_start=12, height=600)\n",
"folium.GeoJson(buffer).add_to(m)\n",
"folium.GeoJson(home, tooltip=folium.GeoJsonTooltip(['address'])).add_to(m)\n",
"m"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"To get the actual data underneath this to measure how far I can travel I'm going to use the `osmnx` library<sup>6</sup> - a tool that lets you download and extract Open Street Map data as a NetworkX graph along with the spatial data. (The data download can take a minute or two!)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment