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.
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)
Posted on 20 Juni 2011, in MapXtreme, Web GIS and tagged MapXtreme Web, MWS. Bookmark the permalink. 2 Komentar.
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.
No idea…. Belum pernah ngetes mana yang lebih cepat.