Adakah anda seorang programmer?? Kalau bukan programmer pun tak apa, tapi berminat tak nak ubah sikit-sikit interface ArcMap anda, maybe nak buat custom menu ke, custom button ke. Kali ini saya akan terangkan serba sedikit mengenai konsep customize interface di dalam ArcGIS.
Sebelum itu saya bagi dulu pengenalan serba sedikit tentang ArcObject. Perisian ArcGIS Desktop anda dibina on top of ArcObject dimana ArcObject ni terdiri dari beberapa set of classes yang ditulis oleh programmer ESRI menggunakan pengaturcaraan C++. Bagaimana ianya disimpan di dalam ArcGIS? Ianya disimpan di dalam fail-fail DLL apabila anda install ArcGIS Desktop anda. Kalau sesiapa yang pernah belajar Object Oriented Programming tentu lebih mudah faham tentang apa yang saya maksudkan ni.
Bagaimana kita nak programkan ArcGIS desktop kita menggunakan ArcObject classes ini? Anda boleh menggunakan pelbagai bahasa pengaturcaraan, antaranya VB, VBA, C++, C# dan .NET. Bermula dari versi ArcGIS 10, ESRI mencadangkan agar persekitaran .NET digunakan kerana mereka tidak akan support VB/VBA apabila versi 10.1 muncul kelak. Tetapi untuk memudahkan anda memahami konsep customization ArcObject, saya akan menggunakan contoh menggunakan VBA kerana VBA Editor memang telah sedia ada di dalam ArcMap versi ArcGIS10 dan juga versi 9.x.
Untuk buka VBA Editor ni, anda klik sahaja pada menu Customize > VBA Macros > Visual Basic Editor di dalam ArcMap.
Penerangan mengenai komponen-komponen di dalam VBA Editor adalah seperti di bawah.
Di dalam contoh ini, saya akan membina satu form yang berfungsi untuk melaksanakan proses carian nama sungai di atas peta saya. Untuk membina form di dalam VBA Editor, right click di dalam ruangan Project (rujuk rajah di atas untuk ruangan Project), kemudian pilih sahaja Insert > UserForm.
Kaedah membina Form |
Secara default VBA Editor akan menamakan form anda sebagai UserForm1. Kemudian saya drag control ComboBox masuk ke dalam form saya. Ini akan bertindak sebagai dropdown box di dalam form saya yang akan menyenaraikan nama-nama sungai. Saya drag juga control CommandButton yang akan mencari nama sungai yang saya kehendaki di dalam ComboBox. Saya namakan CommandButton saya ini sebagai CARI.
Click/Drag control ComboBox dan CommandButton ke dalam form. |
Kemudian saya double click di atas form saya untuk memaparkan ruangan Procedure. Seterusnya saya klik kepada Initialize (rujuk rajah di bawah).
Double click form dan pastikan anda tukar kepada Event Initialize pada Procedure. |
Dim pMxDoc As IMxDocument
Dim PFLayer As IFeatureLayer
Dim pFc As IFeatureClass
Dim pFeat As IFeature
Dim i As Integer
Set pMxDoc = ThisDocument
For i = 0 To pMxDoc.FocusMap.LayerCount - 1
If (UCase(pMxDoc.FocusMap.Layer(i).Name) = UCase("Sungai")) Then
Set PFLayer = pMxDoc.FocusMap.Layer(i)
Exit For
End If
Next
Set pFc = PFLayer.FeatureClass
'sort nama sungai
Dim pTableSort As ITableSort
Set pTableSort = New TableSort
pTableSort.Fields = "NAME"
pTableSort.Ascending("NAME") = True
Set pTableSort.Table = pFc
pTableSort.Sort Nothing
'Return a cursor for all the features
Dim pFCur As IFeatureCursor
Set pFCur = pTableSort.Rows
Set pFeat = pFCur.NextFeature
Dim namaExists As Boolean
namaExists = False
Do Until pFeat Is Nothing
nama = pFeat.Value(pFeat.Fields.FindField("NAME"))
'Check for duplicate name
For i = 0 To ComboBox1.ListCount - 1
If nama = ComboBox1.List(i) Then
namaExists = True
Else: End If
Next i
Select Case namaExists
Case False
ComboBox1.AddItem nama
Case Else
End Select
namaExists = False
Set pFeat = pFCur.NextFeature
Loop
ComboBox1.ListIndex = 0
OK, selesai coding untuk memapar nama sungai ke dalam combobox form saya. Sekarang saya akan masukkan pula coding untuk mencari nama sungai sekiranya pengguna klik butang CARI pada form saya. Kaedah ini samalah seperti bila kita laksanakan proses carian menggunakan kaedah Select by Attributes di dalam ArcMap. Untuk masukkan coding tu, saya double click pada CommandButton CARI, seterusnya procedure CommandButton1_Click akan dipaparkan.
Double click CommandButton CARI untuk mendapatkan procedure |
Seterusnya saya masukkan coding berikut di bawah ruangan Private Sub CommandButton1_Click()
Dim pDoc As IMxDocument
Dim pMap As IMap
Dim pLayer As IFeatureLayer
Dim pFc As IFeatureClass
Dim pQf As IQueryFilter
Dim pSelSet As ISelectionSet
Dim pFSel As IFeatureSelection
Set pDoc = ThisDocument
Set pMap = pDoc.FocusMap
For i = 0 To pMap.LayerCount - 1
If UCase(pMap.Layer(i).Name) = UCase("Sungai") Then
Set pLayer = pMap.Layer(i)
Exit For
End If
Next
Set pFc = pLayer.FeatureClass
'Create the query filter
Set pQf = New QueryFilter
pQf.WhereClause = "NAME = '" & ComboBox1.Value & "'"
'Get the features that meet the where clause
Set pSelSet = pFc.Select(pQf, esriSelectionTypeIDSet, esriSelectionOptionNormal,
Nothing)
'Apply the selection
Set pFSel = pLayer
Set pFSel.SelectionSet = pSelSet
pDoc.ActiveView.Refresh
Kemudian, saya aktifkan kembali form saya dan klik sahaja butang Run di dalam VBA Editor.
Klik Run untuk run form anda |
Sebaik sahaja saya klik Run, form saya akan dipaparkan di dalam ArcMap. Senarai nama-nama sungai akan dapat saya lihat apabila saya klik combobox di dalam form tersebut.
Dalam contoh ini, saya memilih nama Sungai Langat. Apabila saya klik butang CARI, Sungai Langat akan ditunjukkan di atas peta saya seperti rajah di bawah.
Contoh yang saya tunjukkan ini adalah menggunakan bahasa pengaturcaraan VBA. Sekiranya anda ingin menggunakan persekitaran .NET, anda boleh programkan di dalam Microsoft Visual Studio menggunakan samada VB.Net ataupun C#.Net.
So macamana? Menarik tak? Anda boleh mencuba coding di atas untuk disesuaikan dengan data anda. Cuma perlu gantikan sahaja perkataan "Sungai" dengan nama layer anda di dalam ArcMap dan gantikan "NAME" dengan nama field yang ingin anda query di dalam layer anda. Selamat mencuba.
boss, yang macam ni maksud saya nak query..hehee....terima kasih boss...
ReplyDeletehehe...x pasan plak komen ni...
Deletexpa boss...dah setel hahahaha
ReplyDeleteizin share gan
ReplyDelete