--sunfruit
空间数据库Oracle Spatial的建立过程如下:
-- 创建最基本的个人兴趣点表结构
drop table poi;
create table poi (gid INTEGER,
opid INTEGER,
gname VARCHAR2(256),
gshape MDSYS.SDO_GEOMETRY);
-- 更新用户空间数据对象视图(建立索引依赖她)
delete from USER_SDO_GEOM_METADATA where TABLE_NAME='POI' and COLUMN_NAME='GSHAPE';
insert into USER_SDO_GEOM_METADATA values ('poi',
'gshape',
MDSYS.SDO_DIM_ARRAY(MDSYS.SDO_DIM_ELEMENT('lon', -- lontitude
-64800000, -- min(china 26430867 73.41907434101486)
64800000, -- max(china 49679991 137.99997381765377)
1), -- scale (china abs 23249124)
MDSYS.SDO_DIM_ELEMENT('lat', -- latitude
-32400000, -- min(china -1677502 -4.6597267116858045)
32400000, -- max(china 21571819 59.92171939467364)
1)), -- scale (china abs 23249321)
NULL);
-- 插入一个个人兴趣点的SQL语句,使用标准点地物空间数据类型
delete from POI;
insert into POI values (20010001,
1,
'我的家',
MDSYS.SDO_GEOMETRY(2001, -- SDO_GTYPE
NULL, -- SDO_SRID
SDO_POINT_TYPE(41884696, 14377039, NULL), NULL, NULL));
-- 插入一个个人兴趣点的SQL语句,使用另一种点地物空间数据组织结构
delete from POI;
insert into POI values (20010001,
1,
'我的家',
MDSYS.SDO_GEOMETRY(2001, -- SDO_GTYPE
NULL, -- SDO_SRID
NULL, -- SDO_POINT
MDSYS.SDO_ELEM_INFO_ARRAY (1, -- SDO_STARTING_OFFSET
1, -- SDO_ETYPE
1), -- SDO_INTERPRETATION
MDSYS.SDO_ORDINATE_ARRAY (41884696,14377039)));
-- 创建缺省的R-tree空间索引
drop index POI_IDX;
CREATE INDEX POI_IDX on poi(gshape)
INDEXTYPE is MDSYS.SPATIAL_INDEX;
-- PARAMETERS('SDO_LEVEL=10000'); -- 180*60*60*1000*2/100/100*90*60*60*1000*2/100/100 = 8398080000
-- 索引粗滤矩形窗口选择SQL语句(对于点地物对象,索引粗滤的结果是精确的)
SELECT * FROM POI P
WHERE sdo_filter(P.gshape,
mdsys.sdo_geometry(2003,NULL,NULL,
mdsys.sdo_elem_info_array(1,1003,3),
mdsys.sdo_ordinate_array(41883696,14376039, 41885696,14378039)),
'querytype=window') = 'TRUE';
-- 精确匹配矩形窗口选择SQL语句(计算非常耗时)
SELECT * FROM POI P
WHERE sdo_relate(P.gshape,
mdsys.sdo_geometry(2003,NULL,NULL,
mdsys.sdo_elem_info_array(1,1003,3),
mdsys.sdo_ordinate_array(41883696,14376039, 41885696,14378039)),
'mask=INSIDE querytype=window') = 'TRUE';