fix(extract): Hüllrechteck ohne Zusatzpunkte auf den Kanten

_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 <noreply@anthropic.com>
This commit is contained in:
knsoandClaude Sonnet 5 committed 2026-09-16 05:54:22 +02:00
1 parent aa699b1585
commit 73a6df7f08
2 files changed
+8 -4

No files matched your search

+5 -1
View File
@@ -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]:
+3 -3
View File
@@ -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))