ArcGIS 10: Buat layer acara linear dari layer titik berdasarkan directionality

8

Saya memiliki lapisan titik yang mencerminkan batas kecepatan dan lapisan garis jalan. Lokasi tanda kecepatan menunjukkan ke arah mana batas kecepatan berlaku.

Bagaimana saya bisa membuat tabel acara linier di atas lapisan jalan yang mencerminkan kecepatan? Jadi untuk setiap segmen, kembalikan dua atribut kecepatan, satu untuk setiap arah.

Lapisan kecepatan / jalan

dassouki
sumber
Bisakah Anda mengklarifikasi "Lokasi tanda kecepatan menunjukkan ke arah mana batas kecepatan berlaku"? Apakah ini berarti bahwa jika titik ada di sisi kanan jalan (berdasarkan arah jalan), kecepatan berlaku untuk jalur kanan? Seberapa dekat dengan jalan terletak titik?
Stephen Lead
@StephenLead Ya, titik tanda terletak 1 hingga 5 m dari lapisan garis untuk menunjukkan ke arah mana kecepatan berlaku
dassouki
Apakah ada atribut lain yang disimpan dengan rambu-rambu jalan? Kedengarannya Anda harus menjepretnya ke jalan terlebih dahulu lalu memindahkan arah jalan ke rambu lalu memotong garis oleh simpul dan mentransfer nilai atribut dari rambu ke setiap segmen. Hanya sebuah ide. Mungkin bisa membantu jika Anda memposting data.
Jakub Sisak GeoGraphics
@ Yakub satu-satunya atribut yang saya inginkan dari tanda jalan adalah "posted_speed". Lapisan tanda tidak memiliki informasi tentang arah
dassouki
Apakah napas memiliki atribut lain selain kecepatan? Saya bertanya karena mungkin ada sesuatu yang bisa menghubungkan rambu ke jalan. Kalau tidak, apa yang ingin Anda lakukan tidak mungkin dilakukan tanpa membentangkan rambu-rambu secara manual ke ruas-ruas jalan, mentransfer atribut, dan memisahkan ruas-ruas jalan. (Anda bisa melakukan ini secara terprogram tetapi jaraknya bervariasi sehingga otomatisasi penuh tidak mungkin dilakukan) Hasilnya tidak akan berupa tabel yang berdiri sendiri melainkan tabel atribut tempat semua informasi ini akan ditransfer.
Jakub Sisak GeoGraphics

Jawaban:

3

Untuk lapisan peristiwa rute linear, Anda perlu membuat tabel yang berisi ID rute dan nilai m awal dan akhir.

Jika jalan Anda tidak memiliki nilai m, Anda bisa membuat rute menggunakan alat buat rute .

Langkah kedua adalah mengekstraksi nilai-m dari jalan Anda untuk setiap titik, yang dapat dilakukan dengan fitur temukan di sepanjang jalan . Jika saya melihat dengan baik pada sosok Anda, titik-titik tersebut terletak di sisi jalan yang sama jika mereka memiliki arah yang sama. Ini bagus karena Anda kemudian memiliki jarak positif atau negatif yang memberi tahu Anda di sisi mana Anda berada.

Cara termudah untuk langkah terakhir adalah di Microsoft Excel:

  • Urutkan poin Anda dengan roadIDdan dengan tanda jarak ke rute
  • Tambahkan kolom baru dengan m-valuetitik berikutnya (atau titik sebelumnya, tergantung pada arahnya).
  • Akan ada satu nilai yang hilang di akhir yang harus diisi dengan 0 atau maksimum m-valuesegmen.

EDIT: setelah pengurutan, meja Anda akan terlihat seperti ini

 pointID RoadID mvalue dist speed
 15      2      25     1    80
 25      2      30     1    50
 87      2      45     12   70
 etc

Anda melihat bahwa poin diurutkan berdasarkan nilai-m. Kolom ketiga dalam kasus saya akan menjadi awal acara. layer acara baru harus memiliki a fromdan tobidang. Jadi dalam contoh saya akan terlihat seperti:

pointID RoadID from to speed
15      2      25   30   80    
25      2      30   45   50    
87      2      45   max  70

ke arah lain, itu akan menjadi

pointID RoadID from to speed    
15      2      0    25   80    
25      2      25   30   50    
87      2      30   45   70

Anda kemudian dapat membuat lapisan acara Anda menggunakan tanda sebagai bidang offset untuk menemukan batasan kecepatan di sisi yang benar dari rute.

radouxju
sumber
Sejauh ini ini bekerja lebih baik daripada solusi lainnya. Bisakah Anda menjelaskan bagian excel tentang menambahkan poin sebelumnya dan selanjutnya lebih lanjut?
dassouki
3

Saya tidak punya cukup perwakilan untuk berkomentar, tetapi pertanyaan saya adalah apakah jalan sudah ada di segmen yang sesuai dengan zona kecepatan, yaitu apakah setiap segmen umumnya memiliki 1 kecepatan yang terkait dengannya per sisi, atau lebih dari satu.

Bagaimanapun, inilah saran saya, meskipun bergantung pada Anda memiliki tingkat lisensi yang akan memungkinkan penyangga satu sisi (lanjutan / ArcInfo, saya percaya). Prinsipal yang serupa dapat diterapkan dengan alat-alat dasar, tetapi akan lebih kompleks. Juga, saya berharap ini akan membutuhkan waktu untuk menjalankan ...

import arcpy
def TakeOutTrash(dataset):
    if arcpy.Exists(dataset):
        arcpy.management.Delete(dataset)
roads = "path/to/roads" #make sure it's in a projected crs with meter units
buff_right = "path/to/new/buffer/feature/class1" #new gdb feature class
buff_left = "path/to/new/buffer/feature/class2" #new gdb feature class
arcpy.analysis.Buffer(roads,buff_right,6,"RIGHT","FLAT")
arcpy.analysis.Buffer(roads,buff_left,6,"LEFT","FLAT")

Sekarang Anda memiliki penyangga untuk setiap sisi jalan, yaitu 6 meter dari garis tengah, yang harus mencakup semua rambu. Anda dapat melakukan pemilihan dengan lokasi yang mudah untuk memastikan bahwa ini adalah masalahnya, dan jika tidak, jalankan kembali operasi buffer dengan 1 atau 2 meter ekstra.

Lanjut:

final_dict = {}
buffers = [buff_right, buff_left]
for i, buffer in enumerate(buffers):
    rows1 = arcpy.SearchCursor(buffer)
    for row1 in rows1:
        final_dict[seg] = [[],[]]
        seg = str(row1.getValue("seg_num"))
        TakeOutTrash("fl")
        fl = arcpy.management.MakeFeatureLayer(buffer,"fl",'"seg_num" = ' + seg)
        arpcpy.management.SelectLayerByLocation(signs,"INTERSECT",fl)
        rows2 = arcpy.SearchCursor(signs)
        for row2 in rows2:
            final_dict[seg][i].append(row2.getValue("posted_speed"))

Jadi sekarang Anda memiliki kamus dalam format ini:

"seg_num":[[list of speeds on the right],[list of speeds on the left]]

dari mana Anda dapat melakukan apa pun yang Anda suka, misalnya:

for k,v in final_dict.iteritems():
    print "road segment {0}:".format(str(k))
    print "   speeds on right: {0}".format(", ".join(v[0]))
    print "   speeds on left: {0}".format(", ".join(v[1]))

Atau hanya menguji berapa banyak kecepatan yang ada di setiap sisi segmen, atau menulisnya ke bidang di kelas fitur jalan asli, dll. Sekali lagi, tidak yakin apakah ini bisa menjadi solusi akhir dengan data yang Anda miliki, tetapi bisa tentu bekerja sebagai bagian dari itu. Saya bisa melihatnya digunakan bersamaan dengan proses gertakan / pemisahan yang dijelaskan di atas.

Untuk menulis ke lapisan jalan, Anda bisa membuat dua bidang baru, SPD_RIGHT dan SPD_LEFT, dan untuk saat ini (kecuali Anda tahu pasti bahwa hanya ada satu kecepatan per segmen) buatkan bidang teks. Kemudian:

urows = arcpy.UpdateCursor(roads)
for row in urows:
    seg = row.getValue("seg_num")
    right_speeds = ", ".join(final_dict[seg][0])
    left_speeds = ", ".join(final_dict[seg][1])
    row.setValue("SPD_RIGHT",right_speeds)
    row.setValue("SPD_LEFT",left_speeds)
    urows.updateRows(row)

Tentu saja, ideal untuk hanya memiliki satu kecepatan per segmen, tetapi itu kembali ke pertanyaan awal tentang bagaimana segmen saat ini terpecah.

mr.adam
sumber
Sekarang Anda punya poin untuk berkomentar; di mana lapisan kecepatan muncul? Apakah saya salah mengerti perintah buffer Anda?
dassouki
ok saya menambahkan sedikit lebih banyak ke jawabannya. Saya harap saya mengerti apa yang Anda cari.
mr.adam
segmen dan kecepatan mungkin tidak terpecah dengan cara yang sama seperti data dikumpulkan oleh dua entitas yang berbeda; lebih jauh, suatu segmen dapat memiliki kecepatan yang berbeda di kedua arah.
dassouki
Ok, saya berpikir sekarang bahwa cara yang lebih baik untuk melakukan ini adalah pertama-tama lakukan saja buffer sisi kanan, 6m atau sesuatu, dan kemudian pilih tanda-tanda yang termasuk di dalamnya dan ekstrak mereka ke kelas fitur titik baru. Dengan begitu Anda bisa memiliki kelas fitur untuk tanda-tanda sisi kanan dan satu untuk tanda-tanda sisi kiri.
mr.adam
Jawaban Jakub dalam komentar adalah tempat yang baik untuk memulai dalam hal mendefinisikan segmen yang baik, dan itu bisa ditambah dengan milikku untuk menghubungkan kecepatan ke arah jalan.
mr.adam