Utilisation du GeoSpatial dans SQL SERVER 2008 et interaction avec WP7 et Bing Maps – Partie1
Introduction
Avec l’amélioration des technologies et les nouvelles Interfaces Homme/Machine, il est intéressant de pouvoir présenter l’information sous une autre forme que la forme, historique, textuelle.
Dans cet article, l’objectif sera de présenter, de bout en bout, comment localiser géographiquement des données sur une carte à partir d’un mobile Windows Phone 7. Pour ce faire, nous utiliserons l’API Bing Maps pour Windows Phone 7.
En début d’année scolaire, j’ai rédigé un petit article. Et je n’ai jamais pris le temps de le publier. Voici chose faite avec cette première partie.
Où se trouvent les données géographiques ?
Pour les données géographiques, il existe plusieurs possibilités dépendantes en partie de votre besoin:
· Soit il s’agit d’une base de données métier, dans laquelle vous avez déjà des données géographiques au format texte. La plupart du temps, il s’agit de deux colonnes (Latitude et longitude) au format varchar. Il vous suffira donc de créer une colonne de type geography et de renseigner celle-ci à l’aide des colonnes textes en faisant une conversion. Les étapes nécessaires pour effectuer cette conversion sont présentées au chapitre Comment convertir ses latitudes/longitudes en type geography
· Soit il s’agit d’une base dans laquelle vous avez déjà des données géographiques, mais vous souhaitez pouvoir superposer à ces données des territoires par exemple. Ceci afin de mieux visualiser vos données sur des fonds de cartes notamment. Les étapes nécessaires pour réaliser ce besoin sont présentées au chapitre Comment importer des données géographiques externes?
Comment convertir ses latitudes/longitudes en type geography
Le système géodésique le plus utilisé dans le monde est le WGS 84 (World Geodesic System of 1984). Ce système permet de placer des coordonnées sur le globe terrestre. Pour qu’un point puisse être placé de façon présente en utilisant ce système, il doit avoir un format bien particulier.
L’exemple suivant part du principe que les coordonnées géographiques qui sont à notre disposition sont au format dit « décimal ».
Etape1 : Ajouter la colonne de type geography
ALTER TABLE [dbo].[AGENCE] ADD [Position_Geo] GEOGRAPHY
Etape 2 : Alimenter cette colonne
Dans la vraie vie, les latitudes et longitudes ne sont jamais toutes renseignées correctement. Il faut donc faire attention à ne pas prendre les champs NULL par exemple. Au-delà des données NULL, il faudra faire attention à tous les enregistrements pour lesquels il y a une faute de frappe, etc.…
Exemple de données telles qu’on peut les voir chez un client :
Pour cet exemple la requête permettant d’alimenter la colonne Position_Geo sera la suivante :
UPDATE [dbo].[AGENCE]
SET [POSITION_GEO] = geography::STPointFromText('POINT(' + CAST([LONGITUDE] AS VARCHAR(20)) + ' ' + CAST([LATITUDE] AS VARCHAR(20)) + ')', 4326)
where LONGITUDE is not null
and LONGITUDE <> ''
and LATITUDE is not null
and LATITUDE <> ''
and LATITUDE like '%.%'
and LONGITUDE like '%.%'
and LONGITUDE not like '%E9%'
and LONGITUDE not like '%''%'
and LONGITUDE not like '%°%'
and LATITUDE not like '%:%'
Dans cette requête la clause WHERE nous permet de ne sélectionner que les lignes dont les coordonnées sont:
· Différentes de NULL
· Différentes de vide
· Notées sous forme décimales et non DMS (Degrés Minutes Secondes). Si vous avez des coordonnées sous cette forme 43°16'56.70"N , 5°36'7.45"E, il faut alors les convertir préalablement au format « décimal » en appliquant la règle de calcul suivante :
Degrés + (Minutes / 60) + (Secondes / 3600) = Degrés sous forme décimale
Etape 3 : Le résultat
Notez que le format geography stocke les données sous forme binaire.
Comment importer des données géographiques externes?
Il existe un certain nombre de sources qui mettent à disposition des données géographiques sous forme de shapefile. Un shapefile est un format de fichier issu du monde des Systèmes d'Informations Géographiques (SIG) contenant toute l'information liée à la géométrie des objets décrits, qui peuvent être des points, des lignes ou des polygones.
Shape2SQL est un outil gratuit permettant d’importer facilement dans une base MS SQL Server 2008 ce type d’information géographique : http://www.sharpgis.net/page/Shape2SQL.aspx .
Pour réaliser cet article nous nous sommes basés sur un shapefile contenant des points d’intérêts (parc, zoo, restaurant,…). Ce shapefile peut être téléchargé depuis la page suivante : http://www.mapcruzin.com/free-france-arcgis-maps-shapefiles.htm. Les données ont été importées en utilisant l’outil Shape2SQL. La table issue de cet import est la suivante :
Une autre table a été créée pour les besoins de l’article : une table Type, qui contient l’ensemble des types de point d’intérêt possible.
CREATE TABLE [dbo].[Type](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Libelle] [varchar](100) NULL
) ON [PRIMARY]
INSERT INTO [dbo].[Type]
select distinct Type from dbo.PointInteret order by Type
Plusieurs sites mettent à disposition des ressources contenant différent type de données (géographiques, topographiques, etc…), parfois gratuitement. Mais ce n’est pas l’objet de cet article.
Autre exemple de ressource disponible, la carte du monde représentant les frontières des pays du globe : http://www.beginningspatial.com/world_borders_dataset . Cette fois-ci, c’est un fichier plat contenant les instructions SQL permettant de générer une table représentant les frontières de tous les pays du monde. Nous nous servirons de ces données dans notre exemple au chapitre Comment requêter les données géographiques ?
Comment requêter les données géographiques ?
Les types de données (lignes, points, polygones…)
Point : Un point est une représentation exacte, définie grâce à un X et un Y. Il peut également y avoir une élévation Z et une mesure M.
LineString : Segment représentant le chemin le plus court entre deux ou plusieurs points. Si le point de départ est le même que le point d’arrivée, on parle de « ring ».
Polygon : Forme géométrique fermée, possédant une aire. Un polygon peut être « creux » en son centre grâce au retranchement d’un autre polygone en son sein.
Collection : C’est similaire à une collection en .Net. Cela contient plusieurs instances des objets précités. Les collections MultiPolygon, MultiLineString et MultiPoint, elles, comme leur nom l’indique, ne peuvent contenir que des objets d’un type bien particulier.
Requêter
La requête suivante ramène tous les points d’intérêt de type zoo. On constate que les données géographiques sont stockées sous forme binaire et qu’on doit les convertir grâce aux fonctions existantes pour les rendre lisible.
select *, Position_Geo.STAsText() as WKT from PointInteret where type = 'zoo'
Outre la vue tabulaire, SSMS propose une vue du résultat sous forme spatiale. L’onglet « Spatial Results » permet donc de visualiser le résultat sous un rendu beaucoup plus fun et sexy qu’un tableau.
On peut également combiner les résultats de requêtes pour faire se superposer plusieurs résultats, à la manière de calques. Prenons par exemple la requête suivante, qui va permettre de visualiser les points d’intérêts de type zoo sur une carte géographique du monde délimitant les frontières.
SELECT Position_Geo.STAsText() AS WKT FROM PointInteret WHERE type = 'zoo'
UNION ALL
SELECT geog FROM World_Borders
Les fonctions natives
Nous ne pouvons pas toutes les citer et ce n’est pas le but, mais il existe nativement des fonctions permettant de manipuler ces données géographiques afin de réaliser des opérations de :
· Conversion (ex : STAsText())
· Agrégation (ex: STDijoint(),STContains())
· Mesure (ex: STDistance(), STLength())
Par exemple la requête suivante permet de récupérer la liste des cinq zoos les plus proches du zoo de la Barben :
SELECT top 5 *, Position_Geo.STAsText()AS WKT,
Position_Geo.STDistance((select Position_Geo.STAsText() from PointInteret where name = 'Zoo de la Barben')) AS Distance
FROM PointInteret
WHERE type = 'zoo'
and name <> 'Zoo de la Barben'
order by 7
Pour aller plus loin…
Bibliographie
Beginning Spatial with SQL Server 2008
Webographie
http://msdn.microsoft.com/en-us/library/bb933790.aspx
http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx
http://207.46.19.254/france/serveur/sql/donnees-geospatiales/donnees-geospatiales.mspx

