Membedakan garis yang bersinggungan dengan garis yang menyentuh?


9

Bagaimana saya membedakan antara kasus-kasus ini di ArcGIS 10?

  • Kasus 1 : Kedua titik akhir dari suatu garis menyentuh garis yang lain
  • Kasus 2 : Kedua titik akhir menjuntai di atas garis yang bersilangan

Saya melihat fungsi Trim Line tetapi bukan itu yang saya inginkan (destruktif).

Kasus penggunaan dunia nyata adalah untuk membedakan antara jalan layanan yang menghubungkan kedua jalan raya jalan bebas hambatan, dan kasus jalan lain yang bersinggungan dengan jalan raya.

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Jawaban:


13

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 ):

gambar
(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 INTERSECTdan BOUNDARY_TOUCHES. Seperti yang dapat Anda lihat dari diagram di atas, Anda dapat menggunakan BOUNDARY_TOUCHESuntuk 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_TOUCHESakan memilih apa pun. INTERSECTakan 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: Tangkapan layar ArcMap menunjukkan berbagai hubungan persimpangan / sentuhan garis

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".


Terima kasih atas jawaban yang terperinci. Saya memiliki sedikit kesulitan mengubahnya menjadi alat skrip (membeku ketika saya mencoba untuk memilih lapisan) tetapi saya yakin bahwa pendekatan ini valid.
mvexel

Satu komentar lagi: Saya harus mengurangi panjang nama bidang menjadi kurang dari 10 karakter (mungkin karena sumber layer adalah shapefile).
mvexel

Tampaknya ada URL ke gambar dokumentasi ArcGIS yang tersesat di awal jawaban ini.
PolyGeo

@ PolyGeo yang mana? Sepertinya saya baik-baik saja.
blah238

Aneh, gambar pertama (tentang garis keempat) ditunjukkan sebagai salib kecil kemarin. Hari ini terlihat baik-baik saja. Saya pikir saya melihatnya di browser (yang saya gunakan sekarang) daripada klien iOS yang sering saya gunakan.
PolyGeo


-1

Bagaimana dengan menyalin lapisan fitur, memotong garis, lalu membandingkan fitur yang dipangkas diatur ke aslinya untuk menemukan fitur yang telah berubah? Tidak cantik, hampir pasti membutuhkan menggunakan Python, tetapi sepertinya itu harus bekerja.


-1

Anda juga bisa mengekstrak simpul-simpul jaringan. Dalam kasus 1 Anda akan mendapatkan 2 node masing-masing dengan valensi 4. Dalam kasus 2 tidak ada node.


Bisakah Anda menyarankan cara melakukan ini di ArcGIS?
blah238

Anda bisa menggunakan skrip atau alat someones untuk menambahkan id unik ke polyline yang merupakan dari dan ke node. Saya tahu Archydro melakukannya tetapi saya yakin ada skrip di situs web arcscripts yang melakukan itu. Kemudian dengan cara yang tidak terprogram Anda bisa menjalankan alat frekuensi pada bidang dari dan kemudian ke bidang simpul dan menjumlahkannya, ini memberi Anda simpul valensi yang dapat Anda gabungkan kembali ke lapisan titik yang mewakili simpul.
Hornbydd
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.