Menggabungkan Tabel Database dengan Tabel Atribut di MapXtreme

Biasanya, dalam pembuatan aplikasi GIS sering dipisahkan antara tabel data dan peta. Informasi statistik yang sangat banyak tidak disimpan dalam tabel atribut peta, tetapi disimpan dalam database. Tabel atribut peta hanya menyimpan ID  dan keterangan singkat dari objek. Lalu bagaimana menghubungkan tabel di database dengan tabel atribut peta? Ada satu kolom yang biasanya digunakan sebagai referensi, sebut saja kolom ID. Kolom ini terdapat di tabel atribut peta dan juga di tabel database. Kolom inilah menjadi kunci penghubung antara tabel atribut peta dan tabel database.

Peta tematik merupakan satu contoh penerapan dari penggabungan data dari database ke tabel atribut peta. Peta tematik terbentuk berdasarkan data yang ada di tabel atribut peta. Jika data ada di database, maka data harus dipindahkan dan digabungkan ke tabel atribut kemudian peta tematik dibuat. Di artikel kali ini, saya mencoba mengupas penggabungan data dari database SQL server ke tabel atribut peta.

Langkap pertama, ambil data dari database menggunakan ADO.net

Dim tempDs As New DataSet
Dim sqlKon As New SqlClient.SqlConnection("KONEKSI STRING")
Dim cmd As SqlClient.SqlCommand = sqlKon.CreateCommand()
cmd.CommandText = query
sqlKon.Open()
Dim da As New SqlClient.SqlDataAdapter(cmd)
da.Fill(tempDs, "srcTable")
Dim dt As DataTable = tempDs.Tables("srcTable")

Setelah informasi dari database diperoleh, simpan sebagai TableInfoAdonet. Ini penting terutama jika aplikasi di buat menggunakan metode Manual state.

Dim tab As MapInfo.Data.Table
tab = MapInfo.Engine.Session.Current.Catalog("miAdoNetTable")

If Not tab Is Nothing Then tab.Close()

Dim tiAdoNet As MapInfo.Data.TableInfoAdoNet
tiAdoNet = New MapInfo.Data.TableInfoAdoNet("miAdoNetTable", dt)
TableInfo.Create(TableType.AdoNet, "miAdoNetTable")

Kemudian periksa tabel atribut peta, apakah ada kolom temporary hasil dari proses join sebelumnya?. Asumsikan, secara default di tabel atribut ada dua kolom, Misal kolom ID dan NamaRegion. Jika kolom di tabel atribut peta lebih dari dua, maka ada kolom lain bersifat temporary yang kemungkinan merupakan hasil join sebelumnya. Kumpulkan kolom temporary ini dan hapus.

Dim TblAdo, TblLayer As MapInfo.Data.Table
TblAdo = MapInfo.Engine.Session.Current.Catalog.OpenTable(tiAdoNet)
TblLayer = MapInfo.Engine.Session.Current.Catalog.GetTable(nmlayer)
If TblLayer.TableInfo.Columns.Count > 2 Then
    Dim tempKol() As String
    Dim kol As String = String.Empty
    For i As Byte = 0 To TblLayer.TableInfo.Columns.Count - 1
        If TblLayer.TableInfo.Columns(i).ColumnType = ColumnType.TemporaryPhysical Then
            kol = kol & "," & TblLayer.TableInfo.Columns.Item(i).ToString()
        End If
    Next
    tempKol = kol.Trim.Remove(0, 1).Split(",")
    'kumpulkan kolom temporary dalam stringcollection
    Dim KoldiHapus As New StringCollection()
    KoldiHapus.AddRange(tempKol)
	'kolom temporary dibersihkan/dihapus
    TblLayer.DropColumns(KoldiHapus)
    TblLayer.RefreshColumns(KoldiHapus)
End If

Langkah terakhir adalah menggabungkan tabel database ke tabel layer. Sourcekolom merupakan nama kolom di database yang akan dibandingkan kolom di tabel atribut peta. Di contoh ini, diasumsikan tabel key di tabel atribut peta adalah ID.

TblLayer.AddColumns(Nothing, BindType.Static, TblAdo, _
                    sourcekolom, [Operator].Equal, "ID")

Berikut adalah contoh kode selengkapnya menggunakan VB.net.

Sub JoinTabel2(ByVal query As String, ByVal nmlayer As String, _
               ByVal sourcekolom As String)
'ambil data dari database
Dim tempDs As New DataSet
Dim sqlKon As New SqlClient.SqlConnection("KONEKSI STRING")
Dim cmd As SqlClient.SqlCommand = sqlKon.CreateCommand()
cmd.CommandText = query
sqlKon.Open()

Dim da As New SqlClient.SqlDataAdapter(cmd)
da.Fill(tempDs, "srcTable")
Dim dt As DataTable = tempDs.Tables("srcTable")

'simpan data dari database  sebagai TableInfoAdoNet
Dim tab As MapInfo.Data.Table
tab = MapInfo.Engine.Session.Current.Catalog("miAdoNetTable")

If Not tab Is Nothing Then tab.Close()

Dim tiAdoNet As MapInfo.Data.TableInfoAdoNet
tiAdoNet = New MapInfo.Data.TableInfoAdoNet("miAdoNetTable", dt)
TableInfo.Create(TableType.AdoNet, "miAdoNetTable")

Dim TblAdo, TblLayer As MapInfo.Data.Table
TblAdo = MapInfo.Engine.Session.Current.Catalog.OpenTable(tiAdoNet)
TblLayer = MapInfo.Engine.Session.Current.Catalog.GetTable(nmlayer)

'periksa apakah jml kolom di tabel layer lebih dari defaultnya.
'asumsikan jumlah kolom defaultnya ada 2.
If TblLayer.TableInfo.Columns.Count > 2 Then
    Dim tempKol() As String
    Dim kol As String = String.Empty
    For i As Byte = 0 To TblLayer.TableInfo.Columns.Count - 1
        If TblLayer.TableInfo.Columns(i).ColumnType = ColumnType.TemporaryPhysical Then
            kol = kol & "," & TblLayer.TableInfo.Columns.Item(i).ToString()
        End If
    Next
    tempKol = kol.Trim.Remove(0, 1).Split(",")
    'kumpulkan kolom temporary dalam stringcollection
    Dim KoldiHapus As New StringCollection()
    KoldiHapus.AddRange(tempKol)
	'kolom temporary dibersihkan/dihapus
    TblLayer.DropColumns(KoldiHapus)
    TblLayer.RefreshColumns(KoldiHapus)
End If

'join tabel database ke tabel layer
'sourcekolom adalah nama kolom key di database
TblLayer.AddColumns(Nothing, BindType.Static, TblAdo, _
                    sourcekolom, [Operator].Equal, "ID")

'bersihkan semuanya
sqlKon.Close()
sqlKon.Dispose()
tempDs.Dispose()
cmd.Dispose()
da.Dispose()
End Sub

Semoga bermanfaat dan mohon koreksinya. Happy Coding.

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 16 Desember 2009, in MapXtreme and tagged , , , , . Bookmark the permalink. Tinggalkan komentar.

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: