diff --git a/tools/extract/leonida/inpaint.py b/tools/extract/leonida/inpaint.py index afa3813..d11fa76 100644 --- a/tools/extract/leonida/inpaint.py +++ b/tools/extract/leonida/inpaint.py @@ -555,7 +555,11 @@ def _rectangle(rows, cols) -> Polygon: # Siehe buildings.regularize(): harmlose GEOS-Warnung bei achsenparallelen Formen. warnings.filterwarnings("ignore", message=r".*oriented_envelope.*", category=RuntimeWarning) envelope = points.minimum_rotated_rectangle - return envelope.buffer(0.5, cap_style="square", join_style="mitre") + # simplify(0) wirft nur Punkte weg, die genau auf einer Kante liegen, und lässt die Form + # unverändert. Nötig, weil GEOS je nach Plattform solche Punkte setzt (macOS 0, Windows 2) und + # _sides() wie _place_rows() die ersten vier Ringpunkte als Ecken nehmen: mit Zusatzpunkten + # messen sie die falschen Kanten und setzen ergänzte Gebäude in falscher Größe und Richtung. + return envelope.buffer(0.5, cap_style="square", join_style="mitre").simplify(0) def _sides(rect: Polygon) -> tuple[float, float]: diff --git a/tools/extract/tests/test_inpaint.py b/tools/extract/tests/test_inpaint.py index 5df3b82..ec2d640 100644 --- a/tools/extract/tests/test_inpaint.py +++ b/tools/extract/tests/test_inpaint.py @@ -270,7 +270,7 @@ def test_rebuild_is_deterministic(): def test_pixels_on_one_line_give_a_rectangle_with_four_corners(): rect = _rectangle(np.full(10, 5), np.arange(10, 20)) # 10 Pixel in einer Zeile - # simplify(0) wirft Punkte weg, die genau auf einer Kante liegen: GEOS setzt davon je nach - # Plattform unterschiedlich viele (macOS 0, Windows 2). Gemeint sind die echten Ecken. - assert len(rect.simplify(0).exterior.coords) == 5 # vier Ecken und der Schlusspunkt + # Vier Ecken und der Schlusspunkt, ohne Zusatzpunkte auf den Kanten: _sides() und _place_rows() + # nehmen die ersten vier Ringpunkte als Ecken, GEOS setzt sie je nach Plattform verschieden. + assert len(rect.exterior.coords) == 5 assert _sides(rect) == pytest.approx((1.0, 10.0))