Tutorial Sig

Embed Size (px)

Citation preview

Page 1 of 10 [This article will translated in English after all sections complete] Pengguna aplikasi-aplikasi SIG pasti cukup akrab dengan yang namanya Arcview, MapInfo, dan Autocad. Selain cukup popular (karena banyak bajakannya) aplikasi-aplikasi ini memang sangat handal untuk keperluan-keperluan pemetaan dan analisanya. Bahkan Arcview dan Mapinfo bisa di customize tampilannya agar sesuai kebutuhan user. Akan tetapi kadangkala ada suatu kebutuhan dimana sebuah aplikasi SIG terintegrasi dengan aplikasi lain, misalnya pada suatu aplikasi SPK (Sistem Penunjang Keputusan) dimana pemetaan (plus analisanya) hanya merupakan salah satu tools disamping tools-tools yang lain. Kadang juga pengguna kurang suka dengan tampilan hasil customize dari arcview atau mapinfo yang memang terbatas. Untuk kebutuhan-kebutuhan inilah Esri, pembuat Arcview, mengeluarkan MapObjects (dan Mapinfo mengeluarkan MapX). MapObjects adalah sebuah third party component yang bisa digunakan di Visual Basic, Visual C++, Delphi, dan lainnya, agar bisa menampilkan peta beserta navigasi, dan fungsi-fungsi pemetaan lainnya. Karena berupa komponen, maka aplikasi GIS yang dibuat dengan MapObjects ini dapat dibuat lebihflexible, dapat digabung dalam aplikasi yang lainnya, dan dapat bebas dalam membuat tampilan

Disini kita akan menggunakan MapObjects Versi 2. (2.0 atau 2.1) , dan akan dipakai dalam Visual Basic 6.0. Dalam penyampaian materi-nya, akan dibuat berdasar fungsi-fungsi pemetaan baru dari fungsi ini akan di breakdown kedalam object-object apa yang ikut, method dan property apa yang dipakai, dan langsung disertai contoh coding-nya. Page 2 of 10

I. Persiapan Untuk membuat aplikasi SIG dengan VB dan MapObjects, tentu saja kita harus telah menyiapkan keduanya di komputer kita. Installer untuk MapObjects 2.1 versi evaluation dapat didownload di http://if2.ubaya.ac.id/~daniel/uploads/mo21.exe. Sedangkan untuk contoh data peta yang akan digunakan dalam tulisan ini adalah peta Mexico bawaan dari arcview 3.1, dapat didownload di http://if2.ubaya.ac.id/~daniel/mexico.zip . Untuk engine mapObject, cara instalasinya adalah dengan menjalankan file mo21.exe tadi. Sedangkan untuk datanya dapat diextract ke folder apapun. Dalam tulisan ini, data shapefile ini diextract di folder c:\shapefile. Maka akan ada folder c:\shapefile\Mexico, dan didalamnya ada data-data peta bertipe shapefile. Sementara untuk mapobjects, setelah diinstall, kita dapat memakainya di VB dengan menambahkan komponen Esri MapObjects 2.1 lewat menu Project-Component seperti pada gambar 1 dibawah. Setelah ditambahkan komponen ini, maka akan ada tambahan object dalam toolbox, yaitu object Map seperti yang terlihat pada gambar 2.Object Map inilah yang nanti ditaruh dalam Form sebagai tempat dimana peta akan dimunculkan. Selain ketersediaan file-file diatas, untuk dapat mengikuti materi dengan lancar, sebaiknya pembaca telah familiar dengan Visual Basic dan juga dengan konsep SIG.

Page 3 of 10

II. Menampilkan Peta Untuk menampilkan sebuah Peta dalam commponent Map, kita membutuhkan 2 object lagi component tersebut. Yang pertama adalah object DataConnection yang digunakan mengkoneksikan database peta, dan yang kedua adalah object MapLayer yang digunakan menyimpan Informasi untuk sebuah Layer Peta. Ketiga object ini nanti akan dipakai untuk membuat program pertama kita yang bertujuan menampilkan peta Mexico. selain untuk untuk untuk

Pertama, taruh componen Map ke dalam Form. Berikutnya. Object DataConnection di deklarasikan sebagai berikut, ditaruh dalam variable private agar dapat diakses dari berbagai sub dalam form ini. Dim dc as new MapObjects2.DataConnection. Dalam object DataConnection terdapat property Database untuk menentukan di direktori mana datadata peta berada. Dan juga terdapat fungsi Connect untuk memulai koneksi data. Contoh penggunaannya adalah sebagai berikut: dc.Database = "c:\shapefile\mexico" If dc.Connect Then lakukan perintah2 jika data berhasil connect Else lakukan perintah-perintah jika tidak berhasil connect End If Object DataConnection juga mempunyai fungsi FindGeoDataset yang bertujuan untuk mencari peta tertentu dan mengembalikannya sebagai class Geodataset, yaitu class yang menyimpan informasiinformasi spatial dan non-spatial dari data peta. Class Geodataset inilah yang merupakan data peta yang diperlukan oleh object MapLayer. Pastikan dalam direktori yang disetkan pada dc.database terdapat nama file (dengan extension .shp, shx, dan dbf) yang dimasukkan dalam fungsi FindGeoDataset ini. Contoh penggunaan dari findgeodataset sampai digunakan oleh mapLayer adalah sebagai berikut. Dim L1 As mapobjects2.MapLayer Set L1 = New Mapobejcts2.MapLayer L1.GeoDataset = dc.FindGeoDataset("states") Dimana States adalah peta propinsi-propinsi di Mexico yang akan kita tampilkan. Setelah object MapLayer terbentuk, maka object ini dapat dimasukkan ke dalam component Map untuk ditampilkan ke layar. Component Map menyimpan layer-layernya dalam collection class Layers. Dimana dalam class ini terdapat method Add untuk menambahkan anggotanya. Peta akan disusun dengan layer yang ditambahkan terakhir berada di tumpukan paling atas. Jadi jika peta Jalan dimasukkan dalam map.layers, kemudian dilanjutkan dengan menambahkan peta State, maka peta Jalan tadi akan tertutup oleh peta State. Contoh kode untuk menambahkan maplayer kedalam Map.Layers adalah sebagai berikut: Map1.Layers.Add L1

Ini adalah perintah terakhir yang dibutuhkan dalam program pertama kita. Dengan asumsi peta akan di-load pada saat Form_load, kode lengkapnya adalah sebagai berikut: Dim dc As New DataConnection Private Sub Form_Load() dc.Database = "c:\shapefile\mexico" If dc.Connect Then Dim L1 As Mapobjects2.MapLayer Set L1 = New Mapobjects2.MapLayer L1.GeoDataset = dc.FindGeoDataset("states") Map1.Layers.Add L1 Else MsgBox "direktori peta tidak ditemukan" End If End Sub Jadi, setelah menaruh component Map ke Form ( namanya menjadi Map1 ) dan dengan menuliskan perintah-perintah diatas, kemudian menjalankan Run, kita akan mendapatkan sebuah form yang didalamnya terdapat peta Mexico yang terbagi dalam propinsi-propinsi. Apabila anda belum berhasil atau peta tidak keluar, coba periksa lagi lokasi peta dan nama petanya. Program pertama ini harus berhasil dulu sebelum melangkah ke program-program selanjutnya. Selanjutnya, dengan cara yang sama seperti saat menambahkan layer States tambahkan layer Roads dan Cities sehingga bagian didalam If dc.Connect Then adalah sebagai berikut : If dc.Connect Then Dim L1 As Mapobjects2.MapLayer Set L1 = New Mapobjects2.MapLayer L1.GeoDataset = dc.FindGeoDataset("states") Map1.Layers.Add L1 Set L1 = New Mapobjects2.MapLayer L1.GeoDataset = dc.FindGeoDataset("roads") Map1.Layers.Add L1 Set L1 = New Mapobjects2.MapLayer L1.GeoDataset = dc.FindGeoDataset("cities") Map1.Layers.Add L1 Else . . Setelah ditambahkan layer Roads dan Cities maka saat di Run akan tampil peta yang berisi peta negara propinsi di Mexico, diatasnya terdapat Jalan, dan diatas jalan ada titik-titik yang menunjukkan kota-kota di Mexico. Contoh hasilnya dapat dilihat pada gambar 3 dibawah. Jika dicermati, setiap kali aplikasi ini dijalankan, maka warna States, Roads, dan Cities akan berubahubah. Hal ini disebabkan karena kita belum melakukan setting tampilan pada tiap layer ini. Jika belum di set, default warnanya adalah random. Bab berikutnya akan menunjukkan bagaimana cara untuk memodifikasi tampilan Layer.

Gambar 3. Contoh tampilan program menampilkan peta Page 4 of 10

III.

Mengatur tampilan peta

Tampilan atau bentuk penggambaran dari tiap layer peta dapat diatur sesuai keinginan user atau yang lebih sering lagi adalah sesuai dengan standar legenda peta pada umumnya. Beberapa contoh standar tampilan adalah seperti jalan berwarna merah, sungai berwarna hijau, bandara berbentuk tanda pesawat , dan sebagainya. Pada layer bertipe polygon yang dapat diatur adalah warna bidang, bentuk arsiran bidang, warna garis tepi, bentuk dan tebal garis tepi. Untuk tipe Line, yang dapat diatur adalah warna, tebal, dan bentuk garis. Sedang untuk tipe Point, yang dapat diatur adalah warna simbol, ukuran simbol, dan bentuk simbol. Secara umum untuk mengatur tampilan pada masing-masing tipe ini dilakukan dengan mengubah-ubah nilai-nilai dalam property symbol pada object MapLayer. Berikut adalah daftar property dalam maplayer.symbol , dan fungsinya: color - untuk pengaturan warna. Dapat diisi dengan nilai dari konstanta-konstanta warna, seperti moRed, moBlue, moYellow, moGrey, dan warna-warna yang punya nama lainnya. Dapat juga diisi dengan nilai dari pencampuran warna merah, hijau, dan biru, pada fungsi RGB(nilai_merah,nilai_hijau,nilai_biru) size - ukuran simbol, hanya berlaku untuk tipe garis dan point outline, outlinecolor ada tidaknya garis tepi, dan warna garis tepi. Khusus untuk tipe polygon. Outline diisi dengan true/false, sedang outlinecolor diisi warna seperti halnya color. style

- untuk tipe polygon ini adalah bentuk arsiran, untuk tipe line ini adalah bentuk garis, dan untuk point adalah bentuk simbol. Dengan pilihan dibawah ini: o untuk polygon moSolidFill : bidang diwarnai penuh, tanpa arsiran moTransparentFill : bidang tidak diwarnai dan transparent moHorisontalFill: bidang diarsir dengan arsiran garis-garis mendatar moVerticalFill : bidang diasir dengan arsiran garis-garis tegak moDownwardDiagonalFill : arsiran diagonal miring ke kiri moUpwardDiagonalFill : arsiran diagonal miring ke kanan moCrossFill : arsiran gabungan garis vertical dan horizontal moDiagonalCrossFill : arsiran gabungan garis horizontal kiri dan orisontal kanan moGrayFill : arsiran berupa titik-titik moLightgrayFill : arsiran berupa titik-titik yang jarang moDarkgrayFill : arsiran berupa titik-titik yang rapat o untuk line moSolidLine : berupa garis lurus moDotLine : berupa titik-titik yang bersambung moDashLine : berupa garis pendek-pendek yang bersambung moDashDotLine : berupa garistitik yang bersambung moDashDotDotLine : berupa garis-titik-titik yang bersambung untuk point moCircleMarker : berupa bentuk lingkaran moCrossMarker : berupa bentuk cross moSquareMarker : berupa bentuk kotak moTriangleMarker : berupa bentuk segitiga moTrueTypeMarker : berupa suatu karakter dari suatu font Untuk type ini, diperlukan pengisian juga untuk property : symbol.Font : Nama font yang karakternya mau dipakai symbol.CharacterIndex : nomor karakter yang ingin dipakai symbol.Rotation : jika mau diputar ( dalam satuan derajat )

o

Dengan mengisikan property symbol diatas, peta yang tampil akan dapat sangat bervariasi. Berikut disediakan dua contoh program pengubahan tampilan. Program pertama akan membuat warna state hijau (dari fungsi RGB), warna jalan merah dan besarnya 2. Sedangkan kota ditampilkan dengan bentuk lingkaran berwarna biru, dengan ukuran 8. Sedang program yang kedua membentuk state berarsir kotak-kotak berwarna kuning, Jalan berbentuk titikgaris-titikberwarna merah. Cuplikan program pertama saat pengaturan tampilan adalah seperti berikut : Set L1 = New Mapobjects2.MapLayer L1.GeoDataset = dc.FindGeoDataset("states") L1.Symbol.Color = RGB(200, 250, 200) Map1.Layers.Add L1 Set L1 = New Mapobjects2.MapLayer L1.GeoDataset = dc.FindGeoDataset("roads") L1.Symbol.Color = moRed L1.Symbol.Size = 3 Map1.Layers.Add L1

Set L1 = New Mapobjects2.MapLayer L1.GeoDataset = dc.FindGeoDataset("cities") L1.Symbol.Style = moCircleMarker L1.Symbol.Color = moBlue L1.Symbol.Size = 8 Map1.Layers.Add L1 Sedang untuk program kedua adalah sebagai berikut : Set L1 = New Mapobjects2.MapLayer L1.GeoDataset = dc.FindGeoDataset("states") L1.Symbol.Color = moYellow L1.Symbol.Style = moCrossFill Map1.Layers.Add L1 Set L1 = New Mapobjects2.MapLayer L1.GeoDataset = dc.FindGeoDataset("roads") L1.Symbol.Color = moBlue L1.Symbol.Style = moDashDotLine Map1.Layers.Add L1 Set L1 = New Mapobjects2.MapLayer L1.GeoDataset = dc.FindGeoDataset("cities") L1.Symbol.Style = moTrueTypeMarker L1.Symbol.Color = moRed L1.Symbol.Size = 12 L1.Symbol.Font = "wingdings" L1.Symbol.CharacterIndex = 74 Map1.Layers.Add L1 Hasil untuk masing-masing program diatas adalah seperti gambar 4 dan 5 dibawah:

Gambar 4. Hasil untuk program pengubahan tampilan 1 Gambar 5. Hasil untuk program pengubahan tampilan 2 Page 5 of 10

IV.

Navigasi Peta

Salah satu fasilitas yang pasti ada dalam sebuah aplikasi SIG adalah adanya tombol-tombol navigasi peta. Untuk melihat detil peta secara mudah, biasanya sebuah form yang menampilkan peta akan punya tombol-tombol Zoom in, Zoom out, Full Extent dan Pan. Zoom In dilakukan untuk membuat peta terasa lebih detail. Dengan zoom in, skala akan diperkecil. Saat dilakukan zoom in seakan-akan kita akan lebih didekatkan pada permukaan bumi. Fungsi zoom out adalah kebalikan dari zoom in, yaitu membuat peta lebih tidak detail. FullExtent adalah tombol yang membuat peta menjadi terlihat seluruhnya. Misal setelah melihat detail, pengguna ingin melihat peta keseluruhan dengan cepat, maka dia dapat menekan tombol full extent, daripada melakukan zoom out berkali-kali sampai batas full. Sementara Pan adalah fungsi untuk menggeser peta. Fungsi pan biasanya dilakukan setelah pengguna melakukan zoom in. Misal saat pengguna ingin melihat lebih detail , dia melakukan zoom in, ternyata dia juga ingin melihat melihat detail yang disebelah kanan dari yang tampil sekarang, maka dia dapat melakukan penggeseran peta. Untuk memberikan fasilitas navigasi diatas, tambahkan tombol-tombol pada Form. Biasanya ditaruh di atas peta, dan berbentuk tombol-tombol yang bergambar atau suatu toolbar yang bergambar. Gambar-gambar yang sering dipakai adalah seperti kaca pembesar, tangan, dan sebagainya. Untuk penyederhanaan masalah, disini akan ditambahkan command button biasa, ditaruh diatas peta, menjadi seperti gambar 6 dibawah.

Gambar 5. Bentuk form untuk contoh program navigasi peta Proses Untuk Zoom In, Zoom Out, dan Pan, dilakukan dengan cara melakukan aktifitas mouse pada object Map. Ketiganya akan sama-sama dilakukan pada saat event MouseDown. Untuk itu, kita perlu memberikan sebuah tanda, katakanlah semacam mode, yang jika diklik tombol zoom in, berarti mode menjadi zoomin, menekan tombol zoom out, mode menjadi zoomout, dan pan menjadi mode pan. Agar kelihatan mode yang aktif sekarang adalah mode tertentu, maka saat men-set mode, sekalian dilakukan pengubahan bentuk pointer Mouse. Kebetulan MapObjects menyediakan bentuk pointer mouse untuk mode-mode tadi, yaitu moZoomIn, moZoomOut, dan moPan. Karena butuh menyimpan mode yang sedang aktif, dan bisa diakses oleh banyak sub di satu form, maka kita butuh variabel yang bersifat global yang disini akan kita namai dengan pmode. dim Pmode as String Dan, misalkan tombol-tombol tadi berturut-turut bernama command1, command2, command3, dan command4, maka kode untuk masing-masing tombol saat diklik adalah seperti dibawah. Private Sub Command1_Click() pMode = "zoomin" Map1.MousePointer = moZoomIn End Sub Private Sub Command2_Click() pMode = "zoomout" Map1.MousePointer = moZoomOut End Sub Private Sub Command4_Click() pMode = "pan" Map1.MousePointer = moPan End Sub Setelah men-set mode, yang dilakukan selanjutnya adalah mengisikan kode untuk tiga macam mode diatas. Kode ini diisikan pada event MouseDown, sehingga kita butuh untuk mengecek dulu mode apa yang sedang aktif, dan kemudian apa yang harus dilakukan pada saat mode ini. Disini akan digunakan pengecekan dengan Select Case seperti dibawah: Private Sub Map1_MouseDown(Button As Integer, Shift As Integer, X As _ Single, Y As Single) Select Case pmode Case "zoomin" 'kode untuk melakukan zoom in Case "zoomout" 'kode untuk melakukan zoom out Case "pan" 'kode untuk melakukan pan End Select End Sub Property yang digunakan untuk pengaturan seberapa zoom peta yang ditampilkan adalah property Extent pada object map. Property ini menunjukkan seberapa besar bingkai pada peta yang sedang aktif saat ini. Untuk mendekatkan peta, bingkai ini diperkecil. Sebaliknya, untuk menjauhkan peta, bingkai ini diperbesar.

Proses pengguna melakukan zoom in adalah pengguna membuat suatu bingkai berbentuk rectangle yang kemudian rectangle tadi dijadikan bingkai yang aktif. Untuk membuat bingkai ini, pengguna dipaksa untuk membuat rectangle pada map. Disini digunakan fungsi TrackRectangle dan bentuk rectanglenya disimpan dalam sebuah variabel, yang dalam program kita adalah variabel rect. Variabel rect ini kemudian dijadikan extent peta sekarang. Kode untuk melakukan ini adalah seperti dibawah : Dim rect As MapObjects2.Rectangle Set rect = Map1.TrackRectangle Map1.Extent = rect Berbeda dengan saat zoom in yang memerlukan pembuatan luasan (rectangle) dahulu sebelum dilakukan zoom in, pada zoom out pengguna tinggal melakukan klik pada suatu lokasi di peta. Setelah dilakukan klik, extent peta akan diambil, kemudian diperbesar, dan dikembalikan lagi ke extent aktif. Untuk memperbesar rectangle ( dan juga untuk memperkecil) dapat digunakan fungsi ScaleRectangle dengan parameternya adalah berapa pengali skala yang diinginkan. Untuk menjauhkan peta, maka kita perlu untuk memperbesar rectangle, maka diberi skala yang lebih dari 1. Kode untuk melakukan ini adalah seperti dibawah : Dim rect2 As MapObjects2.Rectangle Set rect2 = Map1.Extent rect2.ScaleRectangle 1.5 Map1.Extent = rect2 Untuk melakukan Pan, kita tinggal memanggil fungsi Pan pada object map. Map1.Pan Jadi kode lengkap yang ada pada event MouseDown adalah seperti berikut: Private Sub Map1_MouseDown(Button As Integer, Shift As Integer, X As _ Single, Y As Single) Select Case pMode Case "zoomin" Dim rect As MapObjects2.Rectangle Set rect = Map1.TrackRectangle Map1.Extent = rect Case "zoomout" Dim rect2 As MapObjects2.Rectangle Set rect2 = Map1.Extent rect2.ScaleRectangle 1.5 Map1.Extent = rect2 Case "pan" Map1.Pan End Select End Sub Kita masih menyisakan satu tombol yang belum berfungsi. Yaitu tombol FullExtent. MapObjects selalu menyimpan data besarnya bingkai yang diperlukan untuk menampilkan seluruh layer-layer peta dalam keadaan terlihat semua (full). Property yang menyimpan rectangle ini adalah property FullExtent. Maka, untuk menjadikan peta terlihat full, tinggal dilakukan pengisian nilai Extent dengan nilai dari FullExtent. Dilakukan pada saat event click pada tombol full extent. Private Sub Command3_Click() Map1.Extent = Map1.FullExtent

End Sub Sampai disini, program SIG kita sudah mempunyai fungsi-fungsi navigasi standar, yaitu zoom in, zoom out, full extent, dan pan. Gambar 6 adalah gambar peta saat selesai melakukan zoom in.

Gambar 6. Contoh hasil proses zoom in Page 6 of 10 V. Legenda dan Skala

Pengaturan tampilan peta, seperti pada bab sebelumnya, membuat tampilan peta dapat tergantung pada pembuat aplikasi. Apabila peta mengandung banyak layer dan tiap layer dibentuk bermacam-macam, maka peta dapat membingungkan pembacanya, terutama bagi pengguna yang belum mengenal daerah yang digambarkan di peta. Nah, agar pengguna peta tidak merasa membingungkan, biasanya didalam aplikasi disediakan keterangan tentang simbol-simbol yang dipakai di peta. Misal, garis warna merah adalah jalan, garis warna biru adalah sungai, gambar pesawat adalah bandara, dan sebagaimya. Selain legenda, yang juga penting adalah keterangan berapa skala pada tampilan peta saat ini. Skala ini terupdate secara otomatis saat extent dari peta berubah, baik saat zoom in, zoom out, atau full extent. MapObjects memberikan contoh bagaimana untuk membuat legenda dan skala dalam contoh program di folder LegendComponentSample dan ScalebarComponentSample. Di dalam contoh ini legend dan component dibuat dalam bentuk project OCX dan project untuk testernya. Untuk mempermudah, OCX ini sudah dipaket dan dapat didownload di http://if2.ubaya.ac.id/~daniel/uploads/scalegend.zip Setelah didownload, extractlah file scalelegend.zip ini di suatu tempat. Disitu akan terdapat file mo21samplelegend.ocx dan mo21sampleScalebar.ocx. Nah, tambahkan satu persatu file-file ocx ini dalam project kita lewat menu di vb project component browse. Sehingga componen terpilih dalam window project component menjadi seperti gambar 7 dan toolbar menjadi seperti gambar 8 dibawah.

ambar 7. Menambah ocx Legend dan Scalebar

Gambar 8. Tambahan ocx scalebar dan legend dalam toolbar Setelah ada dalam toolbar, maka kita dapat menggunakan ocx legend dan toolbar ini dan dapat ditaruh di sembarang tempat untuk melengkapi fasilitas aplikasi kita. Disini, untuk contoh program berikutnya, ocx legend dan toolbar ditaruh di sebelah kanan peta dan warna background keduanya diganti menjadi putih. Sehingga desain form menjadi seperti gambar 9 berikut:

Gambar 9. Desain tampilan yang ditambah legend dan scalebar

Kedua Component tambahan ini cukup mudah cara penggunaannya. Untuk Legend, pertama harus di set, map mana yang diikatkan pada legend ini. Setelah itu secara otomatis legend akan mengikuti keterangan-keterangan dan setting-setting tampilan tiap-tiap layer. Ini dilakukan dengan fungsi SetMapSource. Dan jika selama runtime terdapat perubahan tampilan layer, dan legend perlu diupdate, maka tinggal dilakukan pemanggilan fungsi LoadLegend. Nama layer yang ditampilkan dalam legend akan diambil dari property mapLayer.name yang belum kita set pada program-program sebelumnya. Nama layer ini bebas dan dapat berbeda dari nama filenya. Sebagai contoh, layer states, roads, dan cities berturut-turut diberi nama propinsi, jalan, dan kota. Pemberian nama dan proses melekatkan legend ini ditaruh di even Form_Load. Sekalian saja, karena juga diisikan pada form_Load ini, diisikan pula kode untuk setting Scalebar. Untuk mengupdate skala yang tercantum scalebar, pada sourcecode contoh penggunaan scalebar telah dibuatkan suatu fungsi yaitu fungsi UpdateScale . Fungsi ini perlu dituliskan kembali dalam form dan dipanggil pertama kali saat form_load dan pada saat ada perubahan extent, yaitu di saat MouseDown. Sementara untuk setting awalnya, pada scalebar perlu di set ScalebarUnit, dan MapUnit. Juga bentuk tampilan scalebar pada property ScaleText. Berikut adalah code pada FormLoad yang sudah ditambahi, dan kode sub UpdateScale. Diikuti contoh tampilan yang sudah menerapkan legend dan scalebar pada gambar 10. Private Sub Form_Load() dc.Database = "c:\shapefile\mexico" If dc.Connect Then Dim L1 As MapObjects2.MapLayer Set L1 = New MapObjects2.MapLayer L1.GeoDataset = dc.FindGeoDataset("states") L1.Symbol.Color = moYellow L1.Symbol.Style = moCrossFill Map1.Layers.Add L1 L1.Name = "Propinsi" Set L1 = New MapObjects2.MapLayer L1.GeoDataset = dc.FindGeoDataset("roads") L1.Symbol.Color = moBlue L1.Symbol.Style = moDashDotLine Map1.Layers.Add L1 L1.Name = "Jalan" Set L1 = New MapObjects2.MapLayer L1.GeoDataset = dc.FindGeoDataset("cities") L1.Symbol.Style = moTrueTypeMarker L1.Symbol.Color = moRed L1.Symbol.Size = 12 L1.Symbol.Font = "wingdings" L1.Symbol.CharacterIndex = 74 Map1.Layers.Add L1 L1.Name = "Kota" Else

