Suchen Sie mit Open Source GIS oder ArcGIS for Desktop nach Polygonen ohne rechten Winkel?


8

Jetzt digitalisieren wir einige Gebäude in einem bestimmten Bereich.

Die obligatorische Regel für diese Arbeit - in den meisten Fällen sollten Gebäude rechtwinklig sein.

Wir verwenden QGIS mit CAD-Werkzeugen für diese Arbeit, aber manchmal machen wir Fehler und erstellen Polygone mit einer unregelmäßigen Form.

Weiß jemand, wie wir mit Open Source GIS oder ArcGIS solche Polygone ohne rechten Winkel finden können?

Antworten:


5

Ich kenne kein vorhandenes Tool, aber Sie können eines in ArcPy schreiben oder GDAL / OGR wie folgt verwenden:

  • Für jedes Polygon ...
    • Holen Sie sich die Geometrie
    • Folgen Sie der Wicklung des Polygons und berechnen Sie den Innenwinkel an jedem Scheitelpunkt
    • Wenn ein Winkel nicht 90 Grad beträgt, fügen Sie die FID / OID (oder ein anderes Attribut) zu einer Liste von Ablehnungen hinzu
  • Drucken Sie die Liste der Ablehnungen

3
+1 Nachdem ich einen ähnlichen Code geschrieben habe, würde ich eine geringfügige Änderung empfehlen. Ein Winkel, der von extrem kleinen Liniensegmenten überspannt wird, verursacht keine (visuellen) Probleme. Auch Winkel nahe 90 Grad sollten kein Problem sein. Dies legt nahe, das innere Produkt jeder Kante mit ihrem Vorgänger zu berechnen. Vergleichen Sie den absoluten Wert des Ergebnisses mit einem (kleinen positiven) Schwellenwert. Markieren Sie Polygone, bei denen dieser Schwellenwert überschritten wird. Dies ermöglicht gleichzeitig größere Abweichungen von 90 Grad für kleine Kanten sowie kleine Abweichungen für große Kanten. Als Bonus müssen Sie keine Winkel berechnen.
whuber

Hat jemand versucht, die zweite Zeile der Antwort von @MappaGnosis zu implementieren?
b_jugger

2

Nachfolgend finden Sie einen möglichen Ansatz. Die Funktion gibt true oder false zurück, je nachdem, ob das Polygon Winkel unterhalb einer bestimmten Größe aufweist oder innerhalb eines Bereichs um einen Zielwinkel liegt. Denken Sie daran, dass dies ein sehr einfacher Ansatz ist und eine geradlinige Digitalisierung voraussetzt. Ich teste auf einen Kreis, aber nicht auf Kurven oder andere Möglichkeiten, die die Funktion beeinträchtigen könnten.

angleTarget = gewünschter Winkel (z. B. 90).

edgeVariance = zulässige Waffel der geraden Linie (z. B. Richtungsänderung um 0,5 Grad zulässig).

angleVariance = zulässige Abweichung des gewünschten Winkels (z. B. 1, wenn 91 Grad in Ordnung sind).

Brian

private static bool AngleWithinTolerance(IPolygon pPoly, double angletarget, double edgeVariance, double angleVariance)
    {
        GeometryEnvironment geometryEnvironment = new GeometryEnvironment();
        IConstructAngle constructAngle = geometryEnvironment as IConstructAngle;
        IPointCollection ptcol = (IPointCollection)pPoly;
        double angle;

        //No circles!
        if (ptcol.PointCount < 3) return false;

        //Check angle made by last point first point and second point in the collection.
        angle = Math.Abs(constructAngle.ConstructThreePoint(ptcol.get_Point(ptcol.PointCount - 2), ptcol.get_Point(0), ptcol.get_Point(1)) * (180/3.14159250439667));
        if (angle < edgeVariance || (angle < angletarget + angleVariance & angle > angletarget - angleVariance))
        {
            //Angle at index 0 is OK - check all other points in collection.
            for (int x = 0; x != ptcol.PointCount - 2; x++)
            {
                angle = Math.Abs(constructAngle.ConstructThreePoint(ptcol.get_Point(x), ptcol.get_Point(x + 1), ptcol.get_Point(x + 2)) * (180 / 3.14159250439667));
                if (angle > edgeVariance & (angle > angletarget + angleVariance || angle < angletarget - angleVariance))
                {
                    return false;
                }
            }
        }
        else
        {
            return false;
        }
        //never failed.
        return true;
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.