Oracle添加ST_GEOMETRY地理类型

环境:Centos7 + Oracle 11g(11.2)

ArcSIG客户端环境:win10 + ArcSig10.2

Oracle添加ST_GEOMETRY地理类型

0.相关命令

-- 查询Oracle版本
select * from v$version;

-- 查询'SDE'用户是否存在,注意''内的用户名大小写敏感
conn /as sysdba;
select username from all_users where username='SDE';

-- 查询当前用户所属的默认表空间
conn sde/123456
select username,default_tablespace from user_users;

-- 查询所有表空间的使用情况
conn /as sysdba;
select a.tablespace_name,total "Total(M)",free "Free(M)",total-free "Used(M)",round(((total-free)/total)*100,2) "Used(%)" from 
( select tablespace_name,sum(bytes)/1024/1024 total from dba_data_files
   group by tablespace_name) a, 
( select tablespace_name,sum(bytes)/1024/1024 free from dba_free_space
   group by tablespace_name) b
where a.tablespace_name=b.tablespace_name;

-- 查询表空间对应的物理文件路径
conn /as sysdba;
select * from dba_data_files; 

-- 查看表所属的表空间(查看所有表)
conn user/password
select table_name,tablespace_name from user_tables;

-- 查看表所属的表空间(查看指定表)
conn user/password
select table_name,tablespace_name from user_tables where table_name=upper('tableName');

-- sdo_util 常用转换函数

wkt、wkb与geometry互转&验证

SDO_UTIL.FROM_WKBGEOMETRY --from BLOB
SDO_UTIL.FROM_WKTGEOMETRY --from String
SDO_UTIL.TO_WKBGEOMETRY   --to BLOB
SDO_UTIL.TO_WKTGEOMETRY   --to String
SDO_UTIL.VALIDATE_WKBGEOMETRY
SDO_UTIL.VALIDATE_WKTGEOMETRY

select id, sdo_util.to_wktgeometry(myzone) from TAB_ORA_SDO_GEOMETRY?where id=1;
返回:POLYGON ((1.0 1.0, 5.0 1.0, 5.0 7.0, 1.0 7.0, 1.0 1.0)))
返回结果可以通过insert插入:
insert into TAB_ORA_SDO_GEOMETRY (ID, MYZONE) VALUES (2, sdo_util.from_wktgeometry('POLYGON ((1.0 1.0, 5.0 1.0, 5.0 7.0, 1.0 7.0, 1.0 1.0)))'));

gml&geometry转换

SDO_UTIL.TO_GMLGEOMETRY
select id, to_char(sdo_util.to_gmlgeometry(myzone)) from TAB_ORA_SDO_GEOMETRY;

-- 查看类型定义的详细信息
desc MDSYS.SDO_Geometry;
desc MDSYS.ST_Geometry;
desc SDE.ST_Geometry;

-- 查看Geometry字段的数据类型
select SDE.ST_GeometryType(t.MYZONE) from TAB_SDE_ST_GEOMETRY t;

-- 三种类型的定义(MDSYS.SDO_Geometry,MDSYS.ST_Geometry,SDE.ST_Geometry):

desc MDSYS.SDO_Geometry;
TYPE SDO_GEOMETRYAS OBJECT ( 
 SDO_GTYPE NUMBER, 
 SDO_SRIDNUMBER, 
 SDO_POINT SDO_POINT_TYPE, 
 SDO_ELEM_INFO SDO_ELEM_INFO_ARRAY,
 SDO_ORDINATES SDO_ORDINATE_ARRAY, 
 MEMBER FUNCTIONGET_GTYPE
 RETURN NUMBER DETERMINISTIC,
 MEMBER FUNCTIONGET_DIMS 
 RETURN NUMBER DETERMINISTIC,
 MEMBER FUNCTIONGET_LRS_DIM
 RETURN NUMBER DETERMINISTIC)
 
ALTER TYPE SDO_GEOMETRY
ADD MEMBER FUNCTION GET_WKB RETURN BLOB DETERMINISTIC, 
ADD MEMBER FUNCTION GET_WKT RETURN CLOB DETERMINISTIC, 
ADD MEMBER FUNCTION ST_CoordDim RETURN SMALLINT DETERMINISTIC, 
ADD MEMBER FUNCTION ST_IsValid RETURN INTEGER DETERMINISTIC, 
ADD CONSTRUCTOR FUNCTION SDO_GEOMETRY(wkt IN CLOB, 
srid IN INTEGER DEFAULT NULL) RETURN SELF AS RESULT, 
ADD CONSTRUCTOR FUNCTION SDO_GEOMETRY(wkt IN VARCHAR2, 
srid IN INTEGER DEFAULT NULL) RETURN SELF AS RESULT, 
ADD CONSTRUCTOR FUNCTION SDO_GEOMETRY(wkb IN BLOB, 
srid IN INTEGER DEFAULT NULL) RETURN SELF AS RESULT
CASCADE
TYPE BODY SDO_GEOMETRY wrappeda0000001abcdabcdabcdabcdabcdabcd......

