Day 36: Oracle Spatial


Learning In HomeOriginal Date: 17 Februari 2009

Untuk menangani data spatial seperti yang dipergunakan dalam GIS, Oracle menyediakan fitur Oracle Spatial. Contoh penggunaannya, misalnya, untuk mengelola data pemasaran dalam bentuk lokasi geografis. Data spatial disimpan dalam sebuah kolom yang bertipe SDO_GEOMETRY yang didefinisikan sebagai:


CREATE TYPE sdo_geometry AS 
  OBJECT (
 SDO_GTYPE NUMBER, 
 SDO_SRID NUMBER,
 SDO_POINT 
   SDO_POINT_TYPE,
 SDO_ELEM_INFO 
   SDO_ELEM_INFO_ARRAY,
 SDO_ORDINATES 
   SDO_ORDINATE_ARRAY
);

Object tersebut memakai SDO_POINT_TYPE, SDO_ELEM_INFO_ARRAY, dan SDO_ORDINATE_ARRAY yang didefinisikan sebagai:


CREATE TYPE sdo_point_type 
  AS OBJECT (
   X NUMBER,
   Y NUMBER,
   Z NUMBER);
CREATE TYPE sdo_elem_info_array 
  AS VARRAY (1048576) of NUMBER;
CREATE TYPE sdo_ordinate_array 
  AS VARRAY (1048576) of NUMBER;

Nilai SDO_GTYPE pada SDO_GEOMETRY adalah 4 digit angka yang menentukan jenis geometri, dalam format dltt. Nilai d menunjukkan jumlah dimensi (2, 3, atau 4). Nilai l menunjukkan dimensi mana yang mengandung nilai yang akan diukur. Nilai tt menunjukkan jenis geometri, dengan nilai antara lain: 00 (UNKNOWN), 01 (POINT), 02 (LINE atau CURVE), 03 (POLYGON), 04 (COLLECTION), 05 (MULTIPOINT), 06 (MULTILINE atau MULTICURVE), dan 07 (MULTIPOLYGON).

Nilai SDO_SRID pada SDO_GEOMETRY menunjukkan jenis koordinat yang dipergunakan. Jika nilai ini NULL, maka tidak ada koordinat yang dipakai.

Nilai SDO_POINT pada SDO_GEOMETRY dipakai untuk menyimpan koordinat titik untuk jenis geometry POINT, dimana nilai SDO_ELEM_INFO dan SDO_ORDINATES bernilai null.

Nilai SDO_ELEM_INFO pada SDO_GEOMETRY menjelaskan nilai SDO_ORDINATES. SDO_ELEM_INFO terdiri atas kumpulan tiga angka berurutan yang berisi informasi SDO_STARTING_OFFSET, SDO_ETYPE, dan SDO_INTERPRETATION. Nilai SDO_STARTING_OFFSET merujuk ke posisi array di SDO_ORDINATES dimana elemen pertama dimulai dengan 1 dan bukan 0.

Sebagai latihan, aku akan membuat sebuah tabel yang menampung data spatial:


CREATE TABLE TBL_GEOMETRI (
ID NUMBER(10),
DATA_GEOMETRI SDO_GEOMETRY
);

Lalu, aku menambahkan sebuah data geometri berupa bentuk persegi panjang dengan titik kiri bawah pada koordinat kartesian (10,3) dan titik kanan atas pada koordinat (20,10). Aku akan menggunakan SDO_GTYPE = 2003 (POLYGON). SDO_ORDINATES berisi titik kiri bawah dan titik kanan atas secara berurutan, yaitu (10,3,20,10). SDO_ELEM_INFO akan menjelaskan makna titik tersebut, yaitu (1,1003,3). Kombinasi 1003 dan 3 menunjukkan kalau aku ingin mendeskripsikan sebuah persegi panjang berdasarkan posisi titik kiri bawah dan titik kanan atas. Berikut adalah SQL-nya:


INSERT INTO TBL_GEOMETRI VALUES (1,
SDO_GEOMETRY(2003, NULL, NULL,
SDO_ELEM_INFO_ARRAY(1,1003,3),
SDO_ORDINATE_ARRAY(10,3,20,10))
);

Berikutnya aku akan membuat sebuah lingkaran dengan titik koordinat (25,5) dan jari-jari lingkaran = 4:


INSERT INTO TBL_GEOMETRI VALUES (2,
SDO_GEOMETRY(
2003,
NULL,
NULL,
SDO_ELEM_INFO_ARRAY(1,1003,4),
SDO_ORDINATE_ARRAY(25,9,29,5,25,1)
)
);

Setelah ini, aku akan mencoba memakai fungsi yang ada di package SDO_GEOM untuk memanipulasi data geometri. Misalnya, aku ingin melihat hubungan antara kedua geometri yang baru aku masukkan:


SELECT
a.id,
b.id,
sdo_geom.relate(a.data_geometri, 'determine', b.data_geometri, 0.005)
FROM
tbl_geometri a, tbl_geometri b
WHERE
a.id = 1 AND b.id = 2;

Hasilnya adalah DISJOINT yang menunjukkan bahwa kedua geometri tersebut tidak saling menyentuh. Contoh lainnya, misalnya aku ingin mengetahui luas area untuk setiap geometri:


SELECT
a.id,
sdo_geom.sdo_area(a.data_geometri, 0.005)
FROM
tbl_geometri a;

Atau aku dapat melihat jarak terdekat antara kedua geometri tersebut, dengan perintah:


SELECT
a.id,
b.id,
sdo_geom.sdo_distance(a.data_geometri, b.data_geometri, 0.005)
FROM
tbl_geometri a, tbl_geometri b
WHERE
a.id = 1 AND b.id = 2;

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: