2011-11-16 65 views
4

我正在使用SQL Server 2008和Geometry数据类型来存储从Ordanance Survey STRATEGI数据集中导入的英国道路列表。如何将多个LineString行组合到单个行集合中

每条道路被分成多行,每行包含一行(A Linestring由一个段组成)。例如在A369是由18条独立的线路,如下面的图所示:

Screen capture of current linestrings

我今天准备这样做,收集含道路的部分全部单独的行,并创建一个新的将所有组合的单独行保存为一个线串的行。

换句话说,运行代码SELECT * FROM Structure WHERE Name = 'A369'将只返回一行,但仍然绘制出上图中看到的道路。

+2

有一个关于这个讨论在这里: http://stackoverflow.com/questions/3293190/union-all-geometry-in-as ql-server-table-like-geomunion-in-postgres – Mikpa

+0

一直在寻找这个,但我看不到任何其他(好)的方式,添加一个CLR函数。 – Asken

回答

6

只需使用.STUnion

BEGIN 
-- create a test table 
DECLARE @test TABLE(seg GEOMETRY); 
INSERT INTO @test VALUES(geometry::STGeomFromText('LINESTRING (0 0, 50 100)', 0)) 
INSERT INTO @test VALUES(geometry::STGeomFromText('LINESTRING (50 100, 100 200)', 0)) 
INSERT INTO @test VALUES(geometry::STGeomFromText('LINESTRING (100 200, 150 300)', 0)) 
--SELECT seg.STAsText() FROM @test 
DECLARE @geom GEOMETRY 
SELECT @geom = (SELECT TOP 1 seg FROM @test) 
-- union all the linestring points 
SELECT @geom = @geom.STUnion([seg]) FROM @test 
-- do what you want with the results 
SELECT @geom 
print(@geom.STAsText()) 
END 
2

在SQL 2012,您可以使用UnionAggregate

SELECT geometry::UnionAggregate(shape) FROM Table 

,或者如果你有一个地理列

SELECT geography ::UnionAggregate(shape) FROM Table 
相关问题