C#读取Oracle Spatial的sdo_geometry

oracle的sdo_geometry中内置get_wkt和get_wkb两个方法。

以数据库表geoms为例,此表中有id和geometry两列

try
            {
                OracleConnection con = new OracleConnection(conStr);
                OracleCommand cmd = new OracleCommand(@"SELECT sdo_geometry.get_wkt(geometry) FROM geoms WHERE id= 1902 ", con);
                con.Open();
                OracleDataReader read = cmd.ExecuteReader();
                if (read.Read())
                {
                    string geo = ((OracleClob)read.GetOracleValue(0)).Value;
                    MessageBox.Show(geo);
                }
            }
            catch (Exception ex)
            {
                throw;
            }

查询出的结果如下所示

POINT (113.3293658 23.14338586)

POLYGON ((5.0 1.0, 8.0 1.0, 8.0 6.0, 5.0 7.0, 5.0 1.0))

wkt和wkb介绍

wkt(OGC well-known text)和wkb(OGC well-known binary)是OGC制定的空间数据的组织规范,wkt是以文本形式描述,wkb是以二进制形式描述。
使用wkt和wkb能够很好到和其他系统进行数据交换,目前大部分支持空间数据存储的数据库构造空间数据都采用这两种方式。
wkt的组织结构如下:

Geometry type     Text description     Comment
ST_Point     'point empty'     empty point
ST_Point     'point z empty'     empty point with z-coordinate
ST_Point     'point m empty'     empty point with measure
ST_Point     'point zm empty'     empty point with z-coordinate and measure
ST_Point     'point ( 10.05 10.28 )'     point
ST_Point     'point z( 10.05 10.28 2.51 )'     point with z-coordinate
ST_Point     'point m( 10.05 10.28 4.72 )'     point with measure
ST_Point     'point zm(10.05 10.28 2.51 4.72 )'     point with z-coordinate and measure
ST_LineString     'linestring empty'     empty linestring
ST_LineString     'linestring z empty'     empty linestring with z-coordinates
ST_LineString     'linestring m empty'     empty linestring with measures
ST_LineString     'linestring zm empty'     empty linestring with z-coordinates and measures
ST_LineString     'linestring (10.05 10.28 , 20.95 20.89 )'     linestring
ST_LineString     'linestring z(10.05 10.28 3.09, 20.95 31.98 4.72, 21.98 29.80 3.51 )'     linestring with z-coordinates
ST_LineString     'linestring m(10.05 10.28 5.84, 20.95 31.98 9.01, 21.98 29.80 12.84 )'     linestring with measures
ST_LineString     'linestring zm(10.05 10.28 3.09 5.84, 20.95 31.98 4.72 9.01, 21.98 29.80 3.51 12.84)'     linestring with z-coordinates and measures
ST_Polygon     'polygon empty'     empty polygon
ST_Polygon     'polygon z empty'     empty polygon with z-coordinates
ST_Polygon     'polygon m empty'     empty polygon with measures
ST_Polygon     'polygon zm empty'     empty polygon with z-coordinates and measures
ST_Polygon     'polygon ((10 10, 10 20, 20 20, 20 15, 10 10))'     polygon
ST_Polygon     'polygon z((10 10 3, 10 20 3, 20 20 3, 20 15 4, 10 10 3))'     polygon with z-coordinates
ST_Polygon     'polygon m((10 10 8, 10 20 9, 20 20 9, 20 15 9, 10 10 8 ))'     polygon with measures
ST_Polygon     'polygon zm((10 10 3 8, 10 20 3 9, 20 20 3 9, 20 15 4 9, 10 10 3 8 ))'     polygon with z-coordinates and measures
ST_MultiPoint     'multipoint empty'     empty multipoint
ST_MultiPoint     'multipoint z empty'     empty multipoint with z-coordinates
ST_MultiPoint     'multipoint m empty'     empty multipoint with measures
ST_MultiPoint     'multipoint zm empty'     empty multipoint with z-coordinates and measures
ST_MultiPoint     'multipoint (10 10, 20 20)'     multipoint with two points
ST_MultiPoint     'multipoint z(10 10 2, 20 20 3)'     multipoint with z-coordinates
ST_MultiPoint     'multipoint m(10 10 4, 20 20 5)'     multipoint with measures
ST_MultiPoint     'multipoint zm(10 10 2 4, 20 20 3 5)'     multipoint with z-coordinates and measures
ST_MultiLineString     'multilinestring empty'     empty multilinestring
ST_MultiLineString     'multilinestring z empty'     empty multilinestring with z-coordinates
ST_MultiLineString     'multilinestring m empty'     empty multilinestring with measures
ST_MultiLineString     'multilinestring zm empty'     empty multilinestring with z-coordinates and measures
ST_MultiLineString     'multilinestring ((10.05 10.28 , 20.95 20.89 ),( 20.95 20.89, 31.92 21.45))'     multilinestring
ST_MultiLineString     'multilinestring z((10.05 10.28 3.4, 20.95 20.89 4.5),( 20.95 20.89 4.5, 31.92 21.45 3.6))'     multilinestring with z-coordinates
ST_MultiLineString     'multilinestring m((10.05 10.28 8.4, 20.95 20.89 9.5), (20.95 20.89 9.5, 31.92 21.45 8.6))'     multilinestring with measures
ST_MultiLineString     'multilinestring zm((10.05 10.28 3.4 8.4, 20.95 20.89 4.5 9.5), (20.95 20.89 4.5 9.5, 31.92 21.45 3.6 8.6))'     multilinestring with z-coordinates and measures
ST_MultiPolygon     'multipolygon empty'     empty multipolygon
ST_MultiPolygon     'multipolygon z empty'     empty multipolygon with z-coordinates
ST_MultiPolygon     'multipolygon m empty'     empty multipolygon with measures
ST_MultiPolygon     'multipolygon zm empty'     empty
ST_MultiPolygon     'multipolygon (((10 10, 10 20, 20 20, 20 15 , 10 10), (50 40, 50 50, 60 50, 60 40, 50 40)))'     multipolygon
ST_MultiPolygon     'multipolygon z(((10 10 7, 10 20 8, 20 20 7, 20 15 5, 10 10 7), (50 40 6, 50 50 6, 60 50 5, 60 40 6, 50 40 6)))'     multipolygon with z-coordinates
ST_MultiPolygon     'multipolygon m(((10 10 2, 10 20 3, 20 20 4, 20 15 5, 10 10 2), (50 40 7, 50 50 3, 60 50 4, 60 40 5, 50 40 7)))'     multipolygon with measures
ST_MultiPolygon     'multipolygon zm(((10 10 7 2, 10 20 8 3, 20 20 7 4, 20 15 5 5, 10 10 7 2), (50 40 6 7, 50 50 6 3, 60 50 5 4, 60 40 6 5, 50 40 6 7)))'     multipolygon with z-coordinates and measures


