Antes de SQL Denali no había funciones agregadas para «sumar» geografías o geometrías, por lo que teníamos que construir las nuestras ya sea con T-SQL o con .NET. El código en T-SQL era:

CREATE
FUNCTION GeoSum(@State char(2), @City varchar(100))

RETURNS
geometry

AS

BEGIN

      DECLARE @Geo geometry

 

      SELECT @Geo=coalesce(@Geo.STUnion(Geo), Geo)

      FROM ZipcodeTable

      WHERE
State=@State

            AND City=@City

      RETURN @Geo

END

El código en .NET para el método Accumulate de la función agregada de usuario es:

public void Accumulate(SqlGeography Value)

    {

        RunningGeo = RunningGeo.IsNull ? Value : RunningGeo.STUnion(Value);

    }

 

Pero ahora SQL Denali se incluyen 4 funciones agregadas: UnionAggregate, CollectionAggregate, ConvexHullAggregate y EnvelopeAggregate. La primera función UnionAggregate es la más simple de todas, y básicamente lo que hace es «juntar» en una sola geometría un grupo de geometrías. Así el siguiente comando:

select
PoligonoProduccion

from
DimEstructuraFinca.GeometriaGrupos

where
CodigoFinca=33000101;

 

Este comando genera 5 filas, cada una con un valor diferente, en nuestro caso con la geometría de un grupo de producción:

Si uso la UnionAggregate obtengo 1 sola fila con todas las áreas juntas:

select
geometry::UnionAggregate(PoligonoProduccion)

from
DimEstructuraFinca.GeometriaGrupos

where
CodigoFinca=33000101;

La función CollectionAggregate es muy parecida e incluso puede «engañar al ojo»:

select
geometry::CollectionAggregate(PoligonoProduccion)

from
DimEstructuraFinca.GeometriaGrupos

where
CodigoFinca=33000101;

 

La diferencia entre ambos resultados se puede estudiar mejor si usamos la función STNumGeometries para estudiar los resultados (alternativamente podríamos usar ToString para ver el contenido en formato texto):

select
‘UnionAggregate’,
geometry::UnionAggregate(PoligonoProduccion).STNumGeometries()

from
DimEstructuraFinca.GeometriaGrupos

where
CodigoFinca=33000101

UNION
ALL

select
‘CollectionAggregate’,
geometry::CollectionAggregate(PoligonoProduccion).STNumGeometries()

from
DimEstructuraFinca.GeometriaGrupos

where
CodigoFinca=33000101

Con los siguientes resultados:

UnionAggregate    14

CollectionAggregate    5

 

La función UnionAggregate solo «junta» las geometrías, mientras que CollectionAggregate «fusiona» las geometrías continuas internas por lo que el CollectionAggregate termina con menos objetos internos si estos están adyacentes.

Finalmente las funciones ConvexHullAggregate y EnvelopeAggregate, son la combinación de las funciones UnionAggregate y STConvexHull para el primer caso; y de UnionAggregate y STEnvelope para el segundo. Entonces el ConvexHullAggregate devuelve el polígono convexo más pequeño que contiene todas las geometrías agregadas y el EnvelopeAggregate retorna el rectángulo más pequeño que contiene las geometrías agregadas.

select
geometry::ConvexHullAggregate(PoligonoProduccion)

from
DimEstructuraFinca.GeometriaGrupos

where
CodigoFinca=33000101

select
geometry::EnvelopeAggregate(PoligonoProduccion)

from
DimEstructuraFinca.GeometriaGrupos

where
CodigoFinca=33000101

 

¡La adición de las funciones agregadas es definitivamente bienvenida!

 

SolidQ

SolidQ suministra servicios para plataformas Microsoft que le ayudan a diseñar, integrar y optimizar su utilización de datos