Tutorial WebGIS
Tutorial WebGIS
Tutorial WebGIS
LATAR BELAKANG
Teknologi GIS (Georaphic Information System) telah berkembang pesat. Saat ini telah dikenal istilah-istilah Desktop GIS, WebGIS, dan Database Spatial yang merupakan wujud perkembangan teknologi Sistem Informasi Geografis, untuk mengakomodir kebutuhan solusi atas berbagai permasalahan yang hanya dapat dijawab dengan tekhnologi GIS ini.
Saat ini ada beberapa teknologi yang dapat digunakan untuk membangun sistem WebGIS. Salah satu yang paling populer adalah MapServer, yang menggunakan konsep Open Source. Sedangkan untuk pilihan teknologi Database Spatial, PostgreSQL merupakan pilihan database Open Source yang paling populer, dengan dukungan ekstensi spatial yang bernama POSTGIS.
Akan tetapi pemahaman akan bagaimana mengembangkan WebGIS dengan Mapserver dan PostGIS belum banyak dipahami oleh para pengembang teknologi informasi. Hal ini turut dipengaruhi dengan minimnya jumlah tutorial yang dipublikasi di internet dengan bahasa Indonesia.
Oleh karena itu, kali ini kami akan mencoba melakukan riset sedherhana tentang bagaimana mengembangkan aplikasi WebGIS dengan MapServer PostGIS, yang hasilnya akan kami publikasikan di internet. Dengan harapan tutorial dan sample aplikasi WebGIS yang kami kembangkan akan dapat bermanfaat bagai rekan-rekan sesama pengembang teknologi informasi untuk dapat lebih mudah menguasai bagaimana membangun sistem WebGIS dengan MapServer PostGIS. Sehingga dapat bermanfaat bagi kemajuan teknologi informasi di Indonesia.
Hasil dari penelitian ini akan dituliskan menjadi delapan bab yang masing-masingnya dapat didownload secara bebas pada situs www.hatma.info/download/gis/webgis/ , yaitu : I . LATAR BELAKANG II. PENDAHULUAN III. INSTALASI MS4W, MAPLAB DAN CHAMELEON IV. MEMBUAT APLIKASI DEMO WEBGIS MAPSERVER V. INSTALASI POSTGRESQL DAN SEKILAS TENTANG POSTGIS
II. PENDAHULUAN
MS4W (MapServer For Windows) adalah bundle instalasi MapServer untuk platform Windows. Dimana MapServer ( http://mapserver.gis.umn.edu ) merupakan aplikasi freeware dan Open Source untuk dapat menampilkan Sistem Informasi Geografis di web.
MS4W dilengkapi dengan berbagai modul tambahan (optional) yang mempermudah kita membangun dan mengadministrasi sistem WebGIS. Antara lain : MapLab, KaMap, Chameleon, dan lain-lain. MapLab digunakan untuk mempermudah kita membuat file konfigurasi MapServer ( *.map ) pada aplikasi WebGIS yang kita kembangkan. Sedang Chameleon adalah framework yang menyediakan berbagai class dan method yang mempermudah kita membangun interface aplikasi WebGIS yang kita kembangkan, seperti menambahkan fitur zoom, pan, dsb. Informasi mengenai MS4W, MapLab dan Chameleon dapat diperoleh di situs www.maptools.org
Saat ini, selain dapat mengakses MapServer sebagai program CGI, kita dapat mengakses MapServer sebagai modul MapScript, melalui berbagai bahasa pemrograman, seperti PHP, Perl, Python, Java dan lain sebagainya. Akses fungsi-fungsi MapServer melalui skrip akan lebih memudahkan pengembangan aplikasi WebGIS.
PostgreSQL adalah database Open Source yang cukup populer, karena ketangguhan dan kemampuannya dalam mengelola data. PostgreSQL mempunyai ekstensi PostGIS, yang menawarkan kemampuan untuk mengelola data spatial untuk aplikasi Sistem Informasi Geografis. Informasi mengenai PostgreSQL dapat diperoleh pada situs www.postgresql.org . Sedang informasi untuk PostGIS dapat diperoleh dari situs http://postgis.refraction.net .
VI. KONVERSI DATA SHP KE DALAM POSTGIS UNTUK DIGUNAKAN DALAM APLIKASI SAMPLE/DEMO WEBGIS VII. MEMBUAT APLIKASI DEMO WEBGIS MAPSERVER - POSTGIS VIII. KESIMPULAN IX. DAFTAR PUSTAKA
www.hatma.info
MS4W MS4W dapat di download di www.maptools.org . Di dalamnya sudah menyatu aplikasi Apache Web Server, PHP, Map Server dan berbagai library yang dibutuhkan untuk membangun sistem WebGIS. Ada dua buah versi yang MS4W yang dapat didownload, versi 1.x dan versi 2.x .Akan tetapi jika kita hendak menggunakan framework chameleon, lebih baik pilih MS4W versi 1.x (yang digunakan saat ini adalah versi 1.6) karena Chameleon belum mendukung secara sempurna PHP5 pada paket MS4W versi 2.x .
Setelah anda berhasil mendownload ms4w_1.6.zip, selanjutnya extract isinya kedalam root dari partisi harddisk ( misal C:/ atau D:/ ), sehingga seluruh isi paket MS4W terletak di C:/ms4w atau D:/ms4w. Kemudian eksekusi apache-install.bat untuk menginstal service Apache. Apabila service sudah berjalan, maka akan terlihat process httpd.exe pada jendela Task Manager Windows. Cek dengan membuka http://localhost pada web browser anda. Apabila muncul halaman depan MS4W, maka instalasi anda berhasil.
PHP MapScript Untuk mengaktifkan modul PHP/Mapscript, kita harus melakukan sedikit perubahan pada konfiurasi php.ini yang terletak di D:\ms4w\Apache\cgi-bin\php.ini. hilangkan karakter ; pada ;extension=php_mapscript_4.10.0.dll. Kemudian restart Apache dengan mengeksekusi apache-restart.bat.
www.hatma.info
Untuk mengecek instalasi Mapscript, buat file msinfo.php pada folder D:\ms4w\Apache\htdocs yang berisi : <?php echo ms_getVersion(); ?>, kemudian buka http://localhost/msinfo.php dengan web browser. Apabila muncul report versi dari mapserver, maka MapScript telah berjalan dengan baik.
Msinfo.php
MapLab dan Chameleon Download paket MapLab dan Chameleon untuk MS4W pada website www.maptools.org. Kemudian letakkan isi dari chameleon_ms4w-2.4.1-20060906.zip dan maplab_ms4w-2.2.1.zip pada direktori http.d, apps, dan apache/htdocs pada director ms4w anda. Restart Apache, dan perhatikan apakah pada http://localhost telah terlihat link url MapLab 2.2.1 dan Chameleon 2.4. Jika benar, maka instalasi MapLab dan Chameleon pada MS4W telah berhasil. Supaya Maplab dapat berjalan dengan sempurna, dibutuhkan JRE (Java Runtime Environment) terinstal pada computer anda.
www.hatma.info
Untuk lebih mudahnya, kita akan menggunakan demo aplikasi Web GIS berbasis MapServer dan framework Chameleon yang dapat di download di http://www.hatma.info/download/gis/Demo_MapServer.zip . Setelah download selesai, ekstrak isi nya ke direktori yang sesuai, yaitu : apps, http.d dan Apache/htdocs, pada direktori ms4w anda. Kemudian restart Apache dengan mengeksekusi apache-restart.bat. Buka http://localhost dengan web browser, kemudian klik link demo pada Hatma Suryotrisongko Demo Web GIS URLs: ( http://localhost/demo/demo.phtml )
www.hatma.info
FILE HTML DAN PHTML Dua buah file utama yang terletak pada D:\ms4w\apps\demo\samples\htdocs , yaitu :
demo.html Berisi template untuk interface aplikasi, dengan kode program/tag HTML standard dan program/tag framework chameleon, dengan ciri-ciri dibuka dekan tag <cwc2 ...> dan ditutup dengan </cwc2>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Demo Web GIS</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> ............................... dst ................................... <script language="JavaScript" type="text/javascript"> ............................... dst ................................... //--> </script> <link href="sample.css" rel="stylesheet" type="text/css"> </head>
<div id="MainMapLayer" name="MainMapLayer"> <!-- MapDHTML --> <cwc2 type="MapDHTML" visible="true" width="400" height="300" allowresize="true" marqueecolor="FF3333" marqueewidth="2" minscale="1" bordercolor="#0000ff" borderwidth="0"/></div> ............................... dst ...................................
<!-- include the javascript code that manages the DHTML layers --> <script language="JavaScript" src="sample.js" type="text/javascript"></script>
demo.phtml Berisi pemanggilan class utama chameleon, mendefinisikan file template dan file map
<?php include( "../../htdocs/chameleon.php" );
www.hatma.info
class SampleApp extends Chameleon { function SampleApp() { parent::Chameleon(); $this->moMapSession = new MapSession_RW; $this->moMapSession->setTempDir( getSessionSavePath()); } }
$oApp = new SampleApp(); $oApp->registerSkin( 'skins/sample' ); $oApp->CWCInitialize( $szTemplate, $szMapFile ); $oApp->CWCExecute(); ?>
DATA SHP Data spatial peta disimpan dengan format ESRI shp pada direktori D:\ms4w\apps\demo\samples\data . o image raster : layer bathymetry (bath_mapserver.tif) o polygon : layer land_fn (land_fn.shp); layer park (park.shp); layer drain_fn (drain_fn.shp); layer drainage (drainage.shp) o line : layer prov_bound (province.shp); layer fedlimit (fedlimit.shp); layer rail (rail.shp); layer road (road.shp); o point : layer popplace (popplace.shp); o grid : layer grid (grid.shp)
FILE KONFIGURASI (CHAMELEON.MAP) File konfigurasi (*.map) terletak pada D:\ms4w\apps\demo\samples\map, (chameleon.map), yang terdiri dari beberapa bagian. Antara lain :
definisi umum
# # Start of map file # # Sample map file for a chameleon app.
www.hatma.info
# NAME DEMO STATUS ON SIZE 400 300 SYMBOLSET ../etc/symbols.sym EXTENT -2594561 -712631 3467361 3840000 UNITS METERS SHAPEPATH "../data" IMAGECOLOR 255 255 255 FONTSET ../etc/fonts.txt TRANSPARENT FALSE
peta referensi
# # Start of reference map # REFERENCE IMAGE images/keymap.gif EXTENT -2594561 -712631 3467361 3840000 STATUS ON COLOR -1 -1 -1 OUTLINECOLOR 255 0 0 SIZE 120 90 END
skala
# # Start of scalebar #
www.hatma.info
SCALEBAR IMAGECOLOR 255 255 255 LABEL COLOR 0 0 0 SIZE SMALL END SIZE 150 5 COLOR 255 255 255 BACKGROUNDCOLOR 0 0 0 OUTLINECOLOR 0 0 0 UNITS kilometers INTERVALS 5 STATUS ON END
www.hatma.info
LAYER GROUP "Polygon" NAME land_fn METADATA "DESCRIPTION" "Foreign Lands" "GROUP" "Polygon" "LAYER" "land_fn" END TYPE POLYGON STATUS ON DATA land_fn CLASS NAME "Foreign Lands" COLOR 240 240 240 OUTLINECOLOR 199 199 199 END PROJECTION "init=epsg:42304" END END
www.hatma.info
"RESULT_FIELDS" "NAME" "GROUP" "Point" "LAYER" "popplace" END TYPE POINT STATUS ON DATA popplace LabelItem "Name" CLASSITEM "Capital" CLASS EXPRESSION "1" TEMPLATE "ttt_query.html" SYMBOL 2 SIZE 8
NAME "Cities" LABEL COLOR 255 0 0 FONT fritqat-italic TYPE truetype SIZE 8 POSITION AUTO PARTIALS FALSE OUTLINECOLOR 255 255 255 END COLOR 0 0 0 END CLASS EXPRESSION /2|3/ TEMPLATE "ttt_query.html" SYMBOL 7 SIZE 6 NAME "Cities" LABEL COLOR 0 0 0 FONT fritqat TYPE truetype SIZE 8 POSITION AUTO PARTIALS FALSE OUTLINECOLOR 255 255 255 END COLOR 0 0 0 END TOLERANCE 5 PROJECTION "init=epsg:42304" END END
www.hatma.info
ADMINISTRASI FILE KONFIGURASI MENGGUNAKAN MAPLAB Supaya lebih memudahkan dan menghindari penulisan file konfigurasi yang salah, disediakan halaman administrasi berbasis web yang dapat diakses dengan alamat http://localhost/maplab/. Walaupun ada 3 fitur utama (MapEdit, MapBrowser dan GmapFactory), untuk membuat/merubah file konfigurasi peta (*.map) kita menggunakan menu MapEdit.
www.hatma.info
MapEdit sedang membuka file konfigurasi peta dari sample web GIS diatas
Tes konfigurasi yang telah kita buat, dengan klik tombol preview
www.hatma.info
Bagian ini akan mengulas secara sederhana tentang POSTGIS (ekstensi spasial untuk database PostgreSQL). Database yang digunakan : postgresql-8.2.3-1 ; pada platform Windows
INSTALASI POSTGRESQL - POSTGIS Ada berbagai cara untuk membangun database PostgreSQL yang mendukung data spasial (postgis). Akan tetapi cara mudahnya adalah menggunakan postgresql-8.2.msi (installer windows dengan fitur PostgreSQL lengkap, termasuk PostGIS) yang dapat di download di situsnya : http://www.postgresql.org. Kemudian, jangan lupa kunjungi situs PostGIS untuk informasi lebih lengkap, termasuk download dokumentasi/manual posGIS (http://www.postgis.org)
OBJEK SPASIAL PostGIS mendukung semua objek spasial yang di spesifikasikan oleh OpenGIS Consortium (http://www.opengis.org) pada dokumen Simple Features for Specification for SQL (http://www.opengis.org/techno/specs/99-049.pdf). Postgis juga mengembangkan kapabilitasnya dengan 3DZ, 3DM dan 4D koordinat.
WKB and WKT OpenGIS menspesifikasikan ada2 cara standard untuk mengexpresikan objek spasial : format Well-Known Text (WKT) dan Well-Known Binary (WKB).
Contoh WKT :
POINT(0 0) LINESTRING(0 0,1 1,1 2) POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1)) MULTIPOINT(0 0,1 2) MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4)) MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1))) GEOMETRYCOLLECTION(POINT(2 3),LINESTRING((2 3,3 4)))
Input data pada database biasanya menggunakan format WKT seperti diatas. Akan tetapi data spasial disimpan pada database dengan format heksadesimal. Kita dapat memanipulasi format Input/Output, sebagai berikut:
bytea WKB = asBinary(geometry); text WKT = asText(geometry); geometry = GeomFromWKB(bytea WKB, SRID); geometry = GeometryFromText(text WKT, SRID); NB : SRID = spatial referencing system identifier.
INSERT INTO SPATIALTABLE ( THE_GEOM, THE_NAME ) VALUES ( GeomFromText(POINT(-126.4 45.32), 312), A Place ) ;
MEMBUAT DATABASE SPASIAL Cara paling mudah, adalah menggunakan pgAdmin, yang shortcut nya sudah tersedia pada start menu Windows, pada folder PostgreSQL. Setelah pgAdmin dijalankan, pilih menu Edit New Object New Database. Masukkan pilihan database template : template_postgis
TABEL SPATIAL_REF_SYS DAN TABEL GEOMETRY_COLUMNS Kita akan melihat pada database kita ada beberapa table yang telah terbuat. Salah satunya SPATIAL_REF_SYS dan GEOMETRY_COLUMNS. Yang digunakan untuk menyimpan informasi meta dari objek spasial yang kita buat.
MEMBUAT TABEL SPASIAL Langkah pertama adalah membuat database seperti biasa. Misal:
www.hatma.info
Langkah kedua adalah menambahkan kolom spasial dengan fungsi AddGeometryColumn. Dengan format : SELECT AddGeometryColumn(<table_name>, <column_name>, <srid>, <type>, <dimension>). Misal :
SELECT AddGeometryColumn(public, roads_geom, geom, 423, LINESTRING, 2); SELECT AddGeometryColumn( roads_geom, geom, 423, LINESTRING, 2);
Jika tidak ingin pusing dengan SRID (Spatial Reference ID), berikan nilai SRID = -1. Misal:
CREATE TABLE roads ( ROAD_ID int4, ROAD_NAME varchar(128) ); SELECT AddGeometryColumn( roads, roads_geom, -1, GEOMETRY, 3 );
Perhatikan bahwa OGC geometries tidak memperbolehkan nilai Z atau M. Sehingga bagian dimension cukup kita beri nilai 2.
MENJAGA KONSISTENSI DATA PADA KOLOM SPASIAL Pastikan kolom geometri kita memenuhi spesifikasi standard OpenGIS. Salah satunya dengan fungsi IsValid(). Misal :
Ada cara untuk mempermudah kita menjaga data supaya tetap memenuhi standar, yaitu dengan membuat satu check constraint . Misal :
ALTER TABLE mytable ADD CONSTRAINT geometry_valid_check CHECK (isvalid(the_geom));
check constraint juga akan dibuat secara otomatis apabila kita menambahkan kolom geometris dengan perintah AddGeometryColumn().
MEMASUKKAN DATA SPATIAL Ada beberapa metode yang bisa kita gunakan. Cara pertama adalah dengan menggunakan perintah query insert seperti biasa. Misal kita membuat file (roads.sql) yang berisi :
www.hatma.info
BEGIN; INSERT INTO ROADS_GEOM (ID,GEOM,NAME ) VALUES (1,GeomFromText(LINESTRING(191232 243118,191108 243242),-1),Jeff Rd); INSERT INTO ROADS_GEOM (ID,GEOM,NAME ) VALUES (2,GeomFromText(LINESTRING(189141 244158,189265 244817),-1),Geordie Rd); INSERT INTO ROADS_GEOM (ID,GEOM,NAME ) VALUES (3,GeomFromText(LINESTRING(192783 228138,192612 229814),-1),Paul St); INSERT INTO ROADS_GEOM (ID,GEOM,NAME ) VALUES (4,GeomFromText(LINESTRING(189412 252431,189631 259122),-1),Graeme Ave); INSERT INTO ROADS_GEOM (ID,GEOM,NAME ) VALUES(5,GeomFromText(LINESTRING(190131 224148,190871 228134),-1),Phil Tce); INSERT INTO ROADS_GEOM (ID,GEOM,NAME ) VALUES(6,GeomFromText(LINESTRING(198231 263418,198213 268322),-1),Dave Cres); COMMIT;
MENGGUNAKAN SHP2PGSQL Jika kita telah mempunyai file shp yang berisi data-data spasial kita, lebih mudah menggunakan shp2pgsql data loader yang akan mengkonversi file ESRI shp ke dalam SQL. Shp2pgsql dapat kita jalankan pada "psql" SQL terminal monitor. Misal :
Atau :
shp2pgsql shaperoads myschema.roadstable | psql -d roadsdb
MENAMPILKAN DATA SPASIAL Untuk menampilkan data spatial, kita gunakan perintah SELECT. Misal :
www.hatma.info
o && Mengatakan apakah batas luar geometry sebuah objek intersects / beririsan dengan batas luar geometry objek lain. o ~= Mengetes apakah 2 buah geometry adalah identik. Misal, apakah POLYGON((0 0,1 1,1 0,0 0)) identik dengan POLYGON((0 0,1 1,1 0,0 0)) o = Mengetes apakah batas luar 2 buah geometry adalah identik (ya).
Contoh :
SELECT ID, NAME FROM ROADS_GEOM WHERE GEOM ~= GeomFromText(LINESTRING(191232 243118,191108 243242),-1);
SELECT ID, NAME FROM ROADS_GEOM WHERE GEOM && GeomFromText(POLYGON((191232 243117,191232 243119,191234 243117,191232 243117)),-1);
MENGGUNAKAN PGSQL2SHP Kita dapat menggunakan pgsql2shp untuk mengkonversi tabel (atau data spasial tertentu pada database kita) ke dalam format file ESRI .shp
MEMBUAT INDEX SPATIAL Index digunakan untuk mempercepat pencarian data. PostGIS Menggunakan GiST (Generalized Search Trees) indexes.
Tabel dengan 1 juta barisdata, pada mesin 300MHz Solaris, membutuhkan waktgu komputasi 1 jam.
www.hatma.info
Kemudian eksekusi perintah untuk membuat / mengupdate geometry statistic yang sangat penting, untuk optimasi eksekusi query oleh database.
Sebaiknya Vacuum Database dilakukan secara rutin, seperti pada kebanyakan PostgreSQL DBA melakukan VACUUM dengan cron job secara periodic, untuk menjaga agar index dapat berfungsi secara baik dalam mempercepat query.
COMPLEX QUERIES Kita dapat menggunakan fungsi-fungsi geometry dalam perintah query kita. Misalkan fungsi distance() yang digunakan untuk mengukur jarak antar 2 buah objek geometry.
SELECT the_geom FROM geom_table WHERE distance( the_geom, GeomFromText( POINT(100000 200000), -1 ) ) < 100
Kita dapat menggunakan fungsi expand() untuk menemukan objek geometri dalam radius dari suatu objek:
SELECT * FROM GEOTABLE WHERE GEOCOLUMN && Expand(GeomFromText(POINT(1000 1000),-1),100) AND Distance(GeomFromText(POINT(1000 1000),-1),GEOCOLUMN) < 100;
CREATE TABLE bc_roads ( gid INTEGER PRIMARY KEY, name VARCHAR ) SELECT AddGeometryColumn('public', 'bc_roads', 'the_geom', -1, 'LINESTRING', 2) ;
www.hatma.info
insert into bc_roads values (1, 'JALAN PERTAMA', GeomFromText('LINESTRING(1 1, 3 2, 4 3)') ) ; insert into bc_roads values (2, 'JALAN KEDUA', GeomFromText('LINESTRING(2 4, 4 0)') ) ;
CREATE TABLE bc_municipality ( gid INTEGER PRIMARY KEY, code INTEGER UNIQUE, name VARCHAR ) SELECT AddGeometryColumn('public', 'bc_municipality', 'the_geom', -1, 'MULTIPOLYGON', 2) ;
insert into bc_municipality values (1, 101,'AREA PERTAMA', GeomFromText('MULTIPOLYGON(((1 1, 5 1, 5 5, 1 5, 1 1)))') ) ; insert into bc_municipality values (2, 102,'AREA KEDUA', GeomFromText('MULTIPOLYGON(((4 4, 6 4, 6 6, 4 6, 4 4)))') ) ; insert into bc_municipality values (3, 103,'AREA KETIGA', GeomFromText('MULTIPOLYGON(((2 2, 4 2, 4 4, 2 4, 2 2)))') ) ; insert into bc_municipality values (4, 104,'AREA KEEMPAT', GeomFromText('MULTIPOLYGON( ( (2 2, 4 2, 4 4, 2 4, 2 2), (3 3, 4 3, 4 4, 3 4, 3 3) ) )') ) ;
www.hatma.info
6. Buat table baru dengan isi : semua jalan pada kota AREA PERTAMA dengan tambahan kolom panjang jalan tersebut disemua kota , dan titik perpotongannya dengan kota AREA PERTAMA.
CREATE TABLE pg_roads AS SELECT r.*,
ASTEXT( INTERSECTION(r.the_geom, m.the_geom)) AS "PERPOTONGAN DI :", LENGTH(r.the_geom)/1000 AS "PANJANG ASLI JALAN (KM)" FROM WHERE AND bc_roads r, bc_municipality m r.the_geom && m.the_geom CONTAINS(m.the_geom, r.the_geom)
www.hatma.info
VI. KONVERSI DATA SHP KE DALAM POSTGIS UNTUK DIGUNAKAN DALAM APLIKASI SAMPLE/DEMO WEBGIS
Pada pembahasan diatas kita telah mempunyai beberapa data shp yang digunakan dalam sample/demo WebGIS, antara lain : o image raster : layer bathymetry (bath_mapserver.tif) o polygon : layer land_fn (land_fn.shp); layer park (park.shp); layer drain_fn (drain_fn.shp); layer drainage (drainage.shp) o line : layer prov_bound (province.shp); layer fedlimit (fedlimit.shp); layer rail (rail.shp); layer road (road.shp); o point : layer popplace (popplace.shp); o grid : layer grid (grid.shp)
Selanjutnya kita akan mengubah data shp diatas menjadi bentuk tabel didalam database PostgreSQL.
LANGKAH I. MEMBUAT DATABASE SPATIAL 1. Jalankan PgAdmin, kemudian buat user baru
www.hatma.info
www.hatma.info
4. Copy file-file shp yang ada digunakan pada aplikasi sample demo WebGIS diatas, dari folder D:\ms4w\apps\demo\samples\data ke dalam direktori bin pada instalasi server PostgreSQL (C:\Program Files\PostgreSQL\8.2\bin ).
5. Kemudian jalankan "psql" SQL terminal monitor, dan lakukan konversi dari semua file shp diatas kedalam bentuk *.sql. Sehingga diperoleh sepuluh file sql.
o o o o o o o o o o
shp2pgsql road troad > road.sql shp2pgsql rail trail > rail.sql shp2pgsql province tprovince > province.sql shp2pgsql popplace tpopplace > popplace.sql shp2pgsql park tpark > park.sql shp2pgsql land_fn tland_fn > land_fn.sql shp2pgsql grid tgrid > grid.sql shp2pgsql fedlimit tfedlimit > fedlimit.sql shp2pgsql drainage tdrainage > drainage.sql shp2pgsql drain_fn tdrain_fn > drain_fn.sql
www.hatma.info
6. Amati file sql, yang isinya akan membuat table dan isinya sesuai dengan file shp. contoh isi file sql (road.sql) :
BEGIN; CREATE TABLE "troad" (gid serial PRIMARY KEY, "fnode_" int8, "tnode_" int8, "lpoly_" int8, "rpoly_" int8, "length" float8, "road_" int8, "road_id" int8, "f_code" int2, "name_e" varchar(26), "name_f" varchar(26)); SELECT AddGeometryColumn('','troad','the_geom','-1','MULTILINESTRING',2); INSERT INTO "troad" ("fnode_","tnode_","lpoly_","rpoly_","length","road_","road_id","f_code","name_e","name_f",the_geom) VALUES ('65','70','3','3','31779.260','1','1','74',NULL,NULL,'01050000000100000001020000000400000000000000164F414100000060EB773 341000000A0EC494141000000808A71334100000080DF2B414100000080CE3E334100000000C41F414100000000E0273341'); .
7. load semua file sql tersebut kedalam database postgreSQL dengan cara mengeksekusi perintah dengan format psql -d [target_database] -f [file_sql] pada SQL terminal monitor
o o o o o o o o o o psql -d dbspatialdemo -f road.sql psql -d dbspatialdemo -f rail.sql psql -d dbspatialdemo -f province.sql psql -d dbspatialdemo -f popplace.sql psql -d dbspatialdemo -f park.sql psql -d dbspatialdemo -f land_fn.sql psql -d dbspatialdemo -f grid.sql psql -d dbspatialdemo -f fedlimit.sql psql -d dbspatialdemo -f drainage.sql psql -d dbspatialdemo -f drain_fn.sql
Amati hasilnya. Kolom geometry bertipe POINT terdapat pada tabel : tpopplace Kolom geometry bertipe MULTILINESTRING terdapat pada tabel : troad ; trail ; tgrid ; tfedlimit
www.hatma.info
Kolom geometry bertipe MULTIPOLYGON terdapat pada tabel : tprovince ; tpark ; tland_fn ; tdrainage ; tdrain_fn
8. Buat index GIST pada masing-masing kolom yang bertipe geometry pada masing-masing tabel. Kemudian lakukan vacuum analyze, untuk mengupdate statistik geometry (lakukan vacuum secara rutin, terlebih ketika ada perubahan pada data spatial)
CREATE INDEX troad_gist_index ON troad USING GIST ( the_geom GIST_GEOMETRY_OPS ); VACUUM ANALYZE troad (the_geom) ;
CREATE INDEX trail_gist_index ON trail USING GIST ( the_geom GIST_GEOMETRY_OPS ); VACUUM ANALYZE trail (the_geom) ;
CREATE INDEX tprovince_gist_index ON tprovince USING GIST ( the_geom GIST_GEOMETRY_OPS ); VACUUM ANALYZE tprovince (the_geom) ;
CREATE INDEX tpopplace_gist_index ON tpopplace USING GIST ( the_geom GIST_GEOMETRY_OPS ); VACUUM ANALYZE tpopplace (the_geom) ;
CREATE INDEX tpark_gist_index ON tpark USING GIST ( the_geom GIST_GEOMETRY_OPS ); VACUUM ANALYZE tpark (the_geom) ;
CREATE INDEX tland_fn_gist_index ON tland_fn USING GIST ( the_geom GIST_GEOMETRY_OPS ); VACUUM ANALYZE tland_fn (the_geom) ;
CREATE INDEX tgrid_gist_index ON tgrid USING GIST ( the_geom GIST_GEOMETRY_OPS ); VACUUM ANALYZE tgrid (the_geom) ;
CREATE INDEX tfedlimit_gist_index ON tfedlimit USING GIST ( the_geom GIST_GEOMETRY_OPS ); VACUUM ANALYZE tfedlimit (the_geom) ;
CREATE INDEX tdrainage_gist_index ON tdrainage USING GIST ( the_geom GIST_GEOMETRY_OPS ); VACUUM ANALYZE tdrainage (the_geom) ;
CREATE INDEX tdrain_fn_gist_index ON tdrain_fn USING GIST ( the_geom GIST_GEOMETRY_OPS ); VACUUM ANALYZE tdrain_fn (the_geom) ;
9. Buat gid index pada masing-masing table. Karena untuk mempercepat query, maka diperlukan suatu kolom yang unique pada suatu table geometry, dengan index yang telah didefinisikan padanya :
o o o o o o
CREATE INDEX troad_gid ON troad ( gid ); CREATE INDEX trail_gid ON trail ( gid ); CREATE INDEX tprovince_gid ON tprovince ( gid ); CREATE INDEX tpopplace_gid ON tpopplace ( gid ); CREATE INDEX tpark_gid ON tpark ( gid ); CREATE INDEX tland_fn_gid ON tland_fn ( gid );
www.hatma.info
o o o o
CREATE INDEX tgrid_gid ON tgrid ( gid ); CREATE INDEX tfedlimit_gid ON tfedlimit ( gid ); CREATE INDEX tdrainage_gid ON tdrainage ( gid ); CREATE INDEX tdrain_fn_gid ON tdrain_fn ( gid );
10. Lihat pada pgAdmin, apakah sepuluh table dan isinya telah masuk dalam database. Jika benar, maka anda telah berhasil memasukkan data shp ke dalam table di database.
www.hatma.info
Kita akan mengubah demo/sample aplikasi Web GIS yang sudah kita buat diatas, menjadi aplikasi webgis mapserver yang mengambil data geometri dan atribut dari postgreSQL server yang sudah mendukung POSTGIS. Aplikasi ini juga bisa di download di : http://www.hatma.info/download/gis/Demo_MapServer_PostGIS.zip . Setelah download selesai, ekstrak isi nya ke direktori yang sesuai, yaitu : apps, http.d dan Apache/htdocs . Kemudian load data sql ke dalam database postgreSQL anda. Lalu restart Apache anda dengan mengeksekusi apache-restart.bat . buka http://localhost dengan web browser, kemudian klik link demo pada Hatma Suryotrisongko Demo Web GIS - PostGIS Spatial Database URLs: : http://localhost/demo2/demo.phtml
MENGUBAH FILE KONFIGURASI PERTA (CHAMELEON.MAP) DARI SAMPLE/DEMO APLIKASI DIATAS, MENJADI APLIKASI WEBGIS YANG MENGAMBIL DATA DARI SERVER DATABASE POSTGRESQL.
Kita akan merubah baris pemanggilan data shp pada baris definisi layer, sehingga pengambilan data langsung dari database. Secara umum, kita akan mengubah dengan cara sebagai berikut :
www.hatma.info
Harap diperhatikan, bahwa penulisan nama kolom, nama table HARUS menggunakan huruf kecil, sedangkan untuk lainnya menggunakan huruf besar (perhatikan pada bagian DATA dan FILTER diatas), selain itu juga harus sesuai dengan penulisan perintah yang dimengerti oleh database postgresql (pada definisi DATA tidak menggunakan syntax SELECT, sedang pada definisi FILTER tidak menggunakan syntax WHERE). USING UNIQUE [unique index / primary key] pada baris definisi DATA digunakan untuk mempercepat query menggunakan index.
Harap diperhatikan, bahwa penulisan nama kolom data atribut pada LABELITEM, CLASSITEM, dan lain-lain harus menggunakan huruf kecil. Begitu juga dengan isi dari definisi EXPRESSION, harus sesuai dengan penulisan perintah yang dimengerti oleh database postgresql. Sehingga berikut ini perubahan yang terjadi pada file konfigurasi perta (.map)
Layer land_fn #DATA land_fn CONNECTIONTYPE POSTGIS CONNECTION "user=hatma_s dbname=dbspatialdemo host=localhost port=5432 password=2006bedogtelu" DATA "the_geom FROM tland_fn USING UNIQUE gid"
www.hatma.info
CONNECTION "user=hatma_s dbname=dbspatialdemo host=localhost port=5432 password=2006bedogtelu" DATA "the_geom FROM tpark USING UNIQUE gid"
Layer drain_fn #DATA drain_fn CONNECTIONTYPE POSTGIS CONNECTION "user=hatma_s dbname=dbspatialdemo host=localhost port=5432 password=2006bedogtelu" DATA "the_geom FROM tdrain_fn USING UNIQUE gid" FILTER "poly_featu = 16 OR poly_featu = 21" CLASSITEM "poly_featu"
Layer drainage #DATA drainage CONNECTIONTYPE POSTGIS CONNECTION "user=hatma_s dbname=dbspatialdemo host=localhost port=5432 password=2006bedogtelu" DATA "the_geom FROM tdrainage USING UNIQUE gid" FILTER "poly_featu = 0" CLASSITEM "poly_featu"
Layer prov_bound #DATA province CONNECTIONTYPE POSTGIS CONNECTION "user=hatma_s dbname=dbspatialdemo host=localhost port=5432 password=2006bedogtelu" DATA "the_geom FROM tprovince USING UNIQUE gid"
Layer fedlimit #DATA fedlimit CONNECTIONTYPE POSTGIS CONNECTION "user=hatma_s dbname=dbspatialdemo host=localhost port=5432 password=2006bedogtelu" DATA "the_geom FROM tfedlimit USING UNIQUE gid"
Layer rail #DATA rail CONNECTIONTYPE POSTGIS CONNECTION "user=hatma_s dbname=dbspatialdemo host=localhost port=5432 password=2006bedogtelu" DATA "the_geom FROM trail USING UNIQUE gid"
www.hatma.info
CONNECTION "user=hatma_s dbname=dbspatialdemo host=localhost port=5432 password=2006bedogtelu" DATA "the_geom FROM troad USING UNIQUE gid"
Layer popplace #DATA popplace CONNECTIONTYPE POSTGIS CONNECTION "user=hatma_s dbname=dbspatialdemo host=localhost port=5432 password=2006bedogtelu" DATA "the_geom FROM tpopplace USING UNIQUE gid" FILTER "capital >= 1 AND capital <= 3" LabelItem "name" CLASSITEM "capital"
Layer "grid" #DATA "grid" CONNECTIONTYPE POSTGIS CONNECTION "user=hatma_s dbname=dbspatialdemo host=localhost port=5432 password=2006bedogtelu" DATA "the_geom FROM tgrid USING UNIQUE gid" Beberapa perubahan pada file chameleon.php
Setelah file konfigurasi selesai dirubah, selanjutnya kita ujicoba apakah aplikasi yang sudah kita buat dapat berjalan dengan baik, dan apakah data yang ditampilkan sama dengan data yang ditampilkan pada aplikasi demo yang masih mengambil data dari file shp.
www.hatma.info
www.hatma.info
VIII. KESIMPULAN
Penelitian ini berhasil mengembangkan 2 buah aplikasi demo WebGis. Aplikasi yang pertama memperagakan WebGis MapServer dengan pengambilan data dari file ESRI shp dan table dbf (http://www.hatma.info/download/gis/Demo_MapServer.zip). Sedangkan aplikasi kedua memperagakan WebGis MapServer PostGIS dengan pengambilan data dari database (http://www.hatma.info/download/gis/Demo_MapServer_PostGIS.zip).
Sedangkan hasil dari penelitian sederhana ini telah berhasil dipulikasikan di internet pada situs http://www.hatma.info. Dengan harapan untuk dapat memberikan sumbangsih pada dunia pendidikan teknologi informasi di indonesia, supaya dapat lebih mudah memahami dan menguasai pengembangan Sistem Informasi Geografis berbasis Web (WebGIS). Apabila ada masukan ataupun pertanyaan, jangan sungkan-sungkan menghubungi penulis di hatma_s@yahoo.com.sg. Publikasi tersebut dapat dilihat pada link sebagai berikut http://hatma.info/?p=96