สำหรับฟีเจอร์เดียวในแต่ละครั้งคุณสามารถทำสิ่งนี้ได้อย่างง่ายดายโต้ตอบโดยใช้กล่องโต้ตอบเลือกตามตำแหน่งโดยใช้ปุ่มต่อไปนี้เป็นแนวทางสำหรับประเภทของความสัมพันธ์เชิงพื้นที่สำหรับการวางซ้อนบรรทัดบนบรรทัด (จากเลือกตามตำแหน่ง: ตัวอย่างกราฟิก ):
(ที่มา: arcgis.com )
เลือกบรรทัดโดยใช้บรรทัด
การเชื่อมต่อ A, C, D, E, F, G, H, I, J
มี G, H
COMPLETELY_CONTAINS G
CONTAINS_CLEMENTINI G, H
ภายใน F, H
COMPLETELY_WITHIN ฉ
WITHIN_CLEMENTINI F, H
ARE_IDENTICAL_TO H
BOUNDARY_TOUCHES C, E
ประเภทความสัมพันธ์ที่เกี่ยวข้องในกรณีนี้และINTERSECT
BOUNDARY_TOUCHES
ดังที่คุณเห็นจากแผนภาพด้านบนคุณสามารถใช้BOUNDARY_TOUCHES
เพื่อเลือกคุณสมบัติที่สัมผัสจุดสิ้นสุดของเส้น หากมีการเลือกคุณสมบัติสองประการอย่างแน่นอนคุณจะมี Case 1 ของคุณอยู่หากคุณลักษณะไม่ได้ถูกแตะต้องโดยคุณสมบัติอื่นใด แต่ถูกตัดกันโดยคุณสมบัติเหล่านั้นBOUNDARY_TOUCHES
เท่านั้นจะไม่เลือกอะไรเลย INTERSECT
จะเลือกคุณสมบัติทั้งหมดที่ตัดกันโดยไม่คำนึงว่าจะแตะที่จุดปลายหรือไม่ ดังนั้นถ้าคุณรู้ว่าไม่มีฟีเจอร์ที่แตะต้องปลายทาง แต่คุณพบว่ามีฟีเจอร์ที่ตัดกันคุณก็มีเคส 2 ของคุณ
ในการทำให้กระบวนการเป็นอัตโนมัติคุณสามารถใช้สคริปต์ Python ต่อไปนี้ (ใช้เป็นเครื่องมือสคริปต์หากต้องการ) เพื่อคำนวณจำนวนการสัมผัสและทางแยกสำหรับแต่ละคุณลักษณะในคลาสหรือเลเยอร์คุณลักษณะ:
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)
คุณสามารถค้นหาคุณสมบัติที่แตะสองครั้งและตัดกันสองครั้ง (กรณีที่ 1) และสัมผัสที่ 0 ครั้งและตัดสองครั้ง (กรณีที่ 2)
ตัวอย่างข้อความค้นหาคำจำกัดความ:
- กรณีที่ 1 (สัมผัสสองครั้งตัดกันสองครั้ง):
"NUM_TOUCHES" = 2 AND "NUM_INTERSECTIONS" = 2
- กรณีที่ 2 (ไม่แตะเลยตัดสองครั้ง):
"NUM_TOUCHES" = 0 AND "NUM_INTERSECTIONS" = 2
ดูภาพหน้าจอด้านล่างสำหรับภาพประกอบของอินสแตนซ์ของทั้งสองกรณีที่พบ:
โปรดทราบว่าด้วยข้อมูลในโลกแห่งความเป็นจริงโดยปกติส่วนของถนนจะถูกแยกออกเป็นสี่แยกและ dangles จะเกิดขึ้นเฉพาะเมื่อถนนผ่านอีกทางหนึ่งเช่นที่ทางแยกหรือสะพาน ดังนั้นโดยปกติคุณจะมีจำนวนฟีเจอร์เท่ากันตัดกับการสัมผัส
สำหรับกรณีทั่วไปมากขึ้นคุณอาจต้องการที่จะมองหา dangles ใด ๆ "NUM_INTERSECTIONS" > "NUM_TOUCHES"
โดยการตรวจสอบว่า