参数说明:
SDO_GTYPE 表示要存储的几何类型,如点线面。它是通过 NUMBER类型来表达的。SDO_GTYPE值是有四位数字组成的,它们的格式为:dltt。
    d 表示几何的维数。如二维、三维对应的d=2和d=3;
    l 标识三维线状参考系统(Linear referencing system,LRS)几何体的LRS度量维,即哪一维含度量值(measure value),可能的取值为3、4。对于非LRS几何体或者以ORACLE Spatial默认的最后一维为LRS度量维,则l取值为0。
    tt 定义了地理对象的类型。现在使用从00到07,如tt=01代表为单点。
    
    常见的几何类型的定义:
    dl01 POINT,该几何体是一个点
    dl02 LINE or CURVE,该几何体为一线串(线串中的段可以为直线段也可以为弧线断
    dl03 POLYGON 该几何体为一多边形,该多边形可有洞也可没有
    dl04 COLLECTION 是元素的集合,其中的元素只要是非COLLECTION类型的即可
    dl05 MULTIPOINT 含一个或多个点的几何体
    dl06 MULTILINE or MULTICURVE 含一个或多个线串的几何体
    dl07 MULTIPOLYGON 多个DISJOINT的多边形
    
    2001 单点Point类型,地理对象包含一个普通的点
    2002 单线Polyline和Curve类型,地理对象包含直线或片段segments
    2003 Polygon类型,地理对象包含一个普通的多边形,但不包含空岛
    2004 集合COLLECTION类型,地理对象包含不同类型元素集合
    2005 多点MultiPoint类型, 地理对象包含对个点的集合
    2006 多线MultiPolyline和多曲线类型,地理对象有一条或更多的曲线集合
    2007 多多边形MultiPolygon类型,一个地理对象包含岛(多岛)的多边形和N个多边形
        
SDO_SRID 几何的空间参考坐标系,类型也为 NUMBER。
    SDO_SRID定义了空间坐标参考系统。如果SDO_SRID为null,则没有指定坐标系统,如果SDO_SRID不为null,那么它的值必须在在MDSYS.CS_SRS 表中的 SRID 列有对应的值,而且它的值必须插入USER_SDO_GEOM_METADATA视图中。
    
SDO_POINT 如果几何类型点类型的话,就是存储点坐标,否则为空。oracle自定义的SDO_POINT_TYPE类型。
    SDO_POINT类型的构造方法为:sdo_point_type(x,y,z),其中x,y,z类型为Double和Int都可。
    
SDO_ELEM_INFO 定义要如何理解 SDO_ORDINATES 中的坐标串。
    SDO_ELEM_INFO类型的构造方法为:sdo_elem_info_array(a,b,c),其中a,b,c为Number类型。
    SDO_ELEM_INFO每三个数字组合为一个SDO_ELEM_INFO属性单元。
    每个SDO_ELEM_INFO属性单元由:SDO_STARTING_OFFSET、SDO_ETYPE 和SDO_INTERPRETATION 组成。
    
SDO_ORDINATES 存储实际坐标的,以X、Y以及不同点之间都是逗号隔开。声明了组成当前几何片段的第一个坐标在SDO_ORDINATES数组中的坐标序号。坐标序号是从1开始起算的而非从0开始。
              
注意:对于一个给定的层,所有的地理对象必须都是相同的维度,不能将二维与三维的数据放在一个层里。

desc MDSYS.ST_Geometry;
TYPE ST_GEOMETRY           AS OBJECT (                                                                                                                                          GEOM SDO_GEOMETRY,                                                                                                                                                                MEMBER FUNCTION GET_SDO_GEOM RETURN SDO_GEOMETRY DETERMINISTIC,                                                            MEMBER FUNCTION GET_WKB RETURN BLOB DETERMINISTIC,                                                                                            MEMBER FUNCTION GET_WKT RETURN CLOB DETERMINISTIC,                                                                                             MEMBER FUNCTION ST_CoordDim RETURN SMALLINT DETERMINISTIC,                                                                               MEMBER FUNCTION ST_IsValid RETURN INTEGER DETERMINISTIC,                                                                                       MEMBER FUNCTION ST_SRID RETURN INTEGER,                                                                                                                    MEMBER FUNCTION ST_SRID(asrid INTEGER) RETURN ST_Geometry,                                                                                     STATIC FUNCTION FROM_WKT(wkt CLOB) RETURN ST_GEOMETRY DETERMINISTIC,                                                        STATIC FUNCTION FROM_WKT(wkt VARCHAR2) RETURN ST_GEOMETRY DETERMINISTIC,                                               STATIC FUNCTION FROM_WKB(wkb BLOB) RETURN ST_GEOMETRY DETERMINISTIC,                                                       STATIC FUNCTION FROM_WKT(wkt CLOB, asrid INTEGER)                                                                                                          RETURN ST_GEOMETRY DETERMINISTIC,                                                                                                                                  STATIC FUNCTION FROM_WKT(wkt VARCHAR2, asrid INTEGER)                                                                                              RETURN ST_GEOMETRY DETERMINISTIC,                                                                                                                                  STATIC FUNCTION FROM_WKB(wkb BLOB, asrid INTEGER)                                                                                                         RETURN ST_GEOMETRY DETERMINISTIC,                                                                                                                                  STATIC FUNCTION FROM_SDO_GEOM(ageometry SDO_GEOMETRY)                                                                                       RETURN ST_GEOMETRY DETERMINISTIC) NOT FINAL  
  ......    

可以利用结构的相关函数实现地理数据类型的转换:

select id, st_geometry.get_wkt(myzone) from TAB_ORA_ST_GEOMETRY;  -- 转字符串输出
select id, st_geometry.get_wkb(myzone) from TAB_ORA_ST_GEOMETRY;  --转二进制BLOB输出


desc SDE.ST_Geometry
user type definition                                                                                                      
------------------------------------------------------------------------------------------------------------------------- 
Type st_geometry                                                                                                          
                                                Authid current_user  AS object                                            
        --C_Type_Release 1007                                                                                             
          (entity integer,numpts integer,minx float(64),                                                                  
              miny float(64),maxx float(64),maxy float(64),                                                               
              minz float (64),maxz float(64),minm float(64),                                                                          
              maxm float(64),area float(64),len float(64),                                                                
              srid integer,points blob,                                                                                   
              constructor Function st_geometry(geom_str clob,srid number) Return self AS result deterministic,                    
              constructor Function st_geometry(center_x number,                                                           
                                               center_y number,                                                           
                                               center_z number,                                                           
                                               center_m number,                                                           
                                               semiMajorAxis number,                                                      
                                               semiMinorAxis number,                                                      
                                               angle    number,                                                           
                                               numpts   number,                                                           
                                               srid     integer) Return self AS result deterministic,                     
              constructor Function st_geometry(center_x number,                                                           
                                               center_y number,                                                           
                                               center_z number,                                                           
                                               center_m number,                                                           
                                               radius number,                                                             
                                               numpts   number,                                                           
                                               srid     integer) Return self AS result deterministic,                     
              constructor Function st_geometry(center_x number,                                                           
                                               center_y number,                                                           
                                               center_z number,                                                           
                                               center_m number,                                                           
                                               startAngle number,                                                         
                                               endAngle number,                                                           
                                               outerRadius   number,                                                      
                                               innerRadius   number,                                                      
                                               numpts   number,                                                           
                                               srid     integer) Return self AS result deterministic,                     
              constructor Function st_geometry(x     number,                                                              
                                               y     number,                                                              
                                               z     number,                                                              
                                               m     number,                                                              
                                               srid  integer) Return self AS result deterministic,                        
              member Function st_area Return number,                                                                      
              member Function st_len  Return number,                                                                      
              member Function st_length Return number,                                                                    
              member Function st_entity Return number,                                                                    
              member Function st_numpts Return number,                                                                    
              member Function st_minx Return number,                                                                      
              member Function st_maxx Return number,                                                                      
              member Function st_miny Return number,                                                                      
              member Function st_maxy Return number,                                                                      
              member Function st_minm Return number,                                                                      
              member Function st_maxm Return number,                                                                      
              member Function st_minz Return number,                                                                      
              member Function st_maxz Return number,                                                                      
              member Function st_srid Return number,                                                                      
              map member Function st_map Return varchar2,                                                                 
              static Function get_release Return number) NOT final; 
Type Body st_geometry AS                                                                                                  
                                                                                                                          
constructor Function st_geometry (geom_str clob, srid number)                                                             
  Return self AS result                                                                                                   
IS                                                                                                                        
   temp            varchar2(1);                                                                                           
   tempraw         raw(1);                                                                                                
   entity          number;                                                                                                
   geom_type       number;                                                                                                
   name            varchar2(32);                                                                                          
   spref_r         SDE.st_spref_util.spatial_ref_record_t;                                                                
   shape           SDE.st_geom_util.shape_r;                                                                              
   is_empty        boolean := False;                                                                                      
   rc              number;                                                                                                
   buffer          clob;                       
......

从三种数据类型的定义来看,的确完全是不同的数据结构。

-- 使用三种不同结构的空间类型字段建表
create table TAB_ORA_SDO_GEOMETRY (ID INTEGER, MYZONE MDSYS.SDO_GEOMETRY);
create table TAB_ORA_ST_GEOMETRY  (ID INTEGER, MYZONE MDSYS.ST_GEOMETRY);
create table TAB_SDE_ST_GEOMETRY  (ID INTEGER, MYZONE SDE.ST_GEOMETRY);

------------------------------------------------------------------------------------
-- test TAB_ORA_SDO_GEOMETRY
-- 1 插入一个矩形到 TAB_ORA_SDO_GEOMETRY
insert into TAB_ORA_SDO_GEOMETRY (ID, MYZONE) VALUES (
                      1, --表的主键字段
                      MDSYS.SDO_GEOMETRY(  -- 表的空间字段MYZONE(MDSYS.SDO_GEOMETRY),通过空间参数来定义一个矩形
                                  2003, -- SDO_GTYPE=2003,表示二维多边形。2003中的2表示二维数据、2003中的3表示表示多边形
                                  NULL, -- SDO_SRID = NULL
                                  NULL, -- SDO_POINT = NULL
                                  MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3), -- 一个矩形(1003为逆时针方向)。SDO_ELEM_INFO = (1, 1003, 3),最后一个3表示该几何为矩形
                                  MDSYS.SDO_ORDINATE_ARRAY(1,1, 5,7) -- 只需要两点。SDO_ORDINATES = (1,1, 5,7),这定义了具体的左下坐标和右上坐标的坐标序列
                       )
); 
-- 2 插入简单的point到 TAB_ORA_SDO_GEOMETRY
insert into TAB_ORA_SDO_GEOMETRY (ID, MYZONE) VALUES ( 2, MDSYS.SDO_GEOMETRY( 2001, NULL, SDO_POINT_TYPE(200.0000000000, 500.3417619204, null), NULL, NULL )); 
-- 3 插入简单的单曲线到 TAB_ORA_SDO_GEOMETRY
insert into TAB_ORA_SDO_GEOMETRY (ID, MYZONE) VALUES ( 3, MDSYS.SDO_GEOMETRY( 2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,2,2), SDO_ORDINATE_ARRAY(40602883.52196759, 3497165.8231581002, 40602944.9893748, 3497397.0575331002, 40602901.083979294, 3497657.5621717945 ))); 
-- insert into TAB_ORA_SDO_GEOMETRY (ID, MYZONE) VALUES (4, MDSYS.SDO_GEOMETRY(2001, 4326, MDSYS.SDO_POINT_TYPE(300, 600.3417619204, null), null, null));

-- 查询结果
select ID, MYZONE from TAB_ORA_SDO_GEOMETRY;
select ID, sdo_util.to_wktgeometry(t.myzone) from TAB_ORA_SDO_GEOMETRY t; -- select将地理字段转换成文本字符输出

两种方式查询结果如下:
3    MDSYS.SDO_GEOMETRY(2002, null, null, MDSYS.SDO_ELEM_INFO_ARRAY(1, 2, 2), MDSYS.SDO_ORDINATE_ARRAY(40602883.52196759, 3497165.8231581002, 40602944.98937480, 3497397.0575331002, 40602901.0839792940, 3497657.5621717945))
1    MDSYS.SDO_GEOMETRY(2003, null, null, MDSYS.SDO_ELEM_INFO_ARRAY(1, 1003, 3), MDSYS.SDO_ORDINATE_ARRAY(1, 1, 5, 7))
2    MDSYS.SDO_GEOMETRY(2001, null, MDSYS.SDO_POINT_TYPE(200, 500.3417619204, null), null, null)

3    CIRCULARSTRING (4.060288352196759E7 3497165.8231581002, 4.06029449893748E7 3497397.0575331002, 4.060290108397929E7 3497657.5621717945)
1    POLYGON ((1.0 1.0, 5.0 1.0, 5.0 7.0, 1.0 7.0, 1.0 1.0))
2    POINT (200.0 500.3417619204)


------------------------------------------------------------------------------------
-- test TAB_ORA_ST_GEOMETRY
-- 1 插入一个矩形到 TAB_ORA_ST_GEOMETRY
insert into TAB_ORA_ST_GEOMETRY (ID, MYZONE) VALUES (
                      1, --表的主键字段
                      MDSYS.ST_GEOMETRY( -- 表的空间字段MYZONE(MDSYS.ST_GEOMETRY),通过空间参数来定义一个矩形
                                  MDSYS.SDO_GEOMETRY(  -- 空间字段GEOM(MDSYS.SDO_GEOMETRY),通过参数来定义MYZONE.GEOM
                                                          2003, -- SDO_GTYPE=2003,表示二维多边形。2003中的2表示二维数据、2003中的3表示表示多边形
                                                          NULL, -- SDO_SRID = NULL
                                                          NULL, -- SDO_POINT = NULL
                                                          MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3), -- 一个矩形(1003为逆时针方向)。SDO_ELEM_INFO = (1, 1003, 3),最后一个3表示该几何为矩形
                                                          MDSYS.SDO_ORDINATE_ARRAY(1,1, 5,7) -- 只需要两点。SDO_ORDINATES = (1,1, 5,7),这定义了具体的左下坐标和右上坐标的坐标序列
                                  )
                      )
); 
-- 2 插入简单的point到 TAB_ORA_ST_GEOMETRY
insert into TAB_ORA_ST_GEOMETRY (ID, MYZONE) VALUES (2, MDSYS.ST_GEOMETRY( MDSYS.SDO_GEOMETRY( 2001, NULL, SDO_POINT_TYPE( 200.0000000000, 500.3417619204, null ), NULL, NULL ))); 

