2010-07-20 13 views
11

Para aclarar por adelantado: estoy hablando de la geometría de unión, no de la palabra clave SQL UNION.Unión de toda la geometría en una tabla de SQL Server como GeomUnion en Postgres

Estoy intentando mover algunos datos espaciales de PostgreSQL con PostGIS a SQL Server 2008. Estaba bien hasta que vi una declaración como esta:

SELECT GeomUnion(the_geom) FROM some_table 

Este uniones toda la geometría de esa columna y devolverlo como un resultado (similar a cómo funciona COUNT). Hasta donde sé, SQL Server solo tiene la función STUnion, que une una geometría con otra. ¿Hay alguna manera de hacer algo similar a la forma de Postgres?

Si ayuda, la función STUnion funciona así:

SELECT first_geometry_column.STUnion(second_geometry_column) FROM some_table 
+1

Descargo de responsabilidad: No he trabajado con datos espaciales :). ¿No puede usar la expresión de tabla común y STUnion en combinación para obtener la funcionalidad GeomUnion deseada? –

Respuesta

9

La forma en que terminé haciendo esto es con variables:

DECLARE @Shape GEOMETRY 
SET @Shape = GEOMETRY::STGeomFromText('GEOMETRYCOLLECTION EMPTY', @MySrid) 

SELECT @Shape = @Shape.STUnion(Shape) 
    FROM MyShapeTable 

No es tan bonito, pero funciona.

+3

Y se vuelve * realmente * costoso para más de un puñado de geometrías. –

5

Su mejor opción es crear una función CLR para admitir el agregado. Hay un par de soluciones existentes:

+0

Está en lo correcto: esa es la mejor opción para SQL 2008 pero es muy lenta y causa pequeños errores de geometría. Afortunadamente, SQL2012 es muy rápido y no tiene problemas de geometría. MS ha declarado que no van a solucionar los problemas de geometría en SQL2008. – Damien

9

es la función única SQL2012 UnionAggregate?

SELECT geography::UnionAggregate(geometry) FROM some_table 

Hmm guess so. http://technet.microsoft.com/en-us/library/ff929095.aspx

+0

Gracias por la información. Ahorro mucho tiempo! FYI: Para datos de geometría, es geometría :: UnionAggregate (geometría). –

+0

Esta es absolutamente la respuesta a la pregunta original, para SQL 2012 y posteriores. – mdisibio

Cuestiones relacionadas