Frage

Ich habe online gesehen, dass buffer(0) Bowties „reparieren“ sollte.Shapely findet den Schnittpunkt der Fliege, behält aber nur den oberen rechten Teil bei.Auf der Suche nach einer Lösung habe ich versucht, die Reihenfolge meiner Punkte umzukehren.Überraschenderweise (für mich) wurde immer noch derselbe obere rechte Teil der Fliege beibehalten.Ich verstehe nicht.Jede Hilfe wird geschätzt.

Ich möchte die gesamte Fliege als zwei Dreiecke behalten (oder als ein sechsseitiges Polygon – beides wäre nützlich).Suche nach einer Lösung für dieses „Problem“.

#!/usr/bin/env python3

from shapely.geometry.polygon import Polygon

bowtie_plot = [(1, 0), (0, 1), (0, -1), (-1, 0)]

bowties = [
        Polygon(bowtie_plot),
        Polygon(bowtie_plot[::-1])
        ]

cleaned = [
        bowties[0].buffer(0),
        bowties[1].buffer(0)
        ]

print('cleaned[0] exterior = {}'.format(list(cleaned[0].exterior.coords)))
# cleaned[0] exterior = [(0.0, 0.0), (-1.0, 1.0), (1.0, 1.0), (0.0, 0.0)]

print('cleaned[1] exterior = {}'.format(list(cleaned[1].exterior.coords)))
# cleaned[1] exterior = [(0.0, 0.0), (-1.0, 1.0), (1.0, 1.0), (0.0, 0.0)]

# ADDITIONAL INFORMATION BELOW
# here's what shapely *can* do with intersecting lines:
# a star shape made of five intersecting lines and five points

from math import sin, cos, pi

star = Polygon(
        [(cos(x*pi*4/5), sin(x*pi*4/5)) for x in range(5)]
        ).buffer(0)

# after buffering, becomes a star shape made out of ten lines and ten points
# shapely found all intersections and corrected the polygon.
print('list exterior = {}'.format(list(star.exterior.coords)))

Nachdem ich darüber nachgedacht habe, kann ich es verstehen Warum Eine Fliege wird anders behandelt als ein Stern, aber ich bin daran interessiert, einen Workaround zu finden.

War es hilfreich?

Lösung

Ihre Fliege hat keine gültige Form Polygon.Lesen Sie diese Dokumentation und die Dokumentation dazu LinearRing (direkt über dem Polygon Dokumentation).Beachten Sie insbesondere die Beispiele für gültig und ungültig LinearRingS.

Wenn Sie die Fliege wie folgt erstellen:

In [46]: bt = [(1,0), (0,1), (0,0), (-1,0), (0, -1), (0,0)]

In [47]: poly = Polygon(bt)

Dann buffer(0) gibt a zurück MultiPolygon:

In [48]: poly.buffer(0)
Out[48]: <shapely.geometry.multipolygon.MultiPolygon at 0x4a40050>

Andere Tipps

buffer(0) erzeugt nicht immer ein Multipolygon:

generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top