SQL Server 2008 : Ma démonstration des données spatiales en plénière des techdays le 12 février… (4/4)


image La deuxième partie de cette démonstration a été réalisée à l'aide d'une application adaptée à la France, à partir d'une idée de John O'Brien. Regis et moi avons passé quelques temps (mais au final pas plus de 2 jours) pour adapter ce code initial à notre besoin.

L'architecture peut être représentée par le schéma suivant :

image

La base de données utilisée ici est celle des communes de France (incluant les DOM-TOM) avec leurs coordonnées géographiques.

Virtual Earth n°1 : les préfectures en 2D puis en 3D

Les punaises bleues (ou oranges ci-après) correspondent donc à des données stockées dans SQL Server 2008 qui sont passées à Virtual Earth pour affichage. Cela permet de profiter du fond de cartes et des options de zoom et de 2D/3D offerts par Virtual Earth.

image

 

imageimage

imageimage

 

Virtual Earth n°2 : les communes dans un rayon de 30 km autour de Marseille...

Ensuite nous avons utilisés les 2 champs situés en bas de page pour sélectionner uniquement les communes situées dans un rayon de 30 km autour de Marseille.

L'utilisation d'une requête de ce type est évidente : cela peut par exemple être utilisé sur un site d'emploi pour proposer uniquement des annonces qui sont situées à moins de 30km de votre domicile.

Voici la procédure stockée qui est appelée pour sélectionner les communes à afficher (via un web service) :

ALTER PROCEDURE [dbo].[GetPostcodesFRV2]
    @km float, @mode int, @Dept varchar(2)
AS
BEGIN
    SET NOCOUNT ON;

IF (@mode = 1) -- By departement
BEGIN
    IF (@dept='0') -- All the prefectures
        SELECT    TOP 500
            cast ([code postal] as varchar) as Title,
            [Nom] as Description,
            [Geo] as [Location]
        FROM [dbo].[VillesFR] V, [Préfectures] P
        WHERE V.[code Insee] =P.[code Insee]
    ELSE  -- All cities in a dept
        SELECT TOP 500
            cast ([code postal] as varchar) as Title
        ,    [Nom] as Description
        ,    [Geo] as [Location]
        FROM [dbo].[VillesFR]
        WHERE [Code postal] >= cast (@Dept AS int)*1000
        AND [Code postal] < (cast (@Dept AS int)+1)*1000
END
ELSE IF (@mode = 2) -- By Circle around prefecture
BEGIN
    IF (@dept='0') -- Circles around all the prefectures ?
        SELECT    TOP 500
            cast ([code postal] as varchar) as Title,
            [Nom] as Description,
            [Geo] as [Location]
        FROM [dbo].[VillesFR] V, [Préfectures] P
        WHERE V.[code Insee] =P.[code Insee]
    ELSE  -- All cities around a prefecture
    BEGIN
        DECLARE @p geography;
        SET @p = (SELECT Geo
                    FROM [dbo].[VillesFR] V, [Préfectures] P
                    WHERE V.[code Insee] =P.[code Insee]
                    AND (cast (@Dept AS int)*1000)=
                        [Code postal]);
        SET @p= @p.STBuffer(@km*1000);       
        SELECT TOP 500
            cast ([code postal] as varchar) as Title
        ,    [Nom] as Description
        ,    [Geo] as [Location]
        FROM VillesFR
        WHERE Geo.STIntersects(@p) = 1;       
    END
END
END

Les résultats sont ici :

 

image

On peut également mettre en évidence des zones particulières (sous forme de polygones) :

 image

et y rattacher des affichettes et des liens vers d'autres sites :

image

Et pour finir en cliquant sur ces trois points, retour au palais des congrès de Paris :

 

image

 

 

 

Skip to main content