Created
September 6, 2020 02:11
-
-
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!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "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