http://www.gissky.net- GIS空间站

我要投稿 投稿指南 RSS订阅 网站资讯通告:
搜索: 您现在的位置: GIS空间站 >> 技术专栏 >> ArcGIS >> ArcSDE >> 正文

Geodatabase and ArcSDE系列讲座 第七部分:Working With a Geodatabase Using SQL

作者:萝卜兔子    文章来源:ESRI中国北京有限公司    点击数:    更新时间:2007-2-1
摘要:
通过SQL从Geodatabase中获取空间数据库信息,使得Nongeographic database 应用者或者不是用ArcObjects开发的空间应用也可以获取存储在Geodatabase中的信息。
       ArcGIS SQL支持很多Spatial Relationship,例如ST_Equals 、ST_Disjoint等等,如果空间要素之间满足这种关系,则返回结果为1或者TRUE,如果不满足这种关系,则返回结果为0或FALSE。
      Spatial Operations是指能够通过指定的输入数据生成新的空间数据的功能函数(Functions)。例如ST_Distance能够计算要素之间的最短距离,ST_Union能够把输入空间数据集合并。还包括很多其它的Spatial Operations。
       Informix、DB2、Oracle的Spatial SQL之间的差异很小。

Creating a table with an ST_Geometry column
       Spatial Table是包含一个或者多个Spatial Columns的Table:
CREATE TABLE sensitive_areas (area_id integer、name varchar(128) 、area_size float、type varchar(10) 、zone ST_Geometry);
      Spatial Column只接受满足数据类型要求的数据。例如,ST_Polygon类型的空间列就不可以存储Integers、Characters等等。ST_Geometry能够存储其所有的Subtype类型的数据。在一个Table中可以创建多个ST_Geometry列,但是ArcGIS在同一个Table中不支持多个空间几何列,可以创建多个只包含一个ST_Geometry列的Spatial Views。
      ArcSDE必须要包含一个唯一的注册Feature Identifier列以支持Spatial Query、Log File Query、Single-row Operations、Multiversioned Database Operations。这一列通常称为OBJECTID,但是也可以是其它的名字。

Creating spatial references using SQL
      ArcGIS用户除了可以利用桌面程序提供的工具创建空间参考以外,还可以采用SQL创建。所有的Spatial Reference Systems都是存储在Database的System Table中的。在用ST_Geometry 存储空间信息的Oracle数据库中,空间参考是存储在ST_Spatial_References table;在Informix中是 Spatial_References表; DB2中是ST_Spatial_Reference_Systems。利用SQL创建Spatial Reference System,实际上就是利用SQL向以上表中添加记录。

Inserting features to a table with an ST_Geometry column
      能够被插入到ST_Geometry列的数据类型必须是以下两种之一:
      OGC well-known text (WKT) representation
      OGC well-known binary (WKB) representation
但是必须利用SQL函数将以上类型的数据转换成ST_Geometry格式的数据,才能够进行存储。以下例子利用ST_PolyFromText()函数将well-known text representation格式的polygon 数据转换为ST_Polygon类型,以存储到sensitive_areas table 中的ZONE空间列中。
INSERT INTO sensitive_areas VALUES (1, 'Summerhill Elementary School', 67920.64, 'school', ST_PolyFromText('polygon ((52 28,58 28,58 23,52 23,52 28))',1));

Querying tables with an ST_Geometry column
    以下为三种数据库支持的SQL查询语句:
    Spatial Type for Oracle:SELECT sa.name "Sensitive Areas", hs.name "Hazardous Sites" FROM sensitive_areas sa, hazardous_sites hs WHERE ST_Overlaps (sa.zone, ST_Buffer (hs.location,.01)) = 1;
    Informix:SELECT sa.name sensitive_area, hs.name hazardous_siteFROM sensitive_areas sa, hazardous_sites hsWHERE ST_Overlaps(sa.zone, ST_Buffer(hs.location, .01));
    DB2:db2 => SELECT sa.name "Sensitive Areas", hs.name "Hazardous Sites" FROM sensitive_areas sa, hazardous_sites hs WHERE db2gse.ST_Overlaps (sa.zone, db2gse.ST_Buffer (hs.location,.01)) = 1

