Bagian 2: Proses dari layercontrol ke mapcontrol

Seri kedua artikel yang membahas pembuatan layer kontrol di mapxtreme.

Di artikel sebelumnya, dibahas bagaimana membuat tampilan layercontrol menggunakan gridview dan sebuah button. Dibagian kedua ini, dibahas bagaimana proses yang terjadi ketika button di klik, bagaimana melakukan perubahan di mapcontrol sesuai dengan perubahan di layercontrol.

Proses Dari LayerControl ke MapControl
Ketika button di klik, akan dilakukan pemeriksaan terhadap gridview untuk menentukan layer mana aktif atau yang dimatikan, dan juga label mana yang diaktifkan atau dimatikan.
Langkah pertama adalah membuat method untuk mendapatkan labellayer di MWS.

Code VB

Function GetLabelLayer(ByVal peta As Map) As LabelLayer
   Dim ll As LabelLayer = Nothing
   Dim mle As MapLayerEnumerator = peta.Layers.GetMapLayerEnumerator(MapLayerFilterFactory.FilterByType(GetType(Mapping.LabelLayer)))
   While mle.MoveNext()
     ll = CType(mle.Current, Mapping.LabelLayer)
   End While
   Return ll
End Function

Kemudian buat method untuk membaca daftar layer di database

Function GetLayerList() As String()
   Dim namalayer() As String
   'buat kode untuk membaca database, bisa menggunakan datareader
   'dicontoh ini gunakan untuk membaca data XML
Return namalayer
End Function

Kemudian sisipkan kode berikut di method button_click

Dim peta As Map = MapInfo.Engine.Session.Current.MapFactory.Item(0)
Dim flyr As FeatureLayer
Dim namalayer() As String = GetLayerList()
Dim ll As MapInfo.Mapping.LabelLayer = GetLabelLayer(peta)

For i As Byte = 0 To GvLayer.Rows.Count - 1
Dim rw As GridViewRow = GvLayer.Rows(i)
Dim cbvisible As CheckBox = CType(rw.Cells(1).FindControl("cbVis"), CheckBox)

flyr = CType(peta.Layers.Item(namalayer(i)), FeatureLayer)
'jika check box visible tercentang (layer muncul dipeta)
If cbvisible.Checked Then
If flyr.VisibleRange.RangeEnd <> 0.0 Then
    If peta.Zoom.Value > flyr.VisibleRange.RangeEnd Then
        flyr.VisibleRangeEnabled = False
        cbvisible.BackColor = Drawing.Color.White
        flyr.Enabled = True
    Else
        cbvisible.BackColor = Drawing.Color.White
        flyr.VisibleRangeEnabled = True
        flyr.Enabled = True
    End If
Else
    flyr.VisibleRangeEnabled = False
    cbvisible.BackColor = Drawing.Color.White
    flyr.Enabled = True
End If
Else
If flyr.VisibleRange.RangeEnd <> 0.0 Then
    If peta.Zoom.Value > flyr.VisibleRange.RangeEnd Then
        cbvisible.Checked = False
        cbvisible.BackColor = Drawing.Color.FromArgb(255, 102, 204) 'pink
        flyr.VisibleRangeEnabled = True
        flyr.Enabled = True
    Else
        cbvisible.BackColor = Drawing.Color.White
        flyr.VisibleRangeEnabled = True
        flyr.Enabled = False
    End If
Else
    cbvisible.BackColor = Drawing.Color.White
    flyr.Enabled = False
End If
End If

' cek label layer
If Not (ll Is Nothing) Then
Dim cbLabel As CheckBox = CType(rw.Cells(2).FindControl("cbLbl"), CheckBox)

'jika check box label tercentang (label muncul dipeta)
If cbLabel.Checked Then
    If ll.Sources.Item(namalayer(i)).VisibleRange.RangeEnd <> 0.0 Then
        If (peta.Zoom.Value > ll.Sources.Item(namalayer(i)).VisibleRange.RangeEnd) Then
            ll.Sources.Item(namalayer(i)).VisibleRangeEnabled = False
            cbLabel.BackColor = Drawing.Color.White
            ll.Sources.Item(namalayer(i)).Enabled = True
        Else
            ll.Sources.Item(namalayer(i)).VisibleRangeEnabled = True
            cbLabel.BackColor = Drawing.Color.White
            ll.Sources.Item(namalayer(i)).Enabled = True
        End If
    Else
        ll.Sources.Item(namalayer(i)).VisibleRangeEnabled = False
        cbvisible.BackColor = Drawing.Color.White
        ll.Sources.Item(namalayer(i)).Enabled = True
    End If
Else
    If ll.Sources.Item(namalayer(i)).VisibleRange.RangeEnd <> 0.0 Then
        If (peta.Zoom.Value > ll.Sources.Item(namalayer(i)).VisibleRange.RangeEnd) Then
            cbLabel.Checked = False
            cbLabel.BackColor = Drawing.Color.FromArgb(255, 102, 204) 'pink
            ll.Sources.Item(namalayer(i)).VisibleRangeEnabled = True
            ll.Sources.Item(namalayer(i)).Enabled = True
        Else
            cbLabel.BackColor = Drawing.Color.White
            ll.Sources.Item(namalayer(i)).VisibleRangeEnabled = True
            ll.Sources.Item(namalayer(i)).Enabled = False
        End If
    Else
        cbLabel.BackColor = Drawing.Color.White
        ll.Sources.Item(namalayer(i)).Enabled = False
    End If
End If
End If
Next
peta = Nothing
flyr = Nothing
namalayer = Nothing
GC.Collect()
If flyr.VisibleRange.RangeEnd <> 0.0

untuk memeriksa apakah ada visibility range dari layer. Jika checkbox tidak di chek dan nilai visibility range layer lebih kecil dari zoom peta, maka layer tetap di set enable dan checkbox ditampilkan dalam warna pink.
Proses yang sama juga dilakukan untuk labellayer. Pada dasarnya yang dilakukan hanyalah merubah property Enable dari layer. Jika di layercontrol di check, maka enable = true, jika tidak maka enable = false.

Untuk proses yang terjadi pada layercontrol ketika terjadi perubahan di mapcontrol akan dibahas di artikel selanjutnya.

About Yuniar

Penulis sekarang lebih banyak bekerja menggunakan teknologi Microsoft .NET secara umum dan TIDAK lagi menggunakan aplikasi MapXtreme.net dari MapInfo. Karena itu mohon maaf, jika pertanyaan-pertanyaan mengenai MapXtreme sudah tidak bisa saya jawab lagi.

