Czy odróżniasz linie przecinające się od linii, które się dotykają?


9

Jak odróżnić te przypadki w ArcGIS 10?

  • Przypadek 1 : Oba punkty końcowe linii dotykają innej linii
  • Przypadek 2 : Oba punkty końcowe zwisają nad przecinającymi się liniami

Patrzę na funkcję Trim Line, ale nie tego chcę (destrukcyjne).

Rzeczywistym przykładem użycia jest rozróżnienie między drogami usługowymi łączącymi obie jezdnie autostrady, a innymi przypadkami dróg przecinających się z autostradami.

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Odpowiedzi:


13

W przypadku pojedynczej funkcji na raz możesz to zrobić dość interaktywnie, korzystając z normalnego okna dialogowego Wybierz według lokalizacji , używając następującego klucza jako przewodnika po typach relacji przestrzennych dla nakładek liniowych (z Wybierz według lokalizacji: przykłady graficzne ):

wizerunek
(źródło: arcgis.com )

Wybierz linię za pomocą linii

INTERSECT A, C, D, E, F, G, H, I, J

ZAWIERA G, H

COMPLETELY_CONTAINS G

CONTAINS_CLEMENTINI G, H

W CIĄGU F, H

COMPLETELY_WITHIN F.

WITHIN_CLEMENTINI F, H

ARE_IDENTICAL_TO H

BOUNDARY_TOUCHES C, E

Odpowiednimi typami relacji w tym przypadku są INTERSECTi BOUNDARY_TOUCHES. Jak widać na powyższym schemacie, możesz użyć BOUNDARY_TOUCHESfunkcji, które dotykają punktu końcowego linii. Jeśli wybrano dokładnie dwie funkcje, masz Przypadek 1. Jeśli żadna inna cecha nie zostanie dotknięta, ale tylko przez nią przecięta, BOUNDARY_TOUCHESnic nie wybierze. INTERSECTwybierze wszystkie przecinające się obiekty niezależnie od tego, czy dotykają punktu końcowego, czy nie. Jeśli więc wiesz, że nie ma żadnych elementów dotykających punktów końcowych, ale zauważysz, że istnieją przecinające się elementy, to masz przypadek 2.

Aby zautomatyzować ten proces, możesz użyć następującego skryptu Python (w razie potrzeby zaimplementuj go jako narzędzie skryptowe ), aby obliczyć liczbę dotknięć i przecięć dla każdej operacji w klasie lub warstwie operacji:

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)

Po uruchomieniu można łatwo wyszukać funkcje dotykające dokładnie dwa razy i przecinające się dokładnie dwa razy (Przypadek 1) oraz te, które dotykają 0 razy i przecinają się dokładnie dwa razy (Przypadek 2).

Przykładowe zapytania dotyczące definicji:

  • Przypadek 1 (Dotyka dwa razy, przecina się dwa razy):"NUM_TOUCHES" = 2 AND "NUM_INTERSECTIONS" = 2
  • Przypadek 2 (nie dotyka żadnego, przecina się dwa razy):"NUM_TOUCHES" = 0 AND "NUM_INTERSECTIONS" = 2

Poniższy zrzut ekranu ilustruje przypadki znalezienia dwóch przypadków: Zrzut ekranu ArcMap pokazujący różne relacje przecięcia linii / dotyku

Należy pamiętać, że w przypadku danych ze świata rzeczywistego odcinki ulic są zwykle rozbijane na skrzyżowaniach, a zawieszki występują tylko wtedy, gdy drogi mijają się jak na skrzyżowaniu lub moście. Zwykle masz taką samą liczbę funkcji przecinających się jak dotykanie.

W bardziej ogólnym przypadku możesz poszukać zwisów, sprawdzając, czy "NUM_INTERSECTIONS" > "NUM_TOUCHES".


Dziękuję za wyszukaną odpowiedź. Mam trochę problemów z przekształceniem go w narzędzie skryptowe (zawiesza się, gdy próbuję wybrać warstwę), ale jestem pewien, że to podejście jest prawidłowe.
mvexel

Jeszcze jeden komentarz: musiałem zmniejszyć długość nazwy pola do mniej niż 10 znaków (prawdopodobnie dlatego, że źródłem warstwy jest plik kształtów).
mvexel

Wydaje się, że istnieje adres URL obrazu dokumentacji ArcGIS, który zbłądził na początku tej odpowiedzi.
PolyGeo

@PolyGeo który? Wydaje mi się w porządku.
blah238

To dziwne, że pierwsze zdjęcie (na czwartej linii) pokazywało się wczoraj jako mały krzyż. Dziś wygląda dobrze. Myślę, że widziałem to w przeglądarce (której używam teraz), a nie w kliencie iOS, którego często używam.
PolyGeo


-1

Co powiesz na skopiowanie warstwy elementów, przycięcie linii, a następnie porównanie przyciętego zestawu elementów z oryginałem, aby znaleźć zmienione elementy? Nie jest ładny, prawie na pewno wymaga użycia Pythona, ale wydaje się, że powinien działać.


-1

Możesz także wyodrębnić węzły sieci. W przypadku 1 otrzymujesz 2 węzły o wartościowości 4. W przypadku 2 nie ma żadnych węzłów.


Czy możesz zasugerować, jak to zrobić w ArcGIS?
blah238,

Możesz użyć komuś skryptu lub narzędzia, aby dodać unikalne identyfikatory do polilinii, które są od i do węzłów. Wiem, że Archydro to robi, ale jestem pewien, że na stronie arcscripts znajdują się skrypty. Następnie w nieprogramowalny sposób można uruchomić narzędzie częstotliwości w polu od, a następnie w polu do węzła i zsumować je, daje to wartościowość węzła, którą można ponownie połączyć z warstwą punktową reprezentującą węzły.
Hornbydd
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.