ArcSDE for Oracle提供了ST_Geometry类型来存储几何数据。ST_Geometry是一种遵循ISO和OGC规范的,可以通过SQL直接读取的空间信息存储类型。采用这种存储方式能够更好的利用oracle的资源,更好的兼容oracle的特征,比如复制和分区,并且能够更快的读取空间数据。使用ST_Geometry存储空间数据,可以把业务数据和空间数据存储到一张表中(使用SDENBLOB方式业务数据和空间数据是分开存储在B表和F表中的),因此可以很方便的在业务数据中增加空间数据(只需要在业务表中增加ST_Geometry列)。使用这种存储方式还能够简化多用户的读取,管理(只需要管理一张表)。
从 ArcGIS 9.3开始,新的 ArcSDE geodatabases for Oracle 会默认使用ST_Geometry 方式来存储空间数据。它实现了SQL3规范中的用户自定义类型(user-defined data types),允许用户使用ST_Geometry类型创建列来存储诸如界址点,街道,地块等空间数据。
使用ST_Geometry类型存储空间数据,具有以下优势:
1)通过SQL函数( ISO SQL/MM 标准)直接访问空间数据;
2)使用SQL语句存储、检索操纵空间数据,就像其他类型数据一样。
3)通过存储过程来进行复杂的空间数据检索和分析。
4)其他应用程序可以通过SQL语句来访问存储在geodatabase中的数据。从ArcGIS 9.3开始,新的ArcSDE geodatabases for Oracle 要求所以ST 函数调用的时候前面都要加上 SDE schema名称。例如:要对查询出来的空间数据进行union操作,则SQL函数需要这样写:"sde.ST_Union",在9,2版本之前,可以不加SDE schema名称。
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
<!--[if !supportLists]-->1.1 <!--[endif]-->存储结构
ST_Geometry 存储空间数据的结构如下表:
Name Type
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:为要素类型,包括(linestring, multilinestring, multipoint, multipolygon, point, or polygon)。具体的值对应的类型可以通过 st_geom_util 存储过程获得。 NUMPTS为坐标点的个数
Minx, miny, maxx, maxy :对应几何的外包络矩形
Area:几何的面积
Len :几何的周长
SRID :空间参考系ID,对应 ST_Spatial_References 表中的空间参考信息
POINTS:坐标序列
<!--[if !supportLists]-->1.2 <!--[endif]-->操作函数
下面是一些针对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;
在ArcGIS中通过SDE存储空间数据到Oracle中有多种存储方式:二进制Long Raw 、ESRI的ST_Geometry、Oracle Spatial的SDO_Geometry等。这里主要是介绍基于Oracle Spatial的存储方式。
通过这种存储方式几何列Shape的字段类型为MDSYS.SDO_GEOMETRY类型。SDO_GEOMETRY是空间数据中最基本的类型,此类型用于存储几何形状。类型定义为:
CREATE TYPE sdo_geometry AS OBJECT ( //标识该类型为对象类型,自定义对象,编程时为“STRUCT”类型
SDO_GTYPE NUMBER, //表示要存储的几何类型,如点线面。它是通过 NUMBER类型来表达的;
SDO_SRID NUMBER, //几何的空间参考坐标系ID,可在MDSYS.SDO_COORD_REF_SYS表中找;
SDO_POINT SDO_POINT_TYPE, //如果几何类型为点类型,就是存储点坐标,否则为空。
SDO_ELEM_INFO SDO_ELEM_INFO_ARRAY, //定义要如何理解SDO_ORDINATES中的坐标串;
SDO_ORDINATES SDO_ORDINATE_ARRAY); //存储实际坐标的,以X、Y以及不同点之间都是逗号隔开
该类型中的SDO_POINT_TYPE、SDO_ELEM_INFO_ARRAY、SDO_ORDINATE_ARRAY也是Oracle Spatial自定义的类型和 sdo_geometry 是一样的。
下面将详细介绍这些字段参数的含义
一、SDO_GTYPE
SDO_GTYPE值是有四位数字组成的,它们的格式为:dltt 。
其中,d 表示几何的维数。如二维、三维对应的d=2和d=3;
l 定义了LRS。一般l=0;
tt 定义了地理对象的类型。现在使用从00到07,如tt=01代表为单点;
下面就是t=2的二维几何类型,SDO_GTYPE参数值具体,如 图1:
对于一个给定的层,所有的地理对象必须都是相同的维度,不能将二维与三维的数据放在一个层里。
二、SDO_SRID
SDO_SRID定义了空间坐标参考系统。如果SDO_SRID为null,则没有指定坐标系统,如果SDO_SRID不为null,那么它的值必须在在MDSYS.CS_SRS 表中的 SRID 列有对应的值,而且它的值必须插入USER_SDO_GEOM_METADATA视图中。MDSYS.CS_SRS 表 参考 图2
三、 SDO_POINT
SDO_POINT类型的构造方法为:sdo_point_type(x,y,z),其中x,y,z类型为Double和Int都可
SDO_POINT字段定义为含有X、Y、Z属性的SDO_POINT_TYPE类型。如果几何类型为点类型的话,SDO_ELEM_INFO 和SDO_ORDINATES对应的值都为Null,SDO_POINT 不为空。其它情况下,SDO_POINT会被Spatial所忽略即设为Null。如果这个层只有点对象,那么推荐你将其保存在SDO_POINT属性中。 SDO_POINT_TYPE类型的定义如下:
CREATE TYPE sdo_point_type AS OBJECT (
X NUMBER, //X坐标值
Y NUMBER, //y坐标值
Z NUMBER); //z坐标值
四、SDO_ELEM_INFO
SDO_ELEM_INFO类型的构造方法为:sdo_elem_info_array(a,b.c),其中a,b.c为Number类型。
SDO_ELEM_INFO是理解和掌握SDO_Geometry的重点和难点,SDO_ELEM_INFO 定义了如何理解SDO_ORDINATES中的坐标字符串属性。
SDO_ELEM_INFO每三个数字组合为一个SDO_ELEM_INFO属性单元(具体可以结合下面的例子理解)。
每个SDO_ELEM_INFO属性单元由:SDO_STARTING_OFFSET、SDO_ETYPE 和SDO_INTERPRETATION 组成。下面介绍一下这三个数字的具体含义:
4.1、SDO_STARTING_OFFSET:声明了组成当前几何片段的第一个坐标在SDO_ORDINATES数组中的坐标序号。坐标序号是从1开始起算的而非从0开始。这里的SDO_ORDINATES就是sdo_geometry 中的坐标序列,坐标序列是已逗号隔开的数字,具体的计算如:sdo_ordinate_array(1,4,6,7,8,9)中如果以'6'开始几何片段的话,坐标序号SDO_STARTING_OFFSET=3。(具体参考下面的例子理解)
4.2、SDO_ETYPE :声明元素的类型。可结合 SDO_STARTING_OFFSET和SDO_ETYPE 表来理解.
SDO_ETYPE 值 = 1, 2, 1003,或2003,说明几何为简单的几何类型。可以全部按SDO_ELEM_INFO 属性单元【即三个以逗号隔开的数】来理解sdo_ordinate_array中的坐标序列。
特别说明:SDO_ETYPE 值 = 1003 ,假如几何类型为面,则表示为外多边形环(以逆时针顺序)
SDO_ETYPE 值 = 2003 ,假如几何类型为面,则表示为内多边形环(以顺时针顺序)
SDO_ETYPE 值 = 4,1005或2005,说明几何为组合元素,往往第一个三数字组不是SDO_ELEM_INFO 属性单元,而是为了说明组合元素的信息。具体可以参见下面 复杂多义线 和 复杂多边形 的例子。
4.3、SDO_INTERPRETATION:有两种可能的意思,依赖地SDO_ETYPE是否是组合元素。如果SDO_ETYPE 值 = 4,1005或2005,标识的是有多少组合部分,具体参考 复杂多义线 和 复杂多边形 的例子。如果SDO_ETYPE 值 = 1, 2, 1003,或2003,标识决定了元素坐标队列的翻译顺序。
如下图3 :SDO_STARTING_OFFSET和SDO_ETYPE 表
五、SDO_ORDINATES
SDO_ORDINATES类型的构造方法为:sdo_ordinate_array(x1,y1,x2,y2,……),其中x1,y1类型等为Double和Int都可。
SDO_ORDINATES存储的是空间对象的几何节点坐标序列,用逗号将X、Y、Z以及不同点之间隔开,该字段性质:长度=1048576的数字Number类型。如果几何为二维的情况,存储的序列为{Y1, X2, Y2, X3, Y3, X4, Y4......}格式;几何为三维坐标的话,如三维坐标的多边形它的存储的序列为{X1, Y1, Z1, X2, Y2, Z2, X3, Y3, Z3, X4, Y4, Z4, X1, Y1, Z1}格式。坐标序列中的数据必须都合法且不为空。具体坐标的组合成几何的结合SDO_ELEM_INFO来理解。
六、参考例子:
6.1、矩形:
矩形的具体几何形状和坐标,如下图:
用SDO_GEOMETRY定义该矩形,如何确定sdo_geometry()构造方法中的各个参数值。详细解释如下:
SDO_GTYPE = 2003;2003中的2表示二维数据,2003中的3表示表示多边形。具体参考 图1
SDO_SRID = NULL;
SDO_POINT = NULL;
SDO_ELEM_INFO = (1, 1003, 3).;在属性单元SDO_ELEM_INFO (1,1003,3)中的最后一个3表示该几何为矩形,具体参考 图4 。
---因为它是矩形且为二维所以它的构造方法为:sdo_point_type(坐下坐标,右上坐标)。
SDO_ORDINATES = (1,1, 5,7). 定义了具体的坐下坐标和右上坐标的坐标序列。
例子:用SQL 命令插入一个矩形:
INSERT INTO beniy388 VALUES(
1, //其他的属性字段的值
'UpDooGIS', //其他的属性字段的值
MDSYS.SDO_GEOMETRY( //几何字段SDO_GEOMETRY的值
2003, -- 二维多边形
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3), -- 一个矩形(1003为逆时针方向)
MDSYS.SDO_ORDINATE_ARRAY(1,1, 5,7) -- 只需要两点
)
);
6.2、有岛多边形: 有岛多边形的具体几何形状和坐标,如下图:
用SDO_GEOMETRY定义该多边形,如何确定sdo_geometry()构造方法中的各个参数值。详细解释如下:
SDO_GTYPE = 2003;---2003中的2表示二维数据,2003中的3表示表示多边形。具体参考 图1
SDO_SRID = NULL;
SDO_POINT = NULL;
SDO_ELEM_INFO = (1,1003,1, 19,2003,1); ---有两个三元组SDO_ELEM_INFO属性元素。具体参考 图4
---其中1003表明对应的坐标序列组成的几何A为外多边形环(顺时针);而2003表明对应的坐标序列组成的几何B为内多边形环(逆时针)。
---19 表示几何B坐标序列开始的位置,也就是说从19开始的几何坐标组成几何B,而1到18组成几何A。
SDO_ORDINATES = (10,10, 10,14, 6,10, 14,10);---坐标系列
例子:用SQL 命令插入一个有岛的多边形:
INSERT INTO beniy388 VALUES
10, //其他的属性字段的值
'UpDooGIS', //其他的属性字段的值
MDSYS.SDO_GEOMETRY( //几何字段SDO_GEOMETRY的值
2003,
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1, 19,2003,1), -- 有岛多边形
MDSYS.SDO_ORDINATE_ARRAY(2,4, 4,3, 10,3, 13,5, 13,9, 11,13, 5,13, 2,11, 2,4,7,5, 7,10, 10,10, 10,5, 7,5)
)
);
6.3、复杂多义线
下图描述的是一个由一条直线和一条曲线构成的复杂多义线。图中出现了4个点,(10,10)和(10,14)点表示的是直线 ;10,14), (10,6), 和 (14,10) 描述的是圆弧曲线:
用SDO_GEOMETRY定义该复杂多义线,如何确定sdo_geometry()构造方法中的各个参数值。详细解释如下:
SDO_GTYPE = 2002;2002中的2表示二维数据,第二个2表示表示一条或多条直线段。具体参考 图1。
SDO_SRID = NULL;
SDO_POINT = NULL;
SDO_ELEM_INFO = (1,4,2, 1,2,1, 3,2,2). ---有三个三元组,其中后两个是SDO_ELEM_INFO属性元素三元组,前一个为表述组合。具体参考 图4。
---第一个三元组【1,4,2】,根据4可以得到是个描述三元组,2表示有两个几何元素组成,即后两个三元组描述各自的几何A和几何B。
---第二个三元组【1,2,1】,为SDO_ELEM_INFO属性元素三元组,它描述的是几何A。根据 图4可以得到它是一条直线段,且该直线段的最后一个节点还是下一个几何B的开始点,即几何A和几何B有几何节点重合。
---第二个三元组【3,2,2】,为SDO_ELEM_INFO属性元素三元组,它描述的是几何B。根据 图4可以得到它是一条曲线段,该几何B的起点和几何A终点节点重合。
SDO_ORDINATES = (10,10, 10,14, 6,10, 14,10);---坐标系列
例子:用SQL 命令插入一个复杂多义线:
INSERT INTO beniy388 VALUES(
11, //其他的属性字段的值
'UpDooGIS', //其他的属性字段的值
MDSYS.SDO_GEOMETRY( //几何字段SDO_GEOMETRY的值
2002,
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,4,2, 1,2,1, 3,2,2), -- 复杂多义线
MDSYS.SDO_ORDINATE_ARRAY(10,10, 10,14, 6,10, 14,10)
)
);
相关推荐
从ArcGIS 9.3版本开始,ArcSDE Geodatabase在Oracle环境下默认使用ST_Geometry来存储空间数据。 ST_Geometry的数据类型允许用户通过标准的SQL语句直接存储、检索和操纵空间数据,无需使用专业的GIS软件。这意味着,...
《DayDreamInGIS_Geometry地块分割调整工具》是一款基于ArcGIS平台的专业地理信息系统软件工具,主要用于土地利用规划和管理中的地块分割与调整工作。在城市规划、土地资源管理、房地产开发等领域,这款工具能够极大...
ST_Geometry是空间索引的一个核心类型,它用于提高空间查询的效率。在Geodatabase中,还可以使用ST_POLYGON、ST_ASTEXT、ST_INTERSECTS和ST_BUFFER等函数和操作符进行空间数据分析。 在Geodatabase的操作中,还涉及...
ST-Geometry是地理信息系统(GIS)领域中的一种重要的数据类型,由Esri公司开发并用于其ArcGIS平台。它主要用于存储和操作空间几何对象,如点、线、面以及更复杂的几何体。在GIS中,这些几何对象代表了地球表面的...
其次,ArcGIS for Java支持多种数据格式,如Shapefile、Geodatabase、WMS、WFS等,这使得开发者可以从不同来源获取和处理地理数据。通过DataFrame,开发者可以将不同来源的数据整合到同一视图中,实现多源数据的融合...
1. 引入ArcObjects库:在C#项目中,我们需要引用Esri.ArcGIS.ADF Desktop和Esri.ArcGIS.Geometry等ArcObjects相关的DLL文件,这些库包含了ArcGIS的核心功能。 2. 创建ArcGIS工程:设置解决方案,创建桌面应用程序或...
- FeatureLayer:展示地理要素的图层,通常来自Geodatabase或Feature Service。 - Geometry Service:用于执行几何操作,如缓冲区、投影转换等。 2. **API结构** - dojo.js:JavaScript库,提供异步模块加载...
3D Analyst\Animation\Carto \Visual JavaBeans \File Data Sources \Geodatabase Data Sources \NetCDF Data Sources \Object Linking and Embeding DB Data Sources \Raster Data Sources \Display \ArcGIS Engine...
ESRI ArcGIS Geometry IPoint point new ESRI ArcGIS Geometry PointClass ; point PutCoords e mapX e mapY ; ESRI ArcGIS Geodatabase ISpatialFilter spatialFilter new ESRI ArcGIS Geodatabase ...
同时,需要将 st_geometry.so 文件从 ArcGIS for Desktop 安装目录或者 ArcGIS for Server 安装目录中复制到 $PGHOME/lib/postgresql/ 目录下,并确保 sde 用户对 st_geometry.so 拥有 755 权限。 在创建 SDE ...
1. **读取Shapefile**:首先,需要使用ArcObjects中的`ESRI.ArcGIS.Geometry`和`ESRI.ArcGIS.DataSourcesShapefile`命名空间来加载和解析Shapefile。这包括创建一个`ShapefileWorkspaceFactory`对象来打开Shapefile...
ArcGIS Engine的核心是其强大的地图对象模型,包括Map、Layer、FeatureClass、Geometry等一系列对象,它们代表了GIS的基本元素,如地图、图层、要素类和几何对象。通过操作这些对象,开发者可以实现地图的显示、...
为了实现以上功能,你需要对ArcGIS Engine的API有深入理解,包括Geodatabase、Layer、FeatureClass、Geometry等核心概念。同时,熟悉C#编程语言和Windows Forms或WPF框架也非常重要。 总的来说,这个初学者实例代码...
ArcGIS Server 支持多种类型的服务,包括但不限于地图服务(Map Services)、地理数据库服务(Geodatabase Services)、地理编码服务(Geocoding Services)等。 **1.3.2 服务与资源的关系** 每个服务都包含一系列的资源...
2. **GIS对象模型**:ArcGIS Engine的类库构建了一个复杂的对象模型,包括Map、Layer、FeatureClass、Geometry等核心对象,理解这些对象之间的关系及其属性和方法是开发的基础。 3. **地图创建与管理**:通过Map...
using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.SystemUI; // 创建地图控件 IMapControl3 mapControl = new MapControlClass(); mapControl.CreateHook(handle); // 加载地图文档...
需要拷贝 st_geometry.dll 文件到 PostgreSQL 的 lib 目录。在 PostgreSQL 中创建 Geodatabase 时必须用到此类库。 五、配置 pg_hba.conf 文件 需要修改 PostgreSQ 的 pg_hba.conf 文件,添加“host all all 0.0....
1. 数据读取与写入:支持多种GIS数据格式,如Shapefile、Geodatabase等,通过FeatureClass和Table类进行数据操作。 2. 地图操作:使用MapControl的ZoomIn、ZoomOut、Pan等方法实现地图的交互操作。 3. 查询与筛选:...
1. **ArcGIS Engine简介** ArcGIS Engine是一个组件式开发平台,它提供了大量的GIS功能,包括地图显示、数据编辑、空间分析等。开发者可以利用.NET、Java或其他支持的语言,将这些组件集成到自定义的应用程序中,为...