Advertisement
Guest User

Untitled

a guest
Oct 2nd, 2022
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.34 KB | None | 0 0
  1. # Copyrighted by https://osm.org/user/kubahahaha
  2. # Following code is published under WTFPL public licence.
  3.  
  4.  
  5. import argparse
  6. from collections import Counter, defaultdict
  7. import requests
  8. from tabulate import tabulate
  9.  
  10.  
  11. def download(city):
  12.     query = f"""
  13.        [out:json][timeout:600];
  14.        area["name"="{city}"]->.search;
  15.        (
  16.            way[highway][name](area.search);
  17.        );
  18.        out tags;
  19.        """
  20.  
  21.     print(query)
  22.  
  23.     payload = {"data": query}
  24.     url = "https://overpass.openstreetmap.ru/cgi/interpreter"
  25.  
  26.     r = requests.post(url, data=payload)
  27.     tagged = r.json()
  28.     print(f"Downloaded {len(tagged['elements'])} streets.")
  29.  
  30.     return tagged['elements']
  31.  
  32. def count_streets(tags):
  33.     named = list(filter(lambda el: (el['tags'].get('highway') and el['tags'].get('name') and ' ' in el['tags'].get('name')), tagged))
  34.     print(f"Using {len(named)} named streets with at least 2 words.")
  35.  
  36.     counter = defaultdict(Counter)
  37.  
  38.     used_names = []
  39.  
  40.     for street in named:
  41.         name = street['tags']['name']
  42.  
  43.         if name in used_names:
  44.             continue
  45.  
  46.         used_names.append(name)
  47.         label = name.split(' ')[0]
  48.         if label.islower():
  49.             counter[label.lower()]['l'] += 1
  50.         else:
  51.             counter[label.lower()]['u'] += 1
  52.  
  53.     print(f"Got {len(counter)} at least 2-word values in {len(used_names)} distinct streetnames")
  54.     return counter
  55.  
  56. def print_results(counter):
  57.     counter_sorted = sorted(counter.items(), key=lambda row: sum(row[1].values()), reverse=True)
  58.     counter_table = []
  59.     lower, upper = 0, 0
  60.     for row in counter_sorted:
  61.         counter_table.append([row[0], row[1]['l'], row[1]['u']])
  62.         lower += row[1]['l']
  63.         upper += row[1]['u']
  64.  
  65.     counter_table.append(['SUMA', lower, upper])
  66.     print(tabulate(counter_table, headers=["Pierwsze słowo nazwy", "małą literą", "dużą literą"], tablefmt="psql"))
  67.  
  68. def text(string):
  69.      return string
  70.  
  71. parser = argparse.ArgumentParser(description='Download street names and check if first letter is (lower|upper)case.')
  72. parser.add_argument('cityname', type=text, nargs='+',
  73.                     help='Name of area to search in.')
  74.  
  75. args = parser.parse_args()
  76. city = ' '.join(args.cityname)
  77.  
  78. tagged = download(city)
  79. counter = count_streets(tagged)
  80. print_results(counter)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement