1

使用 SQLServer 2008,我试图将两个 LineStrings 转换为多个 LineStrings(最好是 MultiLineStrings),方法是根据彼此部分拆分它们。

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

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

笼统地思考,我可以通过使用 L1.STIntersection(L2) 来获得中心部分。我可以使用 L1.STSymDifference(Intersection) 获得的另外两个部分。最后两个部分作为 MultiLineString 返回。

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

使用 STUnion 将产生一个合并的 LineString,如 L1。也许这就是问题所在,可以合并的 MultiLineStrings 应该总是被合并?

4

1 回答 1

0

我在 SQL Server 2008 中找不到任何可以完成此任务的函数,但我对 SQL Server 2008 sql 函数也比较陌生。

在处理 SQL Server 2008 时,我通常会查看 PostGIS 论坛和电子邮件列表,看看它是如何完成的(PostgreSQL-PostGIS 已经在这方面的时间更长了)。有人似乎有与此相反的问题,这似乎是您所追求的结果。

不幸的是,没有 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();
于 2009-03-16T16:54:29.370 回答