Menampilkan Peta Berbeda Dalam Satu Aplikasi MapXtreme

Menampilkan peta yang berbeda disini maksudnya adalah, jika kita mempunyai 2 atau lebih peta yang tidak terkait. Misal jika peta pertama tampil, maka peta kedua dihilangkan, atau jika peta kedua tampil maka peta pertama dihilangkan atau peta pertama menggunakan batas administrasi sedang peta kedua menggunakan batas yang lain sehingga kedua peta diperlakukan berbeda. Setidaknya ada 2 cara untuk membuat hal semacam ini

  • Membuat file MWS berbeda. Masing-masing peta dibuat MWS tersediri
  • Membuat 1 file MWS dengan beberapa Map alias.

Disini saya tulis mengenai cara kedua, Menggunakan 1 file MWS untuk beberapa peta.

Menyiapkan File MWS
Perhatikan gambar file MWS dibawah ini. Buka workspace manager, dan buat 1 file MWS. Secara default hanya ada satu map, “Map1”. Tambahkan layer peta pada Map1. Klik button Maps, dan tambahkan Map2. Di Map2 tambahkan layer peta lainnya.

Map1

Map 2

Ada dua map (mapalias), Map1 dan map2. Masing-masing map mempunyai susunan peta yang berbeda. Kita bisa menambahkan layer lainnya di masing-masing Map, disini saya hanya menggunakan satu layer peta.

Menyiapkan WebSite Project
Buat website baru, gunakan MapXtreme template. Tambahkan radio button list berikut di file Mapform.aspx (Default.aspx).

<asp:RadioButtonList ID="RadioButtonList1" runat="server" AutoPostBack="True">
    <asp:ListItem Value ="Map1" Text="Jawa" Selected="True"></asp:ListItem>
    <asp:ListItem value="Map2" Text="Kalimantan" ></asp:ListItem>
</asp:RadioButtonList>

Di bagian MapControl, kosongkan property MapAlias. Sehingga kodenya menjadi seperti berikut

<cc1:MapControl ID="MapControl1" runat="server" Height="248px" Width="393px" />

Buka Codebehind file, tambahkan method untuk event radiobuttonlist

Protected Sub RadioButtonList1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles RadioButtonList1.SelectedIndexChanged
     MapControl1.MapAlias = RadioButtonList1.SelectedValue
End Sub

Dan didalam event Page_Load, tambahkan kode berikut, untuk menentukan map alias mana yang akan diload oleh mapcontrol pertama kali. Kalau tidak diset, biasanya yang dipanggil adalah Map1.

If Not Page.IsPostBack Then
     MapControl1.MapAlias = RadioButtonList1.SelectedValue
End If	

Jalankan aplikasi, tampilan awal adalah peta Jawa (Map1), semua informasi map1 seperti koordinat system, posisi center map, zoom range akan tersimpan dalam session. Ketika kalimantan di pilih, peta berubah menjadi kalimantan tapi posisi pusat peta masih mengacu pada Map1 (Jawa). Karena informasi yang tersimpan dalam session adalah informasi untuk map1

Ketika Kalimantan (Map2) dipilih, objek peta yang disimpan di session masih merupakan peta jawa (Map1), karena Map1 dan Map2 mempunyai koordinat system yang sama (WGS84) maka map2 bisa ditampilkan dengan posisi pusat peta sesuai dengan map1.

Kesalahan ini disebabkan karena kedua peta menggunakan objek session yang sama. Untuk menghindari kesalahan ini, informasi masing-masing peta disimpan di objek session yang berbeda. Jika aplikasi yang dibuat menggunakan metode state manual (StateServer), kita perlu merubah prosedur penyimpanan informasi peta di session. Buka file AppStateManager.vb, modifikasi method SaveState dan RestoreState, kurang lebih menjadi seperti ini.

