load space apis asynchronously
This commit is contained in:
parent
4680ae8900
commit
8eeee16937
41
draw_map.py
41
draw_map.py
|
@ -1,5 +1,10 @@
|
||||||
#!/usr/bin/python
|
#!/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/"
|
URL = "https://directory.spaceapi.io/"
|
||||||
NORTHERNMOST = 55.05
|
NORTHERNMOST = 55.05
|
||||||
|
@ -12,14 +17,16 @@ XSPAN = EASTERNMOST - WESTERNMOST
|
||||||
locations = {}
|
locations = {}
|
||||||
doorstati = {}
|
doorstati = {}
|
||||||
blacklist = ["Chaostreff Salzburg", "DevLoL", "CCC Basel", "Chaostreff Zürich",
|
blacklist = ["Chaostreff Salzburg", "DevLoL", "CCC Basel", "Chaostreff Zürich",
|
||||||
"ChaosStuff", "Level2", "Bastli", "Maakplek", "TkkrLab", "Hack42",
|
"ChaosStuff", "Level2", "Bastli", "Maakplek", "TkkrLab", "Hack42",
|
||||||
"Hackerspace Nijmegen", "TDvenlo", "ACKspace"]
|
"Hackerspace Nijmegen", "TDvenlo", "ACKspace"]
|
||||||
|
|
||||||
|
|
||||||
def dist(n1, n2):
|
def dist(n1, n2):
|
||||||
y = n1[0] - n2[0]
|
y = n1[0] - n2[0]
|
||||||
x = n1[1] - n2[1]
|
x = n1[1] - n2[1]
|
||||||
return math.sqrt(math.pow(x, 2) + math.pow(y, 2))
|
return math.sqrt(math.pow(x, 2) + math.pow(y, 2))
|
||||||
|
|
||||||
|
|
||||||
def conflict(targetlist, node):
|
def conflict(targetlist, node):
|
||||||
returner = None
|
returner = None
|
||||||
for element in targetlist:
|
for element in targetlist:
|
||||||
|
@ -28,6 +35,7 @@ def conflict(targetlist, node):
|
||||||
continue
|
continue
|
||||||
return returner
|
return returner
|
||||||
|
|
||||||
|
|
||||||
def merge(n1, n2):
|
def merge(n1, n2):
|
||||||
lat = (n1[0] + n2[0]) / 2
|
lat = (n1[0] + n2[0]) / 2
|
||||||
lon = (n1[1] + n2[1]) / 2
|
lon = (n1[1] + n2[1]) / 2
|
||||||
|
@ -37,18 +45,19 @@ def merge(n1, n2):
|
||||||
returner.append(n1[2] or n2[2])
|
returner.append(n1[2] or n2[2])
|
||||||
return returner
|
return returner
|
||||||
|
|
||||||
|
|
||||||
if os.path.isfile('locations.bin'):
|
if os.path.isfile('locations.bin'):
|
||||||
print ("using offline data...")
|
print("using offline data...")
|
||||||
with open("locations.bin", "rb") as f:
|
with open("locations.bin", "rb") as f:
|
||||||
locations = pickle.load(f)
|
locations = pickle.load(f)
|
||||||
else:
|
else:
|
||||||
print ("offline data not available, downloading...,")
|
print("offline data not available, downloading...,")
|
||||||
r = requests.get(url = URL)
|
r = requests.get(url=URL)
|
||||||
data = r.json()
|
data = r.json()
|
||||||
for space in data:
|
for space in data:
|
||||||
spacerequest = None
|
spacerequest = None
|
||||||
try:
|
try:
|
||||||
spacerequest = requests.get(url = data[space], timeout=1)
|
spacerequest = requests.get(url=data[space], timeout=1)
|
||||||
except requests.exceptions.RequestException as e: # This is the correct syntax
|
except requests.exceptions.RequestException as e: # This is the correct syntax
|
||||||
continue
|
continue
|
||||||
try:
|
try:
|
||||||
|
@ -61,13 +70,14 @@ else:
|
||||||
lon = spacedata["location"]["lon"]
|
lon = spacedata["location"]["lon"]
|
||||||
if "state" in spacedata:
|
if "state" in spacedata:
|
||||||
if "open" in spacedata["state"]:
|
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:
|
for space in locations:
|
||||||
print (space + " " + str(locations[space]))
|
print(space + " " + str(locations[space]))
|
||||||
with open("locations.bin", "wb") as f:
|
with open("locations.bin", "wb") as f:
|
||||||
pickle.dump(locations, f, pickle.HIGHEST_PROTOCOL)
|
pickle.dump(locations, f, pickle.HIGHEST_PROTOCOL)
|
||||||
print ("Removing non-german points...")
|
print("Removing non-german points...")
|
||||||
german_locations = locations.copy()
|
german_locations = locations.copy()
|
||||||
for space in locations:
|
for space in locations:
|
||||||
if locations[space][0] > NORTHERNMOST:
|
if locations[space][0] > NORTHERNMOST:
|
||||||
|
@ -88,24 +98,25 @@ while german_locations:
|
||||||
n1 = next(iter(german_locations))
|
n1 = next(iter(german_locations))
|
||||||
conflictnode = conflict(finallist, german_locations[n1])
|
conflictnode = conflict(finallist, german_locations[n1])
|
||||||
if conflictnode == None:
|
if conflictnode == None:
|
||||||
finallist.update({n1 : german_locations[n1]})
|
finallist.update({n1: german_locations[n1]})
|
||||||
del german_locations[n1]
|
del german_locations[n1]
|
||||||
else:
|
else:
|
||||||
mergenode = merge(german_locations[n1], finallist[conflictnode])
|
mergenode = merge(german_locations[n1], finallist[conflictnode])
|
||||||
del german_locations[n1]
|
del german_locations[n1]
|
||||||
del finallist[conflictnode]
|
del finallist[conflictnode]
|
||||||
german_locations.update({"MERGED: " + n1 + " " + conflictnode : mergenode})
|
german_locations.update(
|
||||||
|
{"MERGED: " + n1 + " " + conflictnode: mergenode})
|
||||||
|
|
||||||
for space in finallist:
|
for space in finallist:
|
||||||
#print(space + " " + str(finallist[space][0]) + " " + str(finallist[space][1]))
|
#print(space + " " + str(finallist[space][0]) + " " + str(finallist[space][1]))
|
||||||
print(str(finallist[space][0]) + " " + str(finallist[space][1]) + " {" +
|
print(str(finallist[space][0]) + " " + str(finallist[space][1]) + " {" +
|
||||||
space + "} Doorstatus: " + str(finallist[space][2]) )
|
space + "} Doorstatus: " + str(finallist[space][2]))
|
||||||
|
|
||||||
dwg = svgwrite.Drawing('svgwrite-example.svg', profile='tiny')
|
dwg = svgwrite.Drawing('svgwrite-example.svg', profile='tiny')
|
||||||
dwg.add(svgwrite.image.Image(href="Karte_Deutschland.svg", size=(592, 801)))
|
dwg.add(svgwrite.image.Image(href="Karte_Deutschland.svg", size=(592, 801)))
|
||||||
dwg.add(dwg.circle(center=(0,0), r=3, fill='black'))
|
dwg.add(dwg.circle(center=(0, 0), r=3, fill='black'))
|
||||||
for space in finallist:
|
for space in finallist:
|
||||||
ypoint = (801 - (((finallist[space][0] - SOUTHERNMOST) / YSPAN)* 801))
|
ypoint = (801 - (((finallist[space][0] - SOUTHERNMOST) / YSPAN) * 801))
|
||||||
xpoint = ((finallist[space][1] - WESTERNMOST) / XSPAN) * 592
|
xpoint = ((finallist[space][1] - WESTERNMOST) / XSPAN) * 592
|
||||||
if finallist[space][2]:
|
if finallist[space][2]:
|
||||||
dwg.add(dwg.circle(center=(xpoint, ypoint), r=5, fill='green'))
|
dwg.add(dwg.circle(center=(xpoint, ypoint), r=5, fill='green'))
|
||||||
|
|
|
@ -1,5 +1,12 @@
|
||||||
#!/usr/bin/python
|
#!/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/"
|
URL = "https://directory.spaceapi.io/"
|
||||||
NORTHERNMOST = 55.05
|
NORTHERNMOST = 55.05
|
||||||
|
@ -10,15 +17,17 @@ threshold = 0.10
|
||||||
YSPAN = NORTHERNMOST - SOUTHERNMOST
|
YSPAN = NORTHERNMOST - SOUTHERNMOST
|
||||||
XSPAN = EASTERNMOST - WESTERNMOST
|
XSPAN = EASTERNMOST - WESTERNMOST
|
||||||
locations = {}
|
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",
|
"ChaosStuff", "Level2", "Bastli", "Maakplek", "TkkrLab", "Hack42",
|
||||||
"Hackerspace Nijmegen", "TDvenlo", "ACKspace"]
|
"Hackerspace Nijmegen", "TDvenlo", "ACKspace"]
|
||||||
|
|
||||||
|
|
||||||
def dist(n1, n2):
|
def dist(n1, n2):
|
||||||
y = n1[0] - n2[0]
|
y = n1[0] - n2[0]
|
||||||
x = n1[1] - n2[1]
|
x = n1[1] - n2[1]
|
||||||
return math.sqrt(math.pow(x, 2) + math.pow(y, 2))
|
return math.sqrt(math.pow(x, 2) + math.pow(y, 2))
|
||||||
|
|
||||||
|
|
||||||
def conflict(targetlist, node):
|
def conflict(targetlist, node):
|
||||||
returner = None
|
returner = None
|
||||||
for element in targetlist:
|
for element in targetlist:
|
||||||
|
@ -27,6 +36,7 @@ def conflict(targetlist, node):
|
||||||
continue
|
continue
|
||||||
return returner
|
return returner
|
||||||
|
|
||||||
|
|
||||||
def merge(n1, n2):
|
def merge(n1, n2):
|
||||||
lat = (n1[0] + n2[0]) / 2
|
lat = (n1[0] + n2[0]) / 2
|
||||||
lon = (n1[1] + n2[1]) / 2
|
lon = (n1[1] + n2[1]) / 2
|
||||||
|
@ -35,35 +45,46 @@ def merge(n1, n2):
|
||||||
returner.append(lon)
|
returner.append(lon)
|
||||||
return returner
|
return returner
|
||||||
|
|
||||||
|
|
||||||
|
def get_space_location(space):
|
||||||
|
try:
|
||||||
|
spacerequest = requests.get(url=data[space], timeout=1)
|
||||||
|
spacedata = spacerequest.json()
|
||||||
|
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"]
|
||||||
|
return [float(lat), float(lon)]
|
||||||
|
|
||||||
|
|
||||||
if os.path.isfile('locations.bin'):
|
if os.path.isfile('locations.bin'):
|
||||||
print ("using offline data...")
|
print("using offline data...", file=sys.stderr)
|
||||||
with open("locations.bin", "rb") as f:
|
with open("locations.bin", "rb") as f:
|
||||||
locations = pickle.load(f)
|
locations = pickle.load(f)
|
||||||
else:
|
else:
|
||||||
print ("offline data not available, downloading...,")
|
print("offline data not available, downloading...,", file=sys.stderr)
|
||||||
r = requests.get(url = URL)
|
r = requests.get(url=URL)
|
||||||
data = r.json()
|
data = r.json()
|
||||||
for space in data:
|
with concurrent.futures.ThreadPoolExecutor(max_workers=16) as executor:
|
||||||
spacerequest = None
|
futures = {}
|
||||||
try:
|
for space in data:
|
||||||
spacerequest = requests.get(url = data[space], timeout=1)
|
futures[space] = executor.submit(get_space_location, space)
|
||||||
except requests.exceptions.RequestException as e: # This is the correct syntax
|
for space in data:
|
||||||
continue
|
location = futures[space].result()
|
||||||
try:
|
if location:
|
||||||
spacedata = spacerequest.json()
|
locations[space] = location
|
||||||
except json.JSONDecodeError as jde:
|
print("done loading space data", file=sys.stderr)
|
||||||
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:
|
for space in locations:
|
||||||
print (space + " " + str(locations[space]))
|
print(space + " " + str(locations[space]))
|
||||||
with open("locations.bin", "wb") as f:
|
with open("locations.bin", "wb") as f:
|
||||||
pickle.dump(locations, f, pickle.HIGHEST_PROTOCOL)
|
pickle.dump(locations, f, pickle.HIGHEST_PROTOCOL)
|
||||||
print ("Removing non-german points...")
|
|
||||||
|
print("Removing non-german points...", file=sys.stderr)
|
||||||
german_locations = locations.copy()
|
german_locations = locations.copy()
|
||||||
for space in locations:
|
for space in locations:
|
||||||
if locations[space][0] > NORTHERNMOST:
|
if locations[space][0] > NORTHERNMOST:
|
||||||
|
@ -75,33 +96,33 @@ for space in locations:
|
||||||
elif locations[space][1] > EASTERNMOST:
|
elif locations[space][1] > EASTERNMOST:
|
||||||
del german_locations[space]
|
del german_locations[space]
|
||||||
|
|
||||||
for space in blacklist:
|
for space in ignorelist:
|
||||||
del german_locations[space]
|
del german_locations[space]
|
||||||
|
|
||||||
|
|
||||||
finallist = {}
|
finallist = {}
|
||||||
while german_locations:
|
while german_locations:
|
||||||
n1 = next(iter(german_locations))
|
n1 = next(iter(german_locations))
|
||||||
conflictnode = conflict(finallist, german_locations[n1])
|
conflictnode = conflict(finallist, german_locations[n1])
|
||||||
if conflictnode == None:
|
if conflictnode == None:
|
||||||
finallist.update({n1 : german_locations[n1]})
|
finallist.update({n1: german_locations[n1]})
|
||||||
del german_locations[n1]
|
del german_locations[n1]
|
||||||
else:
|
else:
|
||||||
mergenode = merge(german_locations[n1], finallist[conflictnode])
|
mergenode = merge(german_locations[n1], finallist[conflictnode])
|
||||||
del german_locations[n1]
|
del german_locations[n1]
|
||||||
del finallist[conflictnode]
|
del finallist[conflictnode]
|
||||||
german_locations.update({"MERGED: " + n1 + " " + conflictnode : mergenode})
|
german_locations.update(
|
||||||
|
{"MERGED: " + n1 + " " + conflictnode: mergenode})
|
||||||
|
|
||||||
for space in finallist:
|
for space in finallist:
|
||||||
#print(space + " " + str(finallist[space][0]) + " " + str(finallist[space][1]))
|
#print(space + " " + str(finallist[space][0]) + " " + str(finallist[space][1]))
|
||||||
print(str(finallist[space][0]) + " " + str(finallist[space][1]) + " {" +
|
print(str(finallist[space][0]) + " " + str(finallist[space][1]) + " {" +
|
||||||
space + "}")
|
space + "}")
|
||||||
|
|
||||||
dwg = svgwrite.Drawing('svgwrite-example.svg', profile='tiny')
|
dwg = svgwrite.Drawing('svgwrite-example.svg', profile='tiny')
|
||||||
dwg.add(svgwrite.image.Image(href="Karte_Deutschland.svg", size=(586, 793)))
|
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:
|
for space in finallist:
|
||||||
ypoint = (793 - (((finallist[space][0] - SOUTHERNMOST) / YSPAN)* 793))
|
ypoint = (793 - (((finallist[space][0] - SOUTHERNMOST) / YSPAN) * 793))
|
||||||
xpoint = ((finallist[space][1] - WESTERNMOST) / XSPAN) * 586
|
xpoint = ((finallist[space][1] - WESTERNMOST) / XSPAN) * 586
|
||||||
dwg.add(dwg.circle(center=(xpoint, ypoint), r=5, fill='green'))
|
dwg.add(dwg.circle(center=(xpoint, ypoint), r=5, fill='green'))
|
||||||
|
|
||||||
dwg.save()
|
dwg.save()
|
||||||
|
|
Loading…
Reference in New Issue