Con las funciones espaciales de SQL2008, ¿cómo puedo generar un polígono que contenga los resultados de una agregación?
-
06-07-2019 - |
Pregunta
Tengo una tabla de puntos, cada uno con un nombre, latitud, longitud y un código de área. Lo que me gustaría hacer es realizar una agregación (es decir, una cláusula `` agrupar por '') y devolver un polígono que contenga todos los puntos para un código de área en particular.
Estoy luchando un poco para incluso encontrar si hay agregaciones integradas para los tipos de datos de geografía, y mucho menos para darme el polígono delimitador
En aras de la discusión, supongamos que tengo una tabla que se parece un poco a:
+---------+------+---------+---------+ | Name | Area | Lat | Long | +---------+------+---------+---------+ | Ipswich | A | 52.053 | 1.156 | | Luton | A | 51.8717 | -0.4246 | | Melton | A | 52.1064 | 1.3322 | | Didcot | B | 51.6024 | -1.2321 | | Oxford | B | 51.7486 | -1.265 | +---------+------+---------+---------+
(En realidad, el área más pequeña tiene 57 puntos y la más grande 626)
Solución
Si bien no hay una forma integrada de hacer esto, hay agregados disponibles como parte de las Herramientas espaciales Sql paquete CodePlex. Dependiendo exactamente de lo que desee, es posible que le interese usar el Agregado de cuadro de límites o el Agregado de unión seguido de una llamada a ConvexHull para obtener el polígono mínimo en lugar de un cuadro.
Otros consejos
Para los beneficios de cualquiera que haya llegado aquí y quiera ver el código que obtiene con (el increíble) Sql Herramientas espaciales :
DECLARE @points TABLE
(
Name VARCHAR(50),
Area CHAR(1),
Point GEOGRAPHY
)
INSERT INTO @points VALUES ('Ipswich', 'A', geography::STGeomFromText('POINT( 1.156 52.053 )', 4326))
INSERT INTO @points VALUES ('Luton', 'A', geography::STGeomFromText('POINT( -0.4246 51.8717 )', 4326))
INSERT INTO @points VALUES ('Melton', 'A', geography::STGeomFromText('POINT( 1.3322 52.1064 )', 4326))
INSERT INTO @points VALUES ('Didcot', 'B', geography::STGeomFromText('POINT( -1.2321 51.6024 )', 4326))
INSERT INTO @points VALUES ('Oxford', 'B', geography::STGeomFromText('POINT( -1.265 51.7486 )', 4326))
SELECT dbo.ConvexHullGeography(dbo.GeographyUnionAggregate(point)), 'red' as color, 1 as thickness
FROM @points
GROUP BY Area
Puede ver el resultado en GeoQuery2008 .