Enhancing ArcGIS functionality using spatial types (ArcInfo and ArcEditor only)
     可以利用SQL向已经存在的Feature Class中填加记录,或者是利用SQL创建自定义的查询以显示某条记录,或者是利用SQL创建一个具备Spatial Type列的新表,然后Register这个表以在ArcGIS中使用。
    (1)如果利用SQL向已有的Feature Class添加新的记录:
    首先在ArcCatalog中新建一个要素图层,如果数据库是Oracle,则创建的时候应该在Use Configuration Keyword中将空间列的类型设置为ST_GEOMETRY,然后将数据添加 到ArcMap中,然后利用SQL添加一行记录:
     insert into buildings(OBJECTID, FID, BUILDING_, BUILDING_I, TAG, TYPE, SUBTYPE, SYMBOL, LOCK__ID, PHASE__ID, ZOOM_SYMBO, SHAPE) Values (1, 0, 12972, 18907, '22JSM0000023946', 'BLD', 'RES', 6, 0, 0, 1, ST_GEOMETRY ('POLYGON (( 2219520.56768649 387051.66985716, 2219525.34823696 387079.52399077,2219536.03133855 387077.71905252, 2219539.05578917 387095.47546386, 2219528.17754562 387097.32910505,2219528.61661291 387099.81695550, 2219489.00622816 387106.54876471, 2219480.81097279 387058.40167483, 2219520.56768649 387051.66985716))', 3));
    (2)利用SQL创建的自定义查询表达式以查询要素:首先将要素添加到ArcMap中,右键单击图层,选择Properties/Definition Query 面板,创建以下SQL查询语句:
objectid in (select p.objectid FROM buildings b, water_lines w where watertype = 'MAIN' and ST_Overlaps (p.shape, ST_Buffer (f.shape, 55)) = 1)
   (3)ESRI推荐使用ArcGIS创建Feature Class,这样能够保证数据的完整性,但是也支持将SQL创建的Feature Class或者第三方应用创建的Feature Class注册为ArcGIS识别的类型。
     可以利用ArcSDE Administrator Command:sdelayer –o register,手动实现将Table注册为Feature Class,以下为将SQL创建的Table,用ArcSDE注册为Feature Class,以下为例子:
    首先在SQL中创建一个Table:
create table comm._bldgs as select * from buildings where SUBTYPE = 'COM';
     然后利用ArcSDE进行注册:
sdelayer -o register -l comm_bldgs,shape -e a -C OBJECTID,SDE -R -u -p
     需要注意的是:需要Register的Table必须满足以下条件:
    (1)注册该表的用户必须是该表的所有者;
    (2)必须具备单一的ST_GEOMETRY列;
    (3)不包括其它User-defined类型;
    (4)具备单一的几何类型(Points,Lines,Polygons);
    (5)必须具备ID列,该列必须是Integer,Unique,NonNull;
    (6)应该具备Spatial Index。
      如果以上注册的Feature Class将参与到Relationship、Geometric Networks、Topology、Subtypes、Default Types、Domains、Validation Rules,则需要Registered with the Geodatabase:在ArcCatalog中右键单击要注册的Feature Class或者Table,选择Register With Geodatabase。

Using Multiversioned Views
      如果用户自定义的应用不支持ArcGIS Geodatabase Versioning,则只能够查询Base Table,而不能够获取Delta Table中的信息。因此,为了保证这样的用户也能够利用SQL获取Geodatabase中的Versioned Table的信息,应该创建Multiversioned Views。
Multiversional Views是将Base Table和Delta Table中的数据按照版本不同组织成完整的View,在这个View中可以得到该版本中数据库的变化情况。
      为了能够创建Multiversional View,首先要利用管理命令sdetable –o create_mv_view。创建完Multiversional View以后,可以利用set_current_version (' < desired_version_name > ')设置想要了解的版本,如果不提供版本名字,则缺省值是SDE.DEFAULT,然后就可以利用SQL查询设定版本的属性了。如果要删除一个Multiversional View,可以采用sdetable –o delete_mv_view。能够利用Multiversional View编辑版本化的Table,不能够在一个View的基础上再创建一个Multiversional View。
      要注意的地方是:
    (1)在一个Feature Class中只能有一个Multiversional View;
    (2)能够对Multiversional View执行所有的版本化操作,包括:creating versions, resolving conflicts, reconciling, and posting;
    (3)Multiversional View不能用来获取或者修改复杂要素,例如Geometric Networks,Topology,Relationship;
    (4)不能利用Multiversional View编辑Default版本,或者属于其它编辑和协调操作的版本;
    (5)不能够利用DBMS工具更新任何ID字段(OBJECTID)

Spatial View
    如果某个ArcSDE Spatial Type Table中包括多个Spatial Column,则唯一的办法是将其注册成Spatial Views。在每一个Spatial View中,只能选择一个Spatial Column,然后就可以将其利用ArcSDE注册。以下为例子:
    create view quake_v as select objectid,shape from quakes4;

Tags:Geodatabase,ArcSDE  
责任编辑:gissky
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 中国地图