-- 查询结果
select ID, MYZONE from TAB_ORA_ST_GEOMETRY;
select ID, sdo_util.to_wktgeometry(t.myzone.geom) from TAB_ORA_ST_GEOMETRY t; -- select将地理字段转换成文本字符输出

两种方式查询结果如下:
1    MDSYS.ST_GEOMETRY(MDSYS.SDO_GEOMETRY(2003, null, null, MDSYS.SDO_ELEM_INFO_ARRAY(1, 1003, 3), MDSYS.SDO_ORDINATE_ARRAY(1, 1, 5, 7)))
2    MDSYS.ST_GEOMETRY(MDSYS.SDO_GEOMETRY(2001, null, MDSYS.SDO_POINT_TYPE(200, 500.3417619204, null), null, null))

1    POLYGON ((1.0 1.0, 5.0 1.0, 5.0 7.0, 1.0 7.0, 1.0 1.0))
2    POINT (200.0 500.3417619204)


------------------------------------------------------------------------------------
-- test TAB_SDE_ST_GEOMETRY (ArcSIG ST_Geometry)
create table TAB_SDE_ST_GEOMETRY  (ID INTEGER, MYZONE SDE.ST_GEOMETRY); -- 创建表
desc TAB_SDE_ST_GEOMETRY; -- 查看表描述/定义

-- 插入点(point)数据
insert into TAB_SDE_ST_GEOMETRY (ID, MYZONE) VALUES (1, SDE.ST_GEOMETRY ('POINT (100 200)', 4326)); --x,y,SRID
insert into TAB_SDE_ST_GEOMETRY (ID, MYZONE) VALUES (2, SDE.ST_GEOMFROMTEXT('POINT (120 220)', 4326)); -- x,y,SRID
insert into TAB_SDE_ST_GEOMETRY (ID, MYZONE) VALUES (3, SDE.ST_Point (100, 200, 4326)); -- x,y,SRID
insert into TAB_SDE_ST_GEOMETRY (ID, MYZONE) VALUES (4, SDE.ST_GEOMETRY (120, 220, null, null, 4326)); -- x,y,z,MEASURE,SRID

-- 插入线
insert into TAB_SDE_ST_GEOMETRY (ID, MYZONE) VALUES (101, SDE.ST_GEOMETRY ('linestring (33 2, 34 3, 35 6)', 4326));

-- 插入面
insert into TAB_SDE_ST_GEOMETRY (ID, MYZONE) VALUES (202, SDE.ST_GEOMETRY ('polygon ((3 3, 4 6, 5 3, 3 3))', 4326));

-- 查询结果
select ID, MYZONE from TAB_SDE_ST_GEOMETRY ORDER BY ID; 
select ID, SDE.ST_AsText (MYZONE) MYZONE FROM TAB_SDE_ST_GEOMETRY ORDER BY ID; --将地理字段转换成文本字符(text)输出

两种方式查询的结果如下:
1    SDE.ST_GEOMETRY(1, 1, 100, 200, 100, 200, null, null, null, null, 0, 0, 4326)
2    SDE.ST_GEOMFROMTEXT(1, 1, 120, 220, 120, 220, null, null, null, null, 0, 0, 4326)
3    SDE.ST_POINT(1, 1, 100, 200, 100, 200, null, null, null, null, 0, 0, 4326)
4    SDE.ST_GEOMETRY(1, 1, 120, 220, 120, 220, 0, 0, -1, -1, 0, 0, 4326)
101    SDE.ST_GEOMETRY(4, 3, 33, 2, 35, 6, null, null, null, null, 0, 4.57649122254147, 4326)
202    SDE.ST_GEOMETRY(8, 4, 3, 3, 5, 6, null, null, null, null, 3, 8.32455532033676, 4326)

1    POINT  ( 100.00000000 200.00000000)
2    POINT  ( 120.00000000 220.00000000)
3    POINT  ( 100.00000000 200.00000000)
4    POINT  ( 120.00000000 220.00000000)
101    LINESTRING  ( 33.00000000 2.00000000, 34.00000000 3.00000000, 35.00000000 6.00000000)
202    POLYGON  (( 3.00000000 3.00000000, 5.00000000 3.00000000, 4.00000000 6.00000000, 3.00000000 3.00000000))

------------------------------------------------------------------------------------

1.ST_Geometry介绍

1.1.Oracle支持的空间数据存储类型
Oracle Spatial在MDSYS模式下定义了一系列几何类型、函数来支持空间数据的存储和使用,最熟悉的就是 SDO_GEOMETRY 这种类型。当然ArcSDE也可以使用这种类型进行存储。
Oracle Spatial并没有像ArcGIS那样有一套从桌面到数据库到服务器到开发包的全方位GIS产品体系,因此向Oracle中加载数据相比用ArcGIS要麻烦得多。Oracle本身则提供了一个工具shp2sdo来帮助你导入Shapefile到Oracle Spatial中。
Oracle Spatial虽然使用了 SDO_GEOMETRY 类型(MDSYS.SDO_GEOMETRY)作为几何对象的存储,不过它也提供了另外的一种类型 ST_GEOMETRY ( MDSYS.ST_GEOMETRY ),同时在此基础上还提供了一些符合OGCSimple Features Access规范的操作。

关于:"Oracle spatial与arcsde 的关系",本文就不详细介绍了,需要更细节的了解,可以网上搜索相关资料,有很多介绍。

测试:
select st_point(1,1) from dual;

-- Oracle SQL Developer执行的返回
MDSYS.ST_POINT(MDSYS.SDO_GEOMETRY(2001,NULL,MDSYS.SDO_POINT_TYPE(1,1,NULL),NULL,NULL))

-- navicate执行的返回
ST_POINT(SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(1, 1, NULL), NULL, NULL))


select mdsys.st_point(1,2,4326) geom from dual;

-- Oracle SQL Developer执行的返回
MDSYS.ST_POINT(MDSYS.SDO_GEOMETRY(2001,4326,MDSYS.SDO_POINT_TYPE(1,2,NULL),NULL,NULL))

