Identifizieren von echten Kurven / Bögen in ArcMap?

12

Die einzige gute Möglichkeit, Kreise in ArcMap zu erstellen, ist die Verwendung eines echten Bogens (zusammengesetzte Kurven). Diese müssen jedoch aufgrund eines Kompatibilitätsproblems in einen Scheitelpunkt (Verdichtung) konvertiert werden. Ich benötige Informationen für Geodatabase und SDO_geometry (arcsde)

und ja, es gibt einen Weg. Ich benutze:

UPDATE layer1 a SET arctype = 'compound' WHERE has_compound_curves(a.shape) <> 0;

und dann mit ET Geotools Schicht für Schicht verdichten.

Es sollte jedoch eine einfachere Möglichkeit geben, dies in Oracle oder ArcMap zu tun, und ich möchte nur die Features verdichten, die einen echten Bogen aufweisen. Ich möchte keine unnötigen Eckpunkte auf geraden Linien und so weiter.

Wie kann ich in ArcMap echte Bögen identifizieren und wie kann ich sie so schnell und einfach wie möglich verdichten?

Gleiches gilt für Oracle SQL.

jonaktiv
quelle
Hier ist ein Thread aus dem Jahr 2006 , der VBA verwendet, um echte Bögen zu finden. Gibt es eine Python- oder UI-Möglichkeit, dies zu tun, da ArcGIS VBA nicht mehr unterstützt?
RyanKDalton
Ich hoffe, dass diese "ArcGIS-Idee" nicht bedeutet, dass es unmöglich ist, in 10.0 echte Kurven zu finden.
RyanKDalton

Antworten:

8

Diese Frage wurde mir heute gestellt ("Wie erkenne ich, ob eine Feature-Class Kurven enthält?") Und ich erhielt einige Vorschläge für einen Arcpy- Code. Ändern Sie den folgenden Code nach Belieben (z. B. eine Flag-Variable anstelle einer Nachricht).

geometries = arcpy.CopyFeatures_management("inputFeatures", arcpy.Geometry())
import json
for g in geometries:
    j = json.loads(g.JSON)
    if 'curve' in j: print "You have true curves!"
    else: print "No curves here"

No curves here
No curves here
You have true curves!
You have true curves!
No curves here
You have true curves!
No curves here
No curves here
You have true curves!
You have true curves!
You have true curves!
You have true curves!
You have true curves!
KHibma
quelle
4

Bei Verwendung von " Verdichten" werden Kurvensegmente durch Verdichtung entweder durch den Parameter "Maximaler Ablenkwinkel" oder "Maximale Abweichung vom Versatz" vereinfacht.

So bleiben gerade Liniensegmente erhalten.

Geogeek
quelle
1
Obwohl dies nicht dazu beiträgt, die wahren Kurven zu identifizieren, stimme ich zu, dass die Verwendung von Densify mit dem Angle-Parameter eine schnelle und effektive Methode ist, um sie sehr schnell zu verdichten. Bei Verwendung des Winkels werden im Allgemeinen nur die wahren Kurven verdichtet, während bei Verwendung der Option Abstand alle Grenzen verdichtet werden. Dies führt (zumindest in meinen Tests unter Verwendung der Standardparameter) zu einer 10-fachen Zunahme der Dateigröße.
RyanKDalton
ok, es gibt also verschiedene lösungen, aber mein problem ist, dass ich keine toolbox auf meiner sde ebene verwenden kann. wir sperren die ebenen für das checkout / checkin. was ich tun möchte ist, ein tool / script auszuführen, das findet diese Kurven und danach Verdichten, aber wenn es das ist, was Sie sagen, dass Verdichten nur wahre Bögen berühren, kann ich alle Funktionen überprüfen, aber gibt es ein Bearbeitungswerkzeug, das mehr verdichtet als ET-Geotools
jonaktiv
Diese Antwort gis.stackexchange.com/a/37082/2969 versucht, gerade Linien zu extrahieren, aber Sie können Kurven extrahieren, indem Sie gerade Linien von der gesamten Ebene abziehen, sodass Sie Kurven lokalisieren können, ohne die gesamten Daten zu berühren. Aber ich habe keine Ahnung, wie ET Geotools funktioniert.
Geogeek
jonaktiv, das von @geogeek verknüpfte Verdichtungswerkzeug, ist ein ArcGIS-Kernwerkzeug, das mit einer ArcEditor- oder ArcInfo-Lizenz verfügbar ist und nicht Teil von ET GeoWizards ist.
RyanKDalton
2

Ich denke, wenn Sie sie einmal ausgewählt haben, können Sie sie verdichten. Der unten stehende (ungetestete) Code könnte dazu angepasst werden. (Vorausgesetzt, Bezier-Kurven werden als Bögen qualifiziert).

