2012-04-25 7 views
4

J'ai une table avec une seule colonne de type geometry, contenant des polygones. Comment puis-je obtenir l'union de tous les polygones dans le tableau?SQL: Union de polygones

+0

Pourriez-vous s'il vous plaît nous envoyer aussi un échantillon de ce qui est dans quelques lignes de tables yoru? Il est frustrant d'entendre parler de la géométrie et de ne même pas voir un seul nom de forme mentionné. –

+1

Que voulez-vous dire par «l'union de tous les polygones»? Voulez-vous le plus petit polygone unique qui entoure tous les polygones de votre table? – MatBailie

+0

@SkippyFastol Je ne suis pas sûr que coller quelques lignes de géométrie codées au format WKB, chacune d'une longueur de milliers d'octets, clarifierait tout. – Imp

Répondre

4

Cela a fonctionné pour moi:

CREATE TABLE #g (i INT IDENTITY, a geometry) 
INSERT INTO #g (a) 
VALUES 
    (geometry::STGeomFromText(
     'POLYGON((0 0, 3 0, 3 3, 0 3, 0 0))', 0) 
    ), 
    (geometry::STGeomFromText(
     'POLYGON((5 2, 7 2, 7 0, 5 0, 5 2))', 0) 
    ) 

DECLARE @g geometry 
SELECT TOP 1 @g = a FROM [#g] 
SELECT @g = @g.STUnion(a) FROM #g 

SELECT @g 

Donc, apparemment, la méthode STUnion retourne null lorsque l'instance sur lequel il est appelé ou l'opérande est nulle, d'où la select top 1 hack.

+0

Eh bien, désolé pour le retard. C'est ce que je voulais, merci beaucoup :) – Imp

-2

SELECT DISTINCT geometry from [your table]?

+0

En ce qui concerne, votre suggestion est fausse pour plusieurs raisons: les données géométriques ne sont pas comparables donc ne peuvent pas être utilisées avec DISTINCT. Et, même si cela était possible, tout ce que vous obtiendriez de cette requête serait un ensemble de géométries individuelles - il n'y a rien ici qui tente de créer une union d'entre eux. –

+0

@AlastairAitchison: En effet. Toutes mes excuses pour cette fausse suggestion. –

0

vous dire, si vous avez 2 places, permet de dire

(0 0 , 1 0 , 0 1 , 1 1) 

et

(1 0 , 1 1 , 2 0 , 2 1) 

vous vous retrouvez avec un rectangle:

(0 0, 2 0 ,0 1, 2 1) 

Si oui, essayez le GPC (Bibliothèque General Polygon Clipper)

This lien peut également vous aider à

12

Dans SQL Server 2012:

SELECT geometry::UnionAggregate(geomcolumn) FROM YourTable; 

Dans SQL Server 2008/R2:

DECLARE @g = geometry::STGeomFromText('GEOMETRYCOLLECTION EMPTY', YourSRID); 
SELECT @g = @g.STUnion(geomcolum) FROM YourTable; 
+0

Merci, ça fonctionne bien :) Mais c'est juste si l'acceptation va à la collègue qui a répondu plus tôt;) – Imp

+3

En fait, @imp, j'accepterais celle-ci. Vous avez ma permission de prendre des points Internet imaginaires loin de moi et de les donner à cette réponse. :) –