将LineString添加到MultiLineString

时间:2009-02-24 20:15:39

标签: tsql sql-server-2008 spatial

使用SQLServer 2008,我试图将两个LineStrings转换为多个LineStrings(最好是MultiLineString),将它们部分地相互拆分。

L1 |---------------|
L2      |----|

=  |----|----|-----|

用通用术语思考我可以通过使用L1.STIntersection(L2)获得中心部分。我可以通过L1.STSymDifference(交叉点)获得另外两个部分。最后两个部分作为MultiLineString返回。

如何将第一个中心部分添加到此MultiLineString?

使用STUnion将导致单个合并的LineString,如L1。也许这就是问题,可以合并的MultiLineStrings应该总是合并吗?

1 个答案:

答案 0 :(得分:0)

我找不到任何能在SQL Server 2008中实现此功能的函数,但我对SQL Server 2008 sql函数也相对较新。

在处理SQL Server 2008时,我通常会检查PostGIS论坛&电子邮件列表,看看它是如何完成的(PostgreSQL-PostGIS已经存在了很长时间)。有人似乎有opposite problem这个似乎是你所追求的结果。

不幸的是,没有ST_LineMerge(或STLineMerge),所以你可能需要自己动手。

我不确定这些示例是否适用于所有情况(并且线串本身不按顺序排列):

select geometry::STGeomFromText(Replace(@g2.STSymDifference(@g1).ToString(),'))','),' + Replace(@g1.STIntersection(@g2).ToString(),'LINESTRING','') + ')'), @g1.STSrid).STAsText()

这是与实际线串数据相同的逻辑:

DECLARE @g1 geometry;
DECLARE @g2 geometry;
DECLARE @g3 geometry;

SET @g1 = geometry::STGeomFromText('LINESTRING(0 0, 0 20)', 0);
SET @g2 = geometry::STGeomFromText('LINESTRING(0 5, 0 10)', 0);

SELECT @g1.STIntersection(@g2).ToString();

SELECT @g1.STIntersection(@g2).STAsText();

SELECT @g2.STSymDifference(@g1).ToString();

select @g1.STIntersection(@g2).ToString();


SET @g3 = geometry::STGeomFromText(Replace(@g2.STSymDifference(@g1).ToString(),'))','),' + Replace(@g1.STIntersection(@g2).ToString(),'LINESTRING','') + ')'), @g1.STSrid);

select @g3.STAsText();