-- navicate执行的返回
SQL> select mdsys.st_point(1,2,4326) geom from dual; 
GEOM(GEOM(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES)
--------------------------------------------------------------------------------
ST_POINT(SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(1, 2, NULL), NULL, NULL))


1.2.ArcSIG支持的空间数据存储类型
ArcSDE支持多种数据存储方式,不但支持ESRI自身的 ST_GEOMETRY ( SDE.ST_GEOMETRY ),也支持 BLOB 和 SDO_GEOMETRY ( MDSYS.SDO_GEOMETRY )类型。
ArcSDE中的ST_GEOMETRY ( SDE.ST_GEOMETRY )和Oracle Spatial中基于 SDO_GEOMETRY (MDSYS.SDO_GEOMETRY) 的 ST_GEOMETRY ( MDSYS.ST_GEOMETRY ) 完全是不相干的两个类型。

ESRI ST_Geometry是空间数据类型,可使用在包含地理数据库(Geodatabase)或不包含地理数据库的Oracle数据库上。空间数据类型是Oracle地理数据库的默认几何存储类型。
使用创建空间类型地理处理工具,也可以在Oracle数据库中安装使用ST_Geometry ( SDE.ST_Geometry )类型。

ArcSDE中的ST_GEOMETRY类型的定义包含如下属性:ENTITY, NUMPTS, MINX, MINY, MAXX, MAXY, MINZ, MAXZ, MINM, MAXM, AREA, LENSRID, POINTS。
属性名称    属性类型
ENTITY  NUMBER(38)
NUMPTS  NUMBER(38)
MINX  FLOAT(64)
MINY  FLOAT(64)
MAXX  FLOAT(64)
MAXY  FLOAT(64)
MINZ  FLOAT(64)
MAXZ  FLOAT(64)
MINM  FLOAT(64)
MAXM  FLOAT(64)
AREA  FLOAT(64)
LEN  FLOAT(64)
SRID NUMBER(38)
POINTS  BLOB

属性描述:
ENTITY: 存储在空间列中的几何要素类型(线串、多线串、多点、多面、点或面)。
NUMPTS: 定义几何的点数。对于多部分几何,还包括各个部分之间的分隔符,每个分隔符对应一个点。
MINX, MINY, MINZ, MAXX, MAXY, MAXZ, MINM, MAXM : 几何的空间包络矩形。
AREA: 几何的面积。
LEN: 几何的周长。
SRID: 空间参考系ID(包含几何的标识符),用于将几何链接到与之关联的ST_Spatial_References表中的空间参考(坐标系)记录。
POINTS: 包含定义几何的点坐标的字节流(坐标序列)

相关操作函数
对ST_Geometry进行操作的函数,输入为ST_Geometry类型数据,输出为Number型数据,函数列表如下:
ST_Area: 返回几何的面积
ST_Len: 返回几何的周长
ST_Entity: 返回几何类型
ST_NumPoints: 返回几何坐标点的个数
ST_MinM, ST_MinX, ST_MinY, ST_MinZ: 返回几何不同维度的最小坐标
ST_MaxM, ST_MaxX, ST_MaxY, ST_MaxZ: 返回几何不同维度的最大坐标
ST_SRID: 返回空间参考系ID
Get_release: 返回版本信息

构造方法
构造ST_Geometry对象
ST_LineString, ST_MultiLineString, ST_MultiPoint, ST_MultiPolygon, ST_Point, ST_Polygon
这些全部是ST_Geometry的子类。ST_Geometry和他的子类共享属性和方法。构造函数的定义是相同的,构造函数的名字就是类型名。


-- 查询数据
select ID, sde.st_astext (MYZONE) MYZONE FROM TAB_SDE_ST_GEOMETRY;

-- 查询坐标系
select table_name, srid FROM sde.st_geometry_columns WHERE table_name = 'GRID'; 

-- 查询注册ID
select registration_id FROM sde.table_registry WHERE table_name = 'GRID' AND owner = 'SDE'; 

-- 查询Geometry字段的数据类型
select SDE.ST_GeometryType(t.MYZONE) from TAB_SDE_ST_GEOMETRY t;


2.Oracle数据库中安装ST_Geometry类型

ArcSIG工具对数据库的要求参考:
Oracle database requirements for ArcGIS 10.2.x:
http://resources.arcgis.com/en/help/system-requirements/10.2/#/Oracle_Database_Requirements/01510000006s000000/


注意:Oracle XA事务不支持ST_Geometry类型。
要在Oracle DBMS中创建地理数据库并使用ST_Geometry类型和域索引,必须授予地理数据库管理员用户(sde)正确的系统权限来实例化类型、运算符及存储过程。
Oracle中地理数据库的权限:相关详情请参考:http://desktop.arcgis.com/zh-cn/arcmap/10.3/manage-data/gdbs-in-oracle/privileges-oracle.htm

要在Oracle数据库中安装ST_Geometry类型,还必须存在sde用户,并且必须授予其特定权限来实例化类型、运算符及存储过程。
可以使用创建空间类型地理处理工具或Python脚本将Esri ST_Geometry类型、子类型和函数添加到Oracle数据库。
执行此操作时,会将名为sde的用户添加到数据库。sde用户拥有ST_Geometry类型、子类型、函数和表。

添加成功以后,可以执行命令查询SDE用户:
conn /as sysdba
select username from all_users where username='SDE';


相关参考链接:
Oracle数据库添加ST_Geometry类型,相关详情参考:
http://desktop.arcgis.com/zh-cn/arcmap/10.3/manage-data/databases/add-the-st-geometry-type-to-an-oracle-database.htm

使用Python脚本在Oracle中创建ST_Geometry类型,相关详情参考:
http://desktop.arcgis.com/zh-cn/arcmap/10.3/manage-data/databases/script-stgeometry-creation-oracle.htm

在 Oracle 中创建地理数据库,相关参考:
http://desktop.arcgis.com/zh-cn/arcmap/10.3/manage-data/gdbs-in-oracle/setup-geodatabase-oracle.htm


ArcGIS提供了Windows使用图形化的安装工具和python脚本安装工具两种方式。
python脚本安装方式,我尝试没有成功(脚本使然执行成功,但Oracle服务器上并没有创建SDE用户,最终放弃脚本方式)。

最初我只是尝试Oracle数据库中安装ST_Geometry类型,并没有想直接 在 Oracle 中创建地理数据库。

Windows图形化在Oracle中安装ST_Geometry类型的方法:下载创建工具ArcGIS10.2_DesktopCN,Windows解析安装后,利用工具连接Oracle进行创建。

配置操作具体流程:
1)Windows客户端机器上先安装ArcGIS工具,作为ArcGIS 客户端。安装后会释放相关的目录和文件。
  
2)从ArcGIS客户端安装位置的 DatabaseSupport 目录复制 libst_shapelib 库(对于 Windows的Oracle则为 st_shapelib),并将其移动到 Oracle 服务器的某一位置上。   
   注意:确保使用适合 Oracle 服务器操作系统的库。运行创建空间类型工具或脚本的客户端计算机必须能够访问服务器上放置库的目录。如果将库放置到目标Oracle服务器上,请确保数据库管理员对该文件夹具有读访问权限,并对库文件具有执行权限。
     
   我Windows安装ArcGIS后的获取lib路径:d:\Program Files (x86)\ArcGIS\Desktop10.2\DatabaseSupport\Oracle\Linux64\libst_shapelib.so
   我直接放置到$ORACLE_HOME目录下:/opt/oracle/product/11.2.0/dbhome_1/
     
3)表空间我这里就不单独创建了,如果要想独立表空间,可以使用ArcSIG配置参数的时候指定表空间名称,不指定则默认表空间

4)在ArcGIS客户端机器上安装Oracle Database Client。
   ArcSIG连接Oracle数据库,需要依赖/使用Oracle Database Client。
   由于Oracle Database Client安装包比较大,而实际ArcSIG只是使用Oracle Database Client安装后释放的对应Oracle版本连接实例的配置目录。
   所以,我直接网上下载了一个instant client压缩包:instantclient-basic-nt-11.2.0.4.0.zip,然后本地解压。
   
   创建文件tnsnames.ora:instantclient目录下手动创建目录和文件: network\admin\tnsnames.ora 。
   注意:ArcSIG本地创建的文件路径要和Oracle服务器的ORACLE_HOME目录下的tnsnames.ora路径保持一致,.ora文件可以直接从服务器拷贝过来。
   
   然后设置环境变量:添加系统变量 ORACLE_HOME ,然后再设置Path,添加变量 %ORACLE_HOME%。
   
   注意:
   a)下载instant client必须根据你的Oracle服务器版本来下载对应的适配版本。
   b)由于ArcGIS客户端安装包是32位的(好像只提供了32位的),所以必须要求instant_client也下载32位的。
     不管客户端PC是32位系统还是64位系统,都要求ArcGIS客户端软件和instant_client保持一致。
     我的Oracle是64位的,ArcSIG客户端是32位的,instance_client也是32位的。
   c)一般解压的目录下没有network\admin\tnsnames.ora,需要手动创建。tnsnames.ora保证SERVICE_NAME和IP端口正确。

5)启动 ArcCatalog 或 ArcMap,然后打开目录窗口(我打开的ArcCatalog),创建访问Oracle数据库的连接。
   注意:必须以 Oracle 系统数据库管理员身份登录,我用的是sys用户。
   
   使用工具中的:数据库连接->添加数据库连接。
   参数根据实际情况填写参数(配置参数和python脚本方式执行时填的参数相同):
   数据库平台:Oracle
   实例:ORCL
   身份验证类型:数据库身份验证
   用户名:sys(必须用Oracle系统数据库管理员连接)
   密码:1q2w3e
   保存用户和密码:true
   
   确定后会成功创建一个.sde的数据库连接在ArcSIG客户端机器上,包含了连接数据库的信息。
   文件的默认位置是 \\<computer_name>\Users\<user_name>\AppData\Roaming\ESRI\Desktop<release#>\ArcCatalog,但您可以将连接移动到另一位置。只需确保需要建立连接的用户和应用程序有权读取放置连接文件的目录。
   
   如果确定后如果提示数据库连接失败,因为数据库客户端软件无法加载,确保已正确安装并配置数据库客户端软件。可点击创建窗口坐下位置的“关于数据库连接”查看详情。
   最初我没有安装Oracle Database client(instantclient),平时我本地使用的是绿色版的Oracle SQL Developer连接管理的。
   看来我之前使用python脚本安装没能成功,可能也是因为这个原因,脚本执行却没有报错。
   