MsgBox "direktori peta tidak ditemukan" End If legend1.setMapSource Map1 legend1.LoadLegend ScaleBar1.ScaleBarUnits = suMeters ScaleBar1.ScreenUnits = suCentimeters ScaleBar1.ScaleText = RepresentativeFraction ScaleBar1.MapUnits = muDecimalDegrees RefreshScale ScaleBar1, Map1 End Sub Public Sub RefreshScale(AEScaleBar As ScaleBar, MOMap As Map) Dim MapExt As sbExtent Dim Pageext As sbExtent Set MapExt = AEScaleBar.MapExtent Set Pageext = AEScaleBar.PageExtent MapExt.MinX = MOMap.Extent.Left MapExt.MinY = MOMap.Extent.Bottom MapExt.MaxX = MOMap.Extent.Right MapExt.MaxY = MOMap.Extent.Top Pageext.MinX = MOMap.Left / Screen.TwipsPerPixelX Pageext.MinY = MOMap.Top / Screen.TwipsPerPixelY Pageext.MaxX = (MOMap.Left + MOMap.Width) / Screen.TwipsPerPixelX Pageext.MaxY = (MOMap.Top + MOMap.Height) / Screen.TwipsPerPixelY AEScaleBar.Refresh End Sub

Gambar 10. Contoh tampilan yang sudah diberi legend dan scalebar Terlihat pada gambar 10, dibagian scalebar terdapat keterangan kota, jalan, dan propinsi dengan bentuk simbolnya masing-masing. Pada tiap layer terlihat ada sebuah checkbox yang dapat digunakan untuk me-visible-kan dan unvisible-kan layer. Selain itu, tiap layer pada legend juga bisa di drag ke layer atasnya maupun ke layer bawahnya yang membuat urutan layer menjadi berubah. Untuk mengtur visible, harus ditambahkan dulu kode untuk me-refresh mapyang dipanggil pada event legend_AfterSetLayerVisible. Private Sub legend1_AfterSetLayerVisible(Index As Integer,isVisible _ As Boolean) Map1.Refresh End Sub Page 7 of 10

VI.

Posisi Lintang/Bujur

Sering penguna ingin tahu posisi suatu object yang sesungguhnya di dunia ada di posisi bujur atau lintang berapa. Pada aplikasi Arcview, posisi ini berada pada bagian atas kanan dan nilainya berubah mengikuti posisi Mouse. Untuk memberikan keterangan ini, pada desain tampilan program berikutnya ditambah dengan Label di bagian atas legend seperti pada gambar 11.

Gambar 11. Desain tampilan yang telah ditambah Label untuk posisi lintang/bujur MapObjects membuatkan fungsi ToMapPoint yang berfungsi men-convert suatu titik dalam layar menjadi lokasi aslinya di dunia. Lokasi asli ini juga berupa Point dan disini akan disimpan dalam variabel P. Dari variabel point inilah akan diambil X dan Y-nya. X akan dimasukkan pada Label3, dan Y dimasukkan pada label4. Karena posisi ini dibuat agar mengikuti gerakan mouse, maka kode untuk mengambil lokasi ini ditaruh di event MouseMove pada object map.

Private Sub Map1_MouseMove(Button As Integer, Shift As Integer, X As _ Single, Y As Single) Dim p As MapObjects2.Point Set p = Map1.ToMapPoint(X, Y) Label3 = p.X Label4 = p.y End Sub Setelah dijalankan. cek program ini dengan cara menggerak-gerakkan mouse di peta. Jika di sebelah kanan atas terdapat nilai yang berubah-ubah mengikuti gerak mouse, berarti program berjalan dengan baik. Contoh tampilan saat mouse diletakkan di suatu tempat di peta adalah seperti gambar 11 dibawah.

Gambar 12. Contoh tampilan yang dilengkapi Posisi Lintang dan Bujur Page 8 of 10 VII. Identify

Tool standar berikutnya adalah tool untuk melihat data Tabular dari object yang dipilih. Dalam Arcview, fungsi ini disebut dengan Identify, dan kita akan mengikuti standar penamaan ini. Proses Identify dilakukan dengan melakukan klik pada suatu posisi dalam peta. Dari posisi ini akan diambil keterangan dari object yang diklik. Dalam contoh berikutnya keterangan object yang akan ditampilkan adalah isi dari field Name pada Kota dan Propinsi, dan field Route pada layer Jalan. Untuk layer propinsi diambil juga luas dari propinsi yang terpilih, dan pada layer jalan diambil juga panjang jalan. Dengan cara yang sama dengan Identify ini, kita dapat mengambil isi field apapun dari shapefile. Seringkali dalam shapefile hanya ada kode object saja, sedang keterangan-keterangan lainnya disimpan dalam database non spatial seperti MS Access, SQL Server, atau Oracle. Jika seperti ini bentuknya, maka saat Identify kita ambil kode object, kemudian kita query ke database non spatial tadi

untuk mencari record yang field kode objectnya sama dengan yang terambil tadi. Jadi tidak masalah apabila data keterangan berada pada database diluar shapefile. Cara ini juga yang digunakan untuk mengkonekkan object tertentu di peta dengan data foto , video, atau yang lainnya. Proses identify dilakukan saat event MouseDown pada object map, seperti halnya zoom in, zoom out, dan pan. Jadi kita akan memerlukan suatu mode yang menunjukkan bahwa yang akan berlaku saat ini saat klik di peta adalah untuk fungsi Identify. Dan agar tampilan lebih bagus, saat mengisi mode, kita juga mengubah bentuk pointer mouse dengan moIdentify. Berikut adalah bentuk desain form untuk contoh identify.

Gambar 13. Desain tampilan untuk Identify Kode pertama yang harus ditambahkan adalah pada saat tombol Identify diklik: Private Sub Command5_Click() pMode = "identify" Map1.MousePointer = moIdentify End Sub Selanjutnya dalam event MouseDown ditambah dengan case jika mode aktif adalah identify. Untuk proses pengambilan data attribut (non spatial) dari suatu object dapat dilakukan dengan beberapa cara. Jika akan mengambil object yang dekat dengan lokasi klik, dapat digunakan fungsi SearchByDistance milik object MapLayer. Fungsi ini akan mengembalikan recordset yang ada pada suatu shapefile yang dekat dengan suatu shape tertentu dan pada jarak tertentu. Shape disini adalah point yang dibentuk dengan fungsi ToMapPoint, sedang jarak diisi suatu nilai double yang besarnya akan menentukan seberapa jauh radius dari object2 dalam layer dari point tadi yang akan diambil datanya. Semakin besar jarak berarti semakin besar radius dan membuat hasil klik kurang spesific karena mengembalikan banyak object. Sebaliknya jika terlalu kecil akan membuat kita sulit untuk mendapatkan informasi dari suatu object karena jaraknya harus tepat dengan klik kita. Recordset yang dikembalikan dari hasil SearchByDistance memiliki field khusus yang digunakan untuk mengambil nilai spatial object. Nama field ini adalah field Shape yang mengeluarkan object point, line, atau polygon, tergantung dari tipe layernya. Untuk mengambil panjang jalan, dapat

dilakukan dengan cara mengambil property length dari object Line yang ada dalam field shape ini, sedang untuk mengambil luas, dilakukan dengan cara memanggil property Area. Karena peta mexico yang kita pakai menggunakan satuan derajat, maka untuk panjang perlu dikalikan dengan suatu konstanta yang membuat nilai derajat menjadi satuan meter. Untuk daerah katulistiwa, satu derajat kurang lebih sama dengan 110 km. Dalam contoh, akan dilakukan looping terlebih dahulu terhadap semua layer. Masing-masing layer akan disearch dan keterangan-keterangan objectnya akan ditampung dalam suatu string dan dikeluarkan dalam messagebox. Berikut adalah kode yang perlu ditambahkan dalam event MouseDown dalam object map, melengkapi kode-kode untuk zoom in, zoom out, dan pan. Case "identify" Dim i As Long Dim L As MapObjects2.MapLayer Dim rec As MapObjects2.Recordset Dim s As String Dim P As MapObjects2.Point Dim FName As String Set P = Map1.ToMapPoint(X, Y) For i = 0 To 2 '0=cities, 1=roads, 2=states If i = 0 Then s = s & "Kota:" & vbCrLf FName = "Name" End If If i = 1 Then s = s & "Jalan:" & vbCrLf FName = "Route" End If If i = 2 Then s = s & "Propinsi:" & vbCrLf FName = "Name" End If Set L = Map1.Layers(i) Set rec = L.SearchByDistance(P, 0.1, "") While Not rec.EOF s = s & vbTab & rec.Fields(FName).ValueAsString If i = 1 Then s = s & ", Panjang=" & _ Format(rec.Fields("Shape").Value.Length * 110, "0") & "Km" If i = 2 Then s = s & ", Luas=" & _ Format(rec.Fields("Shape").Value.Area * 110 * 110, "0") & "Km2" s = s & vbCrLf Wend Next MsgBox s

