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:
1 parent
aa699b1585
commit
73a6df7f08
2 files changed
+8
-4
No files matched your search
@@ -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]:
|
||||
|
||||
@@ -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))
|
||||
Reference in new issue
Block a user