Con las funciones espaciales de SQL2008, ¿cómo puedo generar un polígono que contenga los resultados de una agregación?

StackOverflow https://stackoverflow.com/questions/1212297

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)

¿Fue útil?

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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top