Separate hoods into layers

Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
This commit is contained in:
Adrian Schmutzler 2017-11-15 23:17:59 +01:00
parent 3fd731a5a2
commit 73895af3d9
8 changed files with 164 additions and 26 deletions

View File

@ -0,0 +1,89 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Map>
<Map background-color="transparent" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
<Style name="routerpoint" filter-mode="first">
<Rule>
<Filter>([status] = 'online')</Filter>
<!-- For directed antenna
<PointSymbolizer file="static/img/router_direct_green.svg" allow-overlap="true" transform="rotate(45)" />
-->
<PointSymbolizer file="static/img/router_green.svg" allow-overlap="true" />
</Rule>
<Rule>
<Filter>([status] = 'offline')</Filter>
<PointSymbolizer file="static/img/router_red.svg" allow-overlap="true" />
</Rule>
<Rule>
<Filter>([status] = 'unknown')</Filter>
<PointSymbolizer file="static/img/router_yellow.svg" allow-overlap="true" />
</Rule>
<Rule>
<Filter>([status] = 'orphaned')</Filter>
<PointSymbolizer file="static/img/router_grey.svg" allow-overlap="true" />
</Rule>
</Style>
<Style name="color" filter-mode="first">
<Rule>
<Filter>([quality] &lt; 105)</Filter>
<LineSymbolizer stroke-width="3" stroke="#ff1e1e" stroke-linecap="butt" clip="false" />
</Rule>
<Rule>
<Filter>([quality] &lt; 130)</Filter>
<LineSymbolizer stroke-width="3" stroke="#ff4949" stroke-linecap="butt" clip="false" />
</Rule>
<Rule>
<Filter>([quality] &lt; 155)</Filter>
<LineSymbolizer stroke-width="3" stroke="#ff6a6a" stroke-linecap="butt" clip="false" />
</Rule>
<Rule>
<Filter>([quality] &lt; 180)</Filter>
<LineSymbolizer stroke-width="3" stroke="#ffac53" stroke-linecap="butt" clip="false" />
</Rule>
<Rule>
<Filter>([quality] &lt; 205)</Filter>
<LineSymbolizer stroke-width="3" stroke="#ffeb79" stroke-linecap="butt" clip="false" />
</Rule>
<Rule>
<Filter>([quality] &lt; 230)</Filter>
<LineSymbolizer stroke-width="3" stroke="#79ff7c" stroke-linecap="butt" clip="false" />
</Rule>
<Rule>
<Filter>([quality] &lt; 300)</Filter>
<LineSymbolizer stroke-width="3" stroke="#04ff0a" stroke-linecap="butt" clip="false" />
</Rule>
</Style>
<Style name="l3_color" filter-mode="first">
<Rule>
<LineSymbolizer stroke-width="3" stroke="#0684c4" stroke-linecap="butt" clip="false" />
</Rule>
</Style>
<Style name="shadow1">
<Rule>
<LineSymbolizer stroke-width="4" stroke="#333333" stroke-linecap="round" stroke-opacity="0.5" />
</Rule>
</Style>
<Layer name="links" srs="+proj=latlong +ellps=WGS84 +datum=WGS84 +no_defs">
<StyleName>shadow1</StyleName>
<StyleName>color</StyleName>
<Datasource>
<Parameter name="type">csv</Parameter>
<Parameter name="file">csv/links_v2.csv</Parameter>
</Datasource>
</Layer>
<Layer name="l3_links" srs="+proj=latlong +ellps=WGS84 +datum=WGS84 +no_defs">
<StyleName>shadow1</StyleName>
<StyleName>l3_color</StyleName>
<Datasource>
<Parameter name="type">csv</Parameter>
<Parameter name="file">csv/l3_links_v2.csv</Parameter>
</Datasource>
</Layer>
<Layer name="routers" srs="+proj=latlong +ellps=WGS84 +datum=WGS84 +no_defs">
<StyleName>routerpoint</StyleName>
<Datasource>
<Parameter name="type">csv</Parameter>
<Parameter name="file">csv/routers_v2.csv</Parameter>
</Datasource>
</Layer>
</Map>

