DI空间数据库组件

4年前

1 介绍


ArcGIS 地理数据库是存储在通用文件系统文件夹、Microsoft Access 数据库或多用户关系 DBMS(如 Oracle、Microsoft SQL Server、PostgreSQL、Informix 或 IBM DB2)中的各种类型地理数据集的集合。地理信息的物理存储,主要使用数据库管理系统 (DBMS) 或文件系统。


地理数据库是用于保存数据集集合的“容器”。有以下三种类型:


文件地理数据库 - 在文件系统中以文件夹形式存储。每个数据集都以文件形式保存,该文件大小最多可扩展至 1 TB。建议使用文件地理数据库而不是个人地理数据库。

个人地理数据库 - 所有的数据集都存储于 Microsoft Access 数据文件内,该数据文件的大小最大为 2 GB。

ArcSDE 地理数据库 - 使用 Oracle、Microsoft SQL Server、IBM DB2、IBM Informix 或 PostgreSQL 存储于关系数据库中。这些多用户地理数据库需要使用 ArcSDE,在大小和用户数量方面没有限制。

这里我们对于ArcGIS中的数据同步,我们重点是对第三种使用较多的ArcSDE地理数据库来做数据同步。


2 使用SQL同步


可以使用 SQL 访问现有数据集及其属性,并编辑 ArcSDE 地理数据库中的版本化和非版本化数据集。


还可以使用 SQL 创建可注册到 ArcSDE 和地理数据库的表。这些表可以包含 SQL 空间或栅格类型,也可以只包含非空间属性。


使用 SQL 访问地理数据库时,会在数据库管理系统 (DBMS) 级别对其进行访问。这意味着使用 SQL 时,不会强制执行由 ArcSDE、地理数据库或 ArcGIS 客户端强制执行的行为和功能。


空间类型是存储几何数据的类型。空间类型与熟知的二进制等其他几何存储类型不同,因为所有空间信息都存储在空间列中;不存在端要素表。在一个字段中包含空间信息使访问 ArcGIS 外部的空间数据更加容易。


空间类型具有相关函数或方法,这些函数和方法用于通过使用结构化查询语言 (SQL) 来访问和操作数据。


空间类型彼此之间的 SQL 语法有细微差别,但所有 ESRI 支持的空间类型均基于国际标准化组织 (ISO) SQL 多媒体 (MM) 空间规范。此规范要求用于空间类型的函数提供一组特定功能。多数空间类型可实现除 ISO SQL MM 空间规范要求之外的附加功能。


用户定义数据类型 (UDT) 是程序员为满足应用程序的需要而定义的数据存储对象。由于这些数据类型是由程序员定义的,因此 UDT 由数据库管理系统 (DBMS) 读取,然后使用 DBMS 原有的数据类型存储在数据库中。


我们重点对于Oracle数据库进行SQL操作空间数据库分析。在安装完ArcGIS后会在Oracle数据库中生成ArcGIS的用户定义数据类型,在ArcGIS中主要使用ST_Geometry类型来存储空间数据。因此主要需要解决的问题就是将ST_Geometry取出转换成文本数据然后通过DI来将转换后的数据插入到目标表中。


这里需要说明一下朱换成的文本数据是WKT形式的。WKT(Well-known text)是一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。它的二进制表示方式,亦即WKB(well-known binary)则胜于在传输和在数据库中存储相同的信息。该格式由开放地理空间联盟(OGC)制定。


2.1 ST_Geometry转换成WKT


要取出ST_Geometry中的数据,可以使用ArcGIS提供的ST_ASTEXT函数。例如:


SELECT id, sde.st_astext (geometry) CURVE FROM CURVE_TEST


ST_ASTEXT函数可以将ST_Geometry类型的数据转换成WKT文本。这个函数是ArcGIS的自定义函数所以要使用这个函数需要配置Oracle的extproc。


配置过程如下参考:http://blog.csdn.net/linghe301/article/details/7102447


2.2 WKT转换成ST_Geometry


