WEBGIS MAPSERVER POSTGRE

Embed Size (px)

DESCRIPTION

mantap

Citation preview

  • I . 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 .

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    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 1

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    III. INSTALASI MS4W, MAPLAB DAN CHAMELEON

    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.

    Halaman depan ms4w

    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 1

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    Untuk mengecek instalasi Mapscript, buat file msinfo.php pada folder

    D:\ms4w\Apache\htdocs yang berisi : , 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.

    Link URL chameleon, pada halaman utama

    Link URL MapLab, pada halaman utama

    www.hatma.info 2

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    IV. MEMBUAT APLIKASI DEMO WEBGIS MAPSERVER

    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 )

    Link URL demo program, pada halaman utama

    Tampilan Demo Web GIS

    www.hatma.info 1

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    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 dan ditutup

    dengan

    Demo Web GIS

    ............................... dst ...................................

    ............................... dst ...................................

    //-->

    ............................... dst ...................................

    ............................... dst ...................................

    Isi dari file demo.html

    demo.phtml

    Berisi pemanggilan class utama chameleon, mendefinisikan file template dan file map

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    $szTemplate = "./demo.html";

    $szMapFile = "../map/chameleon.map";

    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();

    ?>

    Isi dari file demo.phtml

    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 3

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    #

    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

    definisi web interface #

    # Start of web interface definition

    #

    WEB

    #MINSCALE 2000000

    #MAXSCALE 50000000

    #

    # On Windows systems, /tmp and /tmp/ms_tmp/ should be created at the root

    # of the drive where the .MAP file resides.

    #

    IMAGEPATH "/ms4w/tmp/ms_tmp/"

    IMAGEURL "/ms_tmp/"

    # LOG "/tmp/gmap.log"

    METADATA

    END

    END

    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 4

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    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

    mekanisme penggambaran peta sebagai hasil proses query QUERYMAP

    STYLE HILITE

    COLOR 255 0 0

    END

    sistem proyeksi peta PROJECTION

    "init=epsg:42304"

    END

    Definisi Layer:

    layer bathymetry (bath_mapserver.tif), raster image LAYER

    GROUP "Raster"

    NAME bathymetry

    METADATA

    "DESCRIPTION" "Elevation/Bathymetry"

    "GROUP" "Raster"

    "LAYER" "bathymetry"

    END

    TYPE RASTER

    STATUS ON

    DATA bath_mapserver.tif

    PROJECTION

    "init=epsg:42304"

    END

    END

    Contoh layer bertipe polygon : layer land_fn (land_fn.shp)

    www.hatma.info 5

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    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

    Contoh layer bertipe line : layer prov_bound (province.shp) LAYER

    GROUP "Line"

    NAME prov_bound

    METADATA

    "DESCRIPTION" "Province"

    "GROUP" "Line"

    "LAYER" "prov_bound"

    END

    TYPE LINE

    STATUS ON

    DATA province

    CLASS

    NAME "Province"

    COLOR 120 120 120

    END

    PROJECTION

    "init=epsg:42304"

    END

    END

    Contoh layer bertipe point : layer popplace (popplace.shp) LAYER

    GROUP "Point"

    NAME popplace

    METADATA

    "DESCRIPTION" "Cities"

    www.hatma.info 6

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    "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 7

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    layer grid (grid.shp) LAYER

    GROUP "Grid"

    NAME "grid"

    METADATA

    "DESCRIPTION" "Grid"

    "GROUP" "Grid"

    "LAYER" "grid"

    END

    TYPE LINE

    STATUS OFF

    DATA "grid"

    CLASS

    NAME "Graticule"

    COLOR 0 0 0

    END

    PROJECTION

    "init=epsg:42304"

    END

    END

    Selengkapnya lihat file chameleon.map pada

    D:\ms4w\apps\demo\samples\map\chameleon.map

    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.

    Gambar halaman awal MapEdit

    www.hatma.info 8

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    MapEdit sedang membuka file konfigurasi peta dari sample web GIS diatas

    Tes konfigurasi yang telah kita buat, dengan klik tombol preview

    Preview file konfigurasi chameleon.map pada MapEdit

    www.hatma.info 9

  • V. INSTALASI POSTGRESQL DAN SEKILAS TENTANG POSTGIS

    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)))

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    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.

    contoh query insert :

    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.

    select * from spatial_ref_sys ;

    select * from geometry_columns ;

    MEMBUAT TABEL SPASIAL

    Langkah pertama adalah membuat database seperti biasa. Misal:

    CREATE TABLE ROADS_GEOM ( ID int4, NAME varchar(25) )

    www.hatma.info 1

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    Langkah kedua adalah menambahkan kolom spasial dengan fungsi AddGeometryColumn.

    Dengan format : SELECT AddGeometryColumn(, , ,

    , ). 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 :

    select isvalid(LINESTRING(0 0, 1 1)), isvalid(LINESTRING(0 0,0 0));

    isvalid | isvalid

    ---------+---------

    t | f

    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 2

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    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;

    Kemudian eksekusi dengan perintah pada "psql" SQL terminal monitor:

    psql -d [database] -f roads.sql

    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 :

    shp2pgsql shaperoads myschema.roadstable > roads.sql

    psql -d roadsdb -f roads.sql

    Atau : shp2pgsql shaperoads myschema.roadstable | psql -d roadsdb

    MENAMPILKAN DATA SPASIAL

    Untuk menampilkan data spatial, kita gunakan perintah SELECT. Misal :

    SELECT id, AsText(geom) AS geom, name FROM ROADS_GEOM;

    Kita bisa menggunakan beberapa operator pada query kita :

    www.hatma.info 3

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    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)) (ya). o =

    Mengetes apakah batas luar 2 buah geometry adalah identik

    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

    pgsql2shp [] [.]

    pgsql2shp []

    MEMBUAT INDEX SPATIAL

    Index digunakan untuk mempercepat pencarian data. PostGIS Menggunakan GiST

    (Generalized Search Trees) indexes.

    CREATE INDEX [indexname] ON [tablename]

    USING GIST ( [geometryfield] GIST_GEOMETRY_OPS );

    Tabel dengan 1 juta barisdata, pada mesin 300MHz Solaris, membutuhkan waktgu komputasi

    1 jam.

    www.hatma.info 4

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    Kemudian eksekusi perintah untuk membuat / mengupdate geometry statistic yang sangat

    penting, untuk optimasi eksekusi query oleh database.

    VACUUM ANALYZE [table_name] ( [column_name] );

    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;

    Fungsi spasial selengkapnya dapat dilihat pada manual/postGIS reference.

    CONTOH IMPLEMENTASI SQL SPATIAL

    Buat table dan isinya dengan perintah sebagai berikut.

    CREATE TABLE bc_roads (

    gid INTEGER PRIMARY KEY,

    name VARCHAR

    )

    SELECT AddGeometryColumn('public', 'bc_roads', 'the_geom', -1, 'LINESTRING', 2) ;

    www.hatma.info 5

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    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) ) )') ) ;

    CONTOH PERMASALAHAN SEDERHANA

    1. Mencari total panjang jalan (dalam kilometer)? SELECT sum(length(the_geom))/1000 AS PANJANG_JALAN

    FROM bc_roads ;

    2. Letak perpotongan semua jalan dengan titik (1 1) SELECT ASTEXT( INTERSECTION(the_geom, GeomFromText('POINT( 1 1 )')) ) FROM bc_roads;

    3. Luas Kota bernama AREA PERTAMA (dalam hektar) SELECT area(the_geom)/10000 AS LUAS_HEKTAR

    FROM bc_municipality

    WHERE name='AREA PERTAMA' ;

    4. Apakah kota terbesar ? SELECT name, area(the_geom)/10000 AS LUAS_HEKTAR

    FROM bc_municipality

    LIMIT 1 ;

    www.hatma.info 6

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    Atau

    SELECT max(area(the_geom)/10000) AS LUAS_HEKTAR

    FROM bc_municipality ;

    5. Berapa panjang jalan pada masing-masing kota? SELECT m.name, SUM(LENGTH(r.the_geom))/1000 AS KM_JALAN

    FROM bc_roads r, bc_municipality m

    WHERE CONTAINS(m.the_geom, r.the_geom)

    AND m.the_geom && r.the_geom

    GROUP BY m.name ;

    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 bc_roads r, bc_municipality m

    WHERE r.the_geom && m.the_geom

    AND CONTAINS(m.the_geom, r.the_geom)

    AND m.name = 'AREA PERTAMA' ;

    7. Berapa kilometer panjang jalan JALAN PERTAMA di kota AREA PERTAMA ? SELECT SUM(LENGTH(r.the_geom))/1000 AS "KM PANJANGNYA ="

    FROM bc_roads r, bc_municipality m

    WHERE m.name = 'AREA PERTAMA'

    AND r.name = 'JALAN PERTAMA'

    AND m.the_geom && r.the_geom

    8. Cari kota terbesar yang memiliki lubang SELECT gid, area(the_geom)/1000 AS "LUAS KOTA"

    FROM bc_municipality

    WHERE nrings(the_geom) > 1

    ORDER BY "LUAS KOTA" DESC

    LIMIT 1

    www.hatma.info 7

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    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 1

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    Kemudian masukkan data user baru

    2. Buat database baru, dengan menggunakan template_postgis

    www.hatma.info 2

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    3. Masukkan detail database

    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 shp2pgsql road troad > road.sql o shp2pgsql rail trail > rail.sql o shp2pgsql province tprovince > province.sql o shp2pgsql popplace tpopplace > popplace.sql o shp2pgsql park tpark > park.sql o shp2pgsql land_fn tland_fn > land_fn.sql o shp2pgsql grid tgrid > grid.sql o shp2pgsql fedlimit tfedlimit > fedlimit.sql o shp2pgsql drainage tdrainage > drainage.sql o shp2pgsql drain_fn tdrain_fn > drain_fn.sql

    www.hatma.info 3

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    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 psql -d dbspatialdemo -f road.sql o psql -d dbspatialdemo -f rail.sql o psql -d dbspatialdemo -f province.sql o psql -d dbspatialdemo -f popplace.sql o psql -d dbspatialdemo -f park.sql o psql -d dbspatialdemo -f land_fn.sql o psql -d dbspatialdemo -f grid.sql o psql -d dbspatialdemo -f fedlimit.sql o psql -d dbspatialdemo -f drainage.sql o 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 4

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    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)

    o CREATE INDEX troad_gist_index ON troad USING GIST ( the_geom GIST_GEOMETRY_OPS

    ); VACUUM ANALYZE troad (the_geom) ;

    o CREATE INDEX trail_gist_index ON trail USING GIST ( the_geom GIST_GEOMETRY_OPS ); VACUUM ANALYZE trail (the_geom) ;

    o CREATE INDEX tprovince_gist_index ON tprovince USING GIST ( the_geom GIST_GEOMETRY_OPS ); VACUUM ANALYZE tprovince (the_geom) ;

    o CREATE INDEX tpopplace_gist_index ON tpopplace USING GIST ( the_geom GIST_GEOMETRY_OPS ); VACUUM ANALYZE tpopplace (the_geom) ;

    o CREATE INDEX tpark_gist_index ON tpark USING GIST ( the_geom GIST_GEOMETRY_OPS ); VACUUM ANALYZE tpark (the_geom) ;

    o CREATE INDEX tland_fn_gist_index ON tland_fn USING GIST ( the_geom GIST_GEOMETRY_OPS ); VACUUM ANALYZE tland_fn (the_geom) ;

    o CREATE INDEX tgrid_gist_index ON tgrid USING GIST ( the_geom GIST_GEOMETRY_OPS ); VACUUM ANALYZE tgrid (the_geom) ;

    o CREATE INDEX tfedlimit_gist_index ON tfedlimit USING GIST ( the_geom GIST_GEOMETRY_OPS ); VACUUM ANALYZE tfedlimit (the_geom) ;

    o CREATE INDEX tdrainage_gist_index ON tdrainage USING GIST ( the_geom GIST_GEOMETRY_OPS ); VACUUM ANALYZE tdrainage (the_geom) ;

    o 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 CREATE INDEX troad_gid ON troad ( gid ); o CREATE INDEX trail_gid ON trail ( gid ); o CREATE INDEX tprovince_gid ON tprovince ( gid ); o CREATE INDEX tpopplace_gid ON tpopplace ( gid ); o CREATE INDEX tpark_gid ON tpark ( gid ); o CREATE INDEX tland_fn_gid ON tland_fn ( gid );

    www.hatma.info 5

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    o CREATE INDEX tgrid_gid ON tgrid ( gid ); o CREATE INDEX tfedlimit_gid ON tfedlimit ( gid ); o CREATE INDEX tdrainage_gid ON tdrainage ( gid ); o 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 6

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    VII. MEMBUAT APLIKASI DEMO WEBGIS MAPSERVER - POSTGIS

    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

    Link URL demo program kedua, pada halaman utama

    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 :

    Langkah I. beri tanda komentar (#) pada baris definisi data # DATA (data file shp)

    Langkah II. Sisipkan definisi pengambilan data dari database CONNECTIONTYPE POSTGIS

    CONNECTION "user=[nama user] dbname=[nama database] host=[host database] port=[port database

    : 5432] password=[password anda]"

    DATA "[nama kolom geometry] FROM [nama table] USING UNIQUE [unique index / primary key]"

    FILTER "[kondisi / persyaratan]"

    www.hatma.info 1

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    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.

    Langkah III. Sesuaikan baris definisi lain LabelItem "name"

    CLASSITEM "capital"

    CLASS

    EXPRESSION "1"

    TEMPLATE "ttt_query.html"

    SYMBOL 2

    SIZE 8

    NAME "Cities"

    COLOR 0 0 0

    END

    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"

    Layer park

    #DATA park

    CONNECTIONTYPE POSTGIS

    www.hatma.info 2

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    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"

    Layer road

    #DATA road

    CONNECTIONTYPE POSTGIS

    www.hatma.info 3

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    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

  • WebgGIS dengan MapServer MapLab Chameleon - PostGIS

    Tampilan program dengan mengambil data dari database

    www.hatma.info 5

  • 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 [email protected]. Publikasi tersebut dapat dilihat pada link sebagai berikut

    http://hatma.info/?p=96