wkb的组织结构如下:
基本类型定义:
byte : 1 byte
uint32 : 32 bit unsigned integer  (4 bytes)
double : double precision number (8 bytes)
Building Blocks : Point, LinearRing
Point {
double x;
double y;
};
LinearRing   {
uint32 numPoints;
Point points[numPoints];
}
enum wkbGeometryType {      
wkbPoint = 1,
wkbLineString = 2,
wkbPolygon = 3,
wkbMultiPoint = 4,
wkbMultiLineString = 5,
wkbMultiPolygon = 6,
wkbGeometryCollection = 7
};
enum wkbByteOrder {
wkbXDR = 0,     Big Endian
wkbNDR = 1     Little Endian
};
WKBPoint {
byte    byteOrder;
uint32   wkbType;       1
Point    point;
}
WKBLineString {
byte    byteOrder;
uint32   wkbType;      2
uint32   numPoints;
Point    points[numPoints];
}
WKBPolygon {
byte    byteOrder;
uint32   wkbType;      3
uint32   numRings;
LinearRing  rings[numRings];
}
WKBMultiPoint {
byte    byteOrder;
uint32   wkbType;          4
uint32   num_wkbPoints;
WKBPoint   WKBPoints[num_wkbPoints];
}
WKBMultiLineString {
byte    byteOrder;
uint32   wkbType;      5
uint32   num_wkbLineStrings;
WKBLineString WKBLineStrings[num_wkbLineStrings];
}
wkbMultiPolygon {    
byte    byteOrder;       

uint32   wkbType;      6
uint32   num_wkbPolygons;
WKBPolygon  wkbPolygons[num_wkbPolygons];
}
WKBGeometry  {
union {
WKBPoint      point;
WKBLineString    linestring;
WKBPolygon     polygon;
WKBGeometryCollection collection;
WKBMultiPoint    mpoint;
WKBMultiLineString  mlinestring;
WKBMultiPolygon   mpolygon;
}
};
WKBGeometryCollection {
byte    byte_order;
uint32   wkbType;      7
uint32   num_wkbGeometries;
WKBGeometry  wkbGeometries[num_wkbGeometries]
}
下面是一个point(1,1) 使用WKB存储的例子:
0101000000000000000000F03F000000000000F03F
这个2进制流可以按照WKBPoint的结构进行拆分:
Byte order : 01
WKB type   : 01000000
X          : 000000000000F03F
Y          : 000000000000F03F
byte order要么为0,要么为1,0为使用little-endian编码(NDR),1为使用big-endian编码(XDR)。
WKB type 是几何类型,在wkbGeometryType中定义. 值为1-7,分别对应 Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, and GeometryCollection.
x,y为点的坐标值,为double类型。

sdo_geometry的详细介绍

在ArcGIS中通过SDE存储空间数据到Oracle中有多种存储方式,分别有:二进制Long Raw 、ESRI的ST_Geometry以及基于Oracle Spatial的SDO_Geometry等等。 <UpDooGIS原创>

      关于这几种方式的各自的优缺点不是主要的探讨的方向,这些我们可以通过ArcGIS中的ArcGIS Server Help得到相关的帮助。这里主要是学习关于基于Oracle Spatial的存储方式,通过这种存储方式几何列Shape的字段类型为mdsys.sde_geometry类型。

      Oracle Spatial定义的SDO_GEOMETRY类型为:
      CREATE TYPE sdo_geometry AS OBJECT (
                     SDO_GTYPE   NUMBER,  //前面字符串为字段名;后面字符串为字段类型
                     SDO_SRID    NUMBER,
                     SDO_POINT    SDO_POINT_TYPE,
                     SDO_ELEM_INFO    SDO_ELEM_INFO_ARRAY,
                     SDO_ORDINATES    SDO_ORDINATE_ARRAY);

      其中sdo_geometry AS OBJECT ,标识该类型为对象类型。开始我们可以想想它为ArcObjects中的Geometry对象(本来要素的shape字段中的对象就是 Geometry),而不要理解他是怎么样组织的。至于该类型中的SDO_POINT_TYPE、SDO_ELEM_INFO_ARRAY、 SDO_ORDINATE_ARRAY也是Oracle Spatial自定义的类型和 sdo_geometry 是一样的。

       现在对sdo_geometry 类型中的各个参数简单的介绍:

        1、SDO_GTYPE :表示要存储的几何类型,如点线面。它是通过 NUMBER类型来表达的;

        2、SDO_SRID :几何的空间参考坐标系,类型也为 NUMBER;

        3、SDO_POINT :如果几何类型点类型的话,就是存储点坐标,否则为空。oracle自定义的SDO_POINT_TYPE类型;

        4、SDO_ELEM_INFO :定义要如何理解SDO_ORDINATES中的坐标串的;

        5、SDO_ORDINATES :存储实际坐标的,以X、Y以及不同点之间都是逗号隔开;

        下面将详细介绍这些字段参数的含义

        一、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 表参考 图3

          

   

             三、 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,标识决定了元素坐标队列的翻译顺序。

          SDO_STARTING_OFFSET和SDO_ETYPE 表  如下图4:

         

           五、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)
                     )
        );

