|
Sering mahasiswa bertanya apakah dengan mapobjects kita bisa membuat aplikasi GIS yang dilengkapi dengan penambahan dan pengubahan peta ? Jawabnya bisa. Apakah sulit ? Untuk menambah dan menghapus data mudah. Yang sulit adalah mengeditnya. Apalagi kalau harus ada fasilitas editing peta seperti di arcview yang ada memotong peta, copy paste, intersect, union, dsb. Tapi kalo hanya editnya sebatas memindah vertex, mungkin agak mudah. Seperti ini contohnya...
[Kode program dalam tulisan ini dapat didownload disini ] Pertama, tentu saja setelah menambahkan component mapobjects2, kita bentuk contoh tampilan nya seperti berikut: Yang kotak putih besar tentu saja adalah object map. Berturut turut command button disebelah kiri dibuat dengan name default, command1, command2 ..dst. Ada 2 command button yang agak menjorok yaitu simpan perubahan dan batalkan perubahan. Dibuat begini karena kedua button tergantung atau berhubungan dengan command edit. Selanjutnya masuk ke kode. Kita akan memerlukan beberapa variabel global brikut: Private mode As String Private dc As DataConnection Private ge_polygon As GeoEvent Private ge_points() As GeoEvent Private sudah_edit As Boolean Private nomor_vertex As Long Private rs_edit As Recordset Private pol_edit As Polygon Variabel mode digunakan untuk menandai mode aktif yang sedang berlangsung, apakah sedang menambah data, mengubah, atau menghapus. Variabel dc untuk data connection, biasanya dipakai cukup sering, jadi ditaruh di private variabel. ge_polygon dan ge_point digunakan untuk bentuk interaksi saat proses editing peta. ge_polygon untuk membentuk polgonnya sedang ge_points yang berupa array untuk membentuk titik-titik vertex dari ge_polygon. Variabel sudah_edit untuk tanda bahwa proses edit sudah siap dimulai yaitu dengan sudah dipilihnya satu polygon yang siap diedit dengan nomor object yang dipilih ini dimasukkan dalam variabel nomor_vertex. Rs_edit dan pol_edit adalah recordset dari data peta yang akan diedit dan bentuk shape hasil perubahan. Kemudian dilanjutkan dengan menambah kode saat command button ditekan. Dari yang paling sederhana dulu, yaitu command1, Command2, dan command5 yang hanya mengganti mode yang aktif. Mode ini diperlukan karena seluruh operasi ada pada event MouseDown dari object map, jadi harus ada pembedanya (seperti juga zoom in, zoom out, pan di tulisan terdahulu ). Private Sub Command1_Click() mode = "tambah" End Sub Private Sub Command2_Click() mode = "edit" End Sub Private Sub Command5_Click() mode = "hapus" End Sub Kemudian pada Form_Load kita inisialisasi Map. Diconnectkan ke data peta contoh. Diberi warna default (mogreen), dan ditampilkan di obeject Map. Selain itu di form_load juga diinisialisasi symbol-symbol trackinglayer yang diperlukan. Yaitu untuk symbol polygon yang sedang diedit (warna cyan, border merah), dan vertex-vertex penyusunnya (hitam bulat), juga warna vertex ketika diedit (bentuk cross). Disini Command3 dan Command4 karena aktif saat edit maka di enable false dulu. Berikut kode program untuk form_load. Private Sub Form_Load() inisialisasi peta Set dc = New MapObjects2.DataConnection dc.Database = App.Path & "\peta" dc.Connect Dim l As New MapLayer l.GeoDataset = dc.FindGeoDataset("petaku") l.Symbol.Color = moGreen Map1.Layers.Add l Map1.TrackingLayer.SymbolCount = 4 With Map1.TrackingLayer.Symbol(1) .SymbolType = moFillSymbol .Color = moCyan .OutlineColor = moRed End With With Map1.TrackingLayer.Symbol(2) .SymbolType = moPointSymbol .Color = moBlack .Style = moCircleMarker .Size = 10 End With With Map1.TrackingLayer.Symbol(3) .SymbolType = moPointSymbol .Color = moBlack .Style = moCrossMarker .Size = 10 End With Command3.Enabled = False Command4.Enabled = False End Sub Selanjutnya bisa dibuat kode untuk tambah data peta. dituliskan pada event Map mouseDown. Disini object maplayer yang ada di object map diambil. Kemudian user ’dipaksa’ untuk membuat polygon dengan method trackpolygon yang disimpan kedalam variabel sementara p bertipe polygon. Bentuk ini kemudian dimasukkan dalam fields ”shape” yaitu field yang menyimpan bentuk spasial dari data shapefile. Untuk field-field yang lain juga dimasukkan nilainya disini. Disini dicontohkan dimasukkan nilai field id dari suatu inputbox. Diakhiri dengan Map refresh agar tampilan peta menjadi tampilan dengan data terbaru. Berikut kodenya Private Sub Map1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Dim l As New MapLayer Dim pt As MapObjects2.Point Set l = Map1.Layers(0) If mode = "tambah" Then Dim p As Polygon Set p = New Polygon Set p = Map1.TrackPolygon Dim r As New MapObjects2.Recordset Set r = l.Records r.AddNew r.Fields("id").Value = InputBox("nilai field id=") r.Fields("shape").Value = p r.Update Map1.Refresh Kode diatas memang belum selesai untuk MouseDown karena masih ada mode untuk edit dan hapus. Kita masuk ke hapus dulu karena lebih simple. Disini tinggal dilakukan perintah delete pada object recordset yang terpilih. Yang dipilih adalah polygon yang dimana mouse yang kita tekan berada didalamnya. Dilakukan dengan perintah searchshape dengan parameter operasinya adalah moPointInPolygon ElseIf mode = "hapus" Then Set pt = Map1.ToMapPoint(X, Y) Set rs_edit = l.SearchShape(pt, moPointInPolygon, "") rs_edit.Delete Map1.Refresh Selanjutnya yang paling rumit adalah proses untuk mengedit posisi. Proses mengedit ini bisa dibagi dalam 4 bagian yaitu: - Proses untuk menentukan polygon mana yang akan di-edit dan persiapan-persiapan penyimpanan data yang diperlukan untuk proses edit selanjutnya - Setelah terpilih polygon yang akan diedit, maka selanjutnya akan memilih vertex (titik sudut) mana yang akan dipindah - Setelah terpilih vertex akan diedit maka bagaimana proses saat menggeser vertex ini - Setelah vertex-vertex dipindah ke tempat yg diinginkan, maka selanjutnya adalah proses menyimpan perubahan atau membatalkannya. Untuk menentukan polygon mana yang akan diedit, juga dengan menggunakan perintah searchshape. Setelah polygon terpilih, polygonnya dimasukkan kedalam obejct geoevent ge_polygon, dan titik-titik vertexnya ke ge_points. Agar terlihat proses editingnya, maka dibuat bentuk polygon berwarna cyan bergaris tepi merah(symbol nomor 1) dan vertextnya bulat hitam (symbol nomor 2). Juga perlu mengubah flag sudah_edit yang menandakan sudah ada polygon terpilih yang siap diedit. Kemudian tombol simpan perubahan dan batal perubahan di enable-kan , dan tombol-tombol lain di disable. ElseIf mode = "edit" Then If sudah_edit = False Then Dim rs As MapObjects2.Recordset ReDim ge_points(0) Map1.TrackingLayer.ClearEvents Set pt = Map1.ToMapPoint(X, Y) Dim py As New Polygon Set rs_edit = l.SearchShape(pt, moPointInPolygon, "") Set py = rs_edit.Fields("shape").Value Set ge_polygon = Map1.TrackingLayer.AddEvent(py, 1) Dim vertexs As MapObjects2.Points Set vertexs = py.Parts(0) For i = 0 To vertexs.Count - 1 ReDim Preserve ge_points(UBound(ge_points) + 1) Set ge_points(UBound(ge_points)) = Map1.TrackingLayer.AddEvent(vertexs(i), 2) Next sudah_edit = True Command3.Enabled = True Command4.Enabled = True Command1.Enabled = False Command2.Enabled = False Command5.Enabled = False Setelah polyogon yang mau diedit terpilih dan diwarnai beda, proses dengan mouse selanjutnya adalah melakukan drag vertex yang ingin di pindah. Prosesnya dengan klik kemudian dengan tetap ditekan, mouse dipindah , dan vertex yang diedit akan mengikuti cursor mouse. Untuk dapat seperti ini, saat mouse ditekan akan dipilih vertex yang paling dekat, di tandai nomor vertexnya, dan di tampilkan dalam bentuk yang berbeda (tanda cross). Cara untuk mencari vertex terdekat adalah dengan rumus pytagoras. Else Set pt = Map1.ToMapPoint(X, Y) Dim titikpalingdekat As Long Dim jarak As Double Dim jarakterdekat As Double jarakterdekat = Sqr((pt.X - ge_points(1).X) ^ 2 + (pt.Y - ge_points(1).Y) ^ 2) titikpalingdekat = 1 For i = 2 To UBound(ge_points) jarak = Sqr((pt.X - ge_points(i).X) ^ 2 + (pt.Y - ge_points(i).Y) ^ 2) If jarakterdekat > jarak Then titikpalingdekat = i jarakterdekat = jarak End If Next nomor_vertex = titikpalingdekat For i = 1 To UBound(ge_points) ge_points(i).SymbolIndex = 2 Next ge_points(nomor_vertex).SymbolIndex = 3 Map1.TrackingLayer.Refresh True End If End If End Sub Proses pengeditan juga harus dilengkapi dengan proses yang ditaruh di MouseMove. Disini setelah vertex aktif terpilih, setiap gerakan mouse akan diikuti oleh vertex tersebut. Agar terlihat, maka perlu dilakukan pengulangan penggambaran polygon dan vertex2nya di object trackinglayer. Disini perlu dibuat kembali polygon ge_polygon dengan titik-titik vertex yang baru. Jika sudah selesai maka nomorVertex aktif dihilangkan dengan diisi 0 di event MouseUp. Private Sub Map1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If nomor_vertex > 0 Then Set pt = Map1.ToMapPoint(X, Y) ge_points(nomor_vertex).MoveTo pt.X, pt.Y Map1.TrackingLayer.RemoveEvent ge_polygon.Index Set pol_edit = New MapObjects2.Polygon Dim newvertexs As New MapObjects2.Points For i = 1 To UBound(ge_points) pt.X = ge_points(i).X pt.Y = ge_points(i).Y newvertexs.Add pt Next pol_edit.Parts.Add newvertexs Set ge_polygon = Map1.TrackingLayer.AddEvent(pol_edit, 1) Map1.TrackingLayer.Refresh True End If End Sub Private Sub Map1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) nomor_vertex = 0 End Sub Setelah perubahan selesai, perlu dilakukan penyimpanan karena yang berubah baru polygon yang ada di ge_polygon. Polygon ini sudah kita simpan di pol_edit, sehingga tinggal dimasukkan di field shape. Setelah tersimpan, jejak editing dihilangkan dengan clearEvent pada tracking layer dan state enable tombol2 dikembalikan. Untuk pembatalan, mirip dengan penyimpanan perubahan, tapi tanpa simpan ke recordset. Private Sub Command3_Click() rs_edit.Edit rs_edit.Fields("shape").Value = pol_edit rs_edit.Update sudah_edit = False nomor_vertex = 0 Map1.TrackingLayer.ClearEvents Map1.Refresh Command3.Enabled = False Command4.Enabled = False Command1.Enabled = True Command2.Enabled = True Command5.Enabled = True End Sub Private Sub Command4_Click() sudah_edit = False nomor_vertex = 0 Map1.TrackingLayer.ClearEvents Map1.Refresh Command3.Enabled = False Command4.Enabled = False Command1.Enabled = True Command2.Enabled = True Command5.Enabled = True End Sub Berikut tampilan saat tambah data.   dan berikut tampilan saat edit data.  
|
Kuliah TKI - Blog da...
mm Apparently, 21,000 boots imported by
Clas-class php yang ...
mm Apparently, 21,000 boots imported by
Kuliah TK Internet :...
mm Apparently, 21,000 boots imported by
The Power of GIS - U...
mm Apparently, 21,000 boots imported by
Kuliah TK Internet :...
mm Apparently, 21,000 boots imported by
JPGraph - membuat gr...
timberland - mm Apparently, 21,000 bo...
Kuliah TKI : Ajax - ...
mm Apparently, 21,000 boots imported by
Banner spesial untuk...
mm Apparently, 21,000 boots imported by