Linien, die sich schneiden, von Linien unterscheiden, die sich berühren?

9

Wie unterscheide ich diese Fälle in ArcGIS 10?

  • Fall 1 : Beide Endpunkte einer Linie berühren eine andere Linie
  • Fall 2 : Beide Endpunkte baumeln über den Schnittlinien

Ich betrachte die Trim Line- Funktion, aber das ist nicht das, was ich will (destruktiv).

Der reale Anwendungsfall besteht darin, zwischen Nebenstraßen zu unterscheiden, die beide Straßen einer Autobahn verbinden, und anderen Fällen von Straßen, die sich mit Autobahnen kreuzen.

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

mvexel
quelle

Antworten:

13

Für jeweils ein Feature können Sie dies ganz einfach interaktiv über das normale Dialogfeld " Nach Standort auswählen" ausführen. Verwenden Sie dazu die folgende Taste als Leitfaden für die räumlichen Beziehungstypen für Zeilen-für-Zeilen-Überlagerungen (unter " Nach Standort auswählen : Grafikbeispiele ):

Bild
(Quelle: arcgis.com )

Linie mit Linie auswählen

Schnittpunkt A, C, D, E, F, G, H, I, J.

ENTHÄLT G, H.

COMPLETELY_CONTAINS G.

CONTAINS_CLEMENTINI G, H.

INNERHALB VON F, H.

COMPLETELY_WITHIN F.

WITHIN_CLEMENTINI F, H.

ARE_IDENTICAL_TO H.

BOUNDARY_TOUCHES C, E.

Die relevanten Beziehungstypen in diesem Fall sind INTERSECTund BOUNDARY_TOUCHES. Wie Sie dem obigen Diagramm entnehmen können, können BOUNDARY_TOUCHESSie die Features auswählen, die einen Endpunkt der Linie berühren. Wenn genau zwei Features ausgewählt sind, haben Sie Ihren Fall 1. Wenn ein Feature nicht von anderen Features berührt wird, sondern nur von diesen geschnitten wird, BOUNDARY_TOUCHESwird nichts ausgewählt. INTERSECTwählt alle Features aus, die sich überschneiden, unabhängig davon, ob sie einen Endpunkt berühren oder nicht. Wenn Sie also wissen, dass keine Features Endpunkte berühren, Sie jedoch feststellen, dass sich Features überschneiden, haben Sie Ihren Fall 2.

Um den Prozess zu automatisieren, können Sie das folgende Python-Skript verwenden (auf Wunsch als Skript-Tool implementieren ), um die Anzahl der Berührungen und Schnittpunkte für jedes Feature in einer Feature-Class oder Layer zu berechnen:

import arcpy

################################ Configuration #################################
numTouchesField = "NUM_TOUCHES"
numIntersectionsField = "NUM_INTERSECTIONS"
################################################################################

def countTouches(layer, feature):
    """Returns the number of times the boundary of a feature touches other
    features in the same feature layer."""
    return countSpatialRelation(layer, feature, "BOUNDARY_TOUCHES")

def countIntersections(layer, feature):
    """Returns the number of times a feature intersects other features in the
    same feature layer."""
    return countSpatialRelation(layer, feature, "INTERSECT") - 1 # Subtract 1 because the feature will always intersect its clone in the feature layer

def countSpatialRelation(layer, feature, relation):
    """Returns the number of times a feature meets the specified spatial
    relationship with other features in the same feature layer."""
    arcpy.SelectLayerByLocation_management(layer, relation, feature)
    count = int(arcpy.GetCount_management(layer).getOutput(0))
    return count

def addField(table, fieldName, fieldType):
    """Adds a fields of the given name and type to a table, unless a field with
    the same name already exists."""
    desc = arcpy.Describe(table)
    fieldInfo = desc.fieldInfo
    fieldIndex = fieldInfo.findFieldByName(fieldName)
    if fieldIndex == -1:
        # Field does not exist, add it
        arcpy.AddField_management(table, fieldName, fieldType)

def countTouchesAndIntersections(layer):
    """Adds and populates fields describing the number of times each feature
    touches and intersects other features in the feature layer."""
    addField(layer, numTouchesField, "LONG")
    addField(layer, numIntersectionsField, "LONG")
    desc = arcpy.Describe(layer)
    shapeField = desc.shapeFieldName
    rows = arcpy.UpdateCursor(layer)
    for row in rows:
        feature = row.getValue(shapeField)
        row.setValue(numTouchesField, countTouches(layer, feature))
        row.setValue(numIntersectionsField, countIntersections(layer, feature))
        rows.updateRow(row)
    del row, rows

if __name__ == "__main__":
    layer = arcpy.MakeFeatureLayer_management(arcpy.GetParameterAsText(0))
    countTouchesAndIntersections(layer)

Sobald dies ausgeführt wurde, können Sie leicht nach Funktionen abfragen, die sich genau zweimal berühren und genau zweimal schneiden (Fall 1), und nach Funktionen, die sich 0 Mal berühren und genau zweimal schneiden (Fall 2).

Beispieldefinitionsabfragen:

  • Fall 1 (Berührt zweimal, schneidet sich zweimal):"NUM_TOUCHES" = 2 AND "NUM_INTERSECTIONS" = 2
  • Fall 2 (Berührt keine, schneidet sich zweimal):"NUM_TOUCHES" = 0 AND "NUM_INTERSECTIONS" = 2

Im folgenden Screenshot sehen Sie eine Illustration der Instanzen der beiden gefundenen Fälle: ArcMap-Screenshot mit verschiedenen Linienschnitt- / Berührungsbeziehungen

Beachten Sie, dass bei Daten aus der realen Welt Straßensegmente normalerweise an Kreuzungen aufgeteilt werden und Baumelungen nur auftreten, wenn Straßen wie an einer Kreuzung oder Brücke übereinander verlaufen. Normalerweise haben Sie also die gleiche Anzahl von Features, die sich überschneiden wie das Berühren.

Für den allgemeineren Fall möchten Sie möglicherweise nach Baumeln suchen, indem Sie prüfen, ob "NUM_INTERSECTIONS" > "NUM_TOUCHES".

blah238
quelle
Danke für die ausführliche Antwort. Ich habe ein kleines Problem damit, es in ein Skript-Tool umzuwandeln (es friert ein, wenn ich versuche, eine Ebene auszuwählen), aber ich bin zuversichtlich, dass der Ansatz gültig ist.
Mvexel
Noch ein Kommentar: Ich musste die Länge des Feldnamens auf weniger als 10 Zeichen reduzieren (wahrscheinlich, weil die Ebenenquelle ein Shapefile ist).
Mvexel
Es scheint eine URL zu einem ArcGIS-Dokumentationsbild zu geben, das zu Beginn dieser Antwort vom Weg abgekommen ist.
PolyGeo
@PolyGeo welches? Scheint mir in Ordnung zu sein.
blah238
Das ist komisch, das erste Bild (in der vierten Zeile) wurde gestern als kleines Kreuz gezeigt. Heute sieht es gut aus. Ich glaube, ich habe es im Browser gesehen (den ich jetzt benutze) und nicht im iOS-Client, den ich oft benutze.
PolyGeo
2

Geteilte Linie an Eckpunkten (Datenverwaltung)

"Erstellt eine Feature-Class mit Linien, die durch Teilen von Eingabezeilen oder Polygongrenzen an ihren Scheitelpunkten generiert werden."

Attribution beibehalten.

Geben Sie hier die Bildbeschreibung ein

http://help.arcgis.com/de/arcgisdesktop/10.0/help/index.html#//00170000003z000000

Mapperz
quelle
Ich bin mir nicht sicher, wie mir das helfen wird, aber mir ist klar, dass ich hätte klären können, was ich brauche, um ein bisschen besser zu werden. Die Frage wurde bearbeitet.
Mvexel
-1

Wie wäre es, wenn Sie den Feature-Layer kopieren, die Linien zuschneiden und dann den zugeschnittenen Feature-Set mit dem Original vergleichen, um die geänderten Features zu finden? Nicht schön, erfordert mit ziemlicher Sicherheit die Verwendung von Python, scheint aber zu funktionieren.

Llaves
quelle
-1

Sie können auch die Knoten des Netzwerks extrahieren. In Fall 1 würden Sie 2 Knoten mit einer Wertigkeit von 4 erhalten. In Fall 2 gibt es keine Knoten.

Hornbydd
quelle
Können Sie vorschlagen, wie dies in ArcGIS gemacht wird?
blah238
Sie können ein Skript oder ein Tool verwenden, um der Polylinie eindeutige IDs hinzuzufügen, die die Knoten von und zu sind. Ich weiß, dass Archydro das tut, aber ich bin mir sicher, dass es auf der arcscripts-Website Skripte gibt, die das tun. Dann könnten Sie das Frequenzwerkzeug auf nicht programmierende Weise auf dem Feld from und dann auf dem Feld to node ausführen und diese summieren. Dadurch erhalten Sie eine Knotenvalenz, die Sie mit einer Punktebene verbinden können, die die Knoten darstellt.
Hornbydd