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!