freifunk-darmstadt / multidomain-toolkit

0 stars 0 forks source link

Überlappende Domaingrenzen #1

Open fleaz opened 6 years ago

fleaz commented 6 years ago

Sanity check nach dem konvertieren zu GeoJSON ob sich die Grenzen der einzelnnen Domains überlappen.

mweinelt commented 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)
fleaz commented 6 years ago

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

mweinelt commented 6 years ago

Verwechselst du overlaps mit touches? Und wie ist das mit contains, das matched sicher auch, wenn auf Linie, oder?