public void SelectTrueArcFeatures()
{
    var editor = ArcMap.Application.FindExtensionByName("ESRI Object Editor") as IEditor;
    if (editor.EditState != esriEditState.esriStateEditing)
        throw new Exception("start editing first");
    var fLayer = ((IEditLayers)editor).CurrentLayer;
    if (fLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPoint)
        throw new Exception("current edit layer must have polylines or polygons");

    var fSel = fLayer as IFeatureSelection;
    fSel.Clear();
    var fCur = fLayer.FeatureClass.Search(null,false);
    IFeature feat;
    while ((feat = fCur.NextFeature()) != null)
    {
        if(HasAnArc(feat.Shape))    
            fSel.SelectionSet.Add(feat.OID);
    }
    fSel.SelectionChanged();
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(fCur);
    ArcMap.Document.ActiveView.Refresh();
}

private bool HasAnArc(IGeometry geom)
{
    var segcoll = geom as ISegmentCollection;
    if (segcoll == null)
        return false;
    for (int i = 0; i < segcoll.SegmentCount; i++)
    {
        if (segcoll.get_Segment(i) is ICircularArc 
          || segcoll.get_Segment(i) is IBezierCurve)
          return true;
    }
    return false;
}
Kirk Kuykendall
quelle
ist das Editierskript? Wie kann ich diesen Code in arcmap einfügen? und wie funktioniert der code, findet er beizercurves oder verdichtet nur diejenigen, die ich gefunden habe (ausgewählt)
jonaktiv
Es ist c#. Wenn Sie noch nicht mit C # (oder .net-Anpassung) vertraut sind, können Sie jemanden bitten, das Äquivalent mit Python zu schreiben. Um diesen Code zu verwenden, müssen Sie ihn mit Visual Studio kompilieren. Es werden alle Polylinien (oder Polygone) in der aktuellen Bearbeitungszielebene ausgewählt, die nichtlineare Segmente aufweisen.
Kirk Kuykendall
@jonaktiv Wenn Sie 9.3.1 verwenden, können Sie dies mit VBA in einem Taschenrechnerskript tun. Berechnen Sie ein Flag-Attribut und wählen Sie dann Features mit dem Flag aus. Wenn Sie 8.3 verwenden, können Sie die Geometrie mithilfe des Feldrechners direkt aktualisieren und benötigen kein Flag-Attribut.
Kirk Kuykendall
Hervorragend! Ich bin sehr dankbar, ich hatte Angst, dass es nicht möglich war
jonaktiv
2

Aufbauend auf der Antwort von @ KHibma verfügt der Datenzugriffs-Cursor über das Token, mit SHAPE@JSONdem nach Kurven gesucht werden kann, ohne das jsonModul zu importieren .

with arcpy.da.SearchCursor ("InputFeatures", ["OID@", "SHAPE@JSON"]) as curs:
    for oid, json in curs:
        if "curve" in json:
            print "{} is curved".format (oid)
Emil Brundage
quelle
1

Auf Anregung von @geogeek habe ich auch hier meine eigene Lösung entwickelt. Ich habe ein Modell erstellt, das die Scheitelpunkte der Quellebenen mit den Scheitelpunkten einer verdichteten (mit der Option ANGLE) Kopie der Quellebene vergleicht. Die Ausgabe ist eine Ebene von Scheitelpunkten, die nicht mit der Quelle übereinstimmen. Im letzten Schritt werden alle Quell-Features ausgewählt, die die nicht übereinstimmenden Punkte schneiden, wodurch Features identifiziert werden, die echte Kurven enthalten.

Da dieses Modell Features am Start- und Endpunkt des Bogens nicht teilt, wird das gesamte Feature exportiert. Wenn Sie also eine einzelne Geometrie haben, die als "Linie-Kurve-Linie-Kurve-Umkehr-Kurve-Linie" verbunden ist, wird das gesamte Feature ausgegeben, nicht nur die Kurvenabschnitte. Verwenden Sie die Punkte, um zu bestimmen, wo die tatsächlichen Kurven vorhanden sind.

Sie können das Modell " Identify True Curves " aus der ArcGIS Resource Center-Galerie "Analysis" herunterladen .

RyanKDalton
quelle
Vielen Dank an ALLE, das ist so toll. wir haben arcgis 9.3.1 aber ich werde es auf meinem privaten computer testen BEARBEITEN: es ist ein sehr gutes werkzeug, aber nicht schnell genug: / ich möchte in der bearbeitungsumgebung in der lage sein, merkmale mit echten bögen zu finden / auszuwählen und dann checkout meine features mit echten bögen und dann verdichten (gibt es irgendwelche bearbeitungswerkzeuge zum verdichten mehr als et geotools, warum ich et getools nicht will, weil du die zielebene wechseln musst, verdichten wir vielleicht 10 verschiedene
ebenen