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 ):
(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 INTERSECT
ve ş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_TOUCHES
hiçbir şey seçmez. INTERSECT
bir 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:
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"
.