#!/usr/bin/python import requests, json, pickle, os.path, svgwrite, math URL = "https://directory.spaceapi.io/" NORTHERNMOST = 55.05 EASTERNMOST = 15.033333 SOUTHERNMOST = 47.270108 WESTERNMOST = 5.866667 threshold = 0.10 YSPAN = NORTHERNMOST - SOUTHERNMOST XSPAN = EASTERNMOST - WESTERNMOST locations = {} blacklist = ["Chaostreff Salzburg", "DevLoL", "CCC Basel", "Chaostreff Zürich", "ChaosStuff", "Level2", "Bastli", "Maakplek", "TkkrLab", "Hack42", "Hackerspace Nijmegen", "TDvenlo", "ACKspace"] def dist(n1, n2): y = n1[0] - n2[0] x = n1[1] - n2[1] return math.sqrt(math.pow(x, 2) + math.pow(y, 2)) def conflict(targetlist, node): returner = None for element in targetlist: if dist(node, targetlist[element]) < threshold: returner = element continue return returner def merge(n1, n2): lat = (n1[0] + n2[0]) / 2 lon = (n1[1] + n2[1]) / 2 returner = [] returner.append(lat) returner.append(lon) return returner if os.path.isfile('locations.bin'): print ("using offline data...") with open("locations.bin", "rb") as f: locations = pickle.load(f) else: print ("offline data not available, downloading...,") r = requests.get(url = URL) data = r.json() for space in data: spacerequest = None try: spacerequest = requests.get(url = data[space], timeout=1) except requests.exceptions.RequestException as e: # This is the correct syntax continue try: spacedata = spacerequest.json() except json.JSONDecodeError as jde: continue if "location" in spacedata: if "lat" in spacedata["location"]: lat = spacedata["location"]["lat"] lon = spacedata["location"]["lon"] locations[space] = [float(lat), float(lon)] for space in locations: print (space + " " + str(locations[space])) with open("locations.bin", "wb") as f: pickle.dump(locations, f, pickle.HIGHEST_PROTOCOL) print ("Removing non-german points...") german_locations = locations.copy() for space in locations: if locations[space][0] > NORTHERNMOST: del german_locations[space] elif locations[space][0] < SOUTHERNMOST: del german_locations[space] elif locations[space][1] < WESTERNMOST: del german_locations[space] elif locations[space][1] > EASTERNMOST: del german_locations[space] for space in blacklist: del german_locations[space] finallist = {} while german_locations: n1 = next(iter(german_locations)) conflictnode = conflict(finallist, german_locations[n1]) if conflictnode == None: finallist.update({n1 : german_locations[n1]}) del german_locations[n1] else: mergenode = merge(german_locations[n1], finallist[conflictnode]) del german_locations[n1] del finallist[conflictnode] german_locations.update({"MERGED: " + n1 + " " + conflictnode : mergenode}) for space in finallist: #print(space + " " + str(finallist[space][0]) + " " + str(finallist[space][1])) print(str(finallist[space][0]) + " " + str(finallist[space][1]) + " {" + space + "}") dwg = svgwrite.Drawing('svgwrite-example.svg', profile='tiny') dwg.add(svgwrite.image.Image(href="Karte_Deutschland.svg", size=(586, 793))) dwg.add(dwg.circle(center=(0,0), r=3, fill='black')) for space in finallist: ypoint = (793 - (((finallist[space][0] - SOUTHERNMOST) / YSPAN)* 793)) xpoint = ((finallist[space][1] - WESTERNMOST) / XSPAN) * 586 dwg.add(dwg.circle(center=(xpoint, ypoint), r=5, fill='green')) dwg.save()