利用st_geometry进行图形叠加分析

首先看一下st_geometry进行图形叠加分析语句:sql

SELECT T.*
  FROM SOURCETABLE S, TARGETTABLE T
 WHERE (SDE.ST_INTERSECTS(T.SHAPE, S.SHAPE) = 1)
   AND (S.OBJECTID = 18133);


 /*  SDE.ST_INTERSECTS(T.SHAPE, S.SHAPE) = 1
 这里面的参数位置须要注意,目标表shape在前,原表shape在后,这样能加快查询速度
 主要看最后的查询条件(S.OBJECTID = 18133)
 假如这里的条件是(T.OBJECTID = 18133),
 那么就要反过来SDE.ST_INTERSECTS(S.SHAPE, T.SHAPE) = 1
 */

该语句表示的是SOURCETABLE 表中OBEJCTID=18133的图形数据与TARGETTABLE 表中全部的图形数据进行叠加,最终返回的是存在叠加目标表(TARGETTABLE )中的数据的全部字段。函数

在通常的需求中,叠加分析除了要返回目标表数据的一些字段外一般还要求返回叠加面积、叠加坐标,修改一下对应的sql:性能

SELECT SDE.ST_AREA(SDE.ST_TRANSFORM(S.SHAPE, 2)) SAREA, --分析图形数据面积
       SDE.ST_ASTEXT(SDE.ST_INTERSECTION(SDE.ST_TRANSFORM(T.SHAPE, 2),
                                         SDE.ST_TRANSFORM(S.SHAPE, 2))) OVERLAPCOORDS, --叠加坐标
       SDE.ST_AREA(SDE.ST_INTERSECTION(SDE.ST_TRANSFORM(T.SHAPE, 2),
                                       SDE.ST_TRANSFORM(S.SHAPE, 2))) OVERLAPAREA, --叠加面积
       T.*
  FROM SOURCETABLE S, TARGETTABLE T
 WHERE (SDE.ST_INTERSECTS(T.SHAPE, S.SHAPE) = 1)
   AND (S.OBJECTID = 18133);

上面讲的是两个表之间的叠加,固然能够传入一个WKT对某个表进行叠加分析,再来个sql:code

SELECT SDE.ST_AREA(SDE.ST_GEOMETRY('POLYGON ((3 3, 4 6, 5 3, 3 3))', 2)) SAREA,
       SDE.ST_ASTEXT(SDE.ST_INTERSECTION(SDE.ST_TRANSFORM(T.SHAPE, 2),
                                         SDE.ST_GEOMETRY('POLYGON ((3 3, 4 6, 5 3, 3 3))',
                                                         2))) OVERLAPCOORDS,
       SDE.ST_AREA(SDE.ST_INTERSECTION(SDE.ST_TRANSFORM(SHAPE, 3),
                                       SDE.ST_GEOMETRY('POLYGON ((3 3, 4 6, 5 3, 3 3))',
                                                       2))) OVERLAPAREA,
       T.*
  FROM TARGETTABLE T
 WHERE (SDE.ST_INTERSECTS(T.SHAPE,
                          SDE.ST_GEOMETRY('POLYGON ((3 3, 4 6, 5 3, 3 3))',
                                          2)) = 1);

利用这种语句能够直接传入WKT而后与TARGETTABLE表中的图形进行叠加分析,可是这样的分析有多是因为sql语句长度的限制致使没法执行。不过在使用程序(例如Java JDBC)执行这种sql语句通常是经过setClob之类的方法来赋值后执行就不会产生sql语句长度的问题,又可是经过setClob来赋值后执行对坐标比较多的图形的时候也会带来程序性能问题。因此这种分析最好经过先将要分析的图形存储到临时图形表中,而后经过两个表叠加进分析。对象

最后来一个直接经过sql存储一条图形数据的语句class

INSERT INTO GEOMETRYTABLE
  (OBJECTID, SHAPE)
VALUES
  (1, SDE.ST_GEOMETRY('POLYGON ((3 3, 4 6, 5 3, 3 3))', 2));

以上用到的st_geometry函数解释:sql语句

ST_GEOMETRY(wkt clob, srid integer):建立一个ST_GEOMETRY对象程序

ST_INTERSECTS(geometry, geometry):判断两个几何对象是否相交,返回1为相交方法

ST_TRANSFORM(geometry,srid):将二维 ST_Geometry 数据转换为空间参考 ID (SRID) 所指定的空间参考数据

ST_AREA(geometry) :面积量测

ST_ASTEXT(geometry) :获取几何对象的WKT,返回的是CLOB

ST_INTERSECTION(geometry, geometry) :获取两个几何对象相交的部分

其中空间参考SRID能够在SDE用户下的ST_SPATIAL_REFERENCES表中找到对应的坐标系。

相关文章
相关标签/搜索