This commit is contained in:
Malte Münch 2020-01-29 00:04:08 +01:00
parent 4130b90e4e
commit 4680ae8900
11 changed files with 976 additions and 50 deletions

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 208 KiB

After

Width:  |  Height:  |  Size: 158 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 211 KiB

68
coordinates.txt Normal file
View File

@ -0,0 +1,68 @@
using offline data...
Removing non-german points...
51.2670186 7.145392 {/dev/tal}
50.8924622 5.9712601 {ACKspace}
47.37861 8.54924 {Bastli}
49.00985285639763 12.118982076644897 {Binary Kitchen}
50.7851514 6.1077813 {CCC Aachen}
53.0815 8.8154 {CCC Bremen}
49.46369 8.48862 {CCC Mannheim}
47.993194 7.840502 {CCCFr}
51.37435 7.69803 {Chaosconsulting}
51.438476 7.024991 {Chaospott}
50.830659 12.939537 {Chaostreff Chemnitz}
52.389424 13.078555 {Chaostreff Potsdam (CCCP)}
51.62435592244 7.1690101828426 {Chaostreff Recklinghausen c3RE}
51.527611 7.4649449 {Chaostreff-Dortmund}
53.617 8.091 {Do It Yourself Werkstatt Wilhelmshaven}
49.0067 8.407438 {Entropia}
49.574 11.03 {FAU FabLab}
52.485936 7.333012 {Forschung und Technik e.V.}
52.168625 9.947232 {Freies Labor}
52.03746 5.9026 {Hack42}
52.038224 8.533056 {Hackerspace Bielefeld e.V.}
51.8334 5.88321 {Hackerspace Nijmegen}
53.6011 11.4183 {Hacklabor}
49.240431 6.973817 {Hacksaar}
50.86904 8.00464 {Hackspace Siegen}
50.9292 11.5826 {Krautspace}
52.371484 9.719891 {LeineLab}
49.61629 6.07057 {Level2}
53.231056 6.58389 {Maakplek}
53.14402 8.21988 {Mainframe}
52.119561 11.629398 {Netz39}
50.7396374 7.0965597 {Netzladen}
49.801806 9.923105 {Nerd2Nerd}
51.54533 9.94526 {Noklab}
48.35771 10.886797 {OpenLab Augsburg}
50.8975 14.8044 {Polytechnischer Werkraum Zittau}
47.629304 8.26288 {Reaktor 23}
52.2785658 10.5211247 {Stratum 0}
51.3694 6.16998 {TDvenlo}
52.222388 6.872435 {TkkrLab}
51.9436176 7.6381682 {Warpzone e.V.}
50.81615 8.77851 {[hsmr]}
49.901927 10.892739 {backspace}
48.77082 11.38182 {bytewerk}
51.3182536 9.4848149 {flipdot}
50.268509 10.950683 {hackzogtum}
50.558867664 9.677546918 {mag.lab}
53.8688 10.6712 {nbsp}
47.77252 9.19997 {see-base}
48.777 9.236 {shackspace - stuttgart hackerspace}
48.3965 9.99023 {verschwoerhaus}
48.065002 8.456495 {vspace.one}
51.53575 7.69172 {UN-Hack-Bar}
50.722616453 12.480350733 {z-Labor Zwickau}
50.0544334 10.3106613 {SchonungsLos}
53.55410215 9.9456255 {MERGED: CCC Hamburg Attraktor Makerspace}
50.9519801 6.921542349999999 {MERGED: DingFabrik e.V. CCC Cologne}
50.9779805 11.0382675 {MERGED: Makerspace Erfurt Bytespeicher}
48.156211 11.55450665 {MERGED: Munich Maker Lab MuCCC}
51.47996 11.99221 {MERGED: Terminal.21 Basislager Eigenbaukombinat Halle}
51.201397 6.738047 {MERGED: fNordeingang Chaosdorf}
54.798057 9.4328885 {MERGED: nordlab e. V. Chaostreff Flensburg}
51.48714765 7.2086889 {MERGED: spaceleft Das Labor}
51.05408455 13.72609615 {MERGED: turmlabor C3D2}
49.4626193 11.028578625 {MERGED: MERGED: K4CG FabLab Nürnberg Nerdberg}
52.506793175 13.45348525 {MERGED: MERGED: xHain c-base MERGED: Motionlab AFRA}

114
draw_map.py Executable file
View File

@ -0,0 +1,114 @@
#!/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()

405
feddich.svg Normal file
View File

@ -0,0 +1,405 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="100%"
version="1.2"
width="100%"
id="svg383"
sodipodi:docname="feddich.svg"
inkscape:version="0.92.4 5da689c313, 2019-01-14">
<metadata
id="metadata387">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="741"
id="namedview385"
showgrid="false"
inkscape:zoom="0.65186407"
inkscape:cx="152.90622"
inkscape:cy="-270.91553"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="svg383" />
<defs
id="defs261" />
<image
sodipodi:absref="/home/mamu/vcs/git/led_karte/Karte_Deutschland.svg"
xlink:href="Karte_Deutschland.svg"
id="image263"
width="586"
height="793" />
<circle
cx="81.7454"
cy="385.5972"
fill="green"
r="5"
id="circle267" />
<circle
cx="399.6935"
cy="615.6688"
fill="green"
r="5"
id="circle269" />
<circle
cx="15.4138"
cy="434.7136"
fill="green"
r="5"
id="circle271" />
<circle
cx="188.5045"
cy="200.6481"
fill="green"
r="5"
id="circle273" />
<circle
cx="167.6143"
cy="569.4094"
fill="green"
r="5"
id="circle275" />
<circle
cx="126.1819"
cy="719.2963"
fill="green"
r="5"
id="circle277" />
<circle
cx="117.0741"
cy="374.6569"
fill="green"
r="5"
id="circle279" />
<circle
cx="74.0485"
cy="368.1206"
fill="green"
r="5"
id="circle281" />
<circle
cx="452.1493"
cy="430.075"
fill="green"
r="5"
id="circle283" />
<circle
cx="461.0364"
cy="271.191"
fill="green"
r="5"
id="circle285" />
<circle
cx="83.2553"
cy="349.174"
fill="green"
r="5"
id="circle287" />
<circle
cx="102.1736"
cy="359.0351"
fill="green"
r="5"
id="circle289" />
<circle
cx="142.1956"
cy="146.0649"
fill="green"
r="5"
id="circle291" />
<circle
cx="162.4246"
cy="615.9902"
fill="green"
r="5"
id="circle293" />
<circle
cx="330.0778"
cy="558.1656"
fill="green"
r="5"
id="circle295" />
<circle
cx="93.7394"
cy="261.3536"
fill="green"
r="5"
id="circle297" />
<circle
cx="260.8594"
cy="293.6969"
fill="green"
r="5"
id="circle299" />
<circle
cx="170.455"
cy="306.9886"
fill="green"
r="5"
id="circle301" />
<circle
cx="354.9008"
cy="147.6856"
fill="green"
r="5"
id="circle303" />
<circle
cx="70.7771"
cy="592.1661"
fill="green"
r="5"
id="circle305" />
<circle
cx="136.6748"
cy="426.1629"
fill="green"
r="5"
id="circle307" />
<circle
cx="365.404"
cy="420.0308"
fill="green"
r="5"
id="circle309" />
<circle
cx="246.3261"
cy="273.0196"
fill="green"
r="5"
id="circle311" />
<circle
cx="150.4345"
cy="194.2755"
fill="green"
r="5"
id="circle313" />
<circle
cx="368.3957"
cy="298.698"
fill="green"
r="5"
id="circle315" />
<circle
cx="78.6237"
cy="439.3528"
fill="green"
r="5"
id="circle317" />
<circle
cx="259.317"
cy="534.9455"
fill="green"
r="5"
id="circle319" />
<circle
cx="260.7333"
cy="357.229"
fill="green"
r="5"
id="circle321" />
<circle
cx="320.9232"
cy="682.1413"
fill="green"
r="5"
id="circle323" />
<circle
cx="571.3649"
cy="423.262"
fill="green"
r="5"
id="circle325" />
<circle
cx="153.1834"
cy="756.3874"
fill="green"
r="5"
id="circle327" />
<circle
cx="297.5468"
cy="282.4907"
fill="green"
r="5"
id="circle329" />
<circle
cx="113.2472"
cy="316.6318"
fill="green"
r="5"
id="circle331" />
<circle
cx="186.1462"
cy="431.5539"
fill="green"
r="5"
id="circle333" />
<circle
cx="321.3031"
cy="524.7402"
fill="green"
r="5"
id="circle335" />
<circle
cx="352.5687"
cy="640.0333"
fill="green"
r="5"
id="circle337" />
<circle
cx="231.2983"
cy="380.3748"
fill="green"
r="5"
id="circle339" />
<circle
cx="325.0073"
cy="487.3747"
fill="green"
r="5"
id="circle341" />
<circle
cx="243.6192"
cy="457.7786"
fill="green"
r="5"
id="circle343" />
<circle
cx="307.1407"
cy="120.399"
fill="green"
r="5"
id="circle345" />
<circle
cx="213.089"
cy="741.7894"
fill="green"
r="5"
id="circle347" />
<circle
cx="215.3923"
cy="639.4033"
fill="green"
r="5"
id="circle349" />
<circle
cx="263.6082"
cy="678.1875"
fill="green"
r="5"
id="circle351" />
<circle
cx="165.5607"
cy="711.9769"
fill="green"
r="5"
id="circle353" />
<circle
cx="116.6707"
cy="358.2055"
fill="green"
r="5"
id="circle355" />
<circle
cx="422.7948"
cy="441.0878"
fill="green"
r="5"
id="circle357" />
<circle
cx="284.0925"
cy="509.1953"
fill="green"
r="5"
id="circle359" />
<circle
cx="260.7567"
cy="152.476"
fill="green"
r="5"
id="circle361" />
<circle
cx="67.4353"
cy="417.7089"
fill="green"
r="5"
id="circle363" />
<circle
cx="330.6063"
cy="415.0586"
fill="green"
r="5"
id="circle365" />
<circle
cx="363.6081"
cy="702.68"
fill="green"
r="5"
id="circle367" />
<circle
cx="391.5893"
cy="363.8922"
fill="green"
r="5"
id="circle369" />
<circle
cx="55.705"
cy="392.2859"
fill="green"
r="5"
id="circle371" />
<circle
cx="227.9788"
cy="25.6804"
fill="green"
r="5"
id="circle373" />
<circle
cx="85.7918"
cy="363.1595"
fill="green"
r="5"
id="circle375" />
<circle
cx="502.4319"
cy="407.3014"
fill="green"
r="5"
id="circle377" />
<circle
cx="329.987"
cy="569.5186"
fill="green"
r="5"
id="circle379" />
<circle
cx="485.0046"
cy="259.2276"
fill="green"
r="5"
id="circle381" />
</svg>