Untuk mengetes program, klik-lah pada suatu titik dalam peta. Jika didekat titik klik tadi ada jalan, maka akan muncul rute-rute jalan tadi. Jika lokasi yang diklik dekat dengan. suatu kota, maka akan muncul nama-nama kota yang dekat dengan klik tadi. Contoh tampilan setelah melakukan identify ini dapat dilihat pada gambar 14.

Gambar 14. Contoh hasil saat melakukan Identify VIII. Searching

Identify digunakan untuk melihat keterangan dari suatu lokasi yang ingin diketahui data attributnya. Atau bisa juga untuk melihat data foto atau video jika di-link-kan ke suatu object. Jadi pengguna melihat data non spatial dari data spatial. Tapi kadang juga pengguna yang tidak begitu hapal dengan peta yang dilihatnya lebih memilih melakukan pencarian data spatial dari data nonspatialnya. Untuk keperluan inilah disediakan tool Searching. Proses searching dilakukan pada isi attribut-atrribut dari layer. Pada contoh program berikutnya, layer yang akan dicari adalah layer propinsi atau layer kota. Keduanya akan dicari pada isi dari field Namenya. Program akan mengambil record-record yang isi field name ini yang mengandung suatu string yang dimasukkan pengguna dan dimasukkan dalam sebuah listbox. Kemudian dari listbox tadi, pengguna dapat memilih salah satu nama propinsi (atau kota) dan melihat posisinya dalam peta. Pada layer propinsi, peta akan fokus ke propinsi yang ingin dilihat dan propinsi ini akan berkedap-kedip, sedang untuk kota hanya akan berkedap-kedip saja. Berikut adalah modifikasi tampilan untuk menambahkan fungsi searching

Gambar14. Desain tampilan yang telah ditambah proses searching Terdapat combobox di bagian kanan atas yang telah disiapkan pilihannya yaitu propinsi dan kota. Textbox dibawahnya digunakan untuk menerima input dari pengguna. Tombol dibawahnya untuk memulai pencarian yang hasilnya dimasukkan dalam listbox dibawahnya. Setelah terdapat hasil di listbox, isi listbox dapat digunkan untuk memilih kota / propinsi tertentu untuk dilihat dipeta lewat tombol Fokus dibawah list. Untuk melakukan searching berdasar nilai non spatial dapat dilakukan dengan fungsi SearchExpression. Sama dengan SearchByDistance, fungsi ini juga mengembalikan sebuah recordset. Parameter untuk fungsi SearchExpression ini adalah sebuah kalimat query tapi hanya kalimat yang berada setelah where. Jadi semisal jika query yang biasanya untuk mencari propinsi yang nama propinsinya adalah tabasco adalah SELECT * FROM states WHERE name=tabasco, dalam fungsi ini cukup ditulis name=tabasco saja. Berikut adalah program saat pengguna melakukan pengisian pada textbox, dilanjutkan klik pada tombol Mulai. Private Sub Command7_Click() Dim L As MapLayer Dim LName As String Dim rec As mapobjects2.Recordset List1.Clear Set L = Map1.Layers(Combo1.Text) Set rec = L.SearchExpression("Name Like '%" & Text1.Text & "%'") While Not rec.EOF List1.AddItem rec.Fields("Name").ValueAsString rec.MoveNext Wend End Sub

Berikutnya setelah isi list berisi nama propinsi/kota yang sesuai kriteria, pengguna dapat memilih salah satu dan menekan tombol fokus untuk melihat lokasinya di peta. Untuk melakukan ini data nonspatial pada layer di query lagi, hanya kali ini tidak menggunakan LIKE tetapi menggunakan = agar hasil yang terlihat dipeta adalah benar-benar object yang bernama persis seperti yang dipilih. Query ini akan menghasilkan recordset juga dan akan diambil bentuk spatialnya untuk di fokuskan dan di kelap-kelipkan. Untuk membuat peta menjadi fokus ke object terpilih dapat dilakukan dengan cara mengubah extent peta menjadi extent object terpilih. Sedang untuk membuat kelap-kelip digunakan perintah FlashShape yang mempunyai parameter object apa yang akan dibuat kalp-kelip, dan berapa kali kelap-kelip akan terjadi. Berikut adalah kode pada tombol Mulai: Private Sub Command6_Click() Dim pilih As String Dim rec As mapobjects2.Recordset pilih = List1.List(List1.ListIndex) Set L = Map1.Layers(Combo1.Text) Set rec = L.SearchExpression("Name='" & pilih & "'") While Not rec.EOF If Combo1.Text = "propinsi" Then Map1.Extent = rec.Fields("Shape").Value.Extent Map1.Refresh Map1.FlashShape rec.Fields("Shape").Value, 3 rec.MoveNext Wend End Sub Contoh Hasil dari proses searching yang kemudian dilanjutkan dengan melihat lokasi object hasil searching dapat dilihat pada gambar 16 berikut:

Gambar 16. Contoh hasil proses searching

Page 10 of 10 IX. Measuring

Salah satu keuntungan penggunaan data spatial adalah kita tidak perlu menyimpan nilai panjang dan luas, karena secara otomatis sudah dapat diambil dari data yang berbentuk vektor ini. Seperti sudah digunakan pada saat identify yang mengeluarkan panjang jalan dan luas propinsi dengan tinggal mengambil property length dan Area. Fungsi pemgambilan panjang dan Luas ini dapat kita manfaatkan juga untuk pengukuran panjang suatu rute tertentu atau pengukuran luas suatu bidang bebentuk tertentu di peta yang dalam Arcview disebut dengan measure. Untuk melakukan measure ini kita perlu menambahkan lagi tombol untuk pengukuran panjang dan pengukuran luas seperti pada gambar 17 dibawah

Gambar 17. Desain tampilan yang sudah dilengkapi Pengukuran jarak dan Luas Sama seperti Identify, proses pencarian jarak dan luas juga dilakukan saat event MouseDown pada object Peta. Jadi harus diberi mode dan bentuk pointer tertentu. Private Sub Command8_Click() pMode = "jarak" Map1.MousePointer = moCross End Sub Private Sub Command9_Click() pMode = "luas" Map1.MousePointer = moCross End Sub

Sebelum menambahkan kode pada event MouseDown, ada yang perlu disiapkan lagi. Yaitu bentuk dari rute dan bidang yang akan dibuat diatas peta. Membuat gambar diatas peta memerlukan object TrackingLayer. Object trackinglayer ini mempunyai koleksi simbol-simbol untuk menggambar bentuk tertentu yang disimpan dalam property Symbol dan jumlah simbolnya dalam property SymbolCount. Isi dari property symbol sama dengan isi property symbol pada object maplayer. Symbol-symbol ini

harus didefinisikan terlebih dahulu, dan akan ditambahkan dalam event form_load. Disini symbol pertama digunakan untuk menggambar rute, sedang simbol kedua untuk menggambar bidang. Map1.TrackingLayer.SymbolCount = 2 With Map1.TrackingLayer.Symbol(0) .SymbolType = moLineSymbol .Color = moRed .Size = 3 End With With Map1.TrackingLayer.Symbol(1) .SymbolType = moFillSymbol .OutlineColor = moRed .Color = moCyan End With Setelah bentuk symbol siap, dilanjutkan dengan menambahkan case untuk jarak dan luas. Jika sebelumnya kita mengenal TrackRectangle saat zoom in untuk memaksa pengguna membuat rectangle, maka untuk pengukuran jarak dan luas ini kita akan memaksa pengguna untuk membuat polyline dan polygon. Masing-masing dengan fungsi TrackLine dan TrackPolygon. Setelah pengguna membuat garis/polygon, bentuk garis/polygon ini kemudian dimasukkan dalam trackinglayer dengan fungsi AddEvent dan digambar dengan simbol yang sudah kita set sebelumnya. Setelah digambar, keterangan panjang/luas ditampilkan dengan messagebox dengan terlebh dulu dikalikan dengan konstanta derajat ke km. Setelah messagebox ditutup, gambar garis/polygon ini akan dihapus dengan ClearEvent. Berikut kode yang harus ditambahkan pada event mouseMove. Case "jarak" Dim Ln As mapobjects2.Line Set Ln = Map1.TrackLine Map1.TrackingLayer.AddEvent Ln, 0 MsgBox "Panjang=" & Ln.Length * 110 & " Km" Map1.TrackingLayer.ClearEvents Case "luas" Dim Pl As mapobjects2.Polygon Set Pl = Map1.TrackPolygon Map1.TrackingLayer.AddEvent Pl, 1 MsgBox "Luas=" & Pl.Area * 110 * 110 & " Km2" Map1.TrackingLayer.ClearEvents

