Skip to content

Instantly share code, notes, and snippets.

@saerdnaer
Created November 27, 2015 23:48
Show Gist options
  • Save saerdnaer/bd9fb6eb30ba34b4adcd to your computer and use it in GitHub Desktop.
Save saerdnaer/bd9fb6eb30ba34b4adcd to your computer and use it in GitHub Desktop.
#!/usr/local/bin/python3
from urllib.parse import quote_plus
from urllib.request import URLopener
import os, subprocess
import json
from shapely.geometry import shape
import csv
def download_data():
bbox = '48.07303233901773,11.348190307617188,48.25028349849019,11.73614501953125'
query = 'rel(' +bbox + ')[boundary=administrative][admin_level=10]; out geom;' + \
'rel(' +bbox + ')[boundary=postal_code][postal_code~"8[01].+"]; out geom;'
file = URLopener()
file.retrieve('http://overpass-api.de/api/interpreter?data=' + quote_plus(query), 'bezirksteile-plz.osm')
pass
def convert_to_geojson():
# install via `npm install -g osmtogeojson`
with open('bezirksteile-plz.geojson', 'w') as out:
os.environ['PATH'] += ':/usr/local/bin/'
return_code = subprocess.call(['osmtogeojson', 'bezirksteile-plz.osm'], stdout=out)
return return_code
bezirksteile = []
def get_bezirksteile():
global bezirksteile
with open('bezirksteile-plz.geojson', encoding='utf-8') as data_file:
data = json.load(data_file)
for item in data['features']:
if 'boundary' in item['properties']:
if item['properties']['boundary'] == 'administrative':
bezirksteile.append({
'name': item['properties']['name'].replace('Bezirksteil ', ''),
'plz' : [],
'shape': shape(item['geometry'])
});
elif item['properties']['boundary'] == 'postal_code':
plz_shape = shape(item['geometry'])
for bezirksteil in bezirksteile:
if plz_shape.intersects(bezirksteil['shape']):
#calculate how many percent of this bezirksteil is covered by this postal code area
percent = (plz_shape.intersection(bezirksteil['shape']).area)/bezirksteil['shape'].area
bezirksteil['plz'].append([item['properties']['postal_code'], percent])
def write_to_csv():
with open('plz-bezirksteile.csv', 'wt', encoding='utf-8') as csvfile:
w = csv.writer(csvfile)
w.writerow(['plz', 'abdeckung', 'bezirksteil'])
for bezirksteil in bezirksteile:
for [plz, percent] in bezirksteil['plz']:
#print(plz, "{0:.6f}".format(percent), bezirksteil['name'])
w.writerow([plz, "{0:.6f}".format(percent), bezirksteil['name']])
pass
def main():
download_data()
convert_to_geojson()
get_bezirksteile()
write_to_csv()
print('done')
pass
if __name__ == '__main__':
main()
pass
plz abdeckung bezirksteil
81827 0.841799 Waldtrudering
81825 0.137724 Waldtrudering
81829 0.000000 Waldtrudering
81735 0.020477 Waldtrudering
81739 0.000000 Waldtrudering
81475 0.013500 Forstenried
81477 0.016892 Forstenried
81379 0.002000 Forstenried
81476 0.967608 Forstenried
81377 0.000000 Forstenried
81479 0.604086 Solln
81477 0.395912 Solln
81476 0.000000 Solln
80995 0.984205 Ludwigsfeld
80997 0.015795 Ludwigsfeld
80935 0.002143 Lerchenau-West
80995 0.997857 Lerchenau-West
80469 0.808611 Dreimühlen
80337 0.191389 Dreimühlen
81371 0.000000 Dreimühlen
81379 0.000000 Dreimühlen
81543 0.000000 Dreimühlen
80469 1.000000 Glockenbach
80337 0.000000 Glockenbach
81541 0.000000 Glockenbach
81543 0.000000 Glockenbach
80469 0.000017 Am Schlachthof
80336 0.000000 Am Schlachthof
80337 0.999983 Am Schlachthof
81371 0.000000 Am Schlachthof
80335 0.209597 St. Paul
80336 0.762772 St. Paul
80337 0.019128 St. Paul
80636 0.000000 St. Paul
80339 0.008503 St. Paul
81373 0.000000 St. Paul
80335 0.204394 Ludwigsvorstadt-Kliniken
80336 0.695861 Ludwigsvorstadt-Kliniken
80337 0.052642 Ludwigsvorstadt-Kliniken
80331 0.047104 Ludwigsvorstadt-Kliniken
80469 0.324677 Angerviertel
80336 0.025530 Angerviertel
80337 0.000047 Angerviertel
80331 0.649746 Angerviertel
80335 0.007482 Hackenviertel
80336 0.030740 Hackenviertel
80331 0.961778 Hackenviertel
80333 0.130529 Graggenau
80469 0.008028 Graggenau
80538 0.000000 Graggenau
80539 0.532254 Graggenau
80331 0.329189 Graggenau
80802 0.037953 Englischer Garten
80538 0.948743 Englischer Garten
80539 0.013303 Englischer Garten
81675 0.000000 Englischer Garten
80469 0.000000 Untere Au
80538 0.000000 Untere Au
81541 0.635071 Untere Au
81667 0.000000 Untere Au
81543 0.203609 Untere Au
81669 0.161320 Untere Au
81541 0.595785 Obere Au
81669 0.404215 Obere Au
81541 0.000000 Haidhausen Süd
81667 0.686914 Haidhausen Süd
81671 0.015067 Haidhausen Süd
81669 0.298019 Haidhausen Süd
81673 0.005919 Haidhausen Nord
81667 0.489640 Haidhausen Nord
81677 0.023991 Haidhausen Nord
81671 0.007300 Haidhausen Nord
81675 0.473150 Haidhausen Nord
81677 0.259303 Steinhausen
81675 0.740697 Steinhausen
80538 0.000000 Maximilianeum
81667 0.416878 Maximilianeum
81675 0.583122 Maximilianeum
81669 0.000000 Maximilianeum
80935 0.000000 Feldmoching
80995 0.996802 Feldmoching
80933 0.003198 Feldmoching
80935 0.600709 Lerchenau-Ost
80995 0.059387 Lerchenau-Ost
80807 0.000000 Lerchenau-Ost
80937 0.000951 Lerchenau-Ost
80809 0.000000 Lerchenau-Ost
80933 0.338953 Lerchenau-Ost
81541 0.134229 Balanstraße-West
81737 0.000000 Balanstraße-West
81539 0.170531 Balanstraße-West
81549 0.695240 Balanstraße-West
81669 0.000000 Balanstraße-West
81737 0.756024 Altperlach
81549 0.000000 Altperlach
81739 0.243976 Altperlach
81541 0.027798 Ramersdorf
81737 0.099155 Ramersdorf
81667 0.000054 Ramersdorf
81671 0.210418 Ramersdorf
81539 0.006177 Ramersdorf
81735 0.322002 Ramersdorf
81549 0.014397 Ramersdorf
81669 0.319998 Ramersdorf
81827 0.000000 Neuperlach
81673 0.000055 Neuperlach
81737 0.317932 Neuperlach
81825 0.000000 Neuperlach
81671 0.000158 Neuperlach
81735 0.418120 Neuperlach
81739 0.263735 Neuperlach
81825 0.956536 Gartenstadt Trudering
81829 0.000000 Gartenstadt Trudering
81735 0.043464 Gartenstadt Trudering
81829 1.000000 Messestadt Riem
80335 0.919723 St. Benno
80333 0.000000 St. Benno
80636 0.080277 St. Benno
80797 0.000000 St. Benno
80335 0.414027 Maßmannbergl
80333 0.000000 Maßmannbergl
80798 0.000169 Maßmannbergl
80636 0.000000 Maßmannbergl
80797 0.585803 Maßmannbergl
80335 0.265595 Augustenstraße
80333 0.729706 Augustenstraße
80798 0.000092 Augustenstraße
80797 0.004607 Augustenstraße
80333 0.043731 Josephsplatz
80798 0.763971 Josephsplatz
80797 0.192298 Josephsplatz
80798 0.143294 Am alten nördlichen Friedhof
80799 0.856706 Am alten nördlichen Friedhof
80333 0.403124 Universität
80802 0.011297 Universität
80799 0.446403 Universität
80539 0.139177 Universität
80802 0.276899 Münchner Freiheit
80803 0.197690 Münchner Freiheit
80804 0.249681 Münchner Freiheit
80801 0.003416 Münchner Freiheit
80805 0.272314 Münchner Freiheit
80802 0.578272 Kleinhesselohe
80538 0.421728 Kleinhesselohe
80805 0.000000 Kleinhesselohe
81679 0.000000 Kleinhesselohe
81925 0.000000 Kleinhesselohe
81675 0.000000 Kleinhesselohe
80802 0.148197 Biederstein
80805 0.851803 Biederstein
80802 0.659112 Schwabing-Ost
80799 0.020735 Schwabing-Ost
80803 0.056094 Schwabing-Ost
80538 0.000000 Schwabing-Ost
80801 0.226843 Schwabing-Ost
80539 0.037216 Schwabing-Ost
80807 0.859022 Neufreimann
80804 0.083535 Neufreimann
80805 0.057442 Neufreimann
80802 0.000000 Alte Heide-Hirschau
80807 0.235305 Alte Heide-Hirschau
80804 0.000000 Alte Heide-Hirschau
80538 0.000000 Alte Heide-Hirschau
80937 0.000000 Alte Heide-Hirschau
80805 0.736378 Alte Heide-Hirschau
80939 0.028317 Alte Heide-Hirschau
81679 0.000000 Alte Heide-Hirschau
81925 0.000000 Alte Heide-Hirschau
80807 0.000000 Freimann
80937 0.000000 Freimann
80805 0.000000 Freimann
80939 1.000000 Freimann
80807 0.000000 Obere Isarau
80805 0.000000 Obere Isarau
80939 1.000000 Obere Isarau
80538 0.000000 Altbogenhausen
81679 0.605120 Altbogenhausen
81925 0.000000 Altbogenhausen
81677 0.127339 Altbogenhausen
81675 0.267542 Altbogenhausen
81679 0.038178 Parkstadt
81925 0.507654 Parkstadt
81677 0.454168 Parkstadt
81927 0.000000 Parkstadt
80538 0.000000 Herzogpark
80805 0.000000 Herzogpark
81679 0.181811 Herzogpark
81925 0.802108 Herzogpark
81675 0.016081 Herzogpark
81927 0.000000 Herzogpark
81673 0.002375 Englschalking
81925 0.000000 Englschalking
81825 0.000000 Englschalking
81677 0.339717 Englschalking
81929 0.273865 Englschalking
81829 0.000000 Englschalking
81675 0.000000 Englschalking
81927 0.384043 Englschalking
80805 0.000000 Oberföhring
80939 0.000000 Oberföhring
81925 0.713529 Oberföhring
81927 0.286471 Oberföhring
81925 0.000000 Johanneskirchen
81929 0.903625 Johanneskirchen
81927 0.096375 Johanneskirchen
81677 0.091566 Daglfing
81929 0.908434 Daglfing
81829 0.000000 Daglfing
81547 0.022733 Obergiesing
81541 0.293810 Obergiesing
81539 0.466735 Obergiesing
81549 0.216010 Obergiesing
81543 0.000713 Obergiesing
81669 0.000000 Obergiesing
81547 0.000000 Südgiesing
81737 0.000000 Südgiesing
81549 1.000000 Südgiesing
81479 0.000000 Harlaching
81547 0.000000 Harlaching
81545 1.000000 Harlaching
81379 0.000000 Harlaching
81543 0.000000 Harlaching
81547 0.976967 Neuharlaching
81545 0.000000 Neuharlaching
81549 0.023033 Neuharlaching
81547 0.841396 Giesing
81545 0.125868 Giesing
81539 0.032736 Giesing
81543 0.000000 Giesing
81547 0.000000 Siebenbrunn
81545 0.000000 Siebenbrunn
81379 0.049676 Siebenbrunn
81543 0.950324 Siebenbrunn
81479 0.091426 Obersendling
81477 0.274440 Obersendling
81369 0.000000 Obersendling
81379 0.634134 Obersendling
81476 0.000000 Obersendling
80469 0.000000 Sendlinger Feld
80336 0.019241 Sendlinger Feld
80337 0.020165 Sendlinger Feld
80339 0.000000 Sendlinger Feld
81371 0.747861 Sendlinger Feld
81369 0.009211 Sendlinger Feld
81379 0.199764 Sendlinger Feld
81373 0.000000 Sendlinger Feld
81543 0.003758 Sendlinger Feld
80689 0.000000 Friedenheim
80639 0.000710 Friedenheim
80686 0.513851 Friedenheim
80339 0.002779 Friedenheim
80687 0.482661 Friedenheim
81377 0.000000 Friedenheim
80689 0.423020 St. Ulrich
80686 0.292201 St. Ulrich
80687 0.284780 St. Ulrich
81375 0.000000 St. Ulrich
81377 0.000000 St. Ulrich
81475 0.000000 Großhadern
81375 0.020220 Großhadern
81379 0.000000 Großhadern
81377 0.979780 Großhadern
80689 0.002526 Neuhadern
80686 0.000000 Neuhadern
81375 0.968178 Neuhadern
81377 0.029296 Neuhadern
80689 0.978102 Blumenau
81375 0.000000 Blumenau
81241 0.021898 Blumenau
80935 0.012571 Am Hart
80807 0.000000 Am Hart
80937 0.902997 Am Hart
80809 0.000000 Am Hart
80933 0.000000 Am Hart
80939 0.084432 Am Hart
80935 0.000000 Milbertshofen
80807 0.975651 Milbertshofen
80804 0.000000 Milbertshofen
80937 0.000000 Milbertshofen
80809 0.024349 Milbertshofen
80805 0.000000 Milbertshofen
80939 0.000000 Milbertshofen
80636 0.000024 Oberwiesenfeld
80809 0.172816 Oberwiesenfeld
80637 0.572949 Oberwiesenfeld
80797 0.254212 Oberwiesenfeld
80636 0.886376 Alte Kaserne
80637 0.004511 Alte Kaserne
80797 0.109113 Alte Kaserne
80636 0.108634 Dom Pedro
80637 0.794159 Dom Pedro
80797 0.000543 Dom Pedro
80634 0.096213 Dom Pedro
80992 0.000451 Dom Pedro
80335 0.025953 St. Vinzenz
80636 0.882159 St. Vinzenz
80339 0.000000 St. Vinzenz
80637 0.086139 St. Vinzenz
80634 0.005749 St. Vinzenz
80639 0.284769 Neuhausen
80636 0.000000 Neuhausen
80339 0.000000 Neuhausen
80637 0.044769 Neuhausen
80638 0.227335 Neuhausen
80634 0.432971 Neuhausen
80992 0.000186 Neuhausen
80687 0.009971 Neuhausen
80639 0.453016 Nymphenburg
80638 0.459791 Nymphenburg
80634 0.000584 Nymphenburg
80992 0.013466 Nymphenburg
80687 0.046045 Nymphenburg
81247 0.027097 Nymphenburg
81245 0.000000 Nymphenburg
80995 0.067942 Industriebezirk
80997 0.932049 Industriebezirk
80999 0.000000 Industriebezirk
81247 0.000009 Industriebezirk
80997 0.000000 Allach-Untermenzing
80999 0.897215 Allach-Untermenzing
81247 0.019210 Allach-Untermenzing
81249 0.083575 Allach-Untermenzing
81243 0.000000 Altaubing
81241 0.000000 Altaubing
81245 0.436808 Altaubing
81249 0.563192 Altaubing
80999 0.000000 Lochhausen
81247 0.000000 Lochhausen
81245 0.102596 Lochhausen
81249 0.897404 Lochhausen
81245 0.000000 Freiham
81249 1.000000 Freiham
80689 0.000032 Pasing
81243 0.324008 Pasing
81241 0.675960 Pasing
81245 0.000000 Pasing
81249 0.000000 Pasing
80689 0.305695 Am Westbad
80687 0.087887 Am Westbad
81241 0.606418 Am Westbad
81245 0.000000 Am Westbad
80639 0.045341 Neupasing
80638 0.000000 Neupasing
80687 0.015757 Neupasing
81243 0.000000 Neupasing
81241 0.047707 Neupasing
81245 0.891195 Neupasing
80639 0.000000 Obermenzing
80997 0.046483 Obermenzing
80999 0.000000 Obermenzing
80638 0.000121 Obermenzing
80992 0.007074 Obermenzing
81247 0.579149 Obermenzing
81245 0.365766 Obermenzing
81249 0.001406 Obermenzing
81827 0.000000 Waldperlach
81737 0.000274 Waldperlach
81735 0.000000 Waldperlach
81739 0.999726 Waldperlach
80689 0.000000 Am Waldfriedhof
80686 0.000000 Am Waldfriedhof
81475 0.000293 Am Waldfriedhof
81375 0.000000 Am Waldfriedhof
81369 0.000000 Am Waldfriedhof
81379 0.276107 Am Waldfriedhof
81373 0.000000 Am Waldfriedhof
81377 0.723600 Am Waldfriedhof
80686 0.483762 Land in Sonne
80339 0.000000 Land in Sonne
80687 0.000000 Land in Sonne
81373 0.516238 Land in Sonne
81377 0.000000 Land in Sonne
81369 0.579771 Mittersendling
81379 0.051569 Mittersendling
81373 0.339511 Mittersendling
81377 0.029150 Mittersendling
80336 0.000000 Untersendling
80337 0.000000 Untersendling
80339 0.002965 Untersendling
81371 0.000000 Untersendling
81369 0.488594 Untersendling
81379 0.000113 Untersendling
81373 0.508329 Untersendling
80637 0.002973 Schwere-Reiter-Straße
80797 0.997027 Schwere-Reiter-Straße
80798 0.124745 Neuschwabing
80799 0.024553 Neuschwabing
80796 0.421234 Neuschwabing
80803 0.073155 Neuschwabing
80801 0.245017 Neuschwabing
80797 0.111297 Neuschwabing
80807 0.000000 Am Luitpoldpark
80796 0.133066 Am Luitpoldpark
80803 0.063098 Am Luitpoldpark
80804 0.568093 Am Luitpoldpark
80809 0.145753 Am Luitpoldpark
80805 0.000000 Am Luitpoldpark
80797 0.089990 Am Luitpoldpark
80335 0.037385 Kreuzviertel
80333 0.644841 Kreuzviertel
80539 0.006993 Kreuzviertel
80331 0.310781 Kreuzviertel
80538 0.931789 Lehel
80539 0.030068 Lehel
80331 0.038143 Lehel
81667 0.000000 Lehel
81675 0.000000 Lehel
81669 0.000000 Lehel
80469 0.503498 Deutsches Museum
80538 0.464132 Deutsches Museum
80331 0.032370 Deutsches Museum
81541 0.000000 Deutsches Museum
81667 0.000000 Deutsches Museum
81669 0.000000 Deutsches Museum
80469 1.000000 Gärtnerplatz
80802 0.010423 Schönfeldvorstadt
80538 0.000000 Schönfeldvorstadt
80539 0.989577 Schönfeldvorstadt
80335 0.000000 Westend
80639 0.000000 Westend
80636 0.000000 Westend
80686 0.000000 Westend
80339 0.998302 Westend
80634 0.000000 Westend
80687 0.000345 Westend
81373 0.001353 Westend
80335 0.000000 Schwanthalerhöhe
80336 0.000000 Schwanthalerhöhe
80339 1.000000 Schwanthalerhöhe
81373 0.000000 Schwanthalerhöhe
80469 0.000000 Untergiesing
81547 0.000000 Untergiesing
81541 0.002404 Untergiesing
81539 0.044360 Untergiesing
81379 0.000219 Untergiesing
81543 0.953017 Untergiesing
81479 0.374318 Thalkirchen
81371 0.017384 Thalkirchen
81545 0.000000 Thalkirchen
81369 0.004435 Thalkirchen
81379 0.603863 Thalkirchen
81543 0.000000 Thalkirchen
81475 0.999587 Fürstenried-West
81476 0.000413 Fürstenried-West
81377 0.000000 Fürstenried-West
81827 0.000000 Trudering-Riem
81825 0.000000 Trudering-Riem
81677 0.000000 Trudering-Riem
81929 0.235810 Trudering-Riem
81829 0.762307 Trudering-Riem
80935 0.011716 Am Riesenfeld
80993 0.000000 Am Riesenfeld
80807 0.000002 Am Riesenfeld
80937 0.000000 Am Riesenfeld
80809 0.953539 Am Riesenfeld
80637 0.000000 Am Riesenfeld
80797 0.023443 Am Riesenfeld
80992 0.011299 Am Riesenfeld
80935 0.005011 Alt-Moosach
80995 0.108114 Alt-Moosach
80993 0.478466 Alt-Moosach
80809 0.019089 Alt-Moosach
80637 0.021254 Alt-Moosach
80992 0.368066 Alt-Moosach
80995 0.018516 Moosach-Bahnhof
80993 0.020827 Moosach-Bahnhof
80997 0.532241 Moosach-Bahnhof
80637 0.004352 Moosach-Bahnhof
80638 0.037331 Moosach-Bahnhof
80992 0.386733 Moosach-Bahnhof
80335 0.067074 Königsplatz
80333 0.889834 Königsplatz
80798 0.000083 Königsplatz
80799 0.043010 Königsplatz
80335 0.653500 Marsfeld
80333 0.000000 Marsfeld
80636 0.346500 Marsfeld
80339 0.000000 Marsfeld
81243 0.504313 Aubing-Süd
81241 0.004007 Aubing-Süd
81245 0.000000 Aubing-Süd
81249 0.491323 Aubing-Süd
80469 0.053095 Am alten südlichen Friedhof
80336 0.011433 Am alten südlichen Friedhof
80337 0.935472 Am alten südlichen Friedhof
81673 0.058174 Berg am Laim Ost
81825 0.729915 Berg am Laim Ost
81671 0.203977 Berg am Laim Ost
81735 0.007933 Berg am Laim Ost
81673 0.466530 Echarding
81667 0.000000 Echarding
81677 0.000000 Echarding
81671 0.533470 Echarding
81735 0.000000 Echarding
81675 0.000000 Echarding
81669 0.000000 Echarding
81673 0.715193 Josephsburg
81825 0.181010 Josephsburg
81677 0.000000 Josephsburg
81671 0.039438 Josephsburg
81829 0.064360 Josephsburg
@saerdnaer
Copy link
Author

TODO: replace plz_shape.intersects() with within() or something simular – compare http://toblerity.org/shapely/manual.html#object.intersects -> should remove 0.000 entries

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment