Như trên vừa giới thiệu về các hệ quản trị cơ sở dữ liệu không gian Oracle, MySql và PostgreSql. Về khía cạnh phát triển, Oracle hơn hẳn so với các hệ thống khác với sự hỗ trợ các ngôn ngữ lập trình Visual Basic, PowerBuilder, Delphi, java và đặc biệt là C/C++ và MFC. Kiến trúc Oracle OLE, thư viện Oracle C++ Class, các hàm OCI, các đối tượng… Là những công cụ phát triển rất mạnh. Gần như tất cả các hệ thống quản trị cơ sở dữ liệu không gian hiện nay đều có thể chuyển đổi dữ liệu với Oracle.
4.2.1 Mô hình dữ liệu trong Oracle spatial
Các kiểu dữ liệu nguyên thủy trong Oracle ở không gian hai chiều như hình 4.1 bao gồm [4].
Điểm (Point),
Chuỗi các đoạn thẳng (Line string), Đa giác n đỉnh (n point polygon), Chuỗi các cung (Arc line string),
Đa giác với các cạnh là cung (Arc polygion),
Đa giác cạnh là cung hoặc các đoạn thẳng (Compound polygion), Chuỗi các đoạn thẳng hay cung (Compound line string),
Hình tròn (Circle),
Oracle cũng hỗ trợ lưu chữ và chỉ mục kiểu dữ liệu hình học ba chiều hay bốn chiều. Mô hình dữ liệu không gian là cấu trúc gồm các các phần tử, các đối tượng hình học và các lớp. Ở đó:
Phần tử là thành phần cơ bản xây dựng nên đối tượng hình học,
Đối tượng hình học biểu diễn một đặc tính không gian, tạo nên từ một tập các phần tử cơ bản,
Lớp bao gồm tập hợp các đối tượng có cùng tập thuộc tính. Ví dụ, lớp mô tả thuộc tính tôpô, lớp mô tả mật độ dân số...
Hình 4.1. Các kiểu hình học trong Oracle
Điểm Chuỗi đoạn
thẳng Đa giác Chuỗi cung Chuỗi
cung kín Đa giác phức hợp Chuỗi cung phức hợp Đường tròn Hình chữ nhật
Kiểu SDO_GEOMETRY biểu diễn một đối tượng hình học, được định nghĩa như sau:
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); Trong đó:
SDO_GTYPE - Chỉ ra kiểu của geometry.
SDO_SRID - Dành riêng sử dụng trong tương lai.
SDO_POINT - Là một kiểu đối tượng với các thuộc tính toạ độ X, Y, và Z. Nếu SDO_ELEM_INFO và SDO_ORDINATES đều không có giá trị và SDO_POINT có giá trị thì giá trị X và Y là toạ độ của điểm. Trong trường hợp khác, thuộc tính SDO_POINT được bỏ qua.
SDO_ELEM_INFO - Là những giá trị kiểu số có độ dài thay đổi. Các thông số này cho biết cách thể hiện tung độ lưu trữ trong thuộc tính SDO_ORDINATES. Mỗi bộ ba số này truyền đạt thông tin về một phần tử geometry và một geometry có thể chứa đựng nhiều phần tử. Nếu một geometry có một phần tử thì mảng SDO_ELEM_INFO có 3 số. Nếu geometry có 2 phần tử thì mảng SDO_ELEM_INFO có 6 số... Mỗi bộ ba như vậy được hiểu như sau:
SDO_STARTING_OFFSET - Chỉ ra khoảng cách trong mảng,
SDO_ORDINATES nơi bắt đầu toạ độ cho phần tử này. Giá trị khoảng cách này bắt đầu từ 1 và không bao giờ mang giá trị 0. Do vậy toạ độ đầu
tiên của phần tử đầu tiên sẽ là
SDO_GEOMETRY.SDO_ORDINATES(1).
SDO_ETYPE - Chỉ ra kiểu của phần tử. Khoảng giá trị từ 0 đến 5. Giá trị 1,2 và 3 là những phần tử đơn giản. Chúng được định nghĩa bởi một bộ ba đơn trong mảng SDO_ELEM_INFO. Giá trị 4 và 5 là những phần tử ghép. Chúng bao gồm ít nhất một bộ ba khởi đầu kèm với một nhóm các bộ ba tiếp theo phụ thuộc các phần tử ghép thêm.
SDO_INTERPRETATION - Xác định một trong hai biện pháp, phụ thuộc SDO_ETYPE là đơn hay phức hợp. Nếu SDO_ETYPE là phức hợp (4 hoặc 5), trường này chỉ ra có bao nhiêu bộ ba giá trị kèm theo. Nếu SDO_ETYPE là đơn (1, 2 hoặc 3) thuộc tính thể hiện xác định dãy toạ độ của phần tử. Ví dụ một đường hay một ranh giới vùng có thể được tạo nên bởi một chuỗi các đường thẳng nối với nhau.
Nếu một đối tượng hình học có nhiều hơn một phần tử thì toạ độ cuối cùng của một phần tử luôn nhỏ hơn khoảng cách đầu tiên cho phần tử tiếp theo. Phần tử cuối cùng trong geometry được mô tả bằng những toạ độ từ khoảng cách bắt đầu của nó tới giá trị cuối cùng trong mảng.
Đối với những phần tử phức hợp, tập hợp của N bộ ba được sử dụng để mô tả phần tử. Có một điều cần nhớ thứ tự kề nhau của các phần tử. Điểm cuối cùng của một phần tử con là điểm đầu tiên của phần tử tiếp theo. Toạ độ cuối cùng của phần tử con thứ N hoặc là khoảng cách bắt đầu của phần tử tiếp theo của geometry hoặc toạ độ cuối cùng trong mảng SDO_ORDINATES.
SDO_ORDINATES - Một mảng kiểu số có độ dài thay đổi dùng để lưu trữ các giá trị toạ độ tạo nên đường biên của một đối tượng không gian. Mảng
này luôn được sử dụng kết hợp với mảng SDO_ELEM_INFO. Những giá trị trong mảng này xác định bởi số chiều. Ví dụ một vùng có đường biên tạo thành từ 4 điểm trong không gian 2 chiều thì được lưu trữ như : (X1, Y1, X2, Y2, X3, Y3, X4, Y4). Nếu 4 điểm đó trong không gian 3 chiều thì chúng được lưu trữ như: (X1, Y1, Z1, X2, Y2, Z2, X3, Y3, Z3, X4, Y4, Z4). Thiết lập chỉ dẫn không gian, các toán tử và hàm chức năng đều bỏ qua giá trị Z vì phiên bản này chỉ hỗ trợ các đối tượng không gian 2 chiều. Số chiều gắn với mỗi điểm được lưu trữ như kiểu metadata trong bảng SDO_GEOM_METADATA, được mô tả phía dưới. Những giá trị trong SDO_ORDINATES phải tồn tại và hợp lệ. Không có giá trị đặc biệt nào được sử dụng để phân định các phần tử trong một geometry phức hợp. Điểm bắt đầu và kết thúc trong chuỗi mô tả một phần tử cụ thể đã được xác định bởi các giá trị trong STARTING_OFFSET và phần tử tiếp theo trong mảng SDO_ELEM_INFO. Giá trị khoảng cách bắt đầu từ 1. SDO_ORDINATES(1) là toạ độ đầu tiên của điểm đầu tiên của phần tử đầu tiên.
Hình 4.2 Một đối tượng hình học gồm 2 thành phần (11,40) (19, 40) (25, 35) (25, 15) (20, 10) (10, 10) (6, 25) (6, 15) (12, 24) (15, 24) (12, 15) (15, 15) SDO_GEOMETRY Column = ( SDO_GTYPE = 3, SDO_SRID = NULL, SDO_POINT = NULL, SDO_ELEM_INFO = (1,3,1,19,3,1), SDO_ORDINATES = (6,15,10,10,20,10, 25,15,25,35,19,40, 11,40,6,25,6,15, 12,15,15,15,15,24, 12,24,12,15))
Các siêu dữ liệu hình học của Oracle Spatial là các mô tả nhiều chiều, được lưu trữ như một mục đơn trong một bảng có tên
SDO_GEOM_METADATA trong lược đồ MDSYS, được định nghĩa như sau: CREATE TABLE SDO_GEOM_METADATA (
TABLE_NAME VARCHAR2(30), COLUMN_NAME VARCHAR2(30),
DIMINFO MDSYS.SDO_DIM_ARRAY,
SRID NUMBER
);
Bảng này không được cập nhật trực tiếp. Spatial cho phép mỗi người sử dụng có sẵn các khung nhìn (view) sau:
USER_SDO_GEOM_METADATA: Chứa các thông tin siêu dữ liệu cho tất cả các quan hệ dữ liệu không gian của người sử dụng đó. Từ khung nhìn này, người sử dụng có thể cập nhật dữ liệu.
ALL_SDO_GEOM_METADATA: Chứa các thông tin siêu dữ liệu cho tất cả các quan hệ dữ liệu không gian của người sử dụng có quyền thực hiện lệnh SELECT.
DBA_SDO_GEOM_METADATA: Chứa các thông tin siêu dữ liệu cho tất cả các quan hệ dữ liệu không gian của người sử dụng có vai trò quản trị và có quyền thực hiện lệnh SELECT.
4.2.2 Mô hình truy vấn
Spatial sử dụng mô hình truy vấn qua hai bước lọc. Mô hình này đã được phân tích trong phần 3.1.1 gồm:
Lọc sơ cấp cho phép lựa chọn nhanh các bản ghi và đây được xem như là cách lọc chi phí thấp.
Lọc thứ cấp (làm tinh) tính toán hình học chính xác từ lọc sơ cấp kết quả cuối cùng trả về cho câu truy vấn.
Spatial sử dụng chỉ mục không gian (R-Tree, QuadTree) để thực thi lọc sơ cấp, trong nhiều trường hợp không cần thiết phải thực hiện lần lượt cả hai bước, đôi khi thực hiện thẳng bước 2 hoặc chỉ bước 1, lọc sơ cấp.
4.2.3 Các phép toán quan hệ không gian
Spatial sử dụng lọc thứ cấp để xác định các mối quan hệ không gian giữa các thực thể trong cơ sở dữ liệu. Oracle có những phương thức lọc thứ cấp sau:
SDO_RELATE: Sử dụng chỉ mục không gian, xác định đối tượng không gian có giao với đối tượng cho trước hay không? Được thực hiện trên cả toán tử lọc sơ cấp và thứ cấp.
SDO_WITHIN_DISTANCE: Sử dụng chỉ mục không gian định nghĩa tập các đối tượng không gian có thuộc đối tượng cho trước hay không?
SDO_NN sử dụng chỉ mục không gian để xác định hàng xóm gần nhất trong các mối quan hệ tôpô thuộc SDO_RELATE,
DISJOINT: Không giao nhau,
TOUCH: Hai biên giao nhau, không cắt nhau,
OVERLAPBDYINTERSECT: Hai đối tượng giao nhau , EQUAL: Hai đối tượng bằng nhau,
COVER: Đối tượng hoàn toàn nằm trong đối tượng khác và biên của chúng giao nhau,
INSIDE: ngược lại với phép CONTAIN,
CORVEREDBY ngược với phép toán CORVER,
ON đối tượng nằm trên biên của đối tượng khác. Ví dụ đoạn thẳng nằm trên biên của đa giác,
ANYINTERACT: Hai đối tượng có điểm chung.