Open fleaz opened 6 years ago
Ouch, unsicher wie man das in Google My Maps gut finden und fixen kann. Oder ob man rauskriegt, wo das überlappt.
% ./nodedistribution.py -b domains.geojson -m https://meshviewer.darmstadt.freifunk.net/data/ffda/meshviewer.json :(
ERROR:root:[shapely] domains "Darmstadt Süd" and "Darmstadt Nord" overlap!
ERROR:root:[shapely] domains "Darmstadt Süd" and "Griesheim, Riedstadt, Gernsheim, Stockstadt, Biebesheim" overlap!
ERROR:root:[shapely] domains "Darmstadt Süd" and "Mühltal" overlap!
ERROR:root:[shapely] domains "Darmstadt Süd" and "Süd-Ostkreis" overlap!
ERROR:root:[shapely] domains "Darmstadt Nord" and "Arheilgen, Kranichstein, Wixhausen" overlap!
ERROR:root:[shapely] domains "Darmstadt Nord" and "Weiterstadt, Gräfenhausen, Schneppenhausen" overlap!
ERROR:root:[shapely] domains "Darmstadt Nord" and "Süd-Ostkreis" overlap!
ERROR:root:[shapely] domains "Arheilgen, Kranichstein, Wixhausen" and "Dieburg" overlap!
ERROR:root:[shapely] domains "Weiterstadt, Gräfenhausen, Schneppenhausen" and "Griesheim, Riedstadt, Gernsheim, Stockstadt, Biebesheim" overlap!
ERROR:root:[shapely] domains "Eberstadt, Pfungstadt, Seeheim-Jugenheim, Bergstraße" and "Mühltal" overlap!
ERROR:root:[shapely] domains "Eberstadt, Pfungstadt, Seeheim-Jugenheim, Bergstraße" and "Odenwald" overlap!
ERROR:root:[shapely] domains "MöWa, Langen, Dreieich, Rödermark, Rodgau, Eppertshausen, Seligenstadt" and "Süd-Ostkreis" overlap!
ERROR:root:[shapely] domains "Babenhausen" and "Süd-Ostkreis" overlap!
ERROR:root:[shapely] domains "Mühltal" and "Süd-Ostkreis" overlap!
ERROR:root:[shapely] domains "Odenwald" and "Süd-Ostkreis" overlap!
ERROR:root:[shapely] domains "Dieburg" and "Süd-Ostkreis" overlap!
ERROR:root:[shapely] exiting due to polygon overlap
diff --git a/nodedistribution.py b/nodedistribution.py
index 197f349..c5631f9 100755
--- a/nodedistribution.py
+++ b/nodedistribution.py
@@ -2,9 +2,12 @@
import json
import logging
+import sys
from argparse import ArgumentParser
-from shapely.geometry import shape, Point
+from itertools import combinations
+
import requests
+from shapely.geometry import shape, Point
def all_nodes(url):
@@ -66,6 +69,21 @@ def main(geojson_file, meshviewer_json_url):
domainname, polygon
))
+ overlap = False
+ for a, b in combinations(polygons.items(), 2):
+ a_name, a_polygon = a
+ b_name, b_polygon = b
+ if a_polygon is b_polygon:
+ continue
+ if a_polygon.overlaps(b_polygon):
+ overlap = True
+ logging.error('[shapely] domains "{0}" and "{1}" overlap!'.format(
+ a_name, b_name
+ ))
+ if overlap:
+ logging.error('[shapely] exiting due to polygon overlap')
+ sys.exit(1)
+
# Match nodes against domain polygons
for node in all_nodes(meshviewer_json_url):
domainname = find_domain(node, polygons)
Die Zeile
if a_polygon.overlaps(b_polygon):
matcht afaik auch wenn sich die beiden Polygone nur berühren. Man muss schauen welche Objekte bei dem .overlaps()
call zurück kommen. Wenn es nur Point
oder Line
ist, dann liegen nur die Kanten der Polygons aufeinander. Wenn bspw Polygon
zurückgegeben wird, dann existiert "echte" Überlappung. Ich such gerade mal den Post raus wo ich das gefstern gelesen hab
EDIT
Die Funktion die ich meinte war intersection()
. Dort bekommt man ein Geometrisches Object zurück und kann prüfen ob die Überlappung nur eine Linie oder ein Polygon ist. Je nach dem wie sie "overlapping" definiert haben, hilft uns die a.overlaps(b)
funktion evtl nicht weiter
Verwechselst du overlaps
mit touches
? Und wie ist das mit contains
, das matched sicher auch, wenn auf Linie, oder?
Sanity check nach dem konvertieren zu GeoJSON ob sich die Grenzen der einzelnnen Domains überlappen.