6)工作空间-创建工作类型(工具箱->系统工具箱->Data Management Tools.tbx->工作空间

   输入数据库连接:点打开按钮,选择之前创建的数据库连接,添加进来完成文本框的参数填充。
       我填充的:数据库连接\192.168.1.140_ORCL_SYS.sde
   SDE密码:设置创建的SDE用户的密码。
   表空间名称:填写SDE用户的表空间名称。该参数非必填,如果不填,会使用默认的。将在 Oracle 的默认存储位置中创建大小为 400 MB 的表空间。如果想要控制表空间的放置位置或表空间的大小,需要提前创建。该工具会将预先存在的表空间设置为 sde 用户的默认表空间。
       我填写之前创建的表空间名称:user_sde_data
   ST_Geometry 形状库路径:该参数可选。浏览至您放置 libst_shapelib 或 st_shapelib 文件的 Oracle 服务器目录,或手动输入一个路径,路径包含文件名。
       我这里填:/opt/oracle/product/11.2.0/dbhome_1/libst_shapelib.so
       
   确定后,首次创建失败,提示用户权限不足,必须使用数据库管理员权限的用户来创建。数据源连接命名配置的就是SYS用户,怎么会没有权限?
   重新再来一次。
   这次虽然过了SDE用户创建,但仍然失败:
     设置 st_geometry 类型失败。Unable to load Type st_geometry, underlying DBMS error encountered.
     要获取其他错误信息,参见以下位置的设置日志:xxxx
     无法设置 Esri 空间类型。执行(CreateSpatialType)失败。

   打开日志,查看详情,错误原因为:
   [Fri Nov 01 17:36:21 2019] ERROR setting up st_geometry type.
   [Fri Nov 01 17:36:21 2019] Unable to load Type st_geometry, underlying DBMS error encountered
   [Fri Nov 01 17:36:21 2019] DBMS error code: 4043
   ORA-04043: object ST_GEOMETRY_SHAPELIB_PKG does not exist
   [Fri Nov 01 17:36:21 2019] ERROR setting up St_Geometry, Error = -521

   
   也不管,重新再创建了一遍。结果详细错误变成了:
   [Fri Nov 01 17:43:07 2019] ERROR setting up st_geometry type.
   [Fri Nov 01 17:43:07 2019] Failed to create the ST_Geometry metadata tables during install.
   [Fri Nov 01 17:43:07 2019] DBMS error code: 955
   ORA-00955: name is already used by an existing object
   [Fri Nov 01 17:43:07 2019] ERROR setting up St_Geometry, Error = -521

   
   不行再来一次,先删除SDE用户和用户下的视图:drop user sde cascade;
   然后再重新创建
   
   [Fri Nov 01 17:47:35 2019] ERROR setting up st_geometry type.
   [Fri Nov 01 17:47:35 2019] Failed to create the ST_Geometry metadata tables during install.
   [Fri Nov 01 17:47:35 2019] DBMS error code: 955
   ORA-00955: name is already used by an existing object
   [Fri Nov 01 17:47:35 2019] ERROR setting up St_Geometry, Error = -521
   
   网上搜索,可能是因为已经有表使用了 ST_GEOMETRY 导致 ST_GEOMETRY 创建失败。drop & purge这些表。
   Cause
   In Oracle, if a table exists that has a column type of PUBLIC.ST_GEOMETRY, the creation of the Esri SDE.ST_GEOMETRY type fails.
   
   Solution or Workaround
   Find the tables that reference a PUBLIC.ST_GEOMETRY column and drop them.
   1. Find the tables that reference a PUBLIC.ST_GEOMETRY column,执行:
     sqlplus sys/manager as sysdba
     set pages 9999
     SELECT OWNER, NAME, TYPE FROM DBA_DEPENDENCIES WHERE REFERENCED_OWNER='MDSYS' AND REFERENCED_NAME  = 'ST_GEOMETRY' AND REFERENCED_TYPE  = 'TYPE' AND TYPE='TABLE';
     
   2. Drop the table found in Step 1
   If the table is needed for any reason, backup the table before dropping it. This table can be restored after Esri ST_Geometry is installed.
   
   drop table USER.TABLE;
   
   3. purge dba_recyclebin:
   purge dba_recyclebin;
   
   再次查询确认没有之后,再重新创建空间类型。
   
   
   好几次都是提示创建用户失败(-51),没有输出错误日志到sde_setup.log,直接窗口中显示错误信息:
   ......
   db_execute_sql OCI Execute Error (922)
   ORA-00922: missing or invalid option
   ]
   执行(CreateEnterpriseGeodatabase)失败。

   
   但我在 C:\Users\Administator\AppData\Local\Temp\sdedc_Oracle.log 这个文件中找到了错误信息
   [Fri Nov 01 18:29:44 2019] [28282202] [Administrator] db_execute_sql OCI Execute Error (922).
   
   尝试多次失败后。放弃工作空间->空间类型的创建。改为在:
   Data Management Tool.tbx -> 地理数据库管理 -> 创建企业地理数据库,看看能否成功。
   企业地理数据库其他的配置都和之前空间类型的创建配置差不多,多一个授权文件参数需要指定(网上下载:arcgisproduct.ecp)
   
   官方提供的企业级地理数据库创建步骤如下:   
   运行创建企业级地理数据库工具
        如果您有权访问 ArcGIS for Desktop,则可运行地理处理工具来创建地理数据库。
        1)启动 ArcMap 或 ArcCatalog。
        2)打开创建企业级地理数据库工具。
           您可以搜索或浏览到此工具,它位于“数据管理”工具箱的“地理数据库管理”工具集中。
        3)从数据库平台下拉列表中选择 Oracle。
        4)提供连接到 Oracle 实例所需的信息。
           如果已经将 Oracle 客户端配置为使用 TNS 网络别名,则请在实例文本框中输入 Net 服务别名。
           如果尚未配置 Oracle 客户端的网络别名,并且 Oracle 数据库和客户端均配置为使用 Easy Connect 字符串,则在实例文本框中提供 Oracle Easy Connect 字符串。
           有关可能使用的 Easy Connect 字符串的列表,请参阅从 ArcGIS 连接到 Oracle。
           必须以数据库管理员身份连接到数据库才能创建地理数据库管理员和表空间。因此,数据库管理员文本框中应填充 sys 用户名。
        5)在数据库管理员密码文本框中输入 sys 用户的密码。
        6)在地理数据库管理员文本框中输入 sde。
           如果数据库中不存在 sde 用户,则该工具会创建此用户并授予其创建地理数据库所需的权限。如果用户已存在,则会向其授予所需的权限。
        7)在地理数据库管理员密码文本框中输入 sde 用户的密码。
           如果数据库中已存在 sde 用户,请确保为现有用户输入正确的密码;此工具不会更改密码。如果创建的是 sde 用户,则输入的密码会在创建 sde 用户时使用。
        8)为 sde 用户指定表空间。
           如果拥有可用于地理数据库资料档案库的预配置表空间,则可在表空间名称文本框中输入其名称。
           如果想要此工具为您创建表空间,可在表空间名称文本框中输入有效的名称,该工具会在 Oracle 默认位置创建一个 400 MB 的表空间。如果不输入表空间名称,则会创建 SDE_TBS 表空间,并将其设置为 sde 用户的默认表空间。
        9)要指定授权文件,请浏览到在授权 ArcGIS for Server Enterprise 时创建的密钥代码文件,并选择该文件。
           此文件将写入 Windows 服务器的 \\Program Files\ESRI\License<release#>\sysgen 文件夹中。
           如果尚未执行此操作,则立即授权 ArcGIS for Server 创建此文件。
        10)单击确定以运行工具。
        确定运行工具以后,将在 Oracle 数据库中创建地理数据库。
        有关地理数据库创建过程的日志文件 (GDBCreateGeodatabase<#>.log) 会写入为运行工具的计算机上的 %TEMP% 变量指定的目录中。如果在运行工具时出现任何问题,可查看此日志文件以解决这些问题。
        接下来,您可创建能够将数据加载到地理数据库中的用户。

   
   企业级地理数据库创建结果还是存在同样失败的问题。
   
   最后网上搜索,找到了一些线索:
   排查是否存在下列情况:
   第一,你所要创建的Database是否已经存在,如果已存在,无法post第二次。
   第二,如果是在已有一个名为sde的database的情况下,创建第二个database的话,那么检查一下第二次使用的地理数据库管理员是否跟第一次的不同。

   
   受到这两点的启发,我联想到之前多次创建的时候用的sde的密码为123456,sde用户是能创建成功的,只是后面步骤失败。
   最近几次失败都无法创建sde用户,难道是因为创建界面指定的sde密码换了一个(1q2w3e)导致的该问题?
   马上在Oracle服务器上查询,确认sde用户不存在,理论上跟我换个密码创建应该无关。
   但实在找不到其他的原因了,创建配置参数sde的密码尝试改回123456试了一下,居然顺利的创建完成了。具体原因没找到。     总之注意:创建过程中,如果遇到类似的问题,请确认是否在多次重复创建过程中使用了不同的sde用户的密码设置,如果是,请尝试用不更换密码设置,用最初设置的密码再尝试安装。

======================================

4)测试
select sde.st_point(1,2,4326) geom from dual; -- 这个测试成功就说明安装成功。 ==我执行失败了