要将WKT数据更新或插入到一张表里,我们需要对WKT文本做转换,这里需要使用到ST_GeomFromText函数来将WKT文本转换成ST_Geometry。例如:INSERT INTO GEOMETRY_TEST VALUES (1, sde.st_geomfromtext ('point (10.02 20.01)', 0));插入时容易出现Underlying DBMS error[ORA-29875: 无法履行 ODCIINDEXINSERT 例行错误.

解决办法:删除对应操纵表的序列index


2.3 ArcGIS函数简介


在ArcGIS的空间数据库中已经封装了很多数据库函数。


下面是一些针对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 返回版本信息.


如下面例子,在us_states表中查找所有state的名字并计算state的面积。


SELECT name, st_area(geometry) FROM us_states ORDER BY name;


构造ST_Geometry对象函数:


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


ST_Point是个有限对象(只有一个点),因此可以使用下面的方法来构造。


1,使用xy坐标和SRID来构造ST_Point


METHOD


FINAL CONSTRUCTOR FUNCTION ST_POINT RETURNS SELF AS RESULT


Argument Name Type In/Out Default?


PT_X NUMBER IN


PT_Y NUMBER IN


SRID NUMBER IN


SQL> insert into sample_pt values (ST_Point (10, 20, 1) );


2,使用xy坐标、高程值(z)和SRID来构造ST_Point


METHOD


FINAL CONSTRUCTOR FUNCTION ST_POINT RETURNS SELF AS RESULT


Argument Name Type In/Out Default?


PT_X NUMBER IN


PT_Y NUMBER IN


PT_Z NUMBER IN


SRID NUMBER IN


SQL> insert into sample_pt values (ST_Point (10, 20, 5, 1) );


3,使用xy坐标、高程值(z),量测值(m)和SRID来构造ST_Point


METHOD


FINAL CONSTRUCTOR FUNCTION ST_POINT RETURNS SELF AS RESULT


Argument Name Type In/Out Default?


PT_X NUMBER IN


PT_Y NUMBER IN


PT_Z NUMBER IN


MEASURE NUMBER IN


SRID NUMBER IN


SQL> insert into sample_pt values (ST_Point (10, 20, 5, 401, 1) );


在oracle使用ST_Geometry ,用户必须有以下权限:


CREATE TYPE


UNLIMITED TABLESPACE


CREATE LIBRARY


CREATE OPERATOR


CREATE INDEXTYPE


CREATE PUBLIC SYNONYM


DROP PUBLIC SYNONYM


The CONNECT and RESOURCE roles include these privileges.


函数详细使用请参考:


http://help.arcgis.com/zh-cn/arcgisserver/10.0/help/arcgis_server_dotnet_help/index.html#/na/009300001594000000/


2.4 DI中配置


在DI中配置ArcGIS的SQL脚本来同步的过程如下:



在这一步主要需要注意的是要将ST_Geometry字段转换。



这一步是将源的字段名称转换成目标表的字段名称和类型。



这里需要注意的是要勾选变量替换,另外就是参数的顺序就是?号的数据顺序。?代表变量。


如果要执行更新或删除只要将SQL改为更新或删除的SQL语句。


3 使用ArcSDE组件同步


ArcSDE 是 Esri 公司的一项用于在关系数据库中访问和管理地理空间数据的技术。ArcSDE 技术支持读取和写入多种标准,包括(在众多的其他数据存储格式中)用于简单要素的开放地理空间联盟 (OGC) 标准、用于空间类型的国际标准化组织 (ISO) 标准、Oracle Spatial 格式、PostGIS 空间格式和 Microsoft 空间格式。


ArcSDE 在支持以下功能方面是独一无二的:


它在多个数据库管理系统之间是开放的,且具有互操作性。

它基于多种标准,使用 OGC 二进制简单要素标准和 ISO 空间类型用作固有数据结构。

它支持对地理数据库进行完整开放的结构化查询语言 (SQL) 访问。

它提供高性能,可扩展以支持大量用户。


目前已经针对ArcSDE提供的的Api编写了几个数据同步需要的测试组件,能够通过ArcSDE数据源来操作ArcGIS中的要素和表。


3.1 ArcSDE输入组件


这个组件用于查找指定表中的数据



在填写完成ArcSDE服务器的基本属性后点击测试连接,所有的表都会在显示在选择表中。从中选择要同步数据的源表。


记录数量限制该字段用户控制获取数据数量,默认为0表示无限制。


是否将特殊对象转换成字符串选项用于控制ArcSDE输入组建的查询结果,选中则将ST_Geometry类型转换成WKT字符串。不选,则直接将查出的对象传递给下一个组件。


点击选择列建弹出对话框,对话框中的列表显示了所有表中的字段名称,这里选择需要获取数据的字段,然后点击确定。选中的列会显示在选择列按钮右侧的列表中。


条件字段用于设置选择的条件,例如SS=2或者使用变量来替换SS=%%num%%.。这里的num是变量,%%%%是变量的格式。


3.2 ArcSDE输出组件


这个组件用于接收数据将数据插入到目标表中。



ArcSDE输出组建的配置很简单只要将ArcSDE服务器基本信息填写好,并选择目标表就可以了。记录数量限制这个目前没有作用暂时保留。


3.3 ArcSDE更新


这个组件用于接收数据将数据更新到目标表中。



将ArcSDE服务器基本信息填写好,选择目标表。


点击获取字段这时会在获取字段左侧表中显示判断条件。表字段代表目标表的条件字段,比较符表示比较方式,字段1代表数据来源。


点击获取更新字段按钮在左侧表中将显示要更新的字段和对应的数据。表字段代表目标表要更新的字段名称,字段表示数据来源。


3.4 ArcSDE删除


这个组件用于接收数据根据数据条件将目标表中的数据删除。



将ArcSDE服务器基本信息填写好,选择目标表。


点击获取字段按钮,这时会在获取字段按钮的左侧表中显示要删除数据的条件。表字段代表目标表的条件字段,比较符表示比较方式,字段1代表数据来源。

COMMENTS

需要 后方可回复
如果没有账号可以 一个帐号。