Gambar 18 dan 19 berturut-turut menunjukkan contoh hasil dari fungsi pengukuran panjang dan luas ini.

Gambar 18. Contoh tampilan saat melakukan pengukuran panjang

Gambar 19. Contoh hasil saat melakukan pengukuran luas 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 symbolsymbol 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.

Membuat Aplikasi SIG dengan MapObjects Bagian II: Fungsi-fungsi Lanjutan Page 1 of 7 Berikut adalah lanjutan dari tulisan tentang membuat aplikasi SIG dengan mapobject dan visual basic. Pada bagian ini, akan dijelaskan bagaimana cara untuk menampilkan peta dalam bentuk2 yang lain selain di bagian pertama, yaitu dengan rendering. Juga akan ada sebuah cara untuk membuat print-out peta. Bahasan terakhir adalah bagaimana menambah data object pada shapefile. [nb:bagi yang menginginkan source-code lengkap dari contoh2 di bagian I dan II dapat menghubungi saya di [email protected]] I. Rendering

Layer peta dapat diatur tampilan warna maupun bentuknya berdasar setting yang diberikan terhadap property Symbol. Selain berdasar property ini, tampilan peta juga dapat diatur dengan property render yang isinya diambil dari beberapa fungsi rendering yang dapat dilakukan oleh MapObject. Fungsi rendering ini akan mengambil nilai atau isi dari field-field dalam layer untuk diproses dengan cara yang berbeda. Ada 5 jenis rendering yang akan dijelaskan yaitu LabelRenderer, ValueMapRenderer, ClassBreakRenderer, DotDensityRenderer, dan ChartRenderer. Yang lebih detailnya ada dalam sub bab-sub bab dibawah,

a.

LabelRenderer

Rendering jenis ini akan membuat aplikasi menampilkan layer dengan isi dari sebuah field nya ditampilkan dalam bentuk text. Fungsi ini sering digunakan untuk memberikan keterangan objectobject di peta. Sering kali, dalam suatu data, semua keterangan tentang object-object dalam petanya

ada dalam sebuah layer, yang sering disebut dengan layer annotation. Maka selain mengubah-ubah tampilan layer2 peta, biasa ditambahkan satu layer annotation ini untuk memberikan keteranganketerangannya. Hal ini dapat dilakukan dengan jenis renderer ini.

Untuk melakukan rendering jenis ini cukup mudah. Akan diperlukan sebuah object yaitu object LabelRenderer. Dalam Object ini yang perlu kita isikan adalah nama field yang isinya akan ditampilkan. Selain nama field tadi itu hanya tambahan-tambahan saja, seperti drawbackground untuk menentukan akan ditampilkan text-nya saja atau text-dan juga bentuk tampilan data spatialnya.

Contoh program rendering ini dan juga rendering yang lain, dapat dilakukan dengan cara menyelipkan atau mengubah potongan-potongan kode yang ada dibagian Form_load. Dimana untuk contoh labelrenderer ini dapat ditambahkan potongan program dibawah dan contoh hasilnya dapat dilihat pada gambar 20.

Dim L1 As MapObjects2.MapLayer Set L1 = New MapObjects2.MapLayer L1.GeoDataset = dc.FindGeoDataset("states") Dim lr As New MapObjects2.LabelRenderer lr.Field = "Name" lr.DrawBackground = False L1.Renderer = lr Map1.Layers.Add L1

Gambar 20. Contoh hasil LabelRenderer

Page 2 of 7

b.

ValueMapRenderer

Renderer jenis ini akan membuat record-record yang isi suatu field tertentu-nya berbeda akan ditampilkan dalam bentuk yang berbeda. Berguna untuk memperlihatkan suatu layer yang berisi banyak informasi yang berbeda, misalnya layer kabupaten yang akan ditampilkan dengan warna yang berberda tiap kecamatan-kecamatan didalamnya.

Inti dari rendering jenis ini adalah penentuan nilai/isi suatu field dan bentuk tampilan dari nilai tersebut. Misal untuk kecamatan A (isi field tertentunya adalah A) akan diwarnai merah, B diwarnai kuning, C hijau, dan seterusnya. Setiap pendeklarasian nilai baru akan merlukan semacam tempat baru, maka tempat ini harus dideklarasikan dahulu jumlahnya. Jumlah tempat ini adalah valueCount, sedang isi dan bentuk symbolnya masing-masing ada dalam property value dan symbol.

Dalam contoh berikut akan ditampilkan jika nama state-nya Sonora akan diwarnai merah, mexico hijau, dan yucatan kuning. Dengan contoh hasil tampilan pada gambar 21.

Dim L1 As MapObjects2.MapLayer

Set L1 = New MapObjects2.MapLayer L1.GeoDataset = dc.FindGeoDataset("states") Dim vr As New ValueMapRenderer vr.ValueCount = 3 vr.Field = "Name" vr.Symbol(0).Color = moRed vr.Value(0) = "Sonora" vr.Symbol(1).Color = moGreen vr.Value(1) = "Mexico" vr.Symbol(2).Color = moYellow

vr.Value(2) = "Yucatan" L1.Renderer = vr Map1.Layers.Add L1

Gambar 21. contoh tampilan ValueMap Renderer 1

Jika ingin membuat seluruh states-nya diwarnai dengan warna berbeda, maka kita dapat memanfaatkan object recordset untuk looping ke semua record dalam layer. Dimana disaat looping kita isikan value-nya dan bentuk symbolnya. Apabila bentuk symbol tidak diisi maka akan digenerate secara acak. Seperti pada contoh dibawah, states akan ditampilkan dalam warna-warna yang berbeda tetapi acak, setiap kali dijalankan akan memberikan susunan warna yang berbeda. Contoh hasilny ada pada gambar 22. Jika ingin susunan warnanya sama, biasanya digunakanlah susunan koleksi2 warna tertentu yang sering disebut dengan nama palette.

Dim L1 As MapObjects2.MapLayer Set L1 = New MapObjects2.MapLayer L1.GeoDataset = dc.FindGeoDataset("states")

Dim vr As New ValueMapRenderer vr.Field = "Name" Dim rec As MapObjects2.Recordset Set rec = L1.Records vr.ValueCount = rec.Count Dim i As Long i=0 While Not rec.EOF vr.Value(i) = rec("name").Value rec.MoveNext i=i+1 Wend L1.Renderer = vr Map1.Layers.Add L1

Page 3 of 7

c.

ClassBreakRenderer

Jika Jenis ValueMap biasa digunakan untuk field-field dengan tipe string, maka untuk field-field dengan tipe angka sering dibentuk dalam ClassBreak Renderer. ClassBreak renderer akan membuat kelompok-kelompok nilai, dimana kelompok-kelompok nilai tadi mempunyai bentuk symbol tertentu. Nilai suatu field jika ada dalam range suatu kelompok akan mengikuti bentuk symbol kelompok tadi. Untuk tipe polygon,biasanya perubahan nilai range diikuti dengan perubahan warna, sedang pada Garis dan Titik, selain perubahan warna juga dapat menggunakan perubahan ukuran.

Dalam contoh pertama akan dibuat 10 buah batas nilai (break), masing-masing batas nilai berselang 1.000.000 dari batas sebelumnya. Nilai-nilai ini akan dibuat dalam warna gradasi dari kuning ke merah. Jadi warna kuning akan bernilai paling kecil dan warna merah bernilai paling besar. Kelompok nilai ini akan dibuat untuk perbandingan dengan isi suatu field tertentu dalam layer, jika nilai field adalah 1.400.000 maka ia masuk kelompok 1.000.000 sampai 1.999.999, dan warna/symbol akan mengikuti warna atau symbol kelompok ini.

Untuk membuat kelompok nilai, dilakukan dengan mengisi property BreakCount. Dan pemberian nilai tiap batas dilakukan dengan mengisikan property break dengan parameter nomor break. Sedang untuk membuat warna gradasi dilakukan dengan fungsi rampcolors dengan parameter warna awal dan warna akhir. Berikut adalah cuplikan code untuk menambah layer dengan rendering bertipe classbreak. Dengan hasilnya dapat dilihat pada gambar 23.

