Avec les fonctions spatiales SQL2008, comment puis-je générer un polygone contenant les résultats d'une agrégation
-
06-07-2019 - |
Question
J'ai un tableau de points, chacun avec un nom, une latitude, une longitude et un indicatif régional. Ce que j'aimerais faire, c'est effectuer une agrégation (c'est-à-dire une clause "group by by") et renvoyer un polygone contenant tous les points d'un indicatif régional particulier.
J'ai du mal à trouver même s'il existe des agrégations intégrées pour les types de données géographiques, et encore moins à me donner le polygone englobant
Par souci d'argumentation, supposons que j'ai un tableau qui ressemble un peu à:
+---------+------+---------+---------+ | 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 réalité, la plus petite surface compte 57 points et la plus grande 626)
La solution
Bien qu’il n’existe pas de méthode intégrée, des agrégats sont disponibles dans les Outils spatiaux SQL. package CodePlex. En fonction de ce que vous voulez, vous voudrez peut-être utiliser l’agrégat Bounding Box ou l’agrégat Union, suivi d’un appel à ConvexHull pour obtenir le polygone minimum au lieu d’un encadré.
Autres conseils
Pour le bénéfice de tous ceux qui sont arrivés ici et veulent voir le code que vous obtenez avec (le génial) Sql Outils spatiaux :
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
Vous pouvez afficher le résultat dans GeoQuery2008 .