"This is not about miles, every mountain has its own beauty to climb"

Oracle Spatial pada Oracle

Membuat tabel pada oracle spatial adalah menggunakan type data mdsys.sdo_geometry.
CREATE TABLE Gambar (
id NUMBER PRIMARY KEY,
nama VARCHAR2(32),
bentuk MDSYS.SDO_GEOMETRY);

Setelah membuat tabel yang mengandung tipe data spatial maka tabel tersebut harus didaftarkan ke dalam tabel user_sdo_geom_metadata dan mendeskripsikan sistem koordinat yang dipakai dan aturan dalam data spatial yang akan dibuat. Ada 4 nilai parameter di user_sdo_geom_metadata antara lain nama tabel yang memiliki kolom spatial, nama kolom untuk data spatial, array yang menggambarkan minimum, maksimum dan nilai toleransi untuk dimensi yang kita buat, dan angka untuk mendefinisikan sistem koordinat yang dipakai jika null maka yang dipakai adalah sistem koordinat cartesian.

INSERT INTO user_sdo_geom_metadata VALUES (
‘Gambar’,
‘bentuk’,
MDSYS.SDO_DIM_ARRAY(
MDSYS.SDO_DIM_ELEMENT(‘X’, 0, 100, 0.05),
MDSYS.SDO_DIM_ELEMENT(‘Y’, 0, 100, 0.05)),
NULL);
Kemudian membuat index spatial yang dibutuhkan untuk mengquery data spatial. Ada dua tipe yaitu R-tree dan Quadtree. Defaultnya adalah R-tree index. Untuk data geodesi atau data peta memakai R-tree.
CREATE INDEX Gambar_index ON Gambar(bentuk)
INDEXTYPE IS MDSYS.SPATIAL_INDEX
Oracle spatial menggunakan type data MDSYS.SDO_GEOMETRY yang didefinisikan sebagai berikut :
CREATE TYPE sdo_geometry AS OBJECT (
SDO_GTYPE NUMBER,
SDO_SRID NUMBER,
SDO_POINT SDO_POINT_TYPE,
SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY,
SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY);
Penjelasan :
SDO_GTYPE adalah number yang mendefinisikan semua bentuk seperti garis, lingkaran dsb. SDO_GTYPE terdiri dari 4 digit angka. Angka pertama untuk nilai dimensinya, yang kedua untuk representasi linear yang penting untuk tipe 3-dimensi dan 4-dimensi. Untuk 2-dimensi nilainya nol. Dua angka terakhir menggambarkan bentuk yang akan digambar terdiri dari :

Nilai

Bentuk Geometri

Penjelasan

00

UNKNOWN_GEOMETRY

Spatial ignores this value

01

POINT

A single point element

02

LINE or CURVE

Contains one line string element that may be linear, curved or both

03

POLYGON

Contains one polygon element with or without other polygon elements in it

04

COLLECTION

A heterogeneous collection of elements

05

MULTIPOINT

Contains one or more points

06

MULTILINE or MULTICURVE

Contains one or more line string elements

07

MULTIPOLYGON

Contains multiple polygon elements that maybe disjoint

Contoh jika ingin menggambar segitiga maka SDO_GTYPE adalah 2003.
SDO_SRID mendeskripsikan untuk sistem koordinat yang dipakai. Tetapi jika semua data menggunakan sistem koordinat yang sama maka langsung diatur dalam tabel user_sdo_geom_metadata. Default adalah sistem koordinat cartesian jika diisi set null.
SDO_POINT adalah digunakan untuk menentukan sumbu Z apakah dipakai. Jika 2-dimensi maka sumbu Z akan dinullkan jadi nilai SDO_POINTnya diset null.
CREATE TYPE sdo_point_type AS OBJECT (
X NUMBER,
Y NUMBER,
Z NUMBER);
SDO_ELEM_INFO_ARRAY menggambarkan elemen-elemen yang akan didefinisikan pada SDO_ORDINATES_ARRAY. Terdiri dari 3 nilai yang menggambarkan elemen dari geometri yang akan dibuat. Nilai pertama adalah untuk mendefinisikan posisi mulai gambar di SDO_ORDINATES_ARRAY. Nilai kedua menggambarkan elemen yang dipakai terdiri dari :

Nilai

Deskripsi

1

Point element

2

LineString element

1003

Exterior polygon element

2003

Interior polygon element

