led_karte/draw_map.py

115 lines
3.9 KiB
Python
Executable File

#!/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 = {}
doorstati = {}
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)
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:
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"]
if "state" in spacedata:
if "open" in spacedata["state"]:
locations[space] = [float(lat), float(lon), spacedata["state"]["open"]]
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 + "} Doorstatus: " + str(finallist[space][2]) )
dwg = svgwrite.Drawing('svgwrite-example.svg', profile='tiny')
dwg.add(svgwrite.image.Image(href="Karte_Deutschland.svg", size=(592, 801)))
dwg.add(dwg.circle(center=(0,0), r=3, fill='black'))
for space in finallist:
ypoint = (801 - (((finallist[space][0] - SOUTHERNMOST) / YSPAN)* 801))
xpoint = ((finallist[space][1] - WESTERNMOST) / XSPAN) * 592
if finallist[space][2]:
dwg.add(dwg.circle(center=(xpoint, ypoint), r=5, fill='green'))
else:
dwg.add(dwg.circle(center=(xpoint, ypoint), r=5, fill='green'))
dwg.save()