Haii sume. Topik kali ni agak
panjang lebar sikit. Untuk sesiapa yang selalu buat keje-keje editing or data
processing, sila take note. Kalau baca topik ni lepas buka posa, pi siap2
bancuh kopi dulu. Panjang ni nak bual. Kalau baca time posa, jangan cari
pasal..haha. OK.. tahukah anda, bila kita digitize sesuatu line, line tu akan
ada arah atau direction, bergantung pada arah mana kita digitize? Tu antara
sebab kenapa data tu dipanggil data vektor, macam masa kat sekolah dulu kita
belajar subjek math, cikgu kata vector diwakili segmen garisan yang ada arah.
Haaa termenung je.. lupa la tu..haha.
Tapi tu tak penting. Yang saya
nak story kat sini, direction line dalam data GIS ni kadangkala memberi maksud
sesuatu, contohnya arah aliran sungai, electricity flow dan lain-lain. Dan
kadangkala, sesetengah analisis yang gunakan layer line ni sebagai data input perlukan
kita set direction line yang betul dulu pada setiap line dalam layer tu. Dalam Arcmap
macamana kita nak tgk direction setiap line ni? Caranya, kita boleh gunakan
simbol Arrow untuk draw direction setiap line.
Senarai simbol arrow dalam dialog Symbol Selector ArcMap |
OK, sekarang kita dah tahu macamana nak tengok direction
line dalam ArcMap. Macamana pulak nak betulkan direction line tu kalau arahnya tersilap?
Ada dua cara :-
i) Buat proses Start Editing, kemudian double-click
line yang salah direction, lepas tu right click dan pilih Flip. Tapi cara ni
kena buat satu-satu manually.
ii) Guna geoprocessing tools Flip Line. Cara ni
boleh ubah direction banyak line serentak based on line yang kita select.
Katakan sekarang ni saya ada satu
data layer sungai, dan saya nak check setiap line sungai tu betul tak directionnya.
Nak tahu direction line sungai tu betul ke salah, kita kena faham dulu sifat
sungai. Sungai akan mengalir dari hulu ke hilir, anak-anak sungai mengalir dari
kawasan tinggi ke kawasan rendah seterusnya memasuki sungai-sungai utama yang
lebih lebar. Bila dah faham tu barulah kita boleh tentukan yang mana satu
direction sungai betul dan yang mana salah based on arrow symbol yang
dipaparkan. Lihat contoh gambar di bawah. Sungai dalam bulatan merah menunjukkan
arah sungai yang salah, seolah-olah sungai mengalir ke atas.
Kesalahan arah sungai |
Dalam kes data sungai ni, dengan
melihat pada symbol arrow di atas garisan, kita boleh mengenalpasti yang mana
satu sungai arah betul dan yang mana salah. Untuk membetulkan sungai yang salah
arah tu, kita boleh guna arahan Flip semasa buat editing atau guna tool Flip
Line seperti yang saya mentioned sebelum ni. Tapi kalau data kita ada banyak
line, sanggup ke kita nak semak satu persatu arrow kat line tu? Macam dalam kes
saya ni, ada 66,088 line sungai yang saya nak semak.
66,088 sungai perlu disemak. Banyak tu... |
Fuhh… kerja giler woo kalau nak
check satu-satu sampai berpuluh ribu line. Mau kalau lepas buat keje edit nak
tido malam tengok siling nampak sungai je..hahahah. Takde ke cara yang paling
mudah??
Ada satu cara. Macam saya
terangkan tadi, sungai mengalir dari kawasan tinggi turun ke kawasan rendah.
Jadi secara logiknya, kalau kita boleh tahu nilai ketinggian Z di setiap hujung
garisan sungai, kita boleh buat perbandingan jika nilai Z ending sungai lebih
tinggi dari nilai Z starting sungai, maknanya error la tu, mana boleh sungai
mendaki bukit.
Perhatikan line direction sungai dalam
gambar atas ni. Sungai A didigit dalam arah yang betul, menurun bukit, jadi
ketinggian titik mula digit (Z1) lebih tinggi dari titik akhir digit (Z2).
Sungai B pulak digit arah salah, mendaki bukit, jadi nilai Z dah jadi terbalik, Z1 lebih
rendah dari Z2. Jadi kat sini kita boleh anggap, direction untuk sesuatu line
sungai adalah salah jika Z1 < Z2. Betul tak? Maknanya kalau data sungai kita
tu ada atribut Z1 dan Z2, kita boleh buat carian Z1 < Z2 untuk mencari
sungai yang salah arah dan lepas tu run tool Flip Line utk betulkan semua line
yang salah serentak. Tak perlu le kita cari satu-satu sungai yang salah tu manually.
Teorinya nampak macam senang kan?
Hehehehe. Tapi persoalannya macamana nak dapatkan nilai Z kat setiap hujung
line sungai tu? Dalam kes saya ni ada 66,088 line sungai ... maknanya kalau
satu line sungai ada dua Z (Z1, Z2), saya
kena dapatkan 66,088 x 2 = 132,176 nilai Z. Huhuhu. Wait seminit…don’t panic. Tau
tak, dalam ArcGIS Spatial Analyst kan, ada satu tool yang boleh pindahkan nilai
Z dari raster DEM kepada layer point. Nama tool tu Extract Values to Points.
Cara nak guna tool ni ada saya explain dalam post yang dulu2 kat link sini. Maksudnya, kalau saya ada data raster DEM dan
kalau saya boleh dapatkan point di starting dan ending setiap line sungai, saya
dah boleh dapat dah nilai Z1 dan Z2.
Tapi sebelum saya story lebih
lanjut lagi tentang point starting ending ni, kita ulangkaji sikit asas data
vektor line. Lihat gambar berikut :-
Setiap satu line terbentuk dari
beberapa siri point yang dipanggil vertex. Dikedua-dua hujung line tu pulak
point tu dipanggil Node atau Start Point/First Vertex atau End Point/Last
Vertex, bergantung pada arah line. Saya lebih suka guna istilah Node, sebab
masa saya mula-mula belajar GIS dulu, itulah istilah yang cikgu saya guna. Setiap
line dia akan ada From Node dan To Node merujuk pada arah line.
Kenapa saya terangkan mende ni?
Sebabnya dalam ArcGIS ada satu tool yang dinamakan Feature Vertices to Points.
Tool ni boleh convert data line kita kepada beberapa siri point bergantung pada
jenis opsyen point macamana yang kita pilih dalam tool tu, samada nak semua
vertex ke, first vertex ke, last vertex ke etc. Maksudnya, bila saya run tool
ni, saya bolehlah dapat data point di setiap hujung line sungai, seterusnya
nanti bolehlah saya gunakan point tu untuk ambil nilai Z dari data raster DEM.
Berbalik pada problem saya tadi, untuk
saya kenalpasti arah line sungai yang salah secara serentak, macam ni lah step
yang saya kena buat :-
- Run tool Feature Vertices to Points untuk dapatkan point di kedua-dua hujung line sungai
- Pindahkan nilai Z dari raster DEM kepada layer point tadi
- Joinkan table layer point kepada table layer sungai untuk dapatkan atribut Z dari layer point masuk ke dalam layer sungai.
- Buat carian pada layer sungai : Z1 < Z2
- Run Flip Line untuk betulkan arah
Banyak kan step tu. Tapi biasa
le, dalam GIS ni kadangkala nak dapatkan hasil akhir, kena melalui beberapa step
dan prosedur. Sekarang saya akan terangkan satu persatu step tu.
Jana Layer Point
Mula-mula, kita kena dapatkan
layer point dulu di kedua-dua hujung line sungai, merujuk kepada point start
dan point end. Kita akan hasilkan dua layer point, satu untuk simpan semua
point start dan satu layer lagi untuk simpan semua point end. Faham ye maksud
start dan end tu? Kalau x sure, rujuk balik gambar yang ada penerangan start,
end vertex sebelum ni. Nak hasilkan layer point ni, buat step seperti di bawah
ni :-
Penerangan gambar :
- Melalui ArcToolbox, run tool Data Management Tools > Features > Feature Vertices to Points
- Untuk Input Features, pilih layer line sungai
- Namakan output layer. Dalam contoh ni, saya nak create start point dulu pada setiap line sungai. So saya namakan output saya River_L_Start. (Beri nama yang bersesuaian ni penting supaya nanti anda tak pening kepala bila dah banyak layer anda create)
- Oleh sebab saya nak create start point, saya pilih opsyen START.
- Klik OK.
Ulangi proses yang sama untuk
generate point END pula. Bila dah complete step ni, saya akan ada 2 layer
point, River_L_Start dan River_L_End.
Jana Nilai Z Pada Layer Point
Next, saya akan pindahkan nilai Z
dari raster DEM masuk ke dalam setiap point yang saya jana tadi. Step ni akan
hasilkan satu lagi output layer point, cuma bezanya kali ni layer point yang
dihasilkan ni ada atribut nilai Z. Oleh sebab anda ada 2 layer point (start
point, end point) yang dihasilkan sebelum tadi, anda kena buat step ni 2 kali,
untuk setiap layer point. Stepnya seperti berikut :-
Penerangan gambar :-
- Melalui ArcToolbox, run tool Spatial Analyst Tools > Extraction > Extract Values to Points.
- Untuk Input point features, pilih layer point yang anda baru hasilkan dari step sebelum tadi.
- Pilih layer raster DEM
- Namakan output layer point yang akan dihasilkan. Dalam contoh ni, untuk input point River_L_Start, output saya namakan River_L_Start_Z.
- Klik OK.
Field tambahan RASTERVALU akan
dibina dalam output layer point yang akan menyimpan nilai Z. Ingat ye, kena
buat step ni dua kali, satu untuk layer start point, dan satu lagi untuk layer
end point.
Join Table
Sekarang saya dah ada dua layer
point yang masing2 ada nilai Z yang saya namakan River_L_Start_Z dan
River_L_End_Z. Next, saya kena joinkan dulu table kedua-dua layer point ni ke
table layer sungai. Sebab apa kena join? Sebabnya kita nak buat carian Z pada
layer sungai, bukannya pada layer point. Kalau anda tak berapa faham konsep
join table, boleh rujuk post saya sebelum ini di link sini.
Join table start point (Z1) dan end point (Z2) kepada table sungai |
Untuk join table start point
kepada layer sungai, buat step berikut :-
Penerangan gambar :-
- Right click layer sungai dalam TOC ArcMap dan pilih Join and Relates > Join…
- Pastikan anda pilih option Join attributes from a table
- Pilih field OBJECTID kalau anda guna data geodatabase. Kalau data point anda dalam shapefile, pilih field FID.
- Pilih nama layer start point yang ada nilai Z tadi.
- Pilih field ORIG_FID
- Klik OK.
Ulangi step yang sama untuk join
table end point pula. Setelah selesai join kedua-dua table, buka table layer
sungai tadi. Anda akan nampak hasilnya seperti di bawah ni. Terdapat dua field
RASTERVALU, masing-masing merujuk kepada start point Z dan end point Z.
Carian Line Sungai Salah Arah
Next, buat carian sungai yang
salah arah melalui kaedah Select by Attributes.
Oleh kerana field RASTERVALU tu
kita join ke dalam table sungai, kita akan nampak “nama layer”.RASTERVALU pada
senarai field dalam dialog Select by Attributes. Seperti dalam contoh gambar di
atas, carian yang saya lakukan ialah "River_L_Start_Z.RASTERVALU"
< River_L_End_Z.RASTERVALU
Hasilnya, terdapat 7,860 line
sungai yang salah arah seperti dipapar dalam table di bawah ni.
Terdapat 7,860 dari 66,088 sungai salah arah |
Perghhh banyak tu. Bayangkan
kalau saya nak cari satu-satu manually. OK, persoalannya sekarang, boleh
percaya ke result 7,860 tu? Tepatkah cara kaedah ni? Ketepatan result
sebenarnya bergantung pada ketepatan data DEM anda dan juga ketepatan lokasi
sungai bila anda overlay atas data DEM. Kalau overlay data lari, dah tentu
resultnya pun lari.
Betulkan Arah Sungai
Now kita dah select sungai-sungai
yang salah arah. Macamana nak betulkan menjadi arah yang betul? Caranya run
tool Flip Line dalam ArcToolbox… tapi buat dulu proses Start Editing tau.
Penerangan gambar :-
- Melalui ArcToolbox, run tool Editing Tools > Flip Line
- Pilih layer sungai sebagai input features
- Klik OK.
Selesai sudah. Proses yang
panjang ni sebenarnya anda boleh automate kan kalau anda familiar dengan
ModelBuilder. Semua step tu anda boleh design dalam ModelBuilder. Fuuhhh…. 2
hari nak prepare tutorial ni. Harap-harap topik yang dikongsi bermanfaat untuk
anda.
Selamat mencuba.