如何在SQL Server中使用STDifference?

时间:2013-12-02 14:49:07

标签: sql sql-server spatial

我有两张带空间多边形的表格。我想从这两个表中返回多边形之间的差异几何。 我试过了:

select  k.geom.STDifference(r.geometry) from table1 k, table2 r

它返回第一个和第二个表中的所有多边形,而不是差异。如何只返回差异?

2 个答案:

答案 0 :(得分:0)

您是否尝试区分table1table2中的所有对象?您的结果集将是table1中行table2中行数的行数,例如table1有10行,table2有20行,您将有200行(将每个几何与其他表中的所有几何进行比较)。

如果您想比较特定的几何图形,请在jointable1之间使用table2

我还建议您使用

select k.geom.STDifference(r.geom).ToString() from table1 k, table2 r

否则,您可能无法读取结果。 我在这里用这个例子来尝试:

create table table1 (geom geometry);
create table table2 (geom geometry);
insert into table1 (geom) 
  values (geometry::STGeomFromText('POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))', 0));
insert into table2 (geom) 
  values (geometry::STGeomFromText('POLYGON((1 1, 3 1, 3 3, 1 3, 1 1))', 0));
select k.geom.STDifference(r.geom).ToString() from table1 k, table2 r;

答案 1 :(得分:0)

--- 下面的代码为 table1 中与表 2 中的多边形相交的每个多边形提供了新的多边形。表 1 中不与表 2 相交的多边形显示为空,您可以稍后匹配上一个表(为了避免为每个差异创建单独的行,您需要将连接多边形地理/几何图形合并为一行---

SELECT
A.a_geom.STDifference(B.b_geom) AS c_geom
,A.a_geom.STDifference(B.b_geom).STArea() AS c_geom_area
,A.RowID
INTO [table3]
FROM [table1] AS A
FULL JOIN [table2] AS B
ON A.a_geom.STIntersects(B.b_geom)=1

--- 现在您需要在表 1 中包含不与表 2 中的多边形相交的多边形,您可以通过简单地将表 3 中的空行与表 1 复制/匹配来实现 ---

UPDATE [table3]
SET c_geom = B.a_geom
FROM [table 3] AS A
JOIN [table1] AS B
ON A.RowID = B.RowID
WHERE A.c_geom IS NULL