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:

Funciones Agregadas Espaciales: Denali

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

select
geometry::UnionAggregate(PoligonoProduccion)

from
DimEstructuraFinca.GeometriaGrupos

where
CodigoFinca=33000101;

Funciones Agregadas Espaciales: Denali

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

select
geometry::CollectionAggregate(PoligonoProduccion)

from
DimEstructuraFinca.GeometriaGrupos

where
CodigoFinca=33000101;

 

Funciones Agregadas Espaciales: Denali

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

Funciones Agregadas Espaciales: Denali

select
geometry::EnvelopeAggregate(PoligonoProduccion)

from
DimEstructuraFinca.GeometriaGrupos

where
CodigoFinca=33000101

Funciones Agregadas Espaciales: Denali

 

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

 

0 Shares:
Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

You May Also Like
Leer más

Super SSIS, tu nuevo superhéroe

¿Tus procesos ETL con SSIS rinder a niveles humanos? ¿Necesitas más velocidad, gestionar más datos, mejor performance? ¿No tienes tiempo de esperar al último hijo de Krypton para que ejecute tus DataFlow? En esta sesión veremos técnicas de optimización en entornos modernos (¡estamos en 2017!) para que lleves tus paquetes SSIS al siguiente nivel... ¡el nivel de los superhéroes!