diff --git a/ffmap/mapnik/hoods_poly.xml b/ffmap/mapnik/hoods_poly.xml new file mode 100644 index 0000000..066a48a --- /dev/null +++ b/ffmap/mapnik/hoods_poly.xml @@ -0,0 +1,28 @@ + + + + + + + hoodborder + + csv + csv/hoods_poly.csv + + + + hoodpoint + + csv + csv/hood-points-poly.csv + + + diff --git a/ffmap/mapnik/run.sh b/ffmap/mapnik/run.sh index 077014d..54a5b07 100755 --- a/ffmap/mapnik/run.sh +++ b/ffmap/mapnik/run.sh @@ -5,5 +5,6 @@ liteserv.py routers_v2.xml -p 8003 --processes=5 & liteserv.py routers_local.xml -p 8004 --processes=5 & liteserv.py hoods.xml -p 8001 --processes=5 & liteserv.py hoods_v2.xml -p 8002 --processes=5 +liteserv.py hoods_poly.xml -p 8005 --processes=5 killall liteserv.py diff --git a/ffmap/mapnik/tilestache.cfg b/ffmap/mapnik/tilestache.cfg index 99e9981..a98f8ff 100644 --- a/ffmap/mapnik/tilestache.cfg +++ b/ffmap/mapnik/tilestache.cfg @@ -53,6 +53,16 @@ }, "metatile": {"buffer": 128}, "cache lifespan": 300 + }, + "tiles/hoods_poly": { + "provider": { + "class": "dynmapnik:DynMapnik", + "kwargs": { + "mapfile": "/usr/share/ffmap/hoods_poly.xml" + } + }, + "metatile": {"buffer": 128}, + "cache lifespan": 300 } }, "logging": "info" diff --git a/ffmap/maptools.py b/ffmap/maptools.py index 15453b1..b21ca69 100644 --- a/ffmap/maptools.py +++ b/ffmap/maptools.py @@ -10,6 +10,7 @@ from ffmap.config import CONFIG import math import numpy as np from scipy.spatial import Voronoi +import urllib.request, urllib.error, json EARTH_RADIUS = 6378137.0 @@ -259,9 +260,43 @@ def update_mapnik_csv(mysql): hoods.append([x, y]) draw_voronoi_lines(csv, hoods) + # Poly-Hoods + with urllib.request.urlopen("http://keyserver.freifunk-franken.de/v2/hoods.php") as url: + dbhoodspoly = json.loads(url.read().decode()) + with open(os.path.join(CONFIG["csv_dir"], "hood-points-poly.csv"), "w", encoding="UTF-8") as csv: + csv.write("lng,lat,name\n") + for hood in dbhoodspoly: + for polygon in hood.get("polygons",()): + avlon = 0 + avlat = 0 + for p in polygon: + avlon += p["lon"] + avlat += p["lat"] + avlon /= len(polygon) + avlat /= len(polygon) + csv.write("%f,%f,\"%s\"\n" % ( + avlon, + avlat, + hood["name"] + )) + + with open(os.path.join(CONFIG["csv_dir"], "hoods_poly.csv"), "w") as csv: + csv.write("WKT\n") + for hood in dbhoodspoly: + for polygon in hood.get("polygons",()): + oldlon = None + oldlat = None + for p in polygon: + if oldlon and oldlat: + csv.write("\"LINESTRING (%f %f,%f %f)\"\n" % (oldlon, oldlat, p["lon"], p["lat"])) + oldlon = p["lon"] + oldlat = p["lat"] + csv.write("\"LINESTRING (%f %f,%f %f)\"\n" % (oldlon, oldlat, polygon[0]["lon"], polygon[0]["lat"])) + # touch mapnik XML files to trigger tilelite watcher touch("/usr/share/ffmap/hoods.xml") touch("/usr/share/ffmap/hoods_v2.xml") + touch("/usr/share/ffmap/hoods_poly.xml") touch("/usr/share/ffmap/routers.xml") touch("/usr/share/ffmap/routers_v2.xml") touch("/usr/share/ffmap/routers_local.xml") diff --git a/ffmap/web/application.py b/ffmap/web/application.py index 8dc235a..61404e3 100755 --- a/ffmap/web/application.py +++ b/ffmap/web/application.py @@ -32,6 +32,7 @@ tileurls = { "routers_local": "/tiles/routers_local", "hoods": "/tiles/hoods", "hoods_v2": "/tiles/hoods_v2", + "hoods_poly": "/tiles/hoods_poly" } @app.route('/') diff --git a/ffmap/web/static/js/map.js b/ffmap/web/static/js/map.js index 39ba115..2ae3933 100644 --- a/ffmap/web/static/js/map.js +++ b/ffmap/web/static/js/map.js @@ -31,6 +31,7 @@ var routers_v2 = new L.TileLayer(tileurls.routers_v2 + '/{z}/{x}/{y}.png', overl var routers_local = new L.TileLayer(tileurls.routers_local + '/{z}/{x}/{y}.png', overlay_config); var hoods = new L.TileLayer(tileurls.hoods + '/{z}/{x}/{y}.png', overlay_config); var hoods_v2 = new L.TileLayer(tileurls.hoods_v2 + '/{z}/{x}/{y}.png', overlay_config); +var hoods_poly = new L.TileLayer(tileurls.hoods_poly + '/{z}/{x}/{y}.png', overlay_config); var popuplayer = new L.TileLayer(''); layersControl = new L.Control.Layers({ "openstreetmap.org": tilesosmorg, @@ -42,6 +43,7 @@ layersControl = new L.Control.Layers({ "Local Routers": routers_local, "Hoods V1": hoods, "Hoods V2": hoods_v2, + "Poly-Hoods": hoods_poly, "Position-Popup": popuplayer }); map.addControl(layersControl); @@ -62,8 +64,14 @@ function update_permalink() { var zoom = map.getZoom(); window.history.replaceState({}, document.title, mapurl + '?mapcenter=' + pos.lat.toFixed(5) + ',' + pos.lng.toFixed(5) + ',' + zoom - + '&layers=' + (map.hasLayer(routers)|0) + ',' + (map.hasLayer(routers_v2)|0) + ',' + (map.hasLayer(routers_local)|0) + ',' - + (map.hasLayer(hoods)|0) + ',' + (map.hasLayer(hoods_v2)|0) + ',' + (map.hasLayer(popuplayer)|0) ); + + '&layers=' + (map.hasLayer(routers)|0) + ',' + + (map.hasLayer(routers_v2)|0) + ',' + + (map.hasLayer(routers_local)|0) + ',' + + (map.hasLayer(hoods)|0) + ',' + + (map.hasLayer(hoods_v2)|0) + ',' + + (map.hasLayer(hoods_poly)|0) + ',' + + (map.hasLayer(popuplayer)|0) + ); } } diff --git a/ffmap/web/templates/map.html b/ffmap/web/templates/map.html index 8cb5aee..278e49c 100644 --- a/ffmap/web/templates/map.html +++ b/ffmap/web/templates/map.html @@ -43,7 +43,8 @@ if(getlayers[2]==1) { routers_local.addTo(map); } if(getlayers[3]==1) { hoods.addTo(map); } if(getlayers[4]==1) { hoods_v2.addTo(map); } - if(getlayers[5]==1) { popuplayer.addTo(map); } + if(getlayers[5]==1) { hoods_poly.addTo(map); } + if(getlayers[6]==1) { popuplayer.addTo(map); } } else { initialLayers(); } diff --git a/install.sh b/install.sh index 0bd5ad1..b56c2fa 100755 --- a/install.sh +++ b/install.sh @@ -5,9 +5,9 @@ mkdir -vp /var/lib/ffmap/csv chown -R www-data:www-data /var/lib/ffmap mkdir -vp /usr/share/ffmap -cp -v ffmap/mapnik/{hoods,hoods_v2,routers,routers_v2,routers_local}.xml /usr/share/ffmap -sed -i -e 's#>csv/#>/var/lib/ffmap/csv/#' /usr/share/ffmap/{hoods,hoods_v2,routers,routers_v2,routers_local}.xml -chown www-data:www-data /usr/share/ffmap/{hoods,hoods_v2,routers,routers_v2,routers_local}.xml +cp -v ffmap/mapnik/{hoods,hoods_v2,hoods_poly,routers,routers_v2,routers_local}.xml /usr/share/ffmap +sed -i -e 's#>csv/#>/var/lib/ffmap/csv/#' /usr/share/ffmap/{hoods,hoods_v2,hoods_poly,routers,routers_v2,routers_local}.xml +chown www-data:www-data /usr/share/ffmap/{hoods,hoods_v2,hoods_poly,routers,routers_v2,routers_local}.xml cp -v ffmap/mapnik/tilestache.cfg /usr/share/ffmap cp -rv ffmap/web/static /usr/share/ffmap