启发辅助语句:
select username from all_users where username='SDE'; --sde用户是否存在。==我执行成功了
desc SDE.ST_GEOMETRY; -- 查看ST_GEOMETRY结构。==我执行失败了
select owner,object_name,object_type,status from all_objects where object_name in ('ST_GEOMFROMTEXT','ST_POINT') and owner='SDE'; -- 检查用户SDE的类型(ST_GEOMFROMTEXT or ST_POINT)是否存在 ==我执行成功了

执行失败的错误信息如下:

ORA-28595: Extproc 代理: DLL 路径无效
ORA-06512: 在 "SDE.ST_GEOMETRY_SHAPELIB_PKG", line 12
ORA-06512: 在 "SDE.ST_POINT", line 181
28595. 00000 -  "Extproc agent : Invalid DLL Path"
*Cause:    The path of DLL supplied for the extproc execution is invalid.
*Action:   Check if the DLL path is set properly using the EXTPROC_DLLS
           environment variable.

即语法没有错误,只是不能调用DLL路径,在 Oracle 中,ST_Geometry 和 ST_Raster 的 SQL 函数使用通过 Oracle 的外部过程代理(即 extproc)访问的共享库。
Oracle 必须能够访问这些库。因此,这些库必须存在于 Oracle 服务器上,并且必须通过 Oracle 的外部过程框架调用它们。

按照官网的解决方法参考:配置 Oracle extproc 以使用 SQL 访问地理数据库:http://desktop.arcgis.com/zh-cn/arcmap/10.3/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm

5)配置Oracle extproc以使用SQL访问地理数据库

在Oracle或Oracle数据库的地理数据库中使用Esri ST_Geometry空间类型,可通过SQL函数访问空间数据,这些函数实现了“ISO SQL/MM 空间标准”及OGC的“简单要素规范”。
您便可以使用SQL命令像处理任何其他类型的数据那样存储、检索及操作空间要素。
通过SQL命令及存储过程可使用一长串标准化的函数来检索和分析空间数据。
通过SQL访问数据,用户便可以使用其他应用程序来访问在Oracle中创建的数据。

要通过SQL访问空间要素,必须将ST_Geometry库安装在与Oracle实例相同的服务器上,确保Oracle服务器的操作系统受到ST_Geometry库的支持。
您还必须配置Oracle extproc以使用SQL访问地理数据库来让Oracle支持以使用SQL方式来访问包含ST_Geometry空间类型的表。
配置Oracle extproc以使用SQL访问地理数据库:相关详情请参考:http://desktop.arcgis.com/zh-cn/arcmap/10.3/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm

在Oracle中,ST_Geometry和ST_Raster的SQL函数使用通过Oracle的外部过程代理(即extproc)访问的共享库。
要将SQL和ST_Geometry或ST_Raster配合使用或访 GDB_ITEMS_VW和GDB_ITEMRELATIONSHIPS_VW 视图中的 ArcSDE XML 列,Oracle 必须能够访问这些库。
因此,这些库必须存在于Oracle服务器上,并且必须通过 Oracle 的外部过程框架调用它们。

在ArcGIS中,不设置Oracle extproc也可以使用ST_Geometry和ST_Raster。
但是,您将不会拥有ArcGIS客户端的全部功能,也不会拥有 SQL 客户端的任何功能(如 SQL*Plus)。例如,如果未配置extproc,则:
无法对ArcMap的查询图层中的ST_Geometry列使用SQL函数;
无法识别数据库视图中的要素;
无法对包含ST_Raster列的表进行版本化;
无法删除包括ST_Raster列的行;
无法发布包含ST_Geometry数据的要素服务;
也无法从SQL客户端执行SQL函数。

如果您使用的是 Oracle 11g 或 12c,请编辑 extproc.ora 文件以通过 Oracle 的外部过程框架来调用函数。如果您使用的是 Oracle 10g,请配置 Oracle 监听器。
按照官网的方法,Oracle 11g只需要修改/$ORACLE_HOME/hs/admin/extproc.ora,而不是配置监听器来配置 extproc。

注意:如果不是自己添加的ST_Geometry,不清楚libst_shapelib.so文件的路径,可以通过find在$ORACLE_HOME目录下小范围查找:
find $ORACLE_HOME -name (如果找不到就在/目录下找:find / -name libst_shapelib.so)

a) 修改Oracle服务器 $ORACLE_HOME/hs/admin/exproc.ora,将其修改指向ST_Geometry (st_shapelib) 和/或 ST_Raster 库的正确位置
cd $ORACLE_HOME
vim hs/admin/extproc.ora

#SET EXTPROC_DLLS=
SET EXTPROC_DLLS=ONLY:/opt/oracle/product/11.2.0/dbhome_1/libst_shapelib.so

如果您正在使用ST_Geometry和ST_Raster两个库,可将二者的条目放在同一行上:
SET EXTPROC_DLLS=ONLY:/user/esrilibs/libst_shapelib.so:/user/esrilibs/libst_raster_ora.so

b)检查ST_SHAPELIB library,如果有误修改正确
conn sde
select * from user_libraries;
查询出来的结果发现ArcSIG默认给Oracle服务器设置成Windows本地的dll的路径了:d:\progra~2\arcgis\desktop10.2\DatabaseSupport\Oracle\Windows64\st_shapelib.dll

create or replace library ST_SHAPELIB AS '/opt/oracle/product/11.2.0/dbhome_1/libst_shapelib.so'; 
alter package sde.st_geometry_shapelib_pkg compile reuse settings;  -- 使修改生效

网上有些介绍是改为“SET EXTPROC_DLLS=ANY”,我这里没有尝试。
最后修改完成以后,重启数据库和监听服务、所有连接的客户端也需要重新连接数据库。


最后再测试一下:

select sde.st_point(1,2,4326) geom from dual; 
select sde.st_astext(sde.st_geometry('point (10 10)', 0)) from dual; 

两条语句都执行成功!!
 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值