05年的时候就用过这个东西,不过当时完成了项目就了事,没把一些操作记录下来,这两天又用了一下,记录一下一个简单应用的操作步骤吧。
- --建立测试表
- createtabletest_geo(idnumberprimarykey,namevarchar2(32),shapemdsys.sdo_geometry);
- --插入metadata
- insertintouser_sdo_geom_metadata
- (table_name,COLUMN_NAME,DIMINFO,SRID)
- values
- ('test_geo',
- 'SHAPE',
- MDSYS.SDO_DIM_ARRAY(MDSYS.SDO_DIM_ELEMENT('X',
- -180.000000000,
- 180.000000000,
- 0.500000000),
- MDSYS.SDO_DIM_ELEMENT('Y',
- -90.000000000,
- 90.000000000,
- 0.500000000)),
- 8307);
- --建立索引
- CREATEINDEXtest_geo_shape_idxONtest_geo(shape)
- INDEXTYPEISMDSYS.SPATIAL_INDEX;
- --插入数据
- --这是一个矩形
- insertintotest_geo
- (id,name,shape)
- values
- (2,
- 'test_area_2',
- mdsys.sdo_geometry(2003,
- 8307,
- null,
- mdsys.sdo_elem_info_array(1,1003,1),
- mdsys.SDO_ORDINATE_array(118,32,119,32,119,33,118,33,118,32)));
- --这是一个不规则多边形
- insertintotest_geo
- (id,name,shape)
- values
- (3,
- 'test_area_3',
- mdsys.sdo_geometry(2003,
- 8307,
- null,
- mdsys.sdo_elem_info_array(1,1003,1),
- mdsys.SDO_ORDINATE_array(1,3,2,2,3,3,4,2,3,1,2,1,0,2,1,3)));
- --执行查询
- --这个能查询到test_area_2
- select*
- fromtest_geot
- whereSDO_RELATE(t.shape,
- MDSYS.Sdo_Geometry(2001,
- null,
- MDSYS.Sdo_Point_Type(118.5,32.5,null),
- null,
- null),
- 'mask=ANYINTERACTquerytype=WINDOW')='TRUE';
- --这个能查询到test_area_3,说明落在地图边界上的点也是可以查询的
- --替换查询条件为2,2可查到,2,1.5可查到,2,2.5查不到
- select*
- fromtest_geot
- whereSDO_RELATE(t.shape,
- MDSYS.Sdo_Geometry(2001,
- 8307,
- MDSYS.Sdo_Point_Type(1.5,2.5,null),
- null,
- null),
- 'mask=ANYINTERACTquerytype=WINDOW')='TRUE';
--建立测试表
create table test_geo (id number primary key, name varchar2(32), shape mdsys.sdo_geometry);
--插入metadata
insert into user_sdo_geom_metadata
(table_name, COLUMN_NAME, DIMINFO, SRID)
values
('test_geo',
'SHAPE',
MDSYS.SDO_DIM_ARRAY(MDSYS.SDO_DIM_ELEMENT('X',
-180.000000000,
180.000000000,
0.500000000),
MDSYS.SDO_DIM_ELEMENT('Y',
-90.000000000,
90.000000000,
0.500000000)),
8307);
--建立索引
CREATE INDEX test_geo_shape_idx ON test_geo(shape)
INDEXTYPE IS MDSYS.SPATIAL_INDEX;
--插入数据
--这是一个矩形
insert into test_geo
(id, name, shape)
values
(2,
'test_area_2',
mdsys.sdo_geometry(2003,
8307,
null,
mdsys.sdo_elem_info_array(1, 1003, 1),
mdsys.SDO_ORDINATE_array(118, 32, 119, 32, 119,33, 118,33, 118,32)));
--这是一个不规则多边形
insert into test_geo
(id, name, shape)
values
(3,
'test_area_3',
mdsys.sdo_geometry(2003,
8307,
null,
mdsys.sdo_elem_info_array(1, 1003, 1),
mdsys.SDO_ORDINATE_array(1,3, 2,2, 3,3, 4,2, 3,1, 2,1, 0,2, 1,3)));
--执行查询
--这个能查询到test_area_2
select *
from test_geo t
where SDO_RELATE(t.shape,
MDSYS.Sdo_Geometry(2001,
null,
MDSYS.Sdo_Point_Type(118.5, 32.5, null),
null,
null),
'mask=ANYINTERACT querytype=WINDOW') = 'TRUE';
--这个能查询到test_area_3,说明落在地图边界上的点也是可以查询的
--替换查询条件为2,2可查到,2,1.5可查到,2,2.5查不到
select *
from test_geo t
where SDO_RELATE(t.shape,
MDSYS.Sdo_Geometry(2001,
8307,
MDSYS.Sdo_Point_Type(1.5, 2.5, null),
null,
null),
'mask=ANYINTERACT querytype=WINDOW') = 'TRUE';
还有一点疑惑写在下面
我最早接触到spatial的时候,地图数据是通过oracle的shp2sdo这个工具,从shp格式的地图里导入的,那时候做查询的时候,查询条件可以用MDSYS.Sdo_Geometry(2003, 8307,
MDSYS.Sdo_Point_Type(1.5, 2.5, null), null, null), 但是现在自己插入的数据,如果第一个参数还用2003就会报一个ora-13031异常,必须改成2001才能正常查询,不知道是为什么。