Untuk satu fitur pada satu waktu, Anda dapat melakukan ini dengan cukup mudah secara interaktif menggunakan dialog Select By Location yang normal , menggunakan tombol berikut sebagai panduan untuk tipe hubungan spasial untuk overlay garis-garis (dari Select by Location: contoh grafik ):
(sumber: arcgis.com )
Pilih jalur menggunakan jalur
BERHUBUNGAN A, C, D, E, F, G, H, I, J
MENGANDUNG G, H
COMPLETELY_CONTAINS G
CONTAINS_CLEMENTINI G, H
DALAM F, H
COMPLETELY_WITHIN F
WITHIN_CLEMENTINI F, H
ARE_IDENTICAL_TO H
BOUNDARY_TOUCHES C, E
Jenis hubungan yang relevan dalam kasus ini adalah INTERSECT
dan BOUNDARY_TOUCHES
. Seperti yang dapat Anda lihat dari diagram di atas, Anda dapat menggunakan BOUNDARY_TOUCHES
untuk memilih fitur yang menyentuh titik akhir garis. Jika tepat dua fitur dipilih maka Anda memiliki Case 1. Jika fitur tidak disentuh oleh fitur lain tetapi hanya berpotongan dengan mereka, maka tidak BOUNDARY_TOUCHES
akan memilih apa pun. INTERSECT
akan memilih semua fitur yang berpotongan terlepas dari apakah mereka menyentuh pada titik akhir atau tidak. Jadi jika Anda tahu tidak ada fitur yang menyentuh titik akhir, tetapi Anda menemukan ada fitur yang berpotongan, maka Anda memiliki Case 2.
Untuk mengotomatiskan proses Anda dapat menggunakan skrip Python berikut (mengimplementasikan sebagai alat skrip jika diinginkan) untuk menghitung jumlah sentuhan dan persimpangan untuk setiap fitur dalam kelas fitur atau lapisan:
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)
Setelah itu berjalan, Anda dapat dengan mudah meminta fitur yang menyentuh tepat dua kali dan berpotongan tepat dua kali (Kasus 1), dan yang menyentuh 0 kali dan berpotongan tepat dua kali (Kasus 2).
Contoh pertanyaan definisi:
- Kasus 1 (Menyentuh dua kali, memotong dua kali):
"NUM_TOUCHES" = 2 AND "NUM_INTERSECTIONS" = 2
- Kasus 2 (Tidak menyentuh, berpotongan dua kali):
"NUM_TOUCHES" = 0 AND "NUM_INTERSECTIONS" = 2
Lihat screenshot di bawah ini untuk ilustrasi contoh dua kasus yang ditemukan:
Perhatikan bahwa dengan data dunia nyata, biasanya ruas jalan rusak di persimpangan, dan menggantung hanya terjadi ketika jalan melewati satu sama lain seperti di persimpangan atau jembatan. Jadi biasanya Anda memiliki jumlah fitur yang sama seperti sentuhan.
Untuk kasus yang lebih umum, Anda mungkin ingin mencari dangles dengan memeriksa apakah "NUM_INTERSECTIONS" > "NUM_TOUCHES"
.