首先看一下st_geometry进行图形叠加分析语句:
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))) OVERLAPAREA,--叠加面积 T.* FROM SOURCETABLE S,S.SHAPE) = 1) AND (S.OBJECTID = 18133);
上面讲的是两个表之间的叠加,当然可以传入一个WKT对某个表进行叠加分析,再来个sql:
SELECT SDE.ST_AREA(SDE.ST_GEOMETRY('POLYGON ((3 3,4 6,5 3,3 3))',SDE.ST_ASTEXT(SDE.ST_INTERSECTION(SDE.ST_TRANSFORM(T.SHAPE,SDE.ST_GEOMETRY('POLYGON ((3 3,SDE.ST_AREA(SDE.ST_INTERSECTION(SDE.ST_TRANSFORM(SHAPE,3),T.* FROM TARGETTABLE T WHERE (SDE.ST_INTERSECTS(T.SHAPE,2)) = 1);
利用这种语句可以直接传入WKT然后与TARGETTABLE表中的图形进行叠加分析,但是这样的分析有可能是由于sql语句长度的限制导致无法执行。不过在使用程序(例如Java JDBC)执行这种sql语句一般是通过setClob之类的方法来赋值后执行就不会产生sql语句长度的问题,又但是通过setClob来赋值后执行对坐标比较多的图形的时候也会带来程序性能问题。所以这种分析最好通过先将要分析的图形存储到临时图形表中,然后通过两个表叠加进分析。
最后来一个直接通过sql存储一条图形数据的语句
INSERT INTO GEOMETRYTABLE (OBJECTID,SHAPE) VALUES (1,2));
以上用到的st_geometry函数解释:
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表中找到对应的坐标系。