Oracle Spatial的简单应用

05年的时候就用过这个东西,不过当时完成了项目就了事,没把一些操作记录下来,这两天又用了一下,记录一下一个简单应用的操作步骤吧。

Sql代码
  1. –建立测试表   
  2. create table test_geo (id number primary keyname varchar2(32), shape mdsys.sdo_geometry);
      
  3.   
  4.   
  5. –插入metadata   
  6. insert into user_sdo_geom_metadata   
  7.   (table_name, COLUMN_NAME, DIMINFO, SRID)   
  8. values  
  9.   (‘test_geo’,   
  10.    ‘SHAPE’,   
  11.    MDSYS.SDO_DIM_ARRAY(MDSYS.SDO_DIM_ELEMENT(‘X’,   
  12.                                              -180.000000000,   
  13.                                              180.000000000,   
  14.                                              0.500000000),   
  15.                        MDSYS.SDO_DIM_ELEMENT(‘Y’,   
  16.                                              -90.000000000,   
  17.                                              90.000000000,   
  18.                                              0.500000000)),   
  19.    8307);   
  20.   
  21. –建立索引   
  22. CREATE INDEX test_geo_shape_idx ON test_geo(shape)
      
  23. INDEXTYPE IS MDSYS.SPATIAL_INDEX;   
  24.   
  25.   
  26. –插入数据   
  27. –这是一个矩形   
  28. insert into test_geo   
  29.   (id, name, shape)   
  30. values  
  31.   (2,   
  32.    ‘test_area_2’,   
  33.    mdsys.sdo_geometry(2003,    
  34.                       8307,    
  35.                       null,   
  36.                       mdsys.sdo_elem_info_array(1, 1003, 1),   
  37.                       mdsys.SDO_ORDINATE_array(118, 32, 119, 32, 119,33, 118,33, 118,32)));   
  38.   
  39. –这是一个不规则多边形   
  40. insert into test_geo   
  41.   (id, name, shape)   
  42. values  
  43.   (3,   
  44.    ‘test_area_3’,   
  45.    mdsys.sdo_geometry(2003,    
  46.                       8307,    
  47.                       null,   
  48.                       mdsys.sdo_elem_info_array(1, 1003, 1),   
  49.                       mdsys.SDO_ORDINATE_array(1,3, 2,2, 3,3, 4,2, 3,1, 2,1, 0,2, 1,3)));   
  50.   
  51.   
  52.   
  53. –执行查询   
  54. –这个能查询到test_area_2
      
  55. select *   
  56.   from test_geo t   
  57.  where SDO_RELATE(t.shape,   
  58.                   MDSYS.Sdo_Geometry(2001,   
  59.                                      null,   
  60.                                      MDSYS.Sdo_Point_Type(118.5, 32.5, null),   
  61.                                      null,   
  62.                                      null),   
  63.                   ‘mask=ANYINTERACT querytype=WINDOW’) = ‘TRUE’;   
  64.   
  65.   
  66. –这个能查询到test_area_3,说明落在地图边界上的点也是可以查询的
      
  67. –替换查询条件为2,2可查到,2,1.5可查到,2,2.5查不到
      
  68. select *   
  69.   from test_geo t   
  70.  where SDO_RELATE(t.shape,   
  71.                   MDSYS.Sdo_Geometry(2001,   
  72.                                      8307,   
  73.                                      MDSYS.Sdo_Point_Type(1.5, 2.5, null),   
  74.                                      null,   
  75.                                      null),   
  76.                   ‘mask=ANYINTERACT querytype=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才能正常查询,不知道是为什么。

转载自:https://blog.csdn.net/wanglipo/article/details/5890525

You may also like...

退出移动版