View File

@ -1,6 +1,7 @@
#!/bin/bash
liteserv.py links_and_routers.xml --processes=5 &
liteserv.py routers.xml --processes=5 &
liteserv.py routers_v2.xml -p 8003 --processes=5 &
liteserv.py hoods.xml -p 8001 --processes=5 &
liteserv.py hoodsv2.xml -p 8002 --processes=5

View File

@ -4,11 +4,21 @@
"path": "/var/cache/ffmap/tiles/"
},
"layers": {
"tiles/links_and_routers": {
"tiles/routers": {
"provider": {
"class": "dynmapnik:DynMapnik",
"kwargs": {
"mapfile": "/usr/share/ffmap/links_and_routers.xml"
"mapfile": "/usr/share/ffmap/routers.xml"
}
},
"metatile": {"buffer": 128},
"cache lifespan": 300
},
"tiles/routers_v2": {
"provider": {
"class": "dynmapnik:DynMapnik",
"kwargs": {
"mapfile": "/usr/share/ffmap/routers_v2.xml"
}
},
"metatile": {"buffer": 128},

View File

@ -72,22 +72,35 @@ def draw_voronoi_lines(csv, hoods):
def update_mapnik_csv(mysql):
routers = mysql.fetchall("""
SELECT router.status, router.lat, router.lng, hoods.name AS hood FROM router
LEFT JOIN hoods ON router.hood = hoods.name
WHERE router.lat IS NOT NULL AND router.lng IS NOT NULL
""")
rv1 = "lng,lat,status\n"
rv2 = "lng,lat,status\n"
for router in routers:
tmp = "%f,%f,%s\n" % (
router["lng"],
router["lat"],
router["status"]
)
if router["hood"]:
rv1 += tmp
else:
rv2 += tmp
with open(os.path.join(CONFIG["csv_dir"], "routers.csv"), "w") as csv:
csv.write("lng,lat,status\n")
routers = mysql.fetchall("""
SELECT status, lat, lng FROM router
WHERE lat IS NOT NULL AND lng IS NOT NULL
""")
for router in routers:
csv.write("%f,%f,%s\n" % (
router["lng"],
router["lat"],
router["status"]
))
csv.write(rv1)
with open(os.path.join(CONFIG["csv_dir"], "routers_v2.csv"), "w") as csv:
csv.write(rv2)
dblinks = mysql.fetchall("""
SELECT r1.lat AS rlat, r1.lng AS rlng, r2.lat AS nlat, r2.lng AS nlng, n.type AS type, quality
SELECT r1.lat AS rlat, r1.lng AS rlng, r2.lat AS nlat, r2.lng AS nlng, n.type AS type, quality, hoods.name AS hood
FROM router AS r1
LEFT JOIN hoods ON r1.hood = hoods.name
INNER JOIN router_neighbor AS n ON r1.id = n.router
INNER JOIN (
SELECT router, mac FROM router_netif GROUP BY mac, router
@ -98,32 +111,53 @@ def update_mapnik_csv(mysql):
""")
links = []
linksl3 = []
linksv2 = []
linksl3v2 = []
for row in dblinks:
if row.get("type")=="l3":
linksl3.append((
tmp = (
row["rlng"],
row["rlat"],
row["nlng"],
row["nlat"]
))
)
if row["hood"]:
linksl3.append(tmp)
else:
linksl3v2.append(tmp)
else:
links.append((
tmp = (
row["rlng"],
row["rlat"],
row["nlng"],
row["nlat"],
row["quality"]
))
)
if row["hood"]:
links.append(tmp)
else:
linksv2.append(tmp)
with open(os.path.join(CONFIG["csv_dir"], "links.csv"), "w") as csv:
csv.write("WKT,quality\n")
for link in sorted(links, key=lambda l: l[4]):
csv.write("\"LINESTRING (%f %f,%f %f)\",%i\n" % link)
with open(os.path.join(CONFIG["csv_dir"], "links_v2.csv"), "w") as csv:
csv.write("WKT,quality\n")
for link in sorted(linksv2, key=lambda l: l[4]):
csv.write("\"LINESTRING (%f %f,%f %f)\",%i\n" % link)
with open(os.path.join(CONFIG["csv_dir"], "l3_links.csv"), "w") as csv:
csv.write("WKT\n")
for link in linksl3:
csv.write("\"LINESTRING (%f %f,%f %f)\"\n" % link)
with open(os.path.join(CONFIG["csv_dir"], "l3_links_v2.csv"), "w") as csv:
csv.write("WKT\n")
for link in linksl3v2:
csv.write("\"LINESTRING (%f %f,%f %f)\"\n" % link)
dbhoods = mysql.fetchall("""
SELECT name, lat, lng FROM hoods
WHERE lat IS NOT NULL AND lng IS NOT NULL
@ -176,7 +210,8 @@ def update_mapnik_csv(mysql):
# touch mapnik XML files to trigger tilelite watcher
touch("/usr/share/ffmap/hoods.xml")
touch("/usr/share/ffmap/hoodsv2.xml")
touch("/usr/share/ffmap/links_and_routers.xml")
touch("/usr/share/ffmap/routers.xml")
touch("/usr/share/ffmap/routers_v2.xml")
if __name__ == '__main__':
update_mapnik_csv()

View File

@ -24,7 +24,8 @@ app.register_blueprint(api, url_prefix='/api')
app.register_blueprint(filters)
tileurls = {
"links_and_routers": "/tiles/links_and_routers",
"routers": "/tiles/routers",
"routers_v2": "/tiles/routers_v2",
"hoods": "/tiles/hoods",
"hoodsv2": "/tiles/hoodsv2",
}

View File

@ -26,7 +26,8 @@ var overlay_config = {
maximumAge: 1000*3600*24*10
}
var links_and_routers = new L.TileLayer(tileurls.links_and_routers + '/{z}/{x}/{y}.png', overlay_config).addTo(map);
var routers = new L.TileLayer(tileurls.routers + '/{z}/{x}/{y}.png', overlay_config).addTo(map);
var routers_v2 = new L.TileLayer(tileurls.routers_v2 + '/{z}/{x}/{y}.png', overlay_config).addTo(map);
var hoods = new L.TileLayer(tileurls.hoods + '/{z}/{x}/{y}.png', overlay_config);
var hoodsv2 = new L.TileLayer(tileurls.hoodsv2 + '/{z}/{x}/{y}.png', overlay_config);
layersControl = new L.Control.Layers({
@ -34,7 +35,8 @@ layersControl = new L.Control.Layers({
"openstreetmap.de": tilesosmde,
"Thunderforest Outdoors": tilestfod
}, {
"Links & Routers": links_and_routers,
"Routers": routers,
"Routers v2 und dezentral": routers_v2,
"Hoods": hoods,
"Hoods v2": hoodsv2
});

View File

@ -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,hoodsv2,links_and_routers}.xml /usr/share/ffmap
sed -i -e 's#>csv/#>/var/lib/ffmap/csv/#' /usr/share/ffmap/{hoods,hoodsv2,links_and_routers}.xml
chown www-data:www-data /usr/share/ffmap/{hoods,hoodsv2,links_and_routers}.xml
cp -v ffmap/mapnik/{hoods,hoodsv2,routers,routers_v2}.xml /usr/share/ffmap
sed -i -e 's#>csv/#>/var/lib/ffmap/csv/#' /usr/share/ffmap/{hoods,hoodsv2,routers,routers_v2}.xml
chown www-data:www-data /usr/share/ffmap/{hoods,hoodsv2,routers,routers_v2}.xml
cp -v ffmap/mapnik/tilestache.cfg /usr/share/ffmap
cp -rv ffmap/web/static /usr/share/ffmap