SQL Server 2008 : Premiers pas avec les index spatiaux (type geography)
Dans SQL Server 2005 il y a déjà eu des prémices de manipulations de données géographiques (http://blogs.codes-sources.com/christian/archive/2007/04/04/sql-server-2005-spatial-index-ou-comment-requeter-des-points-dans-l-espace-geolocalisation-entre-autres.aspx), dans SQL Server 2008 le support devient complet en supportant non seulement les points, mais aussi des formes (polygones, polylignes, etc.).
A savoir le support de tout ce qui est spatial est décomposé en 2 parties : geometry (support de la géométrie sur plan), geography (support de la géométrie sur une sphère).
Prenons un exemple de table avec le type geography :
CREATE TABLE MaTable
(
Id int identity(1,1) primary key,
Localisation geography NOT NULL
)
Puis ensuite utilisons notre générateur de points :
DECLARE @var int
SET @var = 100000
WHILE (@var > 0)
BEGIN
INSERT INTO MaTable(localisation)
VALUES(geography::Point((RAND() * 180) - 90, (RAND() * 360) - 180, 4326))
SET @var -= 1
END
Le nombre 4326 est ici pour distinguer des types de points, imaginer que je peux travailler dans différents espaces ce qui me permet de les distinguer.
Et maintenant requêtons, qui habite à mois de 10km de chez moi ?
DECLARE @loc geography
SET @loc = geography::Point(48.834943,2.244349, 4326)
SELECT Id, localisation.STDistance(@loc) AS distance
FROM MaTable WHERE localisation.STDistance(@loc) < 10000
ORDER BY distance
Et pour améliorer la vitesse de la requête on y ajoute un petit index spatial :
CREATE SPATIAL INDEX Ix_spatial ON MaTable(localisation)
Le tour est joué, et comparez le temps avant et après :o)
Bonne localisation…
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :