From c5291413f1064d3165ebb7529586cd226b771c20 Mon Sep 17 00:00:00 2001 From: Adrian Schmutzler Date: Sat, 24 Nov 2018 14:14:34 +0100 Subject: [PATCH] map: Add Polyhood support This actually implements polyhood support for the MAP. This is not connected to the earlier commit which provides database support for polyhoods. This patch will work independent of the earlier one. Although the KeyXchange does not provide polyhood data so far, the Monitoring's implementation can already be put in place and will take up the data as soon as it's there. Note that since we only provide an additional layer for the map, the overall footprint of this change is relatively small. Signed-off-by: Adrian Schmutzler Tested-by: Adrian Schmutzler --- ffmap/mapnik/hoods_poly.xml | 28 ++++++++++++++++++++++++++++ ffmap/mapnik/run.sh | 1 + ffmap/mapnik/tilestache.cfg | 10 ++++++++++ ffmap/maptools.py | 35 +++++++++++++++++++++++++++++++++++ ffmap/web/application.py | 1 + ffmap/web/static/js/map.js | 12 ++++++++++-- ffmap/web/templates/map.html | 3 ++- install.sh | 6 +++--- 8 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 ffmap/mapnik/hoods_poly.xml 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