首先,oracle 支持自定義的數據類型,你能用數組,結構體或帶有構造函數,功能函數的類來定義自己的對象類型。這樣的對象類型能用于屬性列的數據類型,也能用來創建對象表。而oracle spatial也正是基于此種特性所研發的一套空間數據處理系統。
spatial 的自定義數據類型有非常多,都在mdsys方案下,經常使用的是sdo_geometry類型。sdo_geometry表示一個幾何對象,能是點、線、面、多點、多線、多面或混合對象。
spatial 在此數據類型的基礎上,實現了r樹空間索引和四叉樹空間索引,還以sql函數的形式實現了多種空間分析功能。
ORACLE SPATIAL 是 Oracle 數據庫強大的核心特性,包含了用于存儲矢量數據類型、柵格數據類型和持續拓撲數據的原生數據類型。 ORACLE SPATIAL 使得我們能夠在一個多用戶環境中部署地理信息系統(GIS),并且與其它企業數據有機結合起來,統一部署電子商務、政務。有了 ORACLE SPATIAL 之后,即可用標準的 SQL 查詢管理我們的空間數據。
ORACLE SPATIAL 功能由于傳統的 GIS 技術已達到其本身可伸縮性和可*性的極限,用戶越來越多地轉向以數據庫為中心的空間計算。 ORACLE SPATIAL 將空間過程和操作直接轉移到數據庫內核中,從而提高了性能和安全性。 ORACLE SPATIAL 從1995年 ORACLE 7.1.6開始發展到2003年的10G版本,空間數據處理能力越來越強大。
ORACLE SPATIAL 將所有的地理空間數據類型(矢量、柵格、網格、影像、網絡、拓撲)統一在單一、開放的、基于標準的數據管理環境中, 這就減少了管理單獨、分離的專用系統的成本、復雜性和開銷。
?
?
Step1. 創建一張表,其中shape用來存放空間數據
CREATE TABLE mylake (
??? feature_id NUMBER PRIMARY KEY,
??? name VARCHAR2(32),
???
shape MDSYS.SDO_GEOMETRY
);
Step2. 在
user_sdo_geom_metadata
表中插入新記錄,用于描述空間字段
INSERT INTO user_sdo_geom_metadata VALUES (
??? 'mylake',????
//---表名
??? 'shape',????
//---字段名
??? MDSYS.SDO_DIM_ARRAY(???
??????? MDSYS.SDO_DIM_ELEMENT('X', 0, 100, 0.05),????
//---X維最小,最大值和容忍度。
??????? MDSYS.SDO_DIM_ELEMENT('Y', 0, 100, 0.05)????
//---Y維最小,最大值和容忍度
??? ),
??? NULL????
//---坐標系,缺省為笛卡爾坐標系
);
Step3. 創建空間索引
CREATE INDEX mylake_idx ON mylake(shape)
??? INDEXTYPE IS MDSYS.SPATIAL_INDEX
Step4. 插入空間數據
Oracle Spatial用
MDSYS.SDO_GEOMETRY
來存儲空間數據,定義為:
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);
SDO_GTYPE:
用四個數字定義了所有的形狀
???????????
第一位:維數
???????????
第二位:線性表示。用于3,4維數據,二維為0
???????????
最后兩位:
Value | Geometry | Description |
---|---|---|
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 |
?
?
?
?
SDO_SRID:
坐標系,NULL為笛卡爾坐標系。
SDO_POINT:
Oracle Spatial也可定義單個的點,
SDO_POINT
的定義:
??? CREATE TYPE sdo_point_type AS OBJECT (X NUMBER,Y NUMBER,Z NUMBER);
???
如果是二維,Z為NULL。
SDO_ELEM_INFO:
每三個值描述一個
元素。
????????????????
第一個值:第一個頂點在
SDO_ORDINATES_ARR
開始位置
????????????????
第二個值:元素類型
????????????????
第三個值:頂點連接方式:1-通過直線連接,2-通過圓弧連接
???
定義為
??? CREATE TYPE sdo_elem_info_array AS VARRAY (1048576) of NUMBER;
SDO_ORDINATES:
幾何圖形所有頂點列表。定義為
??? CREATE TYPE sdo_ordinate_array AS VARRAY (1048576) of NUMBER;
FONT color=#003366>
// 插入包含一個島嶼的湖泊
INSERT INTO mylake VALUES(
??? 10,?
??? 'Lake Calhoun',?
??? 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)
??? ));
// 插入兩艘小船
INSERT INTO mylake VALUES(
??? 11,?
??? 'The Windswept',?
??? MDSYS.SDO_GEOMETRY(
??????? 2003,
??????? NULL,
??????? NULL,
??????? MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1),
??????? MDSYS.SDO_ORDINATE_ARRAY(2,2, 3,2, 3,2, 2,3, 2,2)
??? )
);
INSERT INTO mylake VALUES(
??? 12,?
??? 'Blue Crest',?
??? MDSYS.SDO_GEOMETRY(
??????? 2003,
??????? NULL,
??????? NULL,
??????? MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1),
??????? MDSYS.SDO_ORDINATE_ARRAY(7,7, 8,7, 8,7, 7,8, 7,7)
??? )
);
Step4. 查詢
Oracle Spatial查詢數據包括二個處理過程:
1.只通過索引查詢候選項。通過函數
SDO_FILTER
實現:
SDO_FILTER(geometry1 MDSYS.SDO_GEOMETRY,?geometry2 MDSYS.SDO_GEOMETRY, params VARCHAR2)
geometry1:
必須是被索引的幾何數據
geometry2:
不一定是表中的空間字段,也不要求被索引
params:
Filter類型
??????? querytype=WINDOW:
geometry2不要求來自表
??????? querytype=JOIN
:geometry2必須來自表
SELECT name boat_name
FROM mylake t
WHERE feature_id = 12
AND SDO_FILTER(t.shape, 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';
2.再檢查每個候選項是否和條件精確匹配。通過函數
SDO_RELATE
實現:
SDO_RELATE(geometry1 MDSYS.SDO_GEOMETRY, geometry2 MDSYS.SDO_GEOMETRY, params VARCHAR2)
params:
masktype類型
-
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 ofCONTAINS
.A INSIDE B
impliesB CONTAINS A
. -
COVEREDBY
— the opposite ofCOVERS
.A COVEREDBY B
impliesB 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.// 選擇在定義矩形內的所有小船
SELECT name boat_name
FROM mylake t
WHERE feature_id = 12
AND SDO_FILTER(t.shape, 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.shape, 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 querytype=WINDOW') = 'TRUE'// masktype可聯合使用
SELECT feature_id id
FROM mylake t
WHERE feature_id = 12
AND SDO_FILTER(t.shape, 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.shape, 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'Oracle Spatial 提供的其他查詢函數:
Query Description SDO_NN
Nearest neighbor SDO_SDO_WITHIN_DISTANCE
All geometries with a certain distance ? Functions Description SDO_GEOM.SDO_MBR
The minimum bounding rectangle for a geometry SDO_GEOM.SDO_DISTANCE
The distance between two geometries SDO_GEOM.SDO_INTERSECTION
Provides the intersection point of two geometries ?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