SDO_FILTER

格式:

    SDO_FILTER(geometry1, geometry2, params);

描述:

    通过空间索引,根据给定的几何要素检索出具有空间相互关系的空间对象。这里的空间关系是指两个几何不分离,即Non-disjoint。【disjoint:表示两个几何的边和内部都不相交】

    这个Sdo_Filter执行只是初始的空间过滤操作;二次的过滤操作将由SDO_RELATE操作子完成,它能确定空间对象的相交关系。

参数:

geometry1指需要查询表中几何列,该几何列务必已经建立空间索引。该列的数据类型为:MDSYS.SDO_GEOMETRY

geometry2它值的可以是表中的几何,也可以是具体的几何对象(包括关联的几何对象变量、通过SDO_GEOMETRY构造函数的几何对象)。该列的数据类型也为:MDSYS.SDO_GEOMETRY

params  决定操作子的行为。数据类型为VARCHAR2

params具体有以下几种:

querytype: 有效的查询类型有:WINDOWJOIN.。这是个必须的参数。

          querytype =’ WINDOW’建议大部分情况下是使用该参数的。WINDOW’表明查询将执行表中所有候选geometry1,与geometry2进行比较。也就是说WINDOW将单个geometry1和所有的geometry2进行空间关系操作,并比较是否满足空间关系。

          querytype =’ JOIN’很少用到。当你想比较该geometry1几何列和另外geometry2表中的几何列的话可使用JOIN。使用JOIN表明该geometry2必须建立的几何索引(具体参考使用说明)。

          idxtab1【可选】:如果存在多个空间索引表,它指的是geometry1空间索引表对应的表名。

idxtab2【可选】:如果存在多个空间索引表,它指的是geometry1空间索引表对应的表名。只有当querytype =’ JOIN’才可以使用该参数。

返回

表达式SDO_FILTER(arg1, arg2, arg3) = ‘TRUE’中的True表明两个几何空间关系为:不相离;否则为False

使用说明

这个SDO_FILTER操作子必须用在Where子句中,在sql语句中使用该格式:SDO_FILTER(arg1, arg2,arg3) = ‘TRUE’.

如果querytype =’ WINDOW’ geometry2可以来自一个表,也可以来自具体的几何对象(包括关联的几何对象变量、通过SDO_GEOMETRY构造函数的几何对象)。

1、如果2个或大于2geometry2几何将在SDO_FILTER中使用的话,geometry2将在from语句的第一个参数。

如果querytype =’ JOIN’

1geometry2必须来自于表;

2、为了更好的执行SQL语句,geometry1geometry2应该使用相同的空间索引类型(R树或者二叉树);如果是二叉树他们应该有相同的sdo_level值。geometry1geometry2不是相同的索引类型,geometry2将按照geometry1索引类型重新构建索引,这样SQL语句的性能就大打折扣。

如果geometry1geometry2是基于不同的坐标参考系统的话,为了   执行操作geometry2将被临时的转换为geometry1的坐标系统。

举例:

1、从Polygons表中选择出满足一定条件的GID。该条件为:选择出的GID对应的几何与query_polys表中GID=1的几何不相离。

SELECT A.gid

FROM Polygons A, query_polys B

WHERE B.gid = 1

AND SDO_FILTER(A.Geometry, B.Geometry, ’querytype = WINDOW’) = ’TRUE’;

///其中A.GeometryPolygons表几何列的列名

