oracle 创建SDO_Geometry表

Posted 疯子加天才

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 创建SDO_Geometry表相关的知识,希望对你有一定的参考价值。

Oracle Spatial由一坨的对象数据类型,类型方法,操作子,函数与过程组合而成。一个地理对象作为一个SDO_GEOMETRY对象保存在表的一个字段里。空间索引则由普通的DDL和DML语句来建立与维护。
 本章主要说了一些例子演示如何建立,查询,索引空间数据。

简单的插入,索引与查询空间数据例子
 本节演示一个很简单建立空间表,插入,建立索引,查询数据的过程。
 场景是一个软饮料公司,用地理信息来表示他们的产品(可乐)在各个地区的情况。这些情况可以是:市场份额,竞争压力,增长潜力等等。而地区可以是邻近的市,州,省或国家。
 我们要作的是:
 1.建立一个表(COLA_MARKETS)来保存空间数据
 2.插入四个(cola_a, cola_b, cola_c, cola_d)地区的数据
 3.升级USER_SDO_GEOM_METADATA视图来反正这些地区的维度信息
 4.建立空间索引(COLA_SPATIAL_IDX)
 5.进行一些空间查询

 

 

[sql] view plain copy
 
  1. CREATE TABLE cola_markets (  
  2.   mkt_id NUMBER PRIMARY KEY,  
  3.   name VARCHAR2(32),  
  4.   shape SDO_GEOMETRY);  

 

[sql] view plain copy
 
  1. INSERT INTO cola_markets VALUES(  
  2.   1,  
  3.   \'cola_a\',  
  4.   SDO_GEOMETRY(  
  5.     2003,  -- two-dimensional polygon  
  6.     NULL,  
  7.     NULL,  
  8.     SDO_ELEM_INFO_ARRAY(1,1003,3), -- one rectangle (1003 = exterior)  
  9.     SDO_ORDINATE_ARRAY(1,1, 5,7) -- only 2 points needed to  
  10.           -- define rectangle (lower left and upper right) with  
  11.           -- Cartesian-coordinate data  
  12.   )  
  13. );  
  14. -- The next two INSERT statements create areas of interest for   
  15. -- Cola B and Cola C. These areas are simple polygons (but not  
  16. -- rectangles).  
  17. INSERT INTO cola_markets VALUES(  
  18.   2,  
  19.   \'cola_b\',  
  20.   SDO_GEOMETRY(  
  21.     2003,  -- two-dimensional polygon  
  22.     NULL,  
  23.     NULL,  
  24.     SDO_ELEM_INFO_ARRAY(1,1003,1), -- one polygon (exterior polygon ring)  
  25.     SDO_ORDINATE_ARRAY(5,1, 8,1, 8,6, 5,7, 5,1)  
  26.   )  
  27. );  
  28. INSERT INTO cola_markets VALUES(  
  29.   3,  
  30.   \'cola_c\',  
  31.   SDO_GEOMETRY(  
  32.     2003,  -- two-dimensional polygon  
  33.     NULL,  
  34.     NULL,  
  35.     SDO_ELEM_INFO_ARRAY(1,1003,1), -- one polygon (exterior polygon ring)  
  36.     SDO_ORDINATE_ARRAY(3,3, 6,3, 6,5, 4,5, 3,3)  
  37.   )  
  38. );  
  39. -- Now insert an area of interest for Cola D. This is a  
  40. -- circle with a radius of 2. It is completely outside the  
  41. -- first three areas of interest.  
  42. INSERT INTO cola_markets VALUES(  
  43.   4,  
  44.   \'cola_d\',  
  45.   SDO_GEOMETRY(  
  46.     2003,  -- two-dimensional polygon  
  47.     NULL,  
  48.     NULL,  
  49.     SDO_ELEM_INFO_ARRAY(1,1003,4), -- one circle  
  50.     SDO_ORDINATE_ARRAY(8,7, 10,9, 8,11)  
  51.   )  
  52. );  


需要写将建立的表的空间图层的信息插入一条到USER_SDO_GEOM_METADATA

 

[sql] view plain copy
 
  1. INSERT INTO user_sdo_geom_metadata  
  2.     (TABLE_NAME,  
  3.      COLUMN_NAME,  
  4.      DIMINFO,  
  5.      SRID)  
  6.   VALUES (  
  7.   \'cola_markets\',  
  8.   \'shape\',  
  9.   SDO_DIM_ARRAY(   -- 20X20 grid  
  10.     SDO_DIM_ELEMENT(\'X\', 0, 20, 0.005),  
  11.     SDO_DIM_ELEMENT(\'Y\', 0, 20, 0.005)  
  12.      ),  
  13.   NULL   -- SRID  
  14. );  
[sql] view plain copy
 
  1. -- SRID  

USER_SDO_GEOM_METADATA 在登陆PL/SQL后,Users→MDSYS→Objects→Views→USER_SDO_GEOM_METADATA 

打开可以查看到下图(我已经插入了2个空间表的记录了)

可以看到这个插入的记录,点击红色方框初的任意一个,会出现下图:

 

[sql] view plain copy
 
  1. SDO_DIM_ARRAY(   -- 20X20 grid  
  2.     SDO_DIM_ELEMENT(\'X\', 0, 20, 0.005),  
  3.     SDO_DIM_ELEMENT(\'Y\', 0, 20, 0.005)  
  4.      ),  


就是这句sql的意思了,其中SDO_DIMNAME是一个二维的最大值和最小值的描述,SDO_LB是在X上面最小值,SDO_UB是X上面的最大值,SDO_TOLERANCE是指误差的大小,这里就是指0.005内的数据都会默认为一个数据。

 

第四步就是,建立空间索引(COLA_SPATIAL_IDX)

 

[sql] view plain copy
 
  1. CREATE INDEX cola_spatial_idx  
  2.    ON cola_markets(shape)  
  3.    INDEXTYPE IS MDSYS.SPATIAL_INDEX;  


建立索引的目的是增加查询速度(理论上也可以不建立索引进行查询,但是实际中基本无法查询的出来)

建立好索引后会在tables中生成一个下面的表:

这个是个索引表:

可以在系统的索引表中找的到。

以上就创建完成了SDO_Geometry表了;可以开始空间分析了。

以上是关于oracle 创建SDO_Geometry表的主要内容,如果未能解决你的问题,请参考以下文章

oracle12c 上的休眠空间 - sdo_geometry 对象在 em.merge 上变为空

oracle spatial创建空间表元数据

使用JGeometry创建多边形

Oracle 空间查询, 数据类型为 sdo_geometry

oracle 的 SDO_GEOMETRY

使用C#操作Oracle Spatial的SDO_GEOMETRY对像(读取和写入)