Oracle Spatial的简单应用

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

Sql代码 复制代码
  1. --建立测试表
  2. createtabletest_geo(idnumberprimarykey,namevarchar2(32),shapemdsys.sdo_geometry);
  3. --插入metadata
  4. insertintouser_sdo_geom_metadata
  5. (table_name,COLUMN_NAME,DIMINFO,SRID)
  6. values
  7. ('test_geo',
  8. 'SHAPE',
  9. MDSYS.SDO_DIM_ARRAY(MDSYS.SDO_DIM_ELEMENT('X',
  10. -180.000000000,
  11. 180.000000000,
  12. 0.500000000),
  13. MDSYS.SDO_DIM_ELEMENT('Y',
  14. -90.000000000,
  15. 90.000000000,
  16. 0.500000000)),
  17. 8307);
  18. --建立索引
  19. CREATEINDEXtest_geo_shape_idxONtest_geo(shape)
  20. INDEXTYPEISMDSYS.SPATIAL_INDEX;
  21. --插入数据
  22. --这是一个矩形
  23. insertintotest_geo
  24. (id,name,shape)
  25. values
  26. (2,
  27. 'test_area_2',
  28. mdsys.sdo_geometry(2003,
  29. 8307,
  30. null,
  31. mdsys.sdo_elem_info_array(1,1003,1),
  32. mdsys.SDO_ORDINATE_array(118,32,119,32,119,33,118,33,118,32)));
  33. --这是一个不规则多边形
  34. insertintotest_geo
  35. (id,name,shape)
  36. values
  37. (3,
  38. 'test_area_3',
  39. mdsys.sdo_geometry(2003,
  40. 8307,
  41. null,
  42. mdsys.sdo_elem_info_array(1,1003,1),
  43. mdsys.SDO_ORDINATE_array(1,3,2,2,3,3,4,2,3,1,2,1,0,2,1,3)));
  44. --执行查询
  45. --这个能查询到test_area_2
  46. select*
  47. fromtest_geot
  48. whereSDO_RELATE(t.shape,
  49. MDSYS.Sdo_Geometry(2001,
  50. null,
  51. MDSYS.Sdo_Point_Type(118.5,32.5,null),
  52. null,
  53. null),
  54. 'mask=ANYINTERACTquerytype=WINDOW')='TRUE';
  55. --这个能查询到test_area_3,说明落在地图边界上的点也是可以查询的
  56. --替换查询条件为2,2可查到,2,1.5可查到,2,2.5查不到
  57. select*
  58. fromtest_geot
  59. whereSDO_RELATE(t.shape,
  60. MDSYS.Sdo_Geometry(2001,
  61. 8307,
  62. MDSYS.Sdo_Point_Type(1.5,2.5,null),
  63. null,
  64. null),
  65. '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才能正常查询,不知道是为什么。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值