Disusun Oleh :
Aufa Ikhsan 9474
Jayanthi 9560
Yuyun Tinggarlyana 9750
Chocky Haloman 9794
Bramantyo Erlangga 9576
Ilmu Komputer
Universitas Gadjah Mada Jogjakarta
dimana table tersebut akan berisi nama objek dan geometry dari objek postGIS. Warna
akan diisi informasi warna fill dari suatu objek ketika akan ditampilkan di format SVG.
catatan: jika ingin menggunakan full support openGIS, penambahan kolom geometry
sebaiknya menggunakan syntax sql seperti
SELECT AddGeometryColumn('gisdata', 'geom_objek', -1,'GEOMETRY',2);
Ukuran
Keterangan
Titik, direpresentasikan
Dengan himpunan x dan y.
Cara Mendeskripsikan
point
16 bytes
line
((x1,y1),(x2,y2))
lseg
Garis Terbatas,
32 bytes Direpresentasikan dengan
Kumpulan titik.
((x1,y1),(x2,y2))
box
(x,y)
((x1,y1),(x2,y2))
Nama
Ukuran
Keterangan
Cara Mendeskripsikan
16+16n
bytes
((x1,y1),...)
path
16+16n
bytes
[(x1,y1),...]
polygon
40+16n
bytes
((x1,y1),...)
circle
24 bytes Lingkaran
Jika melihat dari struktur data yang disupport oleh postGIS, terlihat bahwa kurva belum
disupport. Salah satu bentuk kurva adalah lingkaran, yang disupport postGIS, tetapi kurva
kurva yang lain belum disupport.
PostgreSQL mensupport GiST(Generalized Search Tree) indexing untuk mengindex
kolom spasial. Kami menggunakan indexing spasial untuk kolom geom._objek dengan
mengeksekusi perintah sql berikut.
CREATE INDEX index_geom ON datagis USING GIST(geom_objek)
output : Query returned successfully with no result in 62 ms.
Setelah membuat table, kami memasukkan data yang merepresentasikan beberapa kotak
dan polygon yang saling overlap, bersinggungan, mengandung, titik, garis, dsb.
Objek yang akan kami masukkan adalah sebagai berikut.
INSERT INTO datagis(nama_objek, geom_objek, warna) VALUES
('persegipanjang5',GeomFromText('POLYGON((-30 -30, -30 30, 30 30, 30
-30, -30 -30))'),'F00');
INSERT INTO datagis(nama_objek, geom_objek, warna) VALUES
('persegipanjang1',GeomFromText('POLYGON((0 0, 0 20, 10 20, 10 0, 0
0))'),'0F0');
INSERT INTO datagis(nama_objek, geom_objek,
('persegipanjang2',GeomFromText('POLYGON((0
0))'),'00F');
INSERT INTO datagis(nama_objek, geom_objek,
('persegipanjang3',GeomFromText('POLYGON((0
0))'),'F0F');
warna) VALUES
0, 0 -20, -10 -20, -10 0, 0
warna) VALUES
0, 20 0, 20 -10, 0 -10, 0
Berikut adalah ilustrasi hasil dari database yang telah dimasukkan jika ditampilkan dalam
format SVG. Kami menggunakan fungsi postgreSQL AsSVG(geometry) untuk
menampilkan objek geometry dalam format SVG.
Terlihat bahwa terdapat 5 Objek persegi panjang yang saling bertumpuk dan berjejer.
Berikut daftar nama objek (nama objek : warna) :
Persegipanjang5 : merah
Persegipanjang4 : putih
Persegipanjang1 : hijau
Persegipanjang2 : biru
Persegipanjang3 : ungu
Persegipanjang6 : oranye
Tepat pada pertengahan persegi warna putih, adalah titik koordinat 0,0.
Fungsi distance akan menghasilkan jarak antara 2 objek geometri dalam tipe float8.
Contoh penggunaan :
SELECT distance(
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang1'),
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang6')
)
SELECT distance(
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang1'),
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang2')
)
Fungsi equals akan menghasilkan nilai TRUE jika dua objek geometri adalah sama
ukurannya.
Contoh penggunaan :
SELECT equals(
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang4'),
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang5')
)
SELECT equals(
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang2'),
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang2')
)
equals
-------f
(1 row)
equals
-------t
(1 row)
Disjoint(geometry, geometry)
Fungsi disjoint akan menghasilkan nilai TRUE jika dua objek geometri saling terpisah
(tidak berhubungan sama sekali).
Contoh penggunaan : (persegi 4 dan 1,2,3 saling berpotongan / overlay, persegi 6 dan
1,2,3,4 saling terpisah)
SELECT disjoint(
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang4'),
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang1')
)
SELECT disjoint(
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang2'),
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang6')
)
Fungsi Intersects akan menghasilkan nilai TRUE jika dua objek geometri saling
berpotongan, jika tidak menghasilkan nilai FALSE.
Contoh penggunaan : (persegi 4 dan 1,2,3 saling berpotongan / overlay, persegi 6 dan
1,2,3,4 saling terpisah)
SELECT Intersects (
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang4'),
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang1')
)
SELECT Intersects (
Fungsi Touches akan menghasilkan nilai TRUE jika dua objek geometri saling
bersentuhan di satu titik saja, jika tidak menghasilkan nilai FALSE.
Contoh penggunaan : (persegi 1 dan 2 bersentuhan di 1 titik, persegi 4 dan 1 berpotongan
di banyak titik)
SELECT Touches (
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang1'),
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang2')
)
SELECT Touches (
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang1'),
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang4')
)
Hasil : (persegi 1 dan 2 bersentuhan hanya di 1 titik saja, maka hasilnya adalah true / t )
touches
-----------t
(1 row)
touches
-------f
(1 row)
Crosses(geometry, geometry)
Fungsi Crosses akan menghasilkan nilai TRUE jika dua objek geometri saling
bersliangan, jika tidak menghasilkan nilai FALSE.
Contoh penggunaan : (persegi 1 dan 2 bersentuhan di 1 titik, persegi 4 dan 1 berpotongan
di banyak titik)
SELECT crosses (
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang1'),
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang2')
)
Fungsi Within akan menghasilkan nilai TRUE jika geometri A berada di dalam geometri
B.
Contoh penggunaan : (persegi 1 berada di dalam persegi 5) , (mencari persegi yang
berada di dalam persegi 5)
SELECT within (
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang1'),
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang5')
)
SELECT nama_objek
FROM datagis
WHERE
WITHIN(geom_objek,
(SELECT geom_objek FROM datagis
WHERE nama_objek='persegipanjang5'))
AND nama_objek<>'persegipanjang5'
Fungsi Contains akan menghasilkan nilai TRUE jika geometri A mengandung geometri
B.
Contoh penggunaan : (persegi 1 berada di dalam persegi 5) , (mencari persegi yang
berada di dalam persegi 5)
SELECT contains (
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang5'),
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang1')
)
SELECT nama_objek
FROM datagis
WHERE
CONTAINS(
(SELECT geom_objek FROM datagis
WHERE nama_objek='persegipanjang5'),
geom_objek)
AND nama_objek<>'persegipanjang5'
Fungsi overlaps akan menghasilkan nilai TRUE jika sebagian dari dua objek geometri
saling bertumpuk di suatu area, jika tidak menghasilkan nilai FALSE.
Contoh penggunaan : (persegi 1 dan 2 tidak overlap, persegi 4 dan 1 overlap)
SELECT Overlaps (
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang1'),
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang2')
)
SELECT Overlaps (
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang4'),
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang1')
)
-----------f
(1 row)
overlaps
-----------t
(1 row)
Fungsi centroid akan menghasilkan nilai berupa titik tengah dari suatu objek geometri,
dalam format objek POINT. Untuk menampilkan diconvert ke Well Known Text Format
menggunakan fungsi ASTEXT(geometry).
Contoh penggunaan : (
SELECT ASTEXT(
Centroid(
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang4')
)
)
Hasil : (titik tengah persegi panjang4 warna putih, yaitu titik 0,0)
astext
-----------POINT(0 0)
(1 row)
Area(geometry)
Fungsi area akan menghasilkan nilai berupa luas dari sebuah objek geometri, dalam
format float (bilangan real).
Contoh penggunaan : (
SELECT area((SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang4'))
Boundary(geometry)
Fungsi boundary akan menghasilkan nilai berupa batas-batas pinggir dari sebuah objek
geometri, dalam format objek LINESTRING.
Contoh penggunaan : (
SELECT astext(
boundary(
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang4'))
)
Hasil : Batas pinggir dari objek persegi panjang berupa objek linestring
astext
------------------------------------LINESTRING(5 5,5 -5,-5 -5,-5 5,5 5)
(1 row)
Length(geometry)
Fungsi length akan menghasilkan nilai berupa panjang dari sebuah objek geometri,
biasanya berupa garis.
Contoh penggunaan : ( menghitung keliling dari persegipanjang 4)
SELECT LENGTH(BOUNDARY(SELECT geom_objek FROM datagis WHERE
nama_objek='persegipanjang4'))
Intersection(geometry, geometry)
Fungsi intersection akan menghasilkan nilai berupa objek geometri yang menggambarkan
lokasi spasial yang saling berpotongan.
Contoh penggunaan : mencari perpotongan antara persegi 4 dengan persegi 1
SELECT ASTEXT(
INTERSECTION(
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang4'),
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang1')
)
)
Untuk menampilkan dalam format SVG
SELECT AsSVG(
INTERSECTION(
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang4'),
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang1')
)
)
Difference(geometry A, geometry B)
Fungsi difference akan menghasilkan nilai berupa objek geometri yang merupakan
wilayah spasial geometri A dikurangi wilayah spasial geometri B.
Contoh penggunaan : mencari pengurangan antara persegi 4 dengan persegi 1
SELECT ASTEXT(
DIFFERENCE(
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang4'),
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang1')
)
)
Untuk menampilkan dalam format SVG
SELECT AsSVG(
DIFFERENCE(
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang4'),
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang1')
)
)
Visualisasi SVG :
GeomUnion(geometry, geometry)
Fungsi geomUnion akan menghasilkan nilai berupa objek geometri yang merupakan
wilayah spasial geometri A ditambah wilayah spasial geometri B.
Contoh penggunaan : mencari wilayah spasial gabungan antara persegi 4 dengan persegi1
SELECT ASTEXT(
GEOMUNION(
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang4'),
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang1')
)
)
Untuk menampilkan dalam format SVG
SELECT AsSVG(
GEOMUNION (
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang4'),
(SELECT geom_objek FROM datagis WHERE nama_objek='persegipanjang1')
)
)
Visualisasi SVG :
AsText(geometry)
Fungsi asText akan menghasilkan nilai berupa string dalam format Well-Known-Text
(WKT) yang ditetapkan oleh OpenGIS Consortium. Format WKT merupakan format
yang mudah dipahami oleh manusia.
Contoh penggunaan :
SELECT ASTEXT(geom_objek) FROM datagis;
Hasil :
astext
-----------------------------------------------POLYGON((-30 -30,-30 30,30 30,30 -30,-30 -30))
POLYGON((0 0,0 20,10 20,10 0,0 0))
POLYGON((0 0,0 -20,-10 -20,-10 0,0 0))
POLYGON((0 0,20 0,20 -10,0 -10,0 0))
POLYGON((5 5,5 -5,-5 -5,-5 5,5 5))
POLYGON((30 30,30 20,20 20,20 30,30 30))
(6 rows)
AsBinary(geometry)
Hasil :
asbinary
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\001\003\000\000\000\001\000\000\000\005\000\000\000\000\000\000\000\000\000\00
0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00
0\000\000\0004@\000\000\000\000\000\000$@\000\000\000\000\000\0004@\000\000\000\
000\000\000$@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00
0\000\000\000\000\000\000\000
(1 row)
SRID(geometry)
Fungsi SRID akan menghasilkan nilai SRID(Spatial Reference ID) yang merupakan
keterkaitan antara data spasial dengan lokasi spasial sesungguhnya di muka bumi. (mirip
seperti id lokasi tertentu di muka bumi ini).
Contoh penggunaan :
SELECT SRID(geom_objek) FROM datagis;
Hasil : (semua data -1 srid nya karena memang tidak direferensikan dengan keadaan
dunia nyata)
srid
------1
-1
-1
-1
-1
-1
(6 rows)
Dimension(geometry)
Fungsi dimension akan menghasilkan tipe dimensi benda geometry (bisa 1 dimensi, 2
dimensi, bahkan 3 dimensi).
Contoh penggunaan :
SELECT Dimension(geom_objek) FROM datagis;
Hasil : semua data 2 dimensi karena merupakan bangun datar semua(segi empat)
dimension
----------2
2
2
2
2
2
(6 rows)
Envelope(geometry)
Fungsi envelope akan menghasilkan polygon yang merupakan batas-batas maksimal dari
nilai x dan y point dari sebuah geometry objet (sebuah segi 4 yang dapat tepat memuat
objek geometri tersebut).
Contoh penggunaan : mencari batas terluar dari persegi 4 digabung persegi 1
SELECT ASTEXT(ENVELOPE(
GEOMUNION(
Hasil :
astext
-----------------------------------------POLYGON((-5 -5,-5 20,10 20,10 -5,-5 -5))
(1 row)
Visualisasi SVG(warna merah adalah polygon bounding box, warna abu-abu adalah
union persegi 1 dan persegi 4) :
ExteriorRing(geometry)
Fungsi ExteriorRing akan menghasilkan tipe LineString yang merupakan batas luar dari
sebuah polygon, karena terkadang sebuah multipolygon bisa memiliki beberapa polygon.
Contoh penggunaan :
SELECT ASTEXT(ExteriorRing(geom_objek)) FROM datagis;
Hasil :
astext
------------------------------------------------LINESTRING(-30 -30,-30 30,30 30,30 -30,-30 -30)
LINESTRING(0 0,0 20,10 20,10 0,0 0)
LINESTRING(0 0,0 -20,-10 -20,-10 0,0 0)
LINESTRING(0 0,20 0,20 -10,0 -10,0 0)
LINESTRING(5 5,5 -5,-5 -5,-5 5,5 5)
LINESTRING(30 30,30 20,20 20,20 30,30 30)
(6 rows)
GeometryType(geometry)
Fungsi GeometryType akan menghasilkan tipe String yang merupakan Jenis dari objek
geometri, bisa berisi linestring, polygon, atau point.
Contoh penggunaan :
SELECT GeometryType (geom_objek) FROM datagis;
Hasil :
geometrytype
-------------POLYGON
POLYGON
POLYGON
POLYGON
POLYGON
POLYGON
(6 rows)
Fungsi GeomFromText digunakan untuk memperoleh objek geometri dari sebuah WKT
(Well Known Text). SRID jika tidak diisi defaultnya diisi dengan -1.
Fungsi GeomFromBinary digunakan untuk memperoleh objek geometri dari sebuah
WKB (Well Known Binary). SRID jika tidak diisi defaultnya diisi dengan -1.
Contoh penggunaan :
INSERT INTO datagis(nama_objek, geom_objek, warna) VALUES
('persegipanjang5',GeomFromText('POLYGON((-30 -30, -30 30, 30 30, 30
-30, -30 -30))'),'F00');
INSERT INTO datagis(nama_objek, geom_objek, warna) VALUES
('persegipanjang5',GeomFromBinary(\001\003\000\000\000\001\000\000\000\0
05\000\000\000\000\000\000\000\000\000\02
4@\000\000\000\000\000\000\024@\000\000\000\000\000\000\024@\000\000\000
\000\000
\
000\024\300\000\000\000\000\000\000\024\300\000\000\000\000\000\000\024\
300\000
\
000\000\000\000\000\024\300\000\000\000\000\000\000\024@\000\000\000\000
\000\00
0\024@\000\000\000\000\000\000\024@),'F00');
Script SVG dimulai dengan header xml, tag <svg></svg>. Objek-objek SVG ditampilkan
dalam tag svg. Script diatas adalah untuk menampilkan sebuah persegi 4 merah.
Pada tugas kali ini , kami menggunakan script PHP yang mengkoneksi dengan
PostgreSQL dan mengeluarkan output dalam script SVG.
Sample Script yang digunakan pada contoh nomer 1, yang menggambarkan letak dari
semua segi 4.
<?php
$host = "localhost";
$user = "postgres";
$password = "postgres";
$database = "myGIS";
$conn = pg_connect("host=".$host." dbname=".$database." user=".
$user." password=".$password)
Dimana pada contoh diatas, sebuah polygon ditampilkan dalam format <path /> pada
SVG. Dalam tag <path/> bisa diisi dengan fill, style, border, dan lain sebagainya.
Kesimpulan
1. postgreSQL memberikan ekstensi postGIS untuk mengolah data spasial.
2. postGIS mengimplementasikan standar dari OpenGIS consortium.
3. postGIS memiliki fungsi output AsSVG, yang memudahkan mengoutputkan
visualisasi dalam bentuk SVG.
4. postGIS mendukung indexing dalam kolom yang bertipe data geometri.
5. postGIS memberikan fasilitas yang cukup lengkap, walaupun postGIS adalah
ekstension postgreSQL dan tidak dibuat oleh orang orang yang membuat
postgreSQL.
Daftar Pustaka
PostGIS manual
PostgreSQL Documentation
PHP Manual
OpenGIS Implementation Specification for Geographic information - Simple
feature Acess - Part 1:Common Achitecture (www.opengis.org)
OpenGIS Implementation Specification for Geographic information - Simple
feature access - Part 2: SQL option (www.opengis.org)
Fundamentals of SVG Programming: Concepts to Source Code by Oswald
Campesato
Designing SVG Web Graphics By Andrew H. Watt, New Riders Publishing,
CHARLES RIVER MEDIA, INC.
http://www.carto.net/
</svg>
---------------------------postgre_gis_svg4.psvg.php
---------------------------<?php
header("Content-type: image/svg+xml");
$host = "localhost";
$user = "postgres";
$password = "postgres";
$database = "myGIS";
$conn = pg_connect("host=".$host." dbname=".$database." user=".$user."
password=".$password)
or die ("Error Connect!");
?>
<?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
"http://www.w3.org/TR/SVG/DTD/svg10.dtd">
<svg width="100%" height="100%">
<!-- buat gambarnya -->
<g transform="translate(50,50)">
<?php
$res = pg_query($conn,"SELECT AsSVG(GEOMUNION((SELECT geom_objek FROM datagis
WHERE nama_objek='persegipanjang4'),(SELECT geom_objek FROM datagis WHERE
nama_objek='persegipanjang1')))");
$row = pg_fetch_row($res);
echo "<path d=\"".$row[0]."\" fill=\"#AAA\"/>";
?>
</g>
</svg>
------------------------postgre_gis_svg5.psvg.php
------------------------<?php
header("Content-type: image/svg+xml");
$host = "localhost";
$user = "postgres";
$password = "postgres";
$database = "myGIS";
$conn = pg_connect("host=".$host." dbname=".$database." user=".$user."
password=".$password)
or die ("Error Connect!");
?>
<?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
"http://www.w3.org/TR/SVG/DTD/svg10.dtd">
<svg width="100%" height="100%">
<!-- buat gambarnya -->
<g transform="translate(50,50)">
<?php