Sedangkan yang terakhir jika nilainya 1 maka memerintahkan untuk mengkoneksikan vertex-vertex dengan garis lurus sedang kalau 2 menghubungkan vertex-vertex dengan menggunakan setengah lingkaran atau busur. Contoh 6, 2003, 1 berarti posisi awal di 6 pada SDO_ORDINATES_ARRAY, 2003 berarti interior polygon dan dikoneksikan dengan menggunakan garis lurus.
SDO_ORDINATES_ARRAY adalah daftar nilai posisi dari vertex-vertex yang akan menggambarkan geometri. Contoh nilai sdo_ordinates_array (0,0, 10,0, 10,10, 0,10, 0,0, 4,4, 6,4, 6,6, 4,6, 4,4), nilai ini akan dipecah-pecah menjadi dua karena nilai pertama adalah untuk nilai sumbu X dan yang kedua untuk nilai sumbu Y dan berulang seterusnya. Jika kita menggunakan 3-dimensi maka yang ketiga akan terbaca untuk sumbu Z.
Contoh untuk operasi Insert data spatial :
INSERT INTO Gambar VALUES(
01, — id
‘Danau’, — nama
MDSYS.SDO_GEOMETRY(
2003,
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1, 19,2003,1),
MDSYS.SDO_ORDINATE_ARRAY(0,0, 10,0, 10,10, 0,10, 0,0, 4,4, 6,4, 6,6, 4,6, 4,4)
));
Query
Oracle spatial menggunakan 2-tier proses untuk melakukan query data spatial. Yang pertama query menggunakan fungsi SDO_FILTER yang definisinya sebagai berikut :
SDO_FILTER(geometry1 MDSYS.SDO_GEOMETRY,
geometry2 MDSYS.SDO_GEOMETRY, params VARCHAR2)
Argumen pertama adalah geometry1 yang merupakan nama kolom index spatial geometri. Argumen kedua adalah geometry2 yang dapat atau bukan berasal dari tabeldan tidak perlu spatial index. Argumen terakhir mendiskripsikan bagaiman kerja dari filtering. Ada dua tipe filtering yaitu querytype=WINDOW (filter berakhir di memori dan bekerja sangat baik ketika geometry2 tidak berasal pada tabel) dan querytype=JOIN (geometry2 harus berasal dari tabel dan performanya tergantung pada index spatial dari type dari 2 tabel). SDO_FILTER me-return string TRUE jika filtering sukses dijalankan dan FALSE jika sebaliknya.
Contoh :
SELECT t.nama
FROM Gambar t
WHERE feature_id = 12
AND SDO_FILTER(t.bentuk, mdsys.sdo_geometry(2003,NULL,NULL,
mdsys.sdo_elem_info_array(1,1003,1),
mdsys.sdo_ordinate_array(2,2, 5,2, 5,5, 2,5, 2,2)),
‘querytype=WINDOW’) = ‘TRUE’;
Dari query diatas dimungkinkan belum kita dapatkan gambar yang sebenarnya, untuk itu diperlukan fungsi selanjutnya yaitu SDO_RELATE yang berfungsi untuk menginteraksikan 2 geometri sesuai yang kita spesifikan. SDO_RELATE hanya bekerja pada gambar berdimensi 2.
SDO_RELATE(geometry1 MDSYS.SDO_GEOMETRY, geometry2 MDSYS.SDO_GEOMETRY,
params VARCHAR2)
Argumen SDO_RELATE sama dengan SDO_FILTER kecuali argumen terakhir yang mempunyai nilai masktype dan nilai querytype. Nilai masktype antara lain :
* DISJOINT — the boundaries and interiors do not intersect
* TOUCH — the boundaries intersect but the interiors do not intersect
* OVERLAPBDYDISJOINT — the interior of one object intersects the boundary and interior of the other object, but the two boundaries do not intersect. This relationship occurs, for example, when a line originates outside a polygon and ends inside that polygon.
* OVERLAPBDYINTERSECT — the boundaries and interiors of the two objects intersect
* EQUAL — the two objects have the same boundary and interior
* CONTAINS — the interior and boundary of one object is completely contained in the interior of the other object
* COVERS — the interior of one object is completely contained in the interior of the other object and their boundaries intersect
* INSIDE — the opposite of CONTAINS. A INSIDE B implies B CONTAINS A.
* COVEREDBY — the opposite of COVERS. A COVEREDBY B implies B COVERS A.
* ON — the interior and boundary of one object is on the boundary of the other object (and the second object covers the first object). This relationship occurs, for example, when a line is on the boundary of a polygon.
* ANYINTERACT — the objects are non-disjoint.
Salah satu contoh penggunaannya adalah
SELECT t.id
FROM Gambar t
WHERE id = 12
AND SDO_FILTER(t.bentuk, mdsys.sdo_geometry(2003,NULL,NULL,
mdsys.sdo_elem_info_array(1,1003,1),
mdsys.sdo_ordinate_array(2,2, 5,2, 5,5, 2,5, 2,2)),
‘querytype=WINDOW’) = ‘TRUE’
AND SDO_RELATE(t.bentuk, mdsys.sdo_geometry(2003,NULL,NULL,
mdsys.sdo_elem_info_array(1,1003,1),
mdsys.sdo_ordinate_array(2,2, 5,2, 5,5, 2,5, 2,2)),
‘masktype=INSIDE+TOUCH querytype=WINDOW’) = ‘TRUE’

2 responses

  1. Mornin’ sunshine…
    Nice…nice…i was looking for quadtree…and your blog show up. Sadly…you just write code and code.

    13 December 2008 at 11:17 am

  2. Nice tutorial, but i agree what december_rain said, you dont hafta just write code but giving a few explaination is good… Keep on writing, bro !

    8 May 2009 at 11:05 am

Leave a reply to koharudin Cancel reply