Dim L1 As MapObjects2.MapLayer Set L1 = New MapObjects2.MapLayer L1.GeoDataset = dc.FindGeoDataset("states") Dim cb As New ClassBreaksRenderer cb.Field = "Pop1990" cb.BreakCount = 10 For i = 0 To cb.BreakCount - 1 cb.Break(i) = i * 1000000 Next cb.RampColors moYellow, moRed L1.Renderer = cb

Map1.Layers.Add L1

Gambar 23. Contoh classbreak renderer pada polygon

Contoh diatas adalah contoh untuk tipe data polygon. Seperti telah disebutkan sebelumnya, untuk Line dan Point, dapat dibuat suatu gradasi symbol berdasar besar atau ukurannya. Berikut ini dicontohkan kode untuk bentuk classbreak renderer untuk layer bertipe point. Untuk gradasi ukuran, dilakukan dengan fungsi SizeSymbol dengan parameter ukuran terkecil dan ukuran terbesar. Brikut adalah cuplikan code untuk menambahkan data cities yang dirender dengan classbreak renderer untuk ditampilkan dalam ukuran yang berbeda tergantung besar populasinya. Contoh hasilnya seperti terlihat pada gambar 24.

Dim cb As New ClassBreaksRenderer cb.Field = "Population" cb.BreakCount = 10 cb.SymbolType = moPointSymbol For i = 0 To cb.BreakCount - 1 cb.Break(i) = i * 100000 cb.Symbol(i).Color = moRed

cb.Symbol(i).Style = moCircleMarker Next cb.Symbol(i).Color = moRed cb.Symbol(i).Style = moCircleMarker cb.SizeSymbols 2, 20 L1.Renderer = cb Map1.Layers.Add L1

Page 4 of 7

d.

DotDensityRenderer

Dengan renderer classbreak dapat secara cepat terlihat mana daerah yang mempunyai jumlah penduduk terpadat. Cara lain yang dapat dilakukan selain memberikan warna seperti ini adalah dengan memberikan infomasi berupa kepadatan titik. Sebuah titik dapat mewakili suatu nilai. Misal jika sebuah titik mewakili 50.000 nilai, maka suatu daerah yang besar nilainya 1.000.000 akan ada 200 titik didalamnya yang posisinya dibuat acak. Penggambaran seperti ini dapat dilakukan dengan DotDensityRenderer.

Nilai yang diwakili titik tadi dapat di set melalui property DotValue. Selain itu bentuk titiknya dapat diubah-ubah warnanya, dan ukurannya. Cuplikan program berikut digunakan untuk menampilkan layer states dalam bentuk dotdensity. Dengan contoh hasilnya dapat dilihat pada gambar 2.4.

Dim L1 As MapObjects2.MapLayer Set L1 = New MapObjects2.MapLayer L1.GeoDataset = dc.FindGeoDataset("states") L1.Symbol.Color = moWhite Dim dd As New DotDensityRenderer dd.Field = "pop1990" dd.DotColor = moGreen dd.DotSize = 3 dd.DotValue = 50000 dd.DrawBackground = True L1.Renderer = dd Map1.Layers.Add L1

Page 5 of 7

e.

ChartRenderer

Masih tentang menampilkan nilai field, jika pada rendering-rendering sebelumnya digunakan untuk memperlihatkan nilai satu field, maka rendering tipe ChartRenderer ini dapat digunakan dengan menyajikan nilai beberapa field secara langsung. Nilai-nilai dari beberapa field ini akan disajikan dalam bentuk grafik (chart ). Ada dua tipe grafik yaitu batang/bar dan lingkaran/pie. Selain membandingkan dengan nilai dengan field yang lain dalam satu record, bentuk charnya juga memungkinkan kita untuk membandingkan dengan nilai pada record yang lain. Dalam bentuk bar akan terlihat dari panjangnya bar, sedang dalam bentuk pie akan terlihat dari besarnya lingkaran.

Seharusnya chart renderer digunakan untuk membandingkan beberapa field yang sejajar, seperti misal jumlah_penduduk_kulit_putih, jumlah_penduduk_kulit_hitam ,jumlah_penduduk_asi, dan sebagainya. tetapi karena dalam contoh data mexico tidak ada field yang sejajar untuk ditampilkan, maka untuk contoh berikut digunakan field P_urban90, P_ing_lang, P_empl_sec. Dengan warna masing-masing adalah merah, kuning, dan hijau. Contoh yang pertama bertipe Bar. Terlihat pada property ChartType. Dan contoh yang kedua hanya mengubah isi property ini dengan nilai moPie. Hasil kedua contoh dapat dilihat pada gambar 26 dan 27.

Dim L1 As MapObjects2.MapLayer Set L1 = New MapObjects2.MapLayer L1.GeoDataset = dc.FindGeoDataset("states") L1.Symbol.Color = moWhite Dim cd As New ChartRenderer cd.DrawBackground = True cd.FieldCount = 3 cd.Field(0) = "P_urban90" cd.Field(1) = "P_ing_lang" cd.Field(2) = "P_empl_sec" cd.ChartType = moBar cd.Color(0) = moRed cd.Color(1) = moYellow

cd.Color(2) = moGreen L1.Renderer = cd Map1.Layers.Add L1

Page 6 of 7 II. Printing

Sebuah aplikasi SIG sering digunakan sebagai dasar analisa bagi pemerintah daerah. Tidak jarang ada pihak-pihak lain yang ingin melihat pemetaan suatu kawasan tertentu meminta (membeli) hardcopy dari pemerintah daerah. Maka kebanyakan aplikasi SIG dapat melakukan printout sampai dengan ukuran kertas terbesar, yaitu A0.

Banyak cara untuk melakukan print-out peta. Hampi semua component tambahan dalam VB yang mengkhususkan fungsinya untuk print-out,seperti crystalreport atau activereport, dapat digunakan untuk printout peta.Karena peta yang tampil dilayar dapat diubah menjadi file (bmp,jpg, atau emf), dan kebanyakan dari component-component tadi menyediakan cara untuk men-attach-kan gambar dalam print-outnya.

Tapi jika tidak mempunyai component tambahan tadi, kita dapat memanfaatkan object COM pada Ms PowerPoint. Kenapa powerpoint ? sebenarnya dapat juga kita buat dalam bentuk ms Word atau Excel. Hanya saja powerpoint mempunyai satu keunggulan, yaitu dapat mencetak sampai A0 dan dapat diconvert kedalam ukuran-ukuran yang lain tanpa merusak gambar karena gambarnya berupa vektor.

Powerpoint ini akan dimanfaatkan untuk membuat template pencetakan. Yang perlu diingat disini adalah urutan penambahan object dalam powerpoint. Disini Object yang pertama akan digunakan sebagai tempat untuk peta, sedang object yang kedua d igunakan untuk tempat legend. Object2 berikutnya bebas mau dipakai untuk apa, bisa untuk judul, keterangan-keterangan lain, gambargambar pendukung, atau frame-frame pemanis tampilan. Pada gambar 28 terlihat contoh template sederhana untuk pencetakan peta.

Gambar 28. Contoh template dalam Microsoft powerpoint

Pada bagian program, karena kita memanfaatkan fungsi-fungsi powerpoint, maka perlu ditambahkan reference microsoft Powerpoint seperti pada gambar 29.

Gambar 29. Menambahkan reference powerpoint

Dalam interface dapat ditambahkan sebuah tombol untuk print. Didalam event click tombol ini yang akan dilakukan adalah :

Menyimpan tampilan peta kedalam file gambar. Yang dipilih adalah tipe EMF karena berbentuk vektor. Dan menyimpan juga legend kedalam file gambar, sayangnya untuk legend hanya ada fungsi untuk menympan sebagai file BMP

Map1.ExportMap moExportEMF, App.Path & "\peta.emf", 1 legend1.ExportToBmp App.Path & "\legenda.bmp"

Memanggil aplikasi powerpoint, me-load file template yang kita siapkan tadi. Mengakses slide nomor satu.

Dim pp As New PowerPoint.Application Dim pr As PowerPoint.Presentation Dim sl As PowerPoint.Slide

pp.Visible = True pp.Activate Set pr = pp.Presentations.Open(App.Path & "\template1.ppt") Set sl = pr.Slides(1)

Mengambil lokasi object 1 untuk tempat peta, dan object 2 untuk tempat legend, kemudian pada lokasi-lokasi tadi diisikan gambar peta dan gambar legend.

Dim sh As PowerPoint.Shape set sh = sl.Shapes(1) T = sh.Top + 2 L = sh.Left + 2 w = sh.Width - 4 h = sh.Height - 4 Set sh = sl.Shapes.AddPicture(App.Path & "\temp.emf", savewithdocument:=True, Left:=L, Top:=T, Width:=w, Height:=h) linktofile:=True,

Set sh = sl.Shapes(2) T = sh.Top + 2 L = sh.Left + 2 Set sh = sl.Shapes.AddPicture(App.Path savewithdocument:=True, Left:=L, Top:=T) & "\legenda.bmp", linktofile:=True,

Jadi kode lengkapnya saat melakukan print adalah seperti dibawah, dengan peta pada gambar 30, akan menghasilkan print-out seperti gambar 31.

Map1.ExportMap moExportEMF, App.Path & "\peta.emf", 1 legend1.ExportToBmp App.Path & "\legenda.bmp"

Dim pp As New PowerPoint.Application Dim pr As PowerPoint.Presentation Dim sl As PowerPoint.Slide

pp.Visible = True pp.Activate Set pr = pp.Presentations.Open(App.Path & "\template1.ppt") Set sl = pr.Slides(1) Dim sh As PowerPoint.Shape Set sh = sl.Shapes(1) T = sh.Top + 2 L = sh.Left + 2 w = sh.Width - 4 h = sh.Height - 4 Set sh = sl.Shapes.AddPicture(App.Path & "\temp.emf", savewithdocument:=True, Left:=L, Top:=T, Width:=w, Height:=h) linktofile:=True,

Set sh = sl.Shapes(2) T = sh.Top + 2 L = sh.Left + 2 Set sh = sl.Shapes.AddPicture(App.Path savewithdocument:=True, Left:=L, Top:=T) & "\legenda.bmp", linktofile:=True,

Page 7 of 7 III. Editing Peta

Seperti dijelaskan pada bab-bab awal, Aplikasi SIG mempunyai dua bentuk data yaitu data spatial dan data tabular. Untuk aktualisasi data, sepanjang itu adalah data tabular akan mudah untuk membuatnya karena seperti membuat editing database biasa. Yang menjadi masalah adalah bagaimana jika data

spatialnya berubah. Misal ada tambahan lokasi titik, ada jalur-jalur jalan baru, ada pemisahan daerah propinsi yang mengakibatkan munculnya propinsi baru, dan sebagainya.

Yang paling mudah adalah memang menyerahkan pengubahan data spatial ini pada aplikasi GIS seperti arcview. Karena disitu sudah sangat lengkap tool-toolnya. Tetapi jika user menginginkan editing spatial pada aplikasi, tetap kita dapat memfasilitasi-nya. Sebenarnya dapat juga dibuat selengkap tool-toool arcview, tetapi akan cukup rumit programnya. Yang paling rumit adalah pengubahan bentuk atau letak sebuah object dalam peta. Di arcview kita dapat merubah lokasi object dengan menggeser vertex-vertex yang ada pada polygon atau polilne. Di dalam aplikasi mapobject, sayang sekali hal ini akan cukup rumit, walau sebenarnya bisa dilakukan. Maka editing peta yang akan dijelaskan disini hanyanya untuk menambah object dan menghapus object spatial, dan mengubah data non spatial.

Agar lebih sederhana, akan dipisah antara data tipe point, line, dan polygon. Sekali lagi bahwa ini untuk penyederhanaan saja, sebenarnya dapat saja ketiga editing pada ketiga jenis ini digabung dalam ssatu form. Adapun desain form untuk editing dibuat seperti gambar 32.

Gambar 32. Desain editing Peta

Proses untuk editingnya adalah sebagai berikut: untuk menambah data, pertama klik pada tombol tambah point, setelah tombol ini diklik, tempatkan mouse pada peta di lokasi dimana mau ditambahkan object-nya. Untuk titik tinggal diklik sekali , sedang untuk line dan polygon akan membutuhkan beberapa kali klik karena data akan dibuat path demi path, yang jika telah selesai

membuat seluruh path, ditutup dengan melakukan double klik. Untuk editing isi-isi field dan hapus object, harus dilakukan select terlebih dahulu pada object yang bersangkutan. Yaitu dengan cara klik tombol select dan kemudian klik di peta object mana yang ingin diselect. Setelah itu dapat dilakukan pengubahan isi field dengan menuliskan nilai-nilai pada textbox-textbox dibagian bawah tombol select. Isian ini akan tersimpan jika dilakukan klik pada tombol Simpan Attribut. Sedang untuk hapusnya, tinggal dilakukan klik pada tombol hapus.

Untuk memberikan fungsi seperti diatas, yang perlu ditambahkan adalah (menggunakan kode pada form editing titik):

ubah penambahan layer-layer pada form load dalam bentuk pemanggilan terhadap suatu sub. Karena sub ini nanti akan sering dipanggil oleh lain-lain sub selama proses editing. Tambahkan bentuk tampilan object yang baru. Dilakukan dengan mensetting nilai-nilai pada object trackinglayer.symbol. tambahakan juga private variabel Recs, agar dapat diakses oleh semua sub dalam form ini

private recs as mapobjects2.records

Private Sub Form_Load() dc.Database = "c:\shapefile\mexico" If dc.Connect Then refreshdata Else MsgBox "direktori peta tidak ditemukan" End If Map1.TrackingLayer.SymbolCount = 1 Map1.TrackingLayer.Symbol(0).SymbolType = moPointSymbol Map1.TrackingLayer.Symbol(0).Color = moGreen Map1.TrackingLayer.Symbol(0).Style = moCircleMarker Map1.TrackingLayer.Symbol(0).Size = 8 End Sub

Tambahkan mode pada saat ingin melakukan penambahan object atau select object. Dapat ditentukan juga bentuk mousepointer-nya.

Private Sub Command5_Click() pMode = "tambah" Map1.MousePointer = moCross End Sub

Private Sub Command7_Click() pMode = "select" Map1.MousePointer = moArrowQuestion End Sub

Ubah onMouseDown pada object peta, tambahkan jika dilakukan saat 2 mode diatas akan melakukan apa. Disini proses akan dilakukan dalam sub, maka dalam mousedown ini dilakukan pemanggilan terhadap sub.

Case "tambah" TambahTitik Map1.Layers("kota"), x, y Case "select" SelectTitik Map1.Layers("kota"), x, y

-

Buat fungsi TambahTitik dan SelectTitik. P

Private Sub TambahTitik(ml As MapObjects2.MapLayer, x As Single, y As Single) Dim p As New MapObjects2.Point Dim f As MapObjects2.Field Set recs = ml.Records Set f = recs.Fields("Shape")

Set p = Map1.ToMapPoint(x, y) recs.Edit recs.AddNew f.Value = p recs.Update refreshdata End Sub

Private Sub SelectTitik(ml As MapObjects2.MapLayer, x As Single, y As Single)

Dim p As New MapObjects2.Point Set p = Map1.ToMapPoint(x, y) Set recs = ml.SearchByDistance(p, 0.1, "") Map1.TrackingLayer.ClearEvents If Not recs.EOF Then Text1.Text = recs.Fields("Name").Value Text2.Text = recs.Fields("Population").Value Map1.TrackingLayer.AddEvent recs.Fields("Shape").Value, 0 End If End Sub

-

terakhir tambahan fungsi untuk simpan attribut

Private Sub Command8_Click() recs.Edit recs.Fields("Name").Value = Text1.Text recs.Fields("Population").Value = Text2.Text

recs.Update End Sub

Contoh tampilan untuk proses editingpeta adalah seperti gambar 33.

Gambar 33. Contoh editing untuk peta jenis Point

Secara umum yang membedakan dengan tipe Lain dan Polygon hanyalah saat definisi symbol dalam trackinglayer symbol dan saat tambah object saja.

Untuk garis:

Map1.TrackingLayer.SymbolCount = 1 Map1.TrackingLayer.Symbol(0).SymbolType = moLineSymbol

Map1.TrackingLayer.Symbol(0).Color = moGreen Map1.TrackingLayer.Symbol(0).Style = moSolidLine Map1.TrackingLayer.Symbol(0).Size = 2

Private Sub TambahGaris(ml As MapObjects2.MapLayer, x As Single, y As Single) Dim ln As New MapObjects2.Line Dim f As MapObjects2.Field Set recs = ml.Records Set f = recs.Fields("Shape") Set ln = Map1.TrackLine recs.Edit recs.AddNew f.Value = ln recs.Update refreshdata End Sub

Untuk polygon:

Map1.TrackingLayer.SymbolCount = 1 Map1.TrackingLayer.Symbol(0).SymbolType = moFillSymbol Map1.TrackingLayer.Symbol(0).Color = moGreen Map1.TrackingLayer.Symbol(0).Style = moSolidFill

Private Sub TambahPoly(ml As MapObjects2.MapLayer, x As Single, y As Single) Dim ln As New MapObjects2.Polygon Dim f As MapObjects2.Field Set recs = ml.Records Set f = recs.Fields("Shape") Set ln = Map1.TrackPolygon recs.Edit recs.AddNew f.Value = ln recs.Update refreshdata End Sub

Dengan contoh tampilan masing-masing