• Tidak ada hasil yang ditemukan

V. INSTALASI POSTGRESQL DAN SEKILAS TENTANG POSTGIS

N/A
N/A
Protected

Academic year: 2021

Membagikan "V. INSTALASI POSTGRESQL DAN SEKILAS TENTANG POSTGIS"

Copied!
8
0
0

Teks penuh

(1)

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

(2)

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:

(3)

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 :

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 :

(4)

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;

(5)

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 [<options>] <database> [<schema>.]<table> pgsql2shp [<options>] <database> <query>

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.

(6)

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

)

(7)

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

(8)

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

Referensi

Dokumen terkait

Apabila data bidang yang hendak diisikan tidak tersedia dalam pilihan, user dapat menambahkan nya terlebih dahulu pada form Bidang program dan form Jenis Program.. Jadwal

Tahap eksternalisasi budaya mengemis pada keluarga ini terjadi saat ayah dan ibu mulai tinggal di lingkungan yang mayoritas penduduknya berprofesi sebagai pengemis,

Pada kondisi optimum yaitu pada pH larutan 5, massa adsorben 40 mg dan waktu optimum adsorpsi 75 menit karbon aktif dapat mengadsorpsi diklorometana secara optimum dan proses

Hal ini dikarenakan terdapat beberapa indikator kinerja yang melebihi target dan terdapat juga beberapa indikator kinerja yang kurang dari target (standar indikator). Nilai kinerja

1. Implementasi prinsip Pelayanan Publik yang sesuai dengan PP Nomor 96 Tahun 2012 Tentang Pelayanan Publik di Kelurahan Tasikmadu yang mengacu pada

Pada himpunan kuosien ini diberikan operasi dan yang belaku pada hasil kali silang sehingga terbentuk suatu sistem matematika yang disebut dengan aljabar max-plus

Berdasarkan hasil studi literatur yang dilakukan penulis tentang aplikasi trigonometri dalam penentuan arah kiblat menggunakan pendekatan ruang vektor dan

Dari hasil analisis menunjukkan bahwa perilaku generasi milenial terhadap minat pada makanan tradisional cenderung kurang diminati, karena generasi milenial ini