PostGIS Dynamic Input Dengan Mapserver CGI Mode

Pada script .map Anda, mungkin menggunakan koneksi PostGIS untuk mengakses data dan geometry. Pertanyaan yang muncul, bagaimana pada data yang ingin kita tampilkan bersifat dinamis. Misalnya saja untuk klasifikasi peta dalam NQuery Mode ataupun layer khusus yang menampilkan data dengan masukan (input) dari website.
Salah satu koneksi statis menampilkan data pada salah satu layer misalnya seperti ini:

CONNECTIONTYPE postgis
CONNECTION "host=localhost dbname=bandung user=eric password=password"
DATA "the_geom from bandung"


Sekarang kita ingin menambah satu layer lagi dengan klasifikasi kepadatan penduduk satu daerah kecamatan yang lebih dari 50rb orang. Kita tentu membuat kondisi khusus seperti ini:

CONNECTIONTYPE postgis
CONNECTION "host=localhost dbname=bandung user=eric password=password"
DATA "the_geom from bandung WHERE 'POPULASI' >= 50"

Atau menggunakan beberapa klasifikasi dengan pewarnaan yang berbeda:

CONNECTIONTYPE postgis
CONNECTION "host=localhost dbname=bandung user=eric password=password"
DATA "the_geom from bandung"
CLASSITEM 'POPULASI'
     CLASS
       NAME 'Populasi Rendah'
       EXPRESSION ([POPULASI] >= 0 AND [POPULASI] < 50)
       COLOR 255 0 0
       OUTLINECOLOR 0 0 0
     END
     CLASS
       NAME 'Populasi Sedang'
       EXPRESSION ([POPULASI] >= 50 AND [POPULASI] < 200)
       COLOR 255 255 0
       OUTLINECOLOR 0 0 0
     END
     CLASS
       NAME 'Populasi Tinggi'
       EXPRESSION ([POPULASI] >= 200)
       COLOR 0 255 0
       OUTLINECOLOR 0 0 0
     END
 END

Lebih ke depan, setelah mempelajari dan menerapkan fungsi routing dijkstra, kita ingin menampilkan source_id dan target_id yang dinamis:

CONNECTIONTYPE postgis
CONNECTION "host=localhost dbname=roads user=routing password=password"
DATA "the_geom from (SELECT gid, the_geom from
         shortest_path_as_geometry('route', 1, 4567))
         as route using unique gid using srid=-1"

Ganti angka 1 dan 4567 berdasarkan masukan. Katakan saja variabel srcID dan trgID.
Ganti saja parameter kondisi dengan suatu variabel. Contoh untuk kasus routing misalnya titik awal routing diberi variabel srcID dan titik tujuan diberi variabel trgID. Ubah sintaks di mapfile menjadi:

CONNECTIONTYPE postgis
CONNECTION "host=localhost dbname=roads user=routing password=password"
DATA "the_geom from (
         SELECT gid, the_geom from
                      shortest_path_as_geometry('route', %srcID%,%trgID%)
         ) as route using unique gid using srid=-1"

Dan jangan lupa pada template html dimasukkan variabel srcID dan trgID:

 <input type="hidden" value="[srcID]" name="srcID" />
 <input type="hidden" value="[trgID]" name="trgID" />

Metoda ini sangat simpel dan dapat dikembangkan misalnya dengan menggunakan javascript.

Selamat Mencoba


Sekarang bagian dimana kita akan menginstall PostGIS sebagai media penyimpanan data kita menggunakan PostgreSQL database server. Mengapa PostgreSQL? Kenapa gak menggunakan MySQL yang notabene sudah biasa digunakan?

Pertama, saranku adalah jalan2 ke OpenGIS. Dari perkembangan awal Open Geospatial Consortium dibentuk, postgre dev-team menjadi salah satu pembentuk OGC standarisasi untuk pembentuk data geometri dalam database. Oracle kemudian berkontribusi semenjak merilis versi open database-nya Oracle 10g dan MySQL baru dapat mengimplementasikan pada versi 5.0. Tipe data geometri (wkb/wkt) yang dirilis mysql5 ini juga awalnya kurang disetujui oleh OGC karena tidak memenuhi standarisasi yang telah ditetapkan. Sebelum unsubscribe dari milis PostGIS, versi awal MySQL5 ini juga banyak dikritik oleh dev-team nya PostGIS dan belum layak disertakan dan disebut MyGIS. Mereka bahkan mengejek bahwa mysql belum dapat dikatakan sebagai true database dan jangan malu-malu kalau memang butuh bantuan untuk developnya. Saat ini kurang tahu juga perkembangannya tapi sepertinya sudah dapat diterima masyarakat GIS sendiri walaupun rata-rata masih menggunakan modul OGR/TAB yang diberikan GDAL menggunakan koneksi ODBC. Bagi yang sudah terbiasa menggunakan phpMyAdmin, tentu tidak akan menemukan tipe data geometri ini. tapi kalau Anda memasukkan tipe geometry akan diterima oleh mysql (yang tentu saja harus sesuai dengan standarisasi pembentukan data geometri ini).

