From 73a6df7f0828704e0d3ae86a77ae96dfcf36e0f3 Mon Sep 17 00:00:00 2001 From: Kenso Grimm Date: Wed, 16 Sep 2026 05:54:22 +0200 Subject: [PATCH] =?UTF-8?q?fix(extract):=20H=C3=BCllrechteck=20ohne=20Zusa?= =?UTF-8?q?tzpunkte=20auf=20den=20Kanten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _sides() und _place_rows() nehmen die ersten vier Ringpunkte eines Rechtecks als seine Ecken. GEOS setzt nach dem Puffern je nach Plattform zusätzliche Punkte mitten auf die Kanten (macOS 0, Windows 2), und dann messen beide die falschen Kanten: ergänzte Gebäude bekamen unter entfernten Beschriftungen eine falsche Größe und eine falsche Richtung. simplify(0) entfernt genau diese Punkte und lässt die Form unverändert. Co-Authored-By: Claude Sonnet 5 --- tools/extract/leonida/inpaint.py | 6 +++++- tools/extract/tests/test_inpaint.py | 6 +++--- 2 files changed, 8 insertions(+), 4 deletions(-) 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))