2、也是从Polygons表中选择出满足一定条件的GID。不过查询几何被存储到aGeom变量中。

Select A.Gid

FROM Polygons A

WHERE SDO_FILTER(A.Geometry, :aGeom, ’querytype=WINDOW’) = ’TRUE’;

3、也是从Polygons表中选择出满足一定条件的GID。查询几何为sdo_geometry构造函数构造的几何。

Select A.Gid

FROM Polygons A

WHERE SDO_FILTER(A.Geometry, mdsys.sdo_geometry(2003,NULL,NULL,

mdsys.sdo_elem_info_array(1,1003,3),

mdsys.sdo_ordinate_array(x1,y1,x2,y2)),

’querytype=WINDOW’) = ’TRUE’;

4、从Polygons表中选择出满足一定条件的GID,当Polygons表的候选几何与任意一个query_polys的几何对象不相离都将GID选择出。因为多个query_polys中的几何将涉及到(参考使用说明)geometry2将被放到from的第一个参数。

SELECT /*+ ORDERED */

A.gid

FROM query_polys B, polygons A

WHERE SDO_FILTER(A.Geometry, B.Geometry, ’querytype = WINDOW’) = ’TRUE’;

5、从Polygons表中选择出满足一定条件的GID,当Polygons表的候选几何与任意一个query_polys的几何对象不相离都将GID选择出。在这个例子中QUERY_POLYS.GEOMETRY几何列务必建立了空间索引。

SELECT A.gid

FROM Polygons A, query_polys B

WHERE

SDO_FILTER(A.Geometry, B.Geometry, ’querytype = JOIN’) = ’TRUE’;

 

SDO_RELATE

格式:

SDO_RELATE(geometry1, geometry2, params);

描述:

通过空间索引,根据给定的几何要素(如一个多边形)检索出与其有特殊空间关系的几何要素。这个空间关系包括九种:Touch, OVERLAPBDYDisjoint, OVERLAPBDYIntersect, Equal,Inside, CoveredBy, Contains, Covers, AnyInteract, On.。具体图形标识如下:

 

这个操作子相当于同时执行了第一步(SDO_FILTER的功能)和第二步过滤操作

参数和关键字:

geometry1指需要查询表中几何列,该几何列务必已经建立空间索引。该列的数据类型为:MDSYS.SDO_GEOMETRY

geometry2它值的可以是表中的几何,也可以是具体的几何对象(包括关联的几何对象变量、通过SDO_GEOMETRY构造函数的几何对象)。该列的数据类型也为:MDSYS.SDO_GEOMETRY

params 决定操作子的行为。数据类型为VARCHAR2

params具体有以下几种:

Mask:指定了空间关系。这是个必须的参数。有九种关系如上图所示,多种空间关系可以组合:例如:’mask=inside+touch’;

Querytype:可以参考SDO_FILTER中的介绍,在此不累赘。

idxtab1idxtab2 :可以参考SDO_FILTER中的介绍,在此不累赘。

返回

表达式SDO_RELATE(geometry1,geometry2, ’mask = <some_mask_val> ,querytype = <some_querytype>’) = ’TRUE’中的True是指两个几何对象满足<some_mask_val>条件。否则为Flase

举例:

这里的所有要求条件和SDO_FILTER例子一样

1、从Polygons表中选择出满足一定条件的GID。该条件为:选择出的GID对应的几何与query_polys表中GID=1的有任何相交关系。

SELECT A.gid

FROM Polygons A, query_polys B

WHERE B.gid = 1

AND SDO_RELATE(A.Geometry, B.Geometry,

’mask=ANYINTERACT querytype=WINDOW’) = ’TRUE’;

2、也是从Polygons表中选择出满足一定条件的GID。不过查询几何被存储到aGeom变量中。

Select A.Gid

FROM Polygons A

WHERE SDO_RELATE(A.Geometry, :aGeom, ’mask=ANYINTERACT querytype=WINDOW’)= ’TRUE’;