Instalasi ini akan kita bagi menjadi 3: Instalasi PostgreSQL, Instalasi PostGIS dan Pembuatan Template PostGIS. Tidak lupa juga disertakan satu contoh untuk memasukkan data geometri ke dalam postgresql server. Dan lagi-lagi dilakukan di lingkungan FreeBSD ya. Soalnya bego kalau pakai yang laen ;))

1. Instalasi PostgreSQL

Sangat disarankan untuk menggunakan postgesql 8.1 ke atas karena sudah lebih stabil dan standarisasi bentuk geometri telah ditetapkan. untuk versi 7.8 - 8.0.0 mempunyai bentuk masing-masing yang berbeda dan akan menyulitkan apabila terjadi pemindahan data (backup - upload) dari satu server ke server lain.

cd /usr/ports/databases/postgresql81-server && make install clean
 
echo 'postgresql_enable="YES"'>> /etc/rc.conf
 
echo 'postgresql_data="/usr/local/pgsql/data"'>> /etc/rc.conf
 
echo 'postgresql_flags="-w -s -m fast"'>> /etc/rc.conf
 
/usr/local/bin/initdb -D /usr/local/pgsql/data
 
  # pastikan semua direktori data dimiliki oleh user pgsql (ato postgres)
chown -R pgsql : pgsql /usr/local/pgsql
 
  # edit konfigurasi untuk server Anda sesuai dengan kebutuhan ( postgresql.conf )
edit /usr/local/pgsql/data/postgresql.conf
 
  -- listen_addresses = 'localhost'
  # diaktifkan (uncomment) dan isi dengan
 
  -- listen_addresses = '*'
 
  # agar bisa konek dari alamat lain atau tinggalkan terkomen (default)
  # bila hanya localhost yang dapat melakukan koneksi (untuk keamanan)
  # edit konfigurasi untuk autentikasi user ( pg_hba.conf )
  # secara default, koneksi dari localhost dibebaskan (tanpa password)
  # tentu ini sangat berbahaya untuk keamanan
 
edit /usr/local/pgsql/data/pg_hba.conf
  # pada paling bawah cari bagian trust ganti dengan password
  # # TYPE  DATABASE	USER		CIDR-ADDRESS		METHOD
  # # "local" is for Unix domain socket connections only
  # local	all		 all				password
  # # IPv4 local connections:
  # host	all		 all		127.0.0.1/32	password
  # # IPv6 local connections:
  # host	all		 all		::1/128		password
 
 
  # Start PostgreSQL
/usr/local/etc/rc.d/postgresql start

Selesai

2. Instalasi PostGIS

Ini bisa kita lakukan lewat port ataupun secara manual. Disarankan lewat cara manual karena ini bukan system library yang dibutuhkan program lain untuk berjalan dan lebih up-to-date tapi biar mudah kita install lewat port aja.

cd /usr/ports/databases/postgis && make install clean
  # semua diinstall di /usr/local/share/postgis (lwpostgis.sql, spatial_ref_sys.sql, ...)

3. Template PostGIS

Menggunakan PostGIS pada database sebenarnya agak merepotkan admin (root) karena membutuhkan superuser
postgresql untuk setting plpgsql dan memasukkan fungsi-fungsi-nya lewat data sql (lwpostgis.sql & spatial_ref_sys.sql)
Cara ini bisa kutuliskan sebagai berikut (menggunakan user eric):

$eric~> createdb jalan -W
$eric~> psql -U pgsql -d roads -f lwpostgis.sql -W
$eric~> psql -U pgsql -d roads -f spatial_ref_sys.sql -W
$eric~> psql -U postgres -d roads -W
	psql> ALTER TABLE geometry_columns OWNER TO eric;
	psql> ALTER TABLE spatial_ref_sys OWNER TO eric;

Bandingkan dengan cara ini :

$eric~> createdb jalan -W -T template_postgis

Lebih simpel mana? ;)

Sekarang kita buat template_postgis agar semua user bisa membuat database menggunakan template ini.
Cara ini diperoleh dari milis postgis oleh GeoLabs

$pgsql~> psql template1
\c template1
CREATE DATABASE template_postgis WITH template = template1;
UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template_postgis';
\c template_postgis
CREATE LANGUAGE plpgsql ;
\i /usr/LOCAL/share/postgis/lwpostgis.sql;
\i /usr/LOCAL/share/postgis/spatial_ref_sys.sql;
GRANT ALL ON geometry_columns TO PUBLIC;
GRANT ALL ON spatial_ref_sys TO PUBLIC;
VACUUM FREEZE;

Sekarang semua user bisa membuat database gis sendiri lengkap dengan fungsi-fungsi geometri dengan mudah.

Oke, segitu aja. Kalau ada pertanyaan tulis di komen ato lewat email.
Yeahhh…. PostGIS rocks!!!