LineJoiner di FME

8

Saya punya banyak objek garis. Beberapa dari mereka lebih kecil dari beberapa kriteria.

Saya ingin menggabungkan semua garis atau segmen garis yang lebih kecil yang lebih kecil daripada 1 metergaris yang lebih besar, menjaga atribut garis yang lebih besar.

Ada saran?

Saya mencoba menggunakan Tester pertama untuk memeriksa panjang objek garis (jika lebih kecil dari 1 m), dan dari output yang lewat pergi ke LineJoiner. Tetapi sebenarnya tidak ada yang terjadi, dan garis-garis yang berasal dari port keluaran LineJoiner tidak memiliki atribut sebagai garis sebelumnya (sebagaimana seharusnya). Mungkin saya terlalu rumit, tapi saya pikir ini akan menjadi tugas yang mudah.

Z77
sumber
Bisakah Anda menjelaskan - apakah Anda ingin garis yang lebih besar untuk mengambil atribut dari garis yang lebih kecil yang mereka bergabung?
GIS-Jonathan
Berlawanan :) Saya perlu garis yang lebih kecil untuk bergabung lebih besar (1 + 5 = 6).
Z77
Saya tahu Anda ingin menggabungkan garis, tetapi apa yang Anda inginkan terjadi pada atribut? Apakah Anda ingin mempertahankan atribut untuk garis yang lebih besar seperti aslinya atau apakah Anda ingin menggunakan atribut dari garis yang lebih kecil untuk baru garis besar?
GIS-Jonathan
Simpan atribut dari garis yang lebih besar.
Z77

Jawaban:

7

Anda dapat menggunakan LineJoinertransformator dengan parameter List Name. Tetapi Anda perlu melakukan beberapa pemrosesan data tambahan:

  1. Gunakan LengthCalculatoruntuk menghitung panjang.
  2. Gunakan Sorteruntuk mengurutkan garis Anda berdasarkan panjang (pengurutan numerik, turun).
  3. Gunakan LineJoineruntuk bergabung dengan garis. Yang terbesar lebih dulu (terima kasih ke langkah 2). Tentukan parameter List Namedari LineJoiner- beberapa nama untuk atribut daftar baru.
  4. Gunakan ListIndexerdengan indeks daftar 0 - untuk mendapatkan fitur bergabung pertama (yang terbesar) atribut dari daftar.

Berikut ini tampilannya: contoh model

EDIT1:

Agar hanya dapat bergabung dengan fitur <1m ke yang lebih besar, kita juga perlu menggunakan:

  1. Tester transformator setelah LengthCalculator dengan tes: _length < 1
  2. Gunakan SpatialFilter(tes untuk melakukan parameter TOUCHES:) setelah Tester untuk memfilter hanya fitur yang menyentuh fitur <1m. Kemudian lakukan sambungan garis pada mereka bersama-sama dengan fitur <1m. Fitur yang tidak menyentuh <1m, langsung ke keluaran (atau pemrosesan lebih lanjut).

Model: model2

EDIT2:

Jika Anda memiliki garis <1m yang menyentuh dua garis besar maka mereka semua akan bergabung bersama. Jika case seperti itu (<1m fitur menyentuh dua atau lebih besar) adalah mungkin dalam data Anda maka Anda harus menambahkan beberapa pemrosesan case seperti itu. Lihatlah parameter Merge Attributesdan Attribute Prefixtransformator SpatialFilter. Dengan menggunakan parameter ini Anda harus dapat mendeteksi kasus-kasus seperti itu dan kemudian melakukan beberapa penyaringan tambahan.

EDIT3:

Mari kita selesaikan kasus ini ketika Anda memiliki dua garis besar yang menyentuh satu kecil (<1m). Kita hanya perlu mengambil satu dari garis besar untuk berpartisipasi dalam bergabung dengan yang kecil.

Untuk dapat melakukan penyaringan seperti itu, kita harus menandai dua fitur besar ini dengan beberapa id dari yang kecil yang mereka sentuh. Sebagaimana dinyatakan dalam EDIT2, itu dapat dilakukan dalam SpatialFiltertransformator menggunakan parameter Merge Attributesdan Attribute Prefix.

Kemudian gunakan transformator DuplicateRemoveruntuk memfilter fitur duplikat tersebut (dua besar) dan hanya mengambil satu saja.

Petunjuk: coba gunakan Inspectortransformator selama membuat model Anda dan lihat hasil antara dalam hal apa pun yang tidak jelas bagi Anda. Sedemikian rupa Anda akan lebih memahami bagaimana masing-masing transformer bekerja. Eksperimen dengan data Anda! :)

Alex Markov
sumber
Baik. Terima kasih atas tanggapan. Saya akan coba ini juga.
Z77
1
Oke, ini tugas yang lebih rumit. Saya telah memperbarui jawaban saya. Ide adalah menggunakan SpatialFilter dan menguji fitur SENTUH. Sedemikian rupa, kami dapat memasok ke LineJoiner hanya <1m fitur dan fitur yang mereka sentuh.
Alex Markov
1
Menyadari bahwa kasus yang lebih rumit adalah mungkin dan menambahkan beberapa info. Lihatlah.
Alex Markov
1
Selanjutnya memperbarui jawaban saya. Lihatlah.
Alex Markov
1
Dengan Sorterkami memberlakukan fitur dengan panjang lebih dulu LineJoinerdan kemudian atributnya akan dengan indeks "0" di daftar (lihat parameter List Name) dan kemudian kita bisa memindahkannya ke atribut utama fitur ( ListIndexer). Kalau tidak, Anda dapat memperoleh hasil di mana atribut fitur kecil akan "mendominasi". Anda dapat melihat tidak ada perbedaan jika fitur besar duluan, tetapi saya tidak akan mengaitkannya.
Alex Markov