其他的例子里类似,这里也不累赘。

 

下面给出两个操作子结合的SQL语句

SELECT name boat_name //选择在定义矩形内的所有小船
FROM mylake t
WHERE feature_id = 12
AND SDO_FILTER(t.shape, mdsys.sdo_geometry(2003,NULL,NULL,
    mdsys.sdo_elem_info_array(1,1003,1),
    mdsys.sdo_ordinate_array(2,2, 5,2, 5,5, 2,5, 2,2)),
    'querytype=WINDOW') = 'TRUE'
AND SDO_RELATE(t.shape, mdsys.sdo_geometry(2003,NULL,NULL,
    mdsys.sdo_elem_info_array(1,1003,1),
    mdsys.sdo_ordinate_array(2,2, 5,2, 5,5, 2,5, 2,2)),
    'masktype=INSIDE querytype=WINDOW') = 'TRUE'

 

SDO_WITHIN_DISTANCE

格式:

SDO_WITHIN_DISTANCE(geometry1, aGeom, params);

描述:

通过空间索引,检索出距离给定几何对象(可以是具体的多边形、点等)的一定范围内的所有空间对象。

参数和关键字:

geometry1:一个表中几何列的列名。这列的几何对象如果是在给定对象aGeom的一定范围之内的话,将被检索出来。这个geometry1对应的几何列务必创建空间索引。

该列的数据类型为:MDSYS.SDO_GEOMETRY

aGeom:值根据这个对象和一定距离去检索geometry1。它可以是一个表的几何列(包含对象的变量),也可以是一个具体的几何对象(如通过SDO_GEOMETRY构造函数的几何对象)。

该列的数据类型为:MDSYS.SDO_GEOMETRY

PARAMS:决定操作子的行为。数据类型为VARCHAR2

params具体有以下几种:

         Distance:指距离长度,这是个必须的参数。如果指定过滤的几何有关联的参考坐标,这个距离的单位就是参考坐标的单位。数据类型为Number

         idxtab1:可以参考SDO_FILTER中的介绍,在此不累赘。

         Querytype:设置为’querytype=FILTER’将执行第一步过滤操作。如果querytype没有指定第一步和第二步过滤操作将执行(默认为该种情况)。数据类型为VARCHAR2

         Unit:指定距离单位。例如:unit=’KM’.具体的单位SDO_UNIT 值来之MDSYS.SDO_DIST_UNITS 表。数据类型为Number。默认的单位适合具体的数据关联的,例如数据是投影数据的话,单位为M.

返回

表达式SDO_WITHIN_DISTANCE(arg1, arg2, arg3) = ’TRUE’,为True将返回一定距离子内的所有要素。

举例:

1、得到距离矩形为10单位之内的所有POLYGONS几何的GID

SELECT A.GID

FROM POLYGONS A

WHERE

SDO_WITHIN_DISTANCE(A.Geometry, mdsys.sdo_geometry(2003,NULL,NULL,

mdsys.sdo_elem_info_array(1,1003,3),

mdsys.sdo_ordinate_array(x1,y1,x2,y2)),

’distance = 10’) = ’TRUE’;

2、得到距离 Query_PointsGID = 1对应的几何 10单位之内的所有POLYGONS几何的GID

SELECT A.GID

FROM POLYGONS A, Query_Points B

WHERE B.GID = 1 AND

SDO_WITHIN_DISTANCE(A.Geometry, B.Geometry, ’distance = 10’) = ’TRUE’;

参考以下文章

http://book.51cto.com/art/200910/157414.htm

http://blog.sina.com.cn/s/blog_00ccd2400101c2x8.html

http://www.cnblogs.com/upDOoGIS/archive/2009/05/20/1469871.html

http://www.cnblogs.com/upDOoGIS/archive/2009/05/31/1493115.html

原文地址:https://www.cnblogs.com/ZJ199012/p/3810164.html