浅析ArcGIS的FeatureClass(oracle)

0
分享 2018-10-31
很多人都想知道ArcGIS的FeatureClass内部都包含什么东西,比如在数据库后面是怎么存储的。
FeatureClass是ArcGIS产品在关系型数据库上虚拟出来的一个存储矢量图像的对象,主要是为了开发的方便,其在后台数据库中对应了一系列的对象,是表,视图,索引,类型等一些对象的组合,使用ArcGIS的现有前端产品直接操作FeatureClass即可,ArcGIS来操作后面所对应的数据库对象。
那创建FeatureClass数据库后台都做了哪些事情。以oracle为例,我们可以通过跟踪一下oracle后台所执行的sql后就会一路了然了。
具体跟踪方法可以参考https://blog.csdn.net/liufeng1 ... 72515
以下是ArcGIS 10.6上抓出来的信息(只摘录了前端应用提交的SQL)
SELECT table_name, time_last_modified FROM   SDE.sde_tables_modified
SELECT ObjectID, UUID, Type, Name, PhysicalName, Path, DatasetSubtype1, DatasetSubtype2, DatasetInfo1, DatasetInfo2, URL, Definition, Properties, 1 SHAPE, SDE.sde_xml_doc1.ROWID, SDE.sde_xml_doc1.XML_DOC, GDB_ITEMS.SHAPE.points,GDB_ITEMS.SHAPE.numpts,GDB_ITEMS.SHAPE.entity,GDB_ITEMS.SHAPE.minx,GDB_ITEMS.SHAPE.miny,GDB_ITEMS.SHAPE.maxx,GDB_ITEMS.SHAPE.maxy,GDB_ITEMS.rowid as rowid$ FROM SDE.GDB_ITEMS GDB_ITEMS, SDE.sde_xml_doc1 WHERE (Type IN ('{C29DA988-8C3E-45F7-8B5C-18E51EE7BEB4}')) AND SDE.sde_xml_doc1.SDE_XML_ID(+) = SDE.GDB_Items.DEFINITION
SELECT ObjectID, UUID, Type, Name, PhysicalName, Path, DatasetSubtype1, DatasetSubtype2, DatasetInfo1, DatasetInfo2, URL, Definition, Properties, 1 SHAPE, SDE.sde_xml_doc1.ROWID, SDE.sde_xml_doc1.XML_DOC, GDB_ITEMS.SHAPE.points,GDB_ITEMS.SHAPE.numpts,GDB_ITEMS.SHAPE.entity,GDB_ITEMS.SHAPE.minx,GDB_ITEMS.SHAPE.miny,GDB_ITEMS.SHAPE.maxx,GDB_ITEMS.SHAPE.maxy,GDB_ITEMS.rowid as rowid$ FROM SDE.GDB_ITEMS GDB_ITEMS, SDE.sde_xml_doc1 WHERE (Type IN ('{8C368B12-A12E-4C7E-9638-C9C64E69E98F}')) AND SDE.sde_xml_doc1.SDE_XML_ID(+) = SDE.GDB_Items.DEFINITION
SELECT ObjectID, UUID, Type FROM SDE.GDB_ITEMS WHERE (PhysicalName = N'SDE.TEST3' AND Type IN ('{D4912162-3413-476E-9DA4-2AEFBBC16939}','{CD06BC3B-789D-4C51-AAFA-A467912B8965}','{70737809-852C-4A03-9E22-2CECEA5B9BFA}','{5ED667A3-9CA9-44A2-8029-D95BF23704B9}','{35B601F7-45CE-4AFF-ADB7-7702D3839B12}'))
SELECT /* ESRI GDM_6 */ registration_id,table_name,owner, rowid_column,description,object_flags, registration_date,config_keyword, minimum_id,imv_view_name FROM SDE.table_registry WHERE owner = :owner AND table_name = :table_name
SELECT * FROM test3
SELECT ObjectID, UUID, Type FROM SDE.GDB_ITEMS WHERE (PhysicalName = N'SDE.TEST3' AND Type IN ('{D4912162-3413-476E-9DA4-2AEFBBC16939}','{CD06BC3B-789D-4C51-AAFA-A467912B8965}','{70737809-852C-4A03-9E22-2CECEA5B9BFA}','{5ED667A3-9CA9-44A2-8029-D95BF23704B9}','{35B601F7-45CE-4AFF-ADB7-7702D3839B12}'))

SELECT keyword, parameter_name, UPPER(config_string) FROM SDE.dbtune where keyword = :upper_lyr_keyword
CREATE TABLE SDE.test3

SELECT SDE.TABLE_ID_GENERATOR.NEXTVAL FROM dual
SELECT view_name FROM all_views WHERE owner = :owner AND view_name = :view_table
SELECT COUNT(*) FROM SDE.instances
SELECT SYSDATE FROM DUAL
ECLARE registration SDE.registry_util.registration_record_t; BEGIN /* ArcSDE plsql */ registration.registration_id := :registration_id; registration.table_name := :table_name; registration.owner := :owner; registration.rowid_column := :rowid_column; registration.description := :description; registration.object_flags := :object_flags; registration.registration_date := :registration_date; registration.config_keyword := :config_keyword; registration.minimum_id := :minimum_id; registration.imv_view_name := :imv_view_name; SDE.registry_util.insert_registration (registration); :sql_code := SDE.sde_util.SE_SUCCESS; EXCEPTION WHEN OTHERS THEN :sql_code := SQLCODE; :error_string := SQLERRM; END;
DECLARE PRAGMA AUTONOMOUS_TRANSACTION; CURSOR check_tlm_cursor (check_schema_name IN NVARCHAR2) IS SELECT time_last_modified FROM SDE.instances WHERE instance_name = check_schema_name FOR UPDATE; passed_time_last_modified DATE := :time_last_modified; found_time_last_modified DATE; new_time_last_modified DATE; passed_schema_name NVARCHAR2(30) := :schema_name; a_second NUMBER := 1/(24 * 60 * 60); BEGIN /* ArcSDE plsql */ OPEN check_tlm_cursor (passed_schema_name); FETCH check_tlm_cursor INTO found_time_last_modified; CLOSE check_tlm_cursor;IF passed_time_last_modified > found_time_last_modified THEN new_time_last_modified := passed_time_last_modified; ELSE new_time_last_modified := found_time_last_modified + a_second; END IF; UPDATE SDE.instances SET time_last_modified = new_time_last_modified WHERE instance_name = passed_schema_name; COMMIT; :sql_code := SDE.sde_util.SE_SUCCESS; EXCEPTION WHEN OTHERS THEN :sql_code := SQLCODE; :error_string := SQLERRM; ROLLBACK; END;
DECLARE tlm SDE.sde_util.tlm_record_t;BEGIN /* ArcSDE plsql */ tlm.table_name := :table_name; tlm.time_last_modified := :time_last_modified; SDE.sde_util.set_table_last_modified(tlm); :sql_code := SDE.sde_util.SE_SUCCESS; EXCEPTION WHEN OTHERS THEN :sql_code := SQLCODE; :error_string := SQLERRM; END;

SELECT count(*) FROM ALL_CATALOG WHERE owner = :owner AND table_name = :table_name

DECLARE reg_column SDE.registry_util.registered_column_record_t; BEGIN /* ArcSDE plsql */ reg_column.table_name := :table_name; reg_column.owner := :owner; reg_column.column_name := :column_name; reg_column.sde_type := :sde_type; reg_column.column_size := :column_size; reg_column.decimal_digits := :decimal_digits; reg_column.description := :description; reg_column.object_flags := :object_flags; reg_column.object_id := :object_id; SDE.registry_util.insert_registered_column (reg_column); :sql_code := SDE.sde_util.SE_SUCCESS; EXCEPTION WHEN OTHERS THEN :sql_code := SQLCODE; :error_string := SQLERRM; END;
END OF STMT

SELECT t.OBJECTID FROM TEST3 t

CREATE UNIQUE INDEX R52_sde_rowid_uk on TEST3 (OBJECTID) PCTFREE 0 INITRANS 4 NOLOGGING

SELECT MIN(OBJECTID) FROM TEST3

DECLARE registration SDE.registry_util.registration_record_t; BEGIN /* ArcSDE plsql */ registration.registration_id := :registration_id; registration.rowid_column := :rowid_column; registration.description := :description; registration.object_flags := :object_flags; registration.config_keyword := :config_keyword; registration.minimum_id := :minimum_id; registration.imv_view_name := :imv_view_name; SDE.registry_util.update_registration (registration); :sql_code := SDE.sde_util.SE_SUCCESS; EXCEPTION WHEN OTHERS THEN :sql_code := SQLCODE; :error_string := SQLERRM; END;

SELECT SDE.R52.CURRVAL FROM dual

SELECT MAX(OBJECTID) FROM SDE.TEST3

CREATE SEQUENCE SDE.R52 INCREMENT BY 16 START WITH 1 NOCYCLE

GRANT SELECT ON SDE.R52 T

DECLARE pipe_result INTEGER; temporary INTEGER; BEGIN /* ArcSDE plsql */ pipe_result := DBMS_PIPE.RECEIVE_MESSAGE (:pipe_name,0); :pipe_result := pipe_result;IF pipe_result = 0 THEN DBMS_PIPE.UNPACK_MESSAGE (temporary); :id_start := temporary; DBMS_PIPE.UNPACK_MESSAGE (temporary); :id_count := temporary; END IF;:sql_code := SDE.sde_util.SE_SUCCESS; EXCEPTION WHEN OTHERS THEN DBMS_PIPE.RESET_BUFFER; :sql_code := SQLCODE; :error_string := SQLERRM; END;

SELECT /* ESRI GDM_7 */ registration_id,table_name,owner, rowid_column,description,object_flags, registration_date,config_keyword, minimum_id,imv_view_name FROM SDE.table_registry WHERE registration_id = :id
SELECT SDE.R52.CURRVAL FROM dual

SELECT last_number FROM all_sequences WHERE sequence_owner = :owner AND sequence_name = :sequence
SELECT /* ESRI GDM_8 */ column_name,sde_type,column_size,decimal_digits,object_flags,object_id,description FROM SDE.column_registry WHERE owner = :owner AND table_name = :table_name

DECLARE reg_column SDE.registry_util.registered_column_record_t; BEGIN /* ArcSDE plsql */ reg_column.table_name := :table_name; reg_column.owner := :owner; reg_column.column_name := :column_name; reg_column.sde_type := :sde_type; reg_column.column_size := :column_size; reg_column.decimal_digits := :decimal_digits; reg_column.description := :description; reg_column.object_flags := :object_flags; reg_column.object_id := :object_id; SDE.registry_util.update_registered_column (reg_column); :sql_code := SDE.sde_util.SE_SUCCESS; EXCEPTION WHEN OTHERS THEN :sql_code := SQLCODE; :error_string := SQLERRM; END;

SELECT keyword, parameter_name, config_string FROM SDE.dbtune WHERE keyword = :keyword AND parameter_name = :parameter_name

SELECT t.SHAPE FROM SDE.TEST3 t

select a.grid.grid1, a.grid.grid2, a.grid.grid3, a.srid from SDE.st_geometry_index a where owner = 'SDE' and table_name = 'TEST3'

SELECT SDE.LAYER_ID_GENERATOR.NEXTVAL FROM dual

select srid, properties from SDE.ST_GEOMETRY_COLUMNS where owner = upper(:owner_name) and table_name = upper(:table_name) and column_name = upper(:spatial_column)

SELECT srid FROM SDE.ST_SPATIAL_REFERENCES WHERE x_offset = :falsex AND y_offset = :falsey AND xyunits = :xyunits AND definition = :srtext AND cs_id = :csid AND srid >= :min_id AND srid <= :max_id

select srid from SDE.spatial_references where falsex = :falsex and falsey = :falsey and xyunits = :xyunits and falsez = :falsez and zunits = :zunits and falsem = :falsem and munits = :munits and object_flags = :object_flags and auth_srid = :auth_srid and auth_name = :auth_name and NVL(xycluster_tol,0.0) = :xycluster_tol and NVL(zcluster_tol,0.0) = :zcluster_tol and NVL(mcluster_tol,0.0) = :mcluster_tol

BEGIN /* ArcSDE plsql */ SDE.layers_util.lock_spatial_ref; :sql_code := SDE.sde_util.SE_SUCCESS; EXCEPTION WHEN OTHERS THEN :sql_code := SQLCODE; :error_string := SQLERRM; END;
DECLARE spatial SDE.layers_util.spatial_record_t; BEGIN /* ArcSDE plsql */ spatial.srid := :srid; spatial.falsex := :falsex; spatial.falsey := :falsey; spatial.xyunits := :xyunits; spatial.falsez := :falsez; spatial.zunits := :zunits; spatial.falsem := :falsem; spatial.munits := :munits; spatial.xycluster_tol := :xycluster_tol; spatial.zcluster_tol := :zcluster_tol; spatial.mcluster_tol := :mcluster_tol; spatial.srtext := :srtext; spatial.object_flags := :object_flags; spatial.auth_name := :auth_name; spatial.auth_srid := :auth_srid; SDE.layers_util.insert_spatial_ref (spatial);:sql_code := SDE.sde_util.SE_SUCCESS; EXCEPTION WHEN OTHERS THEN :sql_code := SQLCODE; :error_string := SQLERRM; END;
DECLARE layer SDE.layers_util.layer_record_t; gcol SDE.layers_util.geocol_record_t;BEGIN /* ArcSDE plsql */ layer.layer_id := :layer_id; layer.description := :description; layer.database_name := :database_name; layer.table_name := :table_name; layer.owner := :owner; layer.spatial_column := :spatial_column; layer.eflags := :eflags; layer.layer_mask := :layer_mask; layer.gsize1 := :gsize1; layer.gsize2 := :gsize2; layer.gsize3 := :gsize3; layer.minx := :minx; layer.miny := :miny; layer.maxx := :maxx; layer.maxy := :maxy; layer.cdate := :cdate; layer.layer_config := :layer_config; layer.optimal_array_size := :optimal_array_size; layer.stats_date := :stats_date; layer.minimum_id := :minimum_id; layer.srid := :srid; layer.base_layer_id := :base_layer_id; layer.minz := :minz; layer.minm := :minm; layer.maxz := :maxz; layer.maxm := :maxm; layer.secondary_srid := :secondary_srid; gcol.f_table_catalog := :f_table_catalog;gcol.f_table_schema := :f_table_schema;gcol.f_table_name := :f_table_name;gcol.f_geometry_column := :f_geometry_column;gcol.g_table_catalog := :g_table_catalog;gcol.g_table_schema := :g_table_schema;gcol.g_table_name := :gcol_table_name;gcol.storage_type := :storage_type;gcol.geometry_type := :geometry_type;gcol.coord_dimension := :coord_dimension;gcol.max_ppr := :max_ppr;gcol.srid := :gcol_srid;SDE.layers_util.insert_layer (layer,gcol,:g_table_name); :sql_code := SDE.sde_util.SE_SUCCESS; EXCEPTION WHEN OTHERS THEN :sql_code := SQLCODE; :error_string := SQLERRM; END;

SELECT layer_id, ly.description, gsize1, gsize2, gsize3, minx, miny, maxx, maxy, minz, minm, maxz, maxm, eflags, layer_mask, ly.database_name, ly.table_name, ly.owner, spatial_column, cdate, layer_config, optimal_array_size, stats_date, ly.minimum_id, base_layer_id, sr.falsex, sr.falsey, sr.xyunits, sr.falsez,sr.zunits, sr.falsem, sr.munits, sr.srtext, ly.srid,sr.object_flags,sr.xycluster_tol, sr.zcluster_tol, sr.mcluster_tol,sr2.falsex, sr2.falsey, sr2.xyunits, sr2.falsez,sr2.zunits, sr2.falsem, sr2.munits, ly.secondary_srid,sr2.object_flags FROM SDE.LAYERS ly LEFT OUTER JOIN SDE.spatial_references sr2 ON ly.secondary_srid = sr2.srid, SDE.spatial_references sr WHERE ly.layer_id = :layer_id AND ly.srid = sr.srid

GRANT SELECT ON SDE.TEST3

DECLARE registration SDE.registry_util.registration_record_t; BEGIN /* ArcSDE plsql */ registration.registration_id := :registration_id; registration.rowid_column := :rowid_column; registration.description := :description; registration.object_flags := :object_flags; registration.config_keyword := :config_keyword; registration.minimum_id := :minimum_id; registration.imv_view_name := :imv_view_name; SDE.registry_util.update_registration (registration); :sql_code := SDE.sde_util.SE_SUCCESS; EXCEPTION WHEN OTHERS THEN :sql_code := SQLCODE; :error_string := SQLERRM; END;

ALTER TABLE SDE.TEST3 ADD (SAHPE ST_GEOMETRY)

DECLARE owner SDE.st_geom_cols_util.gc_owner_t; table_name SDE.st_geom_cols_util.gc_table_t; spatial_column SDE.st_geom_cols_util.gc_column_t; srid SDE.st_geom_cols_util.gc_srid_t; geom_type nvarchar2(32); properties number; BEGIN table_name := :table_name; owner := :owner; spatial_column := :spatial_column; srid := :srid; geom_type := :geom_type; properties := :properties; :ret := SDE.st_geom_cols_util.select_gcol (owner,table_name,spatial_column,geom_type,properties,srid); :sql_code := SDE.sde_util.SE_SUCCESS; EXCEPTION WHEN OTHERS THEN :sql_code := SQLCODE; :error_string := SQLERRM; END;

DECLARE owner SDE.st_geom_cols_util.gc_owner_t; table_name SDE.st_geom_cols_util.gc_table_t; spatial_column SDE.st_geom_cols_util.gc_column_t; srid SDE.st_geom_cols_util.gc_srid_t; geom_type nvarchar2(32); BEGIN table_name := :table_name; owner := :owner; spatial_column := :spatial_column; srid := :srid; geom_type := :geom_type; SDE.st_geom_cols_util.insert_gcol (owner,table_name,spatial_column,geom_type,srid); :sql_code := SDE.sde_util.SE_SUCCESS; EXCEPTION WHEN OTHERS THEN :sql_code := SQLCODE; :error_string := SQLERRM; END;

select 1 from SDE.st_geometry_index a where owner = 'SDE' and table_name = 'TEST3'

SELECT ind.index_name, ind.uniqueness, col.column_name FROM all_indexes ind, all_ind_columns col WHERE ind.table_owner = :owner_name and ind.table_name = :table_name and ind.index_name = col.index_name and ind.table_owner = col.table_owner and ind.table_name = col.table_name and ind.index_type not like 'FUNCTION%' ORDER BY ind.index_name, col.column_position

SELECT /* ESRI GDM_1 */ state_id,owner,creation_time,closing_time,lineage_name,parent_state_id FROM SDE.states WHERE state_id = :id

INSERT INTO SDE.GDB_Items GDB_ITEMS (UUID,TYPE,NAME,PHYSICALNAME,PATH,URL,PROPERTIES,DATASETSUBTYPE1,DATASETSUBTYPE2,DATASETINFO1,DATASETINFO2,DEFINITION,DOCUMENTATION,ITEMINFO,OBJECTID,SHAPE,DEFAULTS) VALUES ( :a1, :a2, :a3, :a4, :a5, :a6, :a7, :a8, :a9, :a10, :a11, :a12, :a13, :a14, :a15,SDE.ST_GEOMETRY(:st1,:st2,:st3,:st4,:st5,:st6,:st7,:st8,:st9,:st10,:st11,:st12,:st13,:st14), :a17)

SELECT * FROM SDE.sde_xml_doc3
SELECT * FROM SDE.sde_xml_doc2
SELECT * FROM SDE.sde_xml_doc1
INSERT INTO SDE.sde_xml_doc1 (SDE_XML_ID, doc_property, xml_doc, xml_doc_val) VALUES (:xml_id, :doc_prop, :xml_doc,:xml_doc_val)

UPDATE SDE.GDB_ITEMS GDB_ITEMS SET TYPE = :a1,NAME = :a2,PHYSICALNAME = :a3,PATH = :a4,URL = :a5,PROPERTIES = :a6,DATASETSUBTYPE1 = :a7,DATASETSUBTYPE2 = :a8,DATASETINFO1 = :a9,DATASETINFO2 = :a10,DEFINITION = :a11,SHAPE = SDE.ST_GEOMETRY(:st1,:st2,:st3,:st4,:st5,:st6,:st7,:st8,:st9,:st10,:st11,:st12,:st13,:st14) WHERE OBJECTID = :a13
UPDATE SDE.GDB_ITEMS SET SHAPE = NULL WHERE OBJECTID = :objid
UPDATE SDE.GDB_ITEMS GDB_ITEMS SET TYPE = :a1,NAME = :a2,PHYSICALNAME = :a3,PATH = :a4,URL = :a5,PROPERTIES = :a6,DATASETSUBTYPE1 = :a7,DATASETSUBTYPE2 = :a8,DATASETINFO1 = :a9,DATASETINFO2 = :a10,SHAPE = SDE.ST_GEOMETRY(:st1,:st2,:st3,:st4,:st5,:st6,:st7,:st8,:st9,:st10,:st11,:st12,:st13,:st14) WHERE OBJECTID = :a13
BEGIN /* ArcSDE plsql */ SDE.lock_util.delete_table_lock (:sde_id,:registration_id); :sql_code := SDE.sde_util.SE_SUCCESS; EXCEPTION WHEN OTHERS THEN :sql_code := SQLCODE; :error_string := SQLERRM; END;
SELECT r.owner, r.table_name, x.column_name, x.column_id, x.index_id, x.registration_id, x.minimum_id, x.config_keyword,x.xflags FROM SDE.table_registry r, SDE.sde_xml_columns x WHERE r.registration_id = x.registration_id AND (( r.table_name = :i1 AND r.owner = :i2 ))

INSERT INTO SDE.GDB_ItemRelationships (OBJECTID,UUID,TYPE,ORIGINID,DESTID,PROPERTIES,ATTRIBUTES) VALUES ( :a1, :a2, :a3, :a4, :a5, :a6, :a7)

WITH TR0 AS (select owner,table_name,imv_view_name from SDE.TABLE_REGISTRY) SELECT owner,table_name,column_name, spatial_type FROM (SELECT DISTINCT rownum, ac.owner,ac.table_name,null column_name,null spatial_type FROM all_catalog ac WHERE ac.table_name NOT LIKE '%BIN$%' AND ac.table_name NOT LIKE 'S%_IDX$' AND ac.table_name NOT LIKE 'S%_PX$' AND ac.table_name NOT LIKE '%_IX1_%$' AND ac.table_name NOT LIKE '%_RT$%' AND ac.table_name NOT LIKE '%RT%$' AND ac.table_name NOT LIKE '%XT_%$%' AND ac.table_name NOT LIKE '%_SDOLAYER' AND ac.table_name NOT LIKE '%_SDODIM' AND ac.table_name NOT LIKE '%_SDOGEOM' AND ac.table_name NOT LIKE '%_SDOINDEX' AND ac.table_name NOT LIKE '%_F%$' AND ac.table_name NOT LIKE '%_H%$' AND ac.table_name NOT LIKE 'DR$%' AND ac.table_name NOT LIKE 'KEYSET_%' AND ac.table_name NOT LIKE 'ESRI__MBT_%' AND ac.table_name NOT LIKE 'ESRI__MBV_%' AND ac.table_name NOT LIKE 'SDE_%' AND ac.table_type <> 'SEQUENCE' AND ac.owner NOT IN ('AURORA$JIS$UTILITY$','OSE$HTTP$ADMIN','QS','QS_CBADM','QS_CS','QS_ES','QS_OS','QS_WS','WMSYS','XDB','WKSYS','OLAPSYS','RMAN','ODM','DMSYS','EXFSYS','WK_TEST','ODM_MRT','SYSMAN','SI_INFORMTN_SCHEMA','FLOWS_030000','FLOWS_FILES','APPQOSSYS','LBACSYS','OWBSYS','OWBSYS_AUDIT','SYS','SYSTEM','ORDSYS','PUBLIC','DBSNMP','DVSYS','AUDSYS','OJVMSYS','GSMADMIN_INTERNAL','OUTLN','ORDDATA','APEX_030200','APEX_040200','TSMSYS','MTSSYS','PERFSTAT','CTXSYS', 'DBSFWUSER' ,'MDSYS') AND NOT EXISTS (SELECT 'X' FROM sde.st_partition_index a WHERE a.owner = 'SDE' AND 'S' || a.geom_id || a.partition_name = ac.table_name) ) o WHERE NOT EXISTS (select 1 from all_tab_columns atci WHERE o.table_name = atci.table_name AND o.owner = atci.owner AND (atci.data_type ='SDO_GEOMETRY' OR atci.data_type ='ST_GEOMETRY')) AND NOT EXISTS (select 1 from TR0 where o.table_name = TR0.table_name AND o.owner = REPLACE(TR0.owner,'"')) AND NOT EXISTS (select 1 from TR0 where o.table_name = TR0.imv_view_name AND o.owner = REPLACE(TR0.owner,'"') AND TR0.imv_view_name IS NOT NULL)




简要概括下,主要包括以下几个步骤:
1. 查询系统表,主要包括LAYERS,TABLE_REGISTRY,SPATAIL_REFERENCES,ST_GEOMETRY_INDEX 等
2. 增加,更新某些信息表,包括LAYERS,TABLE_REGISTRY,ST_GEOMETRY_INDEX,COLUMN_REGISTRY等
3. 创建图层名的同名表,并将shape字段添加到表中。
4. 创建对应的SEQUENCE
5. 创建对应的索引
最终建出来的FeatureClass的信息如下:
SQL> desc test3
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
OBJECTID NOT NULL NUMBER(38)
SHAPE ST_GEOMETRY

可以看到空间字段的名字统一定义为shape,类型为ST_GEOMETRY,ST_GEOMETRY的类型是,如下所示:
SQL> desc st_geometry
st_geometry 不是最终的
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
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

METHOD
------
FINAL CONSTRUCTOR FUNCTION ST_GEOMETRY RETURNS SELF AS RESULT
参数名称 类型 输入/输出默认值?
------------------------------ ----------------------- ------ --------
GEOM_STR CLOB IN
SRID NUMBER IN

METHOD
------
FINAL CONSTRUCTOR FUNCTION ST_GEOMETRY RETURNS SELF AS RESULT
参数名称 类型 输入/输出默认值?
------------------------------ ----------------------- ------ --------
CENTER_X NUMBER IN
CENTER_Y NUMBER IN
CENTER_Z NUMBER IN
CENTER_M NUMBER IN
SEMIMAJORAXIS NUMBER IN
SEMIMINORAXIS NUMBER IN
ANGLE NUMBER IN
NUMPTS NUMBER IN
SRID NUMBER IN

METHOD
------
FINAL CONSTRUCTOR FUNCTION ST_GEOMETRY RETURNS SELF AS RESULT
参数名称 类型 输入/输出默认值?
------------------------------ ----------------------- ------ --------
CENTER_X NUMBER IN
CENTER_Y NUMBER IN
CENTER_Z NUMBER IN
CENTER_M NUMBER IN
RADIUS NUMBER IN
NUMPTS NUMBER IN
SRID NUMBER IN

METHOD
------
FINAL CONSTRUCTOR FUNCTION ST_GEOMETRY RETURNS SELF AS RESULT
参数名称 类型 输入/输出默认值?
------------------------------ ----------------------- ------ --------
CENTER_X NUMBER IN
CENTER_Y NUMBER IN
CENTER_Z NUMBER IN
CENTER_M NUMBER IN
STARTANGLE NUMBER IN
ENDANGLE NUMBER IN
OUTERRADIUS NUMBER IN
INNERRADIUS NUMBER IN
NUMPTS NUMBER IN
SRID NUMBER IN

METHOD
------
FINAL CONSTRUCTOR FUNCTION ST_GEOMETRY RETURNS SELF AS RESULT
参数名称 类型 输入/输出默认值?
------------------------------ ----------------------- ------ --------
X NUMBER IN
Y NUMBER IN
Z NUMBER IN
M NUMBER IN
SRID NUMBER IN

METHOD
------
FINAL CONSTRUCTOR FUNCTION ST_GEOMETRY RETURNS SELF AS RESULT
参数名称 类型 输入/输出默认值?
------------------------------ ----------------------- ------ --------
MINX NUMBER IN
MINY NUMBER IN
MAXX NUMBER IN
MAXY NUMBER IN
SRID NUMBER IN
DSTRING VARCHAR2 IN

METHOD
------
MEMBER FUNCTION ST_AREA RETURNS NUMBER

METHOD
------
MEMBER FUNCTION ST_LEN RETURNS NUMBER

METHOD
------
MEMBER FUNCTION ST_LENGTH RETURNS NUMBER

METHOD
------
MEMBER FUNCTION ST_ENTITY RETURNS NUMBER

METHOD
------
MEMBER FUNCTION ST_NUMPTS RETURNS NUMBER

METHOD
------
MEMBER FUNCTION ST_MINX RETURNS NUMBER

METHOD
------
MEMBER FUNCTION ST_MAXX RETURNS NUMBER

METHOD
------
MEMBER FUNCTION ST_MINY RETURNS NUMBER

METHOD
------
MEMBER FUNCTION ST_MAXY RETURNS NUMBER

METHOD
------
MEMBER FUNCTION ST_MINM RETURNS NUMBER

METHOD
------
MEMBER FUNCTION ST_MAXM RETURNS NUMBER

METHOD
------
MEMBER FUNCTION ST_MINZ RETURNS NUMBER

METHOD
------
MEMBER FUNCTION ST_MAXZ RETURNS NUMBER

METHOD
------
MEMBER FUNCTION ST_SRID RETURNS NUMBER

METHOD
------
MAP MEMBER FUNCTION ST_MAP RETURNS VARCHAR2

METHOD
------
STATIC FUNCTION GET_RELEASE RETURNS NUMBER

可以看的出来st_geometry是一个type,类似c++里面的一个类,具有成员以及成员函数以及构造函数等,其中成员中的POINTS的类型为BLOB是存储实际的点串信息的。
继续查看表的定义
SQL> select dbms_metadata.get_ddl('TABLE','TEST3','SDE') from dual;

DBMS_METADATA.GET_DDL('TABLE','TEST3','SDE')
--------------------------------------------------------------------------------

CREATE TABLE "SDE"."TEST3"
( "OBJECTID" NUMBER(*,0) NOT NULL ENABLE,
"SHAPE" "SDE"."ST_GEOMETRY"
) SEGMENT CREATION IMMEDIATE
PCTFREE 0 PCTUSED 40 INITRANS 4 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "SDE"

DBMS_METADATA.GET_DDL('TABLE','TEST3','SDE')
--------------------------------------------------------------------------------
LOB ("SHAPE"."POINTS") STORE AS SECUREFILE (
TABLESPACE "SDE" ENABLE STORAGE IN ROW CHUNK 8192
CACHE NOCOMPRESS KEEP_DUPLICATES
STORAGE(INITIAL 106496 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))

可以看到POINTS字段的类型是BLOB,而且存储方式为SEQUREFILE。SEQUREFILE是oracle11G针对于BLOB方式新出的存储方式,相对于以前的BASICFILE方式具备很多的有事,具体优势以及设置可以参考oracle的官方文档。
SHAPE字段既然是个composite类型,里面也包含成员变量,所以我们也可以直接通过SQL访问这些变量。
SQL> select t.shape.entity,t.shape.numpts,t.shape.srid,t.shape.area,t.shape.len,t.shape.minx,t.shape.miny,t.shape.maxx,t.shape.maxy from subdltb t where t.objectid=1;


SHAPE.ENTITY SHAPE.NUMPTS SHAPE.SRID SHAPE.AREA SHAPE.LEN SHAPE.MINX SHAPE.MINY SHAPE.MAXX SHAPE.MAXY
------------ ------------ ---------- ---------- ---------- ---------- ---------- ---------- ----------
8 39 3857 10657.595 527.322666 997085.133 739326.72 997278.087 739436.822

除了表之外,我们也可以看到该表上也创建了几个索引:
SQL> select a.index_name,a.column_name,b.index_type from user_ind_columns a,user_indexes b where a.index_name=b.index_name and a.table_name='TEST3';


INDEX_NAME COLUMN_NAME INDEX_TYPE
------------------------------ -------------------- ---------------------------
R52_SDE_ROWID_UK OBJECTID NORMAL
A5_IX1 SHAPE DOMAIN








文章来源:https://blog.csdn.net/liufeng1980423/article/details/81003840

7 个评论

Merry GISmas!
lsh

lsh 回复 GIS知乎

Merry GISmas!
Merry GISmas
每个ID只需发现一个彩蛋即可中奖欧!请勿重复回复!
GIS知乎

GIS知乎 回复 lsh

每个ID只需发现一个彩蛋即可中奖欧!请勿重复回复!
Merry GISmas!
Merry GISmas!

要回复文章请先登录注册