Temas eden çizgilerle kesişen çizgiler?


9

ArcGIS 10'daki bu vakaları nasıl ayırt edebilirim?

  • Durum 1 : Bir çizginin her iki uç noktası başka bir çizgiye değiyor
  • Durum 2 : Her iki uç nokta da kesiştiği çizgiler üzerinde sallanıyor

Trim Line fonksiyonuna bakıyorum ama istediğim bu değil (yıkıcı).

Gerçek dünya kullanım durumu, bir otoyolun her iki yolunu birbirine bağlayan servis yolları ile otoyollarla kesişen diğer yollar arasındaki farkı ayırt etmektir.

resim açıklamasını buraya girin resim açıklamasını buraya girin

Yanıtlar:


13

Her seferinde tek bir özellik için, bunu sıraya göre yer paylaşımları için uzamsal ilişki türleri için bir kılavuz olarak normal Yere Göre Seç iletişim kutusunu kullanarak kolayca etkileşimli olarak yapabilirsiniz (Yere Göre Seç: grafik örnekleri ):

görüntü
(kaynak: arcgis.com )

Satırı kullanarak satırı seçin

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

G, H İÇERİR

TAMAMLANDI_KONTULAR G

CONTAINS_CLEMENTINI G, H

F İÇİNDE, H

TAMAMEN_WITHIN F

WITHIN_CLEMENTINI F, H

ARE_IDENTICAL_TO H

BOUNDARY_TOUCHES C, E

Bu durumda ilgili ilişki türleri INTERSECTve şeklindedir BOUNDARY_TOUCHES. Yukarıdaki şemadan da görebileceğiniz gibi, BOUNDARY_TOUCHESçizginin uç noktasına dokunan özellikleri seçmek için kullanabilirsiniz . Tam olarak iki özellik seçilirse, Vaka 1'iniz olur. Bir özelliğe başka herhangi bir özellik dokunmazsa, yalnızca onlar tarafından kesilirse, BOUNDARY_TOUCHEShiçbir şey seçmez. INTERSECTbir uç noktada dokunup dokunmadıklarına bakılmaksızın kesişen tüm özellikleri seçecektir. Dolayısıyla, uç noktalara dokunan hiçbir özellik olmadığını biliyorsanız, ancak kesişen özellikler olduğunu fark ederseniz, Durum 2'ye sahipsiniz.

İşlemi otomatikleştirmek için , bir özellik sınıfındaki veya katmanındaki her özellik için dokunma ve kavşak sayısını hesaplamak üzere aşağıdaki Python komut dosyasını kullanabilirsiniz ( istenirse komut dosyası aracı olarak uygulayın ):

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)

Bir kez çalıştıktan sonra, tam olarak iki kez dokunan ve tam olarak iki kez kesişen özellikleri (Durum 1) ve 0 kez dokunan ve tam olarak iki kez kesişen özellikleri (Durum 2) kolayca sorgulayabilirsiniz.

Örnek tanım sorguları:

  • Durum 1 (İki kez dokunur, iki kez kesişir):"NUM_TOUCHES" = 2 AND "NUM_INTERSECTIONS" = 2
  • Durum 2 (Hiçbirine dokunmaz, iki kez kesişir):"NUM_TOUCHES" = 0 AND "NUM_INTERSECTIONS" = 2

Bulunan iki vakanın örneklerinin bir örneği için aşağıdaki ekran görüntüsüne bakın: Çeşitli çizgi kesişme / dokunma ilişkilerini gösteren ArcMap ekran görüntüsü

Gerçek dünya verileriyle, normalde sokak segmentlerinin kavşaklarda parçalandığını ve tehlikelerin yalnızca yollar bir kavşakta veya köprüde olduğu gibi birbirinden geçtiğinde meydana geldiğini unutmayın. Normalde dokunma ile kesişen aynı sayıda özelliğe sahip olursunuz.

Daha genel bir durum için, herhangi bir sarkıntı olup olmadığını kontrol etmek isteyebilirsiniz "NUM_INTERSECTIONS" > "NUM_TOUCHES".


Ayrıntılı cevap için teşekkürler. Bir komut dosyası aracına çevirerek küçük bir sorun var (bir katman seçmeye çalıştığınızda donuyor) ama yaklaşımın geçerli olduğundan eminim.
mvexel

Bir yorum daha: Alan adı uzunluğunu 10 karakterden daha azına düşürmek zorunda kaldım (muhtemelen katman kaynağı bir şekil dosyası olduğu için).
mvexel

Bu cevabın başında yanlış giden bir ArcGIS dokümantasyon resmi için bir URL var gibi görünüyor.
PolyGeo

@PolyGeo hangisi? Bana iyi geliyor.
blah238

Bu garip, ilk resim (dördüncü çizgiyle ilgili olacak) dün küçük bir haç olarak gösteriliyordu. Bugün iyi görünüyor. Sanırım sık kullandığım iOS istemcisi yerine tarayıcıda (şimdi kullanıyorum) gördüm.
PolyGeo

2

Tepe Noktalarında Bölünmüş Çizgi (Veri Yönetimi)

"Girdi çizgilerini veya çokgen sınırlarını köşelerinde bölerek oluşturulan satırları içeren bir özellik sınıfı oluşturur"

Atıfta Bulunun.

resim açıklamasını buraya girin

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


Bunun bana nasıl yardımcı olacağından emin değilim, ama biraz daha iyi bir şey elde etmek için neye ihtiyacım olduğunu netleştirebileceğimin farkındayım. Soruyu düzenledi.
mvexel

-1

Özellik katmanını kopyalamaya, satırları kırpmaya, sonra değişen özellikleri bulmak için kırpılan unsurun orijinal ile karşılaştırılmasına ne dersiniz? Güzel değil, neredeyse kesinlikle Python kullanmayı gerektirir, ancak çalışması gerektiği gibi görünüyor.


-1

Ağın düğümlerini de çıkarabilirsiniz. 1 durumunda her biri 4 değerlikli 2 düğüm elde edersiniz. 2 durumunda düğüm yoktur.


Bunu ArcGIS'te nasıl yapabileceğinizi önerebilir misiniz?
blah238

Birden çok noktaya gelen ve noktalardan olan çoklu çizgiye benzersiz kimlikler eklemek için birilerinin komut dosyasını veya aracını kullanabilirsiniz. Archydro bunu biliyorum ama bunu yapmak arcscripts web sitesinde komut dosyaları olduğundan eminim. Daha sonra programlanmayan bir şekilde, frekans aracını from alanında ve daha sonra da düğüm alanında çalıştırabilir ve bunları toplayabilirsiniz, bu size düğümleri temsil eden bir nokta katmanına geri katılabileceğiniz düğüm değeri verir.
Hornbydd
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.