load space apis asynchronously
This commit is contained in:
parent
4680ae8900
commit
8eeee16937
17
draw_map.py
17
draw_map.py
|
@ -1,5 +1,10 @@
|
|||
#!/usr/bin/python
|
||||
import requests, json, pickle, os.path, svgwrite, math
|
||||
import requests
|
||||
import json
|
||||
import pickle
|
||||
import os.path
|
||||
import svgwrite
|
||||
import math
|
||||
|
||||
URL = "https://directory.spaceapi.io/"
|
||||
NORTHERNMOST = 55.05
|
||||
|
@ -15,11 +20,13 @@ 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:
|
||||
|
@ -28,6 +35,7 @@ def conflict(targetlist, node):
|
|||
continue
|
||||
return returner
|
||||
|
||||
|
||||
def merge(n1, n2):
|
||||
lat = (n1[0] + n2[0]) / 2
|
||||
lon = (n1[1] + n2[1]) / 2
|
||||
|
@ -37,6 +45,7 @@ def merge(n1, n2):
|
|||
returner.append(n1[2] or n2[2])
|
||||
return returner
|
||||
|
||||
|
||||
if os.path.isfile('locations.bin'):
|
||||
print("using offline data...")
|
||||
with open("locations.bin", "rb") as f:
|
||||
|
@ -61,7 +70,8 @@ else:
|
|||
lon = spacedata["location"]["lon"]
|
||||
if "state" in spacedata:
|
||||
if "open" in spacedata["state"]:
|
||||
locations[space] = [float(lat), float(lon), spacedata["state"]["open"]]
|
||||
locations[space] = [float(lat), float(
|
||||
lon), spacedata["state"]["open"]]
|
||||
|
||||
for space in locations:
|
||||
print(space + " " + str(locations[space]))
|
||||
|
@ -94,7 +104,8 @@ while german_locations:
|
|||
mergenode = merge(german_locations[n1], finallist[conflictnode])
|
||||
del german_locations[n1]
|
||||
del finallist[conflictnode]
|
||||
german_locations.update({"MERGED: " + n1 + " " + conflictnode : mergenode})
|
||||
german_locations.update(
|
||||
{"MERGED: " + n1 + " " + conflictnode: mergenode})
|
||||
|
||||
for space in finallist:
|
||||
#print(space + " " + str(finallist[space][0]) + " " + str(finallist[space][1]))
|
||||
|
|
|
@ -1,5 +1,12 @@
|
|||
#!/usr/bin/python
|
||||
import requests, json, pickle, os.path, svgwrite, math
|
||||
import requests
|
||||
import json
|
||||
import pickle
|
||||
import os.path
|
||||
import svgwrite
|
||||
import math
|
||||
import sys
|
||||
import concurrent.futures
|
||||
|
||||
URL = "https://directory.spaceapi.io/"
|
||||
NORTHERNMOST = 55.05
|
||||
|
@ -10,15 +17,17 @@ threshold = 0.10
|
|||
YSPAN = NORTHERNMOST - SOUTHERNMOST
|
||||
XSPAN = EASTERNMOST - WESTERNMOST
|
||||
locations = {}
|
||||
blacklist = ["Chaostreff Salzburg", "DevLoL", "CCC Basel", "Chaostreff Zürich",
|
||||
ignorelist = ["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:
|
||||
|
@ -27,6 +36,7 @@ def conflict(targetlist, node):
|
|||
continue
|
||||
return returner
|
||||
|
||||
|
||||
def merge(n1, n2):
|
||||
lat = (n1[0] + n2[0]) / 2
|
||||
lon = (n1[1] + n2[1]) / 2
|
||||
|
@ -35,35 +45,46 @@ def merge(n1, n2):
|
|||
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
|
||||
|
||||
def get_space_location(space):
|
||||
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
|
||||
except requests.exceptions.RequestException as _: # This is the correct syntax
|
||||
return
|
||||
except json.JSONDecodeError as _:
|
||||
return
|
||||
if "location" in spacedata:
|
||||
if "lat" in spacedata["location"]:
|
||||
lat = spacedata["location"]["lat"]
|
||||
lon = spacedata["location"]["lon"]
|
||||
locations[space] = [float(lat), float(lon)]
|
||||
return [float(lat), float(lon)]
|
||||
|
||||
|
||||
if os.path.isfile('locations.bin'):
|
||||
print("using offline data...", file=sys.stderr)
|
||||
with open("locations.bin", "rb") as f:
|
||||
locations = pickle.load(f)
|
||||
else:
|
||||
print("offline data not available, downloading...,", file=sys.stderr)
|
||||
r = requests.get(url=URL)
|
||||
data = r.json()
|
||||
with concurrent.futures.ThreadPoolExecutor(max_workers=16) as executor:
|
||||
futures = {}
|
||||
for space in data:
|
||||
futures[space] = executor.submit(get_space_location, space)
|
||||
for space in data:
|
||||
location = futures[space].result()
|
||||
if location:
|
||||
locations[space] = location
|
||||
print("done loading space data", file=sys.stderr)
|
||||
|
||||
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...")
|
||||
|
||||
print("Removing non-german points...", file=sys.stderr)
|
||||
german_locations = locations.copy()
|
||||
for space in locations:
|
||||
if locations[space][0] > NORTHERNMOST:
|
||||
|
@ -75,10 +96,9 @@ for space in locations:
|
|||
elif locations[space][1] > EASTERNMOST:
|
||||
del german_locations[space]
|
||||
|
||||
for space in blacklist:
|
||||
for space in ignorelist:
|
||||
del german_locations[space]
|
||||
|
||||
|
||||
finallist = {}
|
||||
while german_locations:
|
||||
n1 = next(iter(german_locations))
|
||||
|
@ -90,7 +110,8 @@ while german_locations:
|
|||
mergenode = merge(german_locations[n1], finallist[conflictnode])
|
||||
del german_locations[n1]
|
||||
del finallist[conflictnode]
|
||||
german_locations.update({"MERGED: " + n1 + " " + conflictnode : mergenode})
|
||||
german_locations.update(
|
||||
{"MERGED: " + n1 + " " + conflictnode: mergenode})
|
||||
|
||||
for space in finallist:
|
||||
#print(space + " " + str(finallist[space][0]) + " " + str(finallist[space][1]))
|
||||
|
@ -99,9 +120,9 @@ for space in finallist:
|
|||
|
||||
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()
|
||||
|
|
Loading…
Reference in New Issue