After

Width:  |  Height:  |  Size: 7.3 KiB

BIN
feddich.svg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

View File

@ -10,7 +10,9 @@ threshold = 0.10
YSPAN = NORTHERNMOST - SOUTHERNMOST
XSPAN = EASTERNMOST - WESTERNMOST
locations = {}
blacklist = ["Chaostreff Salzburg", "DevLoL", "CCC Basel", "Chaostreff Zürich", "ChaosStuff"]
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]
@ -91,12 +93,15 @@ while german_locations:
german_locations.update({"MERGED: " + n1 + " " + conflictnode : mergenode})
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]) + " {" +
space + "}")
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:
ypoint = (793 - (((finallist[space][0] - SOUTHERNMOST) / YSPAN)* 793))
dwg.add(dwg.circle(center=(((finallist[space][1] - WESTERNMOST) / XSPAN) *
586, ypoint), r=5, fill='green'))
xpoint = ((finallist[space][1] - WESTERNMOST) / XSPAN) * 586
dwg.add(dwg.circle(center=(xpoint, ypoint), r=5, fill='green'))
dwg.save()

Binary file not shown.

BIN
locations.bin.old Normal file

Binary file not shown.

6
merged.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 210 KiB

View File

@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" ?>
<svg baseProfile="tiny" height="100%" version="1.2" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink"><defs /><circle cx="0" cy="0" fill="black" r="3" /><circle cx="81.7454" cy="385.5972" fill="green" r="5" /><circle cx="6.6864" cy="423.7755" fill="green" r="5" /><circle cx="171.4896" cy="781.9405" fill="green" r="5" /><circle cx="399.6935" cy="615.6688" fill="green" r="5" /><circle cx="15.4138" cy="434.7136" fill="green" r="5" /><circle cx="188.5045" cy="200.6481" fill="green" r="5" /><circle cx="167.6143" cy="569.4094" fill="green" r="5" /><circle cx="126.1819" cy="719.2963" fill="green" r="5" /><circle cx="117.0741" cy="374.6569" fill="green" r="5" /><circle cx="74.0485" cy="368.1206" fill="green" r="5" /><circle cx="452.1493" cy="430.075" fill="green" r="5" /><circle cx="461.0364" cy="271.191" fill="green" r="5" /><circle cx="83.2553" cy="349.174" fill="green" r="5" /><circle cx="102.1736" cy="359.0351" fill="green" r="5" /><circle cx="142.1956" cy="146.0649" fill="green" r="5" /><circle cx="162.4246" cy="615.9902" fill="green" r="5" /><circle cx="330.0778" cy="558.1656" fill="green" r="5" /><circle cx="93.7394" cy="261.3536" fill="green" r="5" /><circle cx="260.8594" cy="293.6969" fill="green" r="5" /><circle cx="2.2971" cy="307.0665" fill="green" r="5" /><circle cx="170.455" cy="306.9886" fill="green" r="5" /><circle cx="1.0575" cy="327.8662" fill="green" r="5" /><circle cx="354.9008" cy="147.6856" fill="green" r="5" /><circle cx="70.7771" cy="592.1661" fill="green" r="5" /><circle cx="136.6748" cy="426.1629" fill="green" r="5" /><circle cx="365.404" cy="420.0308" fill="green" r="5" /><circle cx="246.3261" cy="273.0196" fill="green" r="5" /><circle cx="13.035" cy="553.855" fill="green" r="5" /><circle cx="45.8501" cy="185.4039" fill="green" r="5" /><circle cx="150.4345" cy="194.2755" fill="green" r="5" /><circle cx="368.3957" cy="298.698" fill="green" r="5" /><circle cx="78.6237" cy="439.3528" fill="green" r="5" /><circle cx="259.317" cy="534.9455" fill="green" r="5" /><circle cx="260.7333" cy="357.229" fill="green" r="5" /><circle cx="320.9232" cy="682.1413" fill="green" r="5" /><circle cx="571.3649" cy="423.262" fill="green" r="5" /><circle cx="153.1834" cy="756.3874" fill="green" r="5" /><circle cx="297.5468" cy="282.4907" fill="green" r="5" /><circle cx="19.39" cy="375.1615" fill="green" r="5" /><circle cx="64.296" cy="288.2169" fill="green" r="5" /><circle cx="113.2472" cy="316.6318" fill="green" r="5" /><circle cx="186.1462" cy="431.5539" fill="green" r="5" /><circle cx="321.3031" cy="524.7402" fill="green" r="5" /><circle cx="352.5687" cy="640.0333" fill="green" r="5" /><circle cx="231.2983" cy="380.3748" fill="green" r="5" /><circle cx="325.0073" cy="487.3747" fill="green" r="5" /><circle cx="243.6192" cy="457.7786" fill="green" r="5" /><circle cx="307.1407" cy="120.399" fill="green" r="5" /><circle cx="213.089" cy="741.7894" fill="green" r="5" /><circle cx="215.3923" cy="639.4033" fill="green" r="5" /><circle cx="263.6082" cy="678.1875" fill="green" r="5" /><circle cx="165.5607" cy="711.9769" fill="green" r="5" /><circle cx="116.6707" cy="358.2055" fill="green" r="5" /><circle cx="422.7948" cy="441.0878" fill="green" r="5" /><circle cx="284.0925" cy="509.1953" fill="green" r="5" /><circle cx="260.7567" cy="152.476" fill="green" r="5" /><circle cx="67.4353" cy="417.7089" fill="green" r="5" /><circle cx="330.6063" cy="415.0586" fill="green" r="5" /><circle cx="363.6081" cy="702.68" fill="green" r="5" /><circle cx="391.5893" cy="363.8922" fill="green" r="5" /><circle cx="55.705" cy="392.2859" fill="green" r="5" /><circle cx="227.9788" cy="25.6804" fill="green" r="5" /><circle cx="85.7918" cy="363.1595" fill="green" r="5" /><circle cx="502.4319" cy="407.3014" fill="green" r="5" /><circle cx="329.987" cy="569.5186" fill="green" r="5" /><circle cx="485.0046" cy="259.2276" fill="green" r="5" /></svg>
<svg baseProfile="tiny" height="100%" version="1.2" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink"><defs /><image height="801" width="592" xlink:href="Karte_Deutschland.svg" /><circle cx="0" cy="0" fill="black" r="3" /><circle cx="82.5824" cy="389.4872" fill="green" r="5" /><circle cx="403.7859" cy="621.8798" fill="green" r="5" /><circle cx="15.5716" cy="439.0991" fill="green" r="5" /><circle cx="190.4346" cy="202.6723" fill="green" r="5" /><circle cx="67.5718" cy="422.084" fill="green" r="5" /><circle cx="169.3305" cy="575.1538" fill="green" r="5" /><circle cx="127.4739" cy="726.5527" fill="green" r="5" /><circle cx="118.2728" cy="378.4366" fill="green" r="5" /><circle cx="74.8067" cy="371.8343" fill="green" r="5" /><circle cx="456.7788" cy="434.4138" fill="green" r="5" /><circle cx="465.7569" cy="273.9269" fill="green" r="5" /><circle cx="84.1077" cy="352.6965" fill="green" r="5" /><circle cx="103.2197" cy="362.6572" fill="green" r="5" /><circle cx="143.6515" cy="147.5384" fill="green" r="5" /><circle cx="164.0876" cy="622.2044" fill="green" r="5" /><circle cx="333.4575" cy="563.7965" fill="green" r="5" /><circle cx="94.6992" cy="263.9902" fill="green" r="5" /><circle cx="263.5303" cy="296.6598" fill="green" r="5" /><circle cx="172.2003" cy="310.0856" fill="green" r="5" /><circle cx="358.5346" cy="149.1755" fill="green" r="5" /><circle cx="71.5018" cy="598.14" fill="green" r="5" /><circle cx="138.0742" cy="430.4621" fill="green" r="5" /><circle cx="369.1454" cy="424.2682" fill="green" r="5" /><circle cx="248.8482" cy="275.7739" fill="green" r="5" /><circle cx="151.9748" cy="196.2354" fill="green" r="5" /><circle cx="372.1677" cy="301.7113" fill="green" r="5" /><circle cx="79.4287" cy="443.7851" fill="green" r="5" /><circle cx="261.9722" cy="540.3421" fill="green" r="5" /><circle cx="263.403" cy="360.8329" fill="green" r="5" /><circle cx="324.2091" cy="689.023" fill="green" r="5" /><circle cx="577.2151" cy="427.532" fill="green" r="5" /><circle cx="154.7518" cy="764.018" fill="green" r="5" /><circle cx="300.5934" cy="285.3406" fill="green" r="5" /><circle cx="114.4068" cy="319.8261" fill="green" r="5" /><circle cx="188.0521" cy="435.9076" fill="green" r="5" /><circle cx="324.5929" cy="530.0339" fill="green" r="5" /><circle cx="356.1786" cy="646.4901" fill="green" r="5" /><circle cx="233.6666" cy="384.2121" fill="green" r="5" /><circle cx="246.1136" cy="462.3968" fill="green" r="5" /><circle cx="310.2855" cy="121.6137" fill="green" r="5" /><circle cx="215.2708" cy="749.2728" fill="green" r="5" /><circle cx="217.5977" cy="645.8538" fill="green" r="5" /><circle cx="266.3072" cy="685.0292" fill="green" r="5" /><circle cx="167.2558" cy="719.1595" fill="green" r="5" /><circle cx="117.8652" cy="361.8192" fill="green" r="5" /><circle cx="427.1238" cy="445.5376" fill="green" r="5" /><circle cx="287.0013" cy="514.3322" fill="green" r="5" /><circle cx="263.4266" cy="154.0142" fill="green" r="5" /><circle cx="333.9914" cy="419.2459" fill="green" r="5" /><circle cx="367.3311" cy="709.7688" fill="green" r="5" /><circle cx="395.5987" cy="367.5632" fill="green" r="5" /><circle cx="56.2753" cy="396.2434" fill="green" r="5" /><circle cx="230.3131" cy="25.9395" fill="green" r="5" /><circle cx="86.6702" cy="366.8232" fill="green" r="5" /><circle cx="507.5763" cy="411.4104" fill="green" r="5" /><circle cx="333.3657" cy="575.264" fill="green" r="5" /><circle cx="489.9706" cy="261.8428" fill="green" r="5" /></svg>

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB