Đối với một tính năng tại một thời điểm, bạn có thể thực hiện điều này khá dễ dàng bằng cách sử dụng hộp thoại Chọn theo vị trí thông thường , sử dụng phím sau làm hướng dẫn cho các loại mối quan hệ không gian cho lớp phủ trên dòng (từ Chọn theo Vị trí: ví dụ đồ họa ):
(nguồn: arcgis.com )
Chọn dòng sử dụng dòng
TƯƠNG TÁC A, C, D, E, F, G, H, I, J
CONTAIN G, H
COMPLETELY_CONTAIN G
CONTAIN_CLEMENTINI G, H
TRONG VÒNG F, H
COMPLETELY_WITHIN F
VỚIIN_CLMENTINI F, H
IS_IDENTICS_TO H
BOUNDARY_TOUCHES C, E
Các loại mối quan hệ có liên quan trong trường hợp này là INTERSECT
và BOUNDARY_TOUCHES
. Như bạn có thể thấy từ sơ đồ trên, bạn có thể sử dụng BOUNDARY_TOUCHES
để chọn các tính năng chạm vào điểm cuối của dòng. Nếu chính xác hai tính năng được chọn thì bạn có Case 1. Nếu một tính năng không bị bất kỳ tính năng nào khác chạm vào mà chỉ giao nhau với chúng, thì BOUNDARY_TOUCHES
sẽ không chọn gì. INTERSECT
sẽ chọn tất cả các tính năng giao nhau bất kể chúng có chạm vào điểm cuối hay không. Vì vậy, nếu bạn biết không có tính năng nào chạm vào điểm cuối, nhưng bạn thấy có những tính năng giao nhau, thì bạn có Trường hợp 2 của bạn.
Để tự động hóa quy trình, bạn có thể sử dụng tập lệnh Python sau (triển khai như một công cụ tập lệnh nếu muốn) để tính toán số lần chạm và giao điểm cho từng tính năng trong một lớp hoặc lớp tính năng:
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)
Khi đã chạy, bạn có thể dễ dàng truy vấn các tính năng chạm chính xác hai lần và giao nhau chính xác hai lần (Trường hợp 1) và các tính năng chạm 0 lần và giao nhau chính xác hai lần (Trường hợp 2).
Các truy vấn định nghĩa ví dụ:
- Trường hợp 1 (Chạm hai lần, giao nhau hai lần):
"NUM_TOUCHES" = 2 AND "NUM_INTERSECTIONS" = 2
- Trường hợp 2 (Không chạm vào, giao nhau hai lần):
"NUM_TOUCHES" = 0 AND "NUM_INTERSECTIONS" = 2
Xem ảnh chụp màn hình bên dưới để biết minh họa về các trường hợp của hai trường hợp được tìm thấy:
Lưu ý rằng với dữ liệu trong thế giới thực, thông thường các đoạn đường bị phá vỡ tại các giao lộ và các nguy hiểm chỉ xảy ra khi các đường đi qua nhau như tại một nút giao hoặc cầu. Vì vậy, thông thường bạn có cùng số lượng các tính năng giao nhau như chạm.
Đối với trường hợp tổng quát hơn, bạn có thể muốn tìm kiếm bất kỳ nguy hiểm nào bằng cách kiểm tra xem "NUM_INTERSECTIONS" > "NUM_TOUCHES"
.