Posted on 7 September 2009, in MapXtreme, Web GIS and tagged , , , . Bookmark the permalink. 11 Komentar.

  1. maaf sekali mas komentarnya salah masuk ke add point, Perkenalkan nama saya linda, saya sedang mempelajari mapxreme untuk tugas akhir saya, makasih banget tambahan ilmunya mas, cuman mungkin saya yang sangat awam kok pas saya coba terapkan pembuatan layercontrol ini hasilnya masih ada erorr ya ….
    1. pas di LyrControlCommand, itu ada eror yang menanyakan “GetLabelLayer”
    2. di kode VB menanyakan juga ‘LabelLayer’
    3. itu yang di “Function GetLayerList” contoh pembacaan data XML yang mana mas..
    3. klo boleh, saya pengen tahu kode ini selengkapnya biar gak ada erorr lagi, gpp gak pake petanya juga biar ringan, saya bisa download dimana ya mas, ato klo mas tidak keberatan mohon dikirim ke email saya aja “lindacute01@yahoo.com”

    • Salam kenal juga…😀
      Saya coba satu persatu ya.
      1. kan di contoh saya ada tuh function GetLabelLayer. Trus errornya gmana?
      2. Dibagian /kode yang mana yang menanyakan labellayer?
      3. Di artikel bagian pertama, saya memberi contoh bagaimana format/struktur data XML yang menyimpan informasi layer2, disitu saya juga tulis ada atribut layer alias, layername dan imgsrc untuk gambar simbol dari layer. Baca dulu yang ini. Di gambar layer control SISN ada kolom layer (kolom 1) yng informasinya diambil dari layeralias di data XML dan kolom 4 yang merupakan simbol layer informasinya diambil dari atribut imgsrc dari data xml.
      Fungsi GetLayerList memang tidak saya tulis disitu kodenya, karena asumsi saya, informasi mengenai daftar layer bisa di simpan dimana aja, bisa di database atoupun dalam bentuk XML seperti contoh saya di artikel 1 ataupun dalam format laen. Dan fugsi GetLayerList itu membaca informasi mengenai “layername”
      4. Sya gak ada contoh kodenya. Mengenai kode pembacaan XML, linda bisa mencari di google ataupun di MSDN, banyak artikel yang membahas tentang ini lebih detil.

  2. terimakasih sekali mas atas penjelasannya… semoga blognya makin rame. itu mas tentang mapxtremenya terus tambahin ya biar ilmunya dapat dinikmati banyak orang karena di kita jarang sekali yang membahas masalah ini.

    oh ea mas itu kalo boleh request gmn scriptnya bikin filter lokasi pake SQL, karena kalo fungsi find tidak bisa menemukan object yg pake filter. contoh kasus klo kita pake sample program mapxtremenya sendiri kita melakukan pencarian : country dengan filter continent=”asia”, Capital = “Jakarta”
    sebelunnya terimakasih ya mas..

  3. ea mas.. gmn biar coment sql bisa dipake untuk memfilter dan select dari object yg kita inginkan, karena fungsi find tidak bisa jika dalam satu colom ada lebih dari satu yang sama,
    contoh kasus; fungsi find bisa mnemukan object country indonesia (dari table world) tapi klo object yg mo kita cari country : conntinent = europe , Capital = london fungsi find tidak bisa. nah untuk melakukannya mungkin kita harus membuat filter pake sql select,
    itu mohon bimbingannya supaya fungsi itu bisa di eksekusi di aplikasi kita….

    • Kayaknya pertanyaan linda mirip yang di tanyakan oleh Eric deh…
      Bagaimana kalau Linda cari dulu satu-satu, pertama buat query untuk cari continen = europe lalu di looping untuk cari capital = london.

      Sebenarnya data atribut linda itu tersimpan di SQL server atau tetep jadi satu ama petanya? kalo jadi 1 ama peta, berarti harus pake sql standarnya mapinfo.
      Lalu apa data tersebut terletak di satu layer atau terpisah pisah di layer yang berbeda? misal continen ada di layer continen, trus capital ada di layer yang laen.
      Kalo ya, berarti Linda harus cari satu2 per layer pake metode looping. Mirip yang ditanyakan Eric (coba cari coment2 eric sebelumnya).

      NB: Lagi boring… iseng2 buka sample find di mapxtreme
      Maksudnya linda ini bukan? SELECT COUNTRY FROM WORLD WHERE CONTINENT =”EUROPE” AND CAPITAL = “LONDON”

  4. hehe… makasih mas.. aq sudah dua pertanyaan sebelunya sudah bisa aq selsaikan dan jalan di aplilaksi saya, makasih bgt ya, cuman sekarang saya bingung nambahin SCALEBAR saya maunya unit jaraknya dalam kilometer ke peta kita, Mohon petunjuknya mas.

    • Saya gak pernah tuh bikin scalebar…..
      Karena selama ini di aplikasi yang aku buat, satuan jaraknya selalu km, gak pernah mile.

      Kalo kita lihat di class MapInfo.Mapping.ScaleBarAdornment ada property MapUnit tapi ini tipenya readonly jadi gak bisa diubah.
      Jadi kemungkinan satuan jarak ini tergantung pada petanya, mungkin di set di mapinfo atau di workspace manager. CMIIW

  5. Linda, mohon informasi pemecahan solusi pertanyaan2 yang kamu selesaikan. Aku juga mengalami hal yang sama. Terimakasih.. kalo berkenan silahkan kirim by email juga ke kiki@wisaka.or.id

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: