{ "metadata": { "name": "", "signature": "sha256:b7ec301ad7f68d400f65d703b37b53833a5cb418c982a70461362e4370364bb1" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Read Overpass-API to Python Pandas Dataframe" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The [Overpass API](http://wiki.openstreetmap.org/wiki/Overpass_API) provides access to the data behind the Openstreetmaps Map Data.\n", "The [Overpass-Turbo](http://overpass-turbo.eu/) is the easyiest way to test requests and get the correct code to ask the database." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pandas as pd\n", "import requests\n", "import json\n", "pd.set_option('display.max_columns', 200)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 33 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Gebiet festlegen, am besten mit einer [Bounding Box](http://boundingbox.klokantech.com/)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Get yours at: http://boundingbox.klokantech.com/\n", "bbox = [13.526452,50.932114,13.966063,51.17772]\n", "\n", "# Links unten\n", "minLat = bbox[1]\n", "minLon = bbox[0]\n", "\n", "# Rechts oben\n", "maxLat = bbox[3]\n", "maxLon = bbox[2]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 34 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Request from [Overpass-Turbo](http://overpass-api.de/api/convert?data=%3C!--%0AThis%20has%20been%20generated%20by%20the%20overpass-turbo%20wizard.%0AThe%20original%20search%20was%3A%0A%E2%80%9CBushaltestelle%E2%80%9D%0A--%3E%0A%3Cosm-script%20output%3D%22json%22%20timeout%3D%2225%22%3E%0A%20%20%3C!--%20gather%20results%20--%3E%0A%20%20%3Cunion%3E%0A%20%20%20%20%3C!--%20query%20part%20for%3A%20%E2%80%9CBushaltestelle%E2%80%9D%20--%3E%0A%20%20%20%20%3Cquery%20type%3D%22node%22%3E%0A%20%20%20%20%20%20%3Chas-kv%20k%3D%22highway%22%20v%3D%22bus_stop%22%2F%3E%0A%20%20%20%20%20%20%3Cbbox-query%20s%3D%2250.973778188690716%22%20w%3D%2213.552322387695312%22%20n%3D%2251.12033393562918%22%20e%3D%2213.898735046386719%22%2F%3E%0A%20%20%20%20%3C%2Fquery%3E%0A%20%20%3C%2Funion%3E%0A%20%20%3C!--%20print%20results%20--%3E%0A%20%20%3Cprint%20mode%3D%22body%22%2F%3E%0A%20%20%3Crecurse%20type%3D%22down%22%2F%3E%0A%20%20%3Cprint%20mode%3D%22skeleton%22%20order%3D%22quadtile%22%2F%3E%0A%3C%2Fosm-script%3E&target=mapql)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "osmrequest = {'data': '[out:json][timeout:25];(node[\"highway\"=\"bus_stop\"](%s,%s,%s,%s););out body;>;out skel qt;' % (minLat, minLon, maxLat, maxLon)}\n", "osmurl = 'http://overpass-api.de/api/interpreter'\n", "\n", "# Ask the API\n", "osm = requests.get(osmurl, params=osmrequest)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 35 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The JSON can't be directyl imported to a Pandas Dataframe:\n", "\n", "```\n", "If the JSON string were to be converted to a Python object, it would be a dict whose elements key is a list of dicts. The vast majority of the data is inside this list of dicts.\n", "\n", "This JSON string is not directly convertible to a Pandas object. What would be the index, and what would be the columns? Surely you don't want [u'elements', u'version', u'osm3s', u'generator'] to be the columns, since almost all the information is in the elements list-of-dicts.\n", "\n", "But if you want the DataFrame to consist of the data only in the elements list-of-dicts, then you'd have to specify that, since Pandas can't make that assumption for you.\n", "\n", "Further complicating things is that each dict in elements is a nested dict.\n", "```\n", "\n", "Thanks to [unutbu from stackoverflow.com](http://stackoverflow.com/questions/24848416/expected-string-or-unicode-when-reading-json-with-pandas) for fiddling this out!" ] }, { "cell_type": "code", "collapsed": false, "input": [ "osmdata = osm.json()\n", "osmdata = osmdata['elements']\n", "for dct in osmdata:\n", " for key, val in dct['tags'].iteritems():\n", " dct[key] = val\n", " del dct['tags']" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 36 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Now put everything to the Pandas Dataframe" ] }, { "cell_type": "code", "collapsed": false, "input": [ "osmdf = pd.DataFrame(osmdata)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 37 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Look at the whole Dataframe" ] }, { "cell_type": "code", "collapsed": true, "input": [ "osmdf.head(5)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
FIXMELinieaddr:suburbalt_nameamenitybenchbinbusbus_linesbus_routescommentcoveredcreated_byddbus2010descriptiondestinationdirectionfee_zonefixmehighwayidinformationlatlayerlinelineslitlocal_reflonmap_sizemap_typenamenetworknoteold_nameopening_hoursoperatorpostal_codepublic_transportrailwayrefref_nameroute_refsheltersourcetactile_pavingtoilettoiletstourismtramtypeuic_namewaste_basketwebsitewheelchairwheelchair:description
0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN bus_stop 536694 NaN 50.984926 NaN NaN NaN NaN NaN 13.682178 NaN NaN Niederh\u00e4slich Bergmannsweg NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN node NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN bus_stop 11004528 NaN 51.123623 NaN NaN NaN NaN NaN 13.782789 NaN NaN Sagarder Weg NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN node NaN NaN NaN yes NaN
2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN bus_stop 11070510 NaN 51.081560 NaN NaN NaN NaN NaN 13.900377 NaN NaN Ullersdorf, Gasthof NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN node NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN NaN NaN yes NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN bus_stop 11070784 NaN 51.065752 NaN NaN NaN NaN NaN 13.895734 NaN NaN Wei\u00dfig, Einkaufszentrum NaN NaN NaN NaN DVB NaN stop_position NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN node NaN NaN NaN NaN NaN
4 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN bus_stop 11297121 NaN 51.007140 NaN NaN NaN NaN NaN 13.698498 NaN NaN Stuttgarter Stra\u00dfe NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN node NaN NaN NaN NaN NaN
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 38, "text": [ " FIXME Linie addr:suburb alt_name amenity bench bin bus bus_lines \\\n", "0 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", "1 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", "2 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", "3 NaN NaN NaN NaN NaN NaN NaN yes NaN \n", "4 NaN NaN NaN NaN NaN NaN NaN NaN NaN \n", "\n", " bus_routes comment covered created_by ddbus2010 description destination \\\n", "0 NaN NaN NaN NaN NaN NaN NaN \n", "1 NaN NaN NaN NaN NaN NaN NaN \n", "2 NaN NaN NaN NaN NaN NaN NaN \n", "3 NaN NaN NaN NaN NaN NaN NaN \n", "4 NaN NaN NaN NaN NaN NaN NaN \n", "\n", " direction fee_zone fixme highway id information lat layer \\\n", "0 NaN NaN NaN bus_stop 536694 NaN 50.984926 NaN \n", "1 NaN NaN NaN bus_stop 11004528 NaN 51.123623 NaN \n", "2 NaN NaN NaN bus_stop 11070510 NaN 51.081560 NaN \n", "3 NaN NaN NaN bus_stop 11070784 NaN 51.065752 NaN \n", "4 NaN NaN NaN bus_stop 11297121 NaN 51.007140 NaN \n", "\n", " line lines lit local_ref lon map_size map_type \\\n", "0 NaN NaN NaN NaN 13.682178 NaN NaN \n", "1 NaN NaN NaN NaN 13.782789 NaN NaN \n", "2 NaN NaN NaN NaN 13.900377 NaN NaN \n", "3 NaN NaN NaN NaN 13.895734 NaN NaN \n", "4 NaN NaN NaN NaN 13.698498 NaN NaN \n", "\n", " name network note old_name opening_hours operator \\\n", "0 Niederh\u00e4slich Bergmannsweg NaN NaN NaN NaN NaN \n", "1 Sagarder Weg NaN NaN NaN NaN NaN \n", "2 Ullersdorf, Gasthof NaN NaN NaN NaN NaN \n", "3 Wei\u00dfig, Einkaufszentrum NaN NaN NaN NaN DVB \n", "4 Stuttgarter Stra\u00dfe NaN NaN NaN NaN NaN \n", "\n", " postal_code public_transport railway ref ref_name route_ref shelter source \\\n", "0 NaN NaN NaN NaN NaN NaN NaN NaN \n", "1 NaN NaN NaN NaN NaN NaN NaN NaN \n", "2 NaN NaN NaN NaN NaN NaN NaN NaN \n", "3 NaN stop_position NaN NaN NaN NaN NaN NaN \n", "4 NaN NaN NaN NaN NaN NaN NaN NaN \n", "\n", " tactile_paving toilet toilets tourism tram type uic_name waste_basket \\\n", "0 NaN NaN NaN NaN NaN node NaN NaN \n", "1 NaN NaN NaN NaN NaN node NaN NaN \n", "2 NaN NaN NaN NaN NaN node NaN NaN \n", "3 NaN NaN NaN NaN NaN node NaN NaN \n", "4 NaN NaN NaN NaN NaN node NaN NaN \n", "\n", " website wheelchair wheelchair:description \n", "0 NaN NaN NaN \n", "1 NaN yes NaN \n", "2 NaN NaN NaN \n", "3 NaN NaN NaN \n", "4 NaN NaN NaN " ] } ], "prompt_number": 38 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "The interesting ones are" ] }, { "cell_type": "code", "collapsed": false, "input": [ "busstopsdf = osmdf[['lat', 'lon', 'name', 'wheelchair']].dropna(subset=['name']).fillna(u'unknown')\n", "busstopsdf.head(5)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
latlonnamewheelchair
0 50.984926 13.682178 Niederh\u00e4slich Bergmannsweg unknown
1 51.123623 13.782789 Sagarder Weg yes
2 51.081560 13.900377 Ullersdorf, Gasthof unknown
3 51.065752 13.895734 Wei\u00dfig, Einkaufszentrum unknown
4 51.007140 13.698498 Stuttgarter Stra\u00dfe unknown
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 39, "text": [ " lat lon name wheelchair\n", "0 50.984926 13.682178 Niederh\u00e4slich Bergmannsweg unknown\n", "1 51.123623 13.782789 Sagarder Weg yes\n", "2 51.081560 13.900377 Ullersdorf, Gasthof unknown\n", "3 51.065752 13.895734 Wei\u00dfig, Einkaufszentrum unknown\n", "4 51.007140 13.698498 Stuttgarter Stra\u00dfe unknown" ] } ], "prompt_number": 39 }, { "cell_type": "code", "collapsed": false, "input": [ "accesslevel = {'unknown': 0, 'yes': 2, 'limited': 1, 'no': -1}\n", "def getacclev(c):\n", " return accesslevel[c]\n", "busstopsdf['accesslevel'] = busstopsdf.wheelchair.apply(getacclev)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 41 }, { "cell_type": "code", "collapsed": false, "input": [ "busstopsdf.head(10)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
latlonnamewheelchairaccesslevel
0 50.984926 13.682178 Niederh\u00e4slich Bergmannsweg unknown 0
1 51.123623 13.782789 Sagarder Weg yes 2
2 51.081560 13.900377 Ullersdorf, Gasthof unknown 0
3 51.065752 13.895734 Wei\u00dfig, Einkaufszentrum unknown 0
4 51.007140 13.698498 Stuttgarter Stra\u00dfe unknown 0
5 51.010199 13.701411 Heilbronner Stra\u00dfe limited 1
6 51.003121 13.686136 Burgker Stra\u00dfe unknown 0
7 50.996333 13.689492 Kleinnaundorf, Schule unknown 0
8 51.087893 13.699240 Peschelstra\u00dfe/Rankestra\u00dfe no-1
9 51.086979 13.639351 Gohliser Weg unknown 0
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 42, "text": [ " lat lon name wheelchair accesslevel\n", "0 50.984926 13.682178 Niederh\u00e4slich Bergmannsweg unknown 0\n", "1 51.123623 13.782789 Sagarder Weg yes 2\n", "2 51.081560 13.900377 Ullersdorf, Gasthof unknown 0\n", "3 51.065752 13.895734 Wei\u00dfig, Einkaufszentrum unknown 0\n", "4 51.007140 13.698498 Stuttgarter Stra\u00dfe unknown 0\n", "5 51.010199 13.701411 Heilbronner Stra\u00dfe limited 1\n", "6 51.003121 13.686136 Burgker Stra\u00dfe unknown 0\n", "7 50.996333 13.689492 Kleinnaundorf, Schule unknown 0\n", "8 51.087893 13.699240 Peschelstra\u00dfe/Rankestra\u00dfe no -1\n", "9 51.086979 13.639351 Gohliser Weg unknown 0" ] } ], "prompt_number": 42 }, { "cell_type": "code", "collapsed": false, "input": [ "busstopsdf[['lat','lon','name','accesslevel','wheelchair']].to_csv('bus_stops.csv', sep=',', encoding='utf-8', index=False)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 43 }, { "cell_type": "code", "collapsed": false, "input": [ "print('Done.')" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Done.\n" ] } ], "prompt_number": 44 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Get Accessability Level for Disabled People" ] }, { "cell_type": "code", "collapsed": false, "input": [ "busstopsdf.wheelchair.unique()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 45, "text": [ "array([u'unknown', u'yes', u'limited', u'no'], dtype=object)" ] } ], "prompt_number": 45 }, { "cell_type": "code", "collapsed": false, "input": [ "colorcodes = {'unknown': '#FFFFFF', 'yes': '#00FF00', 'limited': '#FFFF00', 'no': '#FF0000'}\n", "def colorencode(c):\n", " return colorcodes[c]\n", "busstopsdf['color'] = busstopsdf.wheelchair.apply(colorencode)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 46 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Generate .html out of it" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from bokeh.plotting import *\n", "output_notebook()" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ " \n", " \n", " \n", "
\n", "