Con le funzioni spaziali SQL2008, come posso generare un poligono contenente i risultati di un'aggregazione
-
06-07-2019 - |
Domanda
Ho una tabella di punti, ognuno con un nome, latitudine, longitudine e un prefisso. Quello che mi piacerebbe fare è eseguire un'aggregazione (ovvero una clausola "raggruppa per") e restituire un poligono contenente tutti i punti per un particolare prefisso.
Faccio fatica anche a scoprire se esistono aggregazioni integrate per i tipi di dati geografici, figuriamoci per darmi il poligono di delimitazione
Per ragioni di argomento, supponiamo che io abbia una tabella che assomigli un po '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 | +---------+------+---------+---------+
(In realtà, l'area più piccola ha 57 punti e la più grande 626)
Soluzione
Anche se non esiste un modo integrato per farlo, ci sono aggregati disponibili come parte degli Sql Spatial Tools pacchetto CodePlex. A seconda esattamente di ciò che desideri, potresti essere interessato a utilizzare Bounding Box Aggregate o Union Aggregate seguito da una chiamata a ConvexHull per ottenere il poligono minimo anziché una casella.
Altri suggerimenti
Per i vantaggi di chiunque sia arrivato qui e voglia vedere il codice che ottieni (il fantastico) Sql Strumenti spaziali :
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
Puoi visualizzare il risultato in GeoQuery2008 .