2011-11-16 3 views
4

J'utilise SQL Server 2008 et le type de données Geometry pour stocker une liste de routes du Royaume-Uni que j'ai importées du jeu de données Ordanance Survey STRATEGI.Comment combiner plusieurs lignes LineString dans une collection de lignes unique

Chaque route est divisée en plusieurs rangées qui contiennent chacune une seule ligne (A Linestring constituée d'un segment). Par exemple, le A369 est composé de 18 lignes séparées, comme le montre l'image ci-dessous:

Screen capture of current linestrings

Ce que je voudrais le faire recueillir toutes les parties séparées contenant des lignes d'une route et créer un nouveau rangée qui contient toutes les lignes individuelles combinées comme une ligne. En d'autres termes, l'exécution du code SELECT * FROM Structure WHERE Name = 'A369' retournerait une seule ligne, mais dessinerait toujours la route vue dans l'image ci-dessus.

+2

Il y a une discussion à ce sujet ici: http://stackoverflow.com/questions/3293190/union-all-geometry-in-as ql-server-table-like-geomunion-in-postgres – Mikpa

+0

Je l'ai cherché aussi mais je ne vois pas d'autre (bonne) façon d'ajouter une fonction CLR. – Asken

Répondre

6

utiliser juste .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

Dans SQL 2012 vous pouvez utiliser UnionAggregate

SELECT geometry::UnionAggregate(shape) FROM Table 

ou si vous avez une colonne de géographie

SELECT geography ::UnionAggregate(shape) FROM Table 
Questions connexes