Public Overrides Sub SaveState()
    Dim mapAlias As String = ParamsDictionary(ActiveMapAliasKey)
    Dim map As Map = GetMapObj(mapAlias)

    If Not map Is Nothing Then
        If mapAlias = "Map1" Then
            ManualSerializer.SaveMapXtremeObjectIntoHttpSession(map.Center, "center")
            ManualSerializer.SaveMapXtremeObjectIntoHttpSession(map.Layers, "Layers")
            ManualSerializer.SaveMapXtremeObjectIntoHttpSession( _
            MapInfo.Engine.Session.Current.Selections.DefaultSelection, "Selection")
            ' Mark the users HTTPSession as dirty
            HttpContext.Current.Session("UserDirtyFlag") = True
        Else
            ManualSerializer.SaveMapXtremeObjectIntoHttpSession(map.Center, "center2")
            ManualSerializer.SaveMapXtremeObjectIntoHttpSession(map.Layers, "Layers2")
            ManualSerializer.SaveMapXtremeObjectIntoHttpSession( _
            MapInfo.Engine.Session.Current.Selections.DefaultSelection, "Selection2")
            ' Mark the users HTTPSession as dirty
            HttpContext.Current.Session("UserDirtyFlag") = True
        End If
    End If
End Sub

Public Overrides Sub RestoreState()
    Dim mapAlias As String = ParamsDictionary(ActiveMapAliasKey)
    Dim map As Map = GetMapObj(mapAlias)

    If (Not IsDirtyMapXtremeSession(map)) Then
        SaveDefaultState(map)
    End If

    ' If it was user's first time and the session is dirty, restore the default state.
    If IsUsersFirstTime() Then
        If IsDirtyMapXtremeSession(map) Then
            RestoreDefaultState(map)
        End If
    Else
        If (IsDirtyMapXtremeSession(map)) Then
            ' TODO: Manual work to prepare the dirty Pooled MapXtreme Session instance
        Else
            ' TODO: Manual work to prepare the clean Pooled MapXtreme Session instance
        End If

        If mapAlias = "Map1" Then
            'RestoreZoomCenterState(map)
            ManualSerializer.RestoreMapXtremeObjectFromHttpSession("center")
            ManualSerializer.RestoreMapXtremeObjectFromHttpSession("Layers")
            ManualSerializer.RestoreMapXtremeObjectFromHttpSession("Selection")
        Else
            'RestoreZoomCenterState(map)
            ManualSerializer.RestoreMapXtremeObjectFromHttpSession("center2")
            ManualSerializer.RestoreMapXtremeObjectFromHttpSession("Layers2")
            ManualSerializer.RestoreMapXtremeObjectFromHttpSession("Selection2")
        End If
    End If
End Sub

Perhatikan di method SaveState(), informasi center map dan layer masing-masing map disimpan secara terpisah. Sehingga ketika RestoreState dijalankan tidak terjadi kesalahan seperti yang dijelaskan sebelumnya.

Dengan cara ini, kita bisa menampilkan beberapa peta dengan tema yang berbeda dalam satu aplikasi. Tentu saja pengaturan di appstate tidak akan sesederhana ini jika kita juga menerapkan tematik di masing-masing peta.

Catatan:
Jika aplikasi dibangun menggunakan metode InProc (HttpSessionState) kemungkinan penggunakan mapalias ini tidak akan berjalan mulus. Karena informasi yang disimpan dalam session objek di handle secara otomatis, kita tidak tahu informasi apa yang disimpan. Sehingga dalam beberapa percobaan yang saya lakukan dengan metode InProc (HttpSessionState) terkadang berjalan dengan mulus namun terkadang tidak sesuai yang diharapkan.

Happy Coding (Dibuat menggunakan MXT 7.0)

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 20 Juni 2011, in MapXtreme, Web GIS and tagged , . Bookmark the permalink. 2 Komentar.

  1. maaf mas.. bila masih sempat menulis saya ada pertanyaan..
    mengenai artikel ini memakai cara yang pertama (bbrp mws), dg cara yang kedua (1 mws) penampilan map-nya cepetan yang mana.? terima kasih.

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: