jeudi 13 octobre 2005
Depuis la version 4.1 MySQL supporte l’extension SQL OpenGIS. Cette spécification permet de travailler sur des données géométriques et cartographiques. L’implémentation partielle de MySQL se limite actuelment à la 2D. Cette extension permet de faire des calculs de distance et ensemblistes sur des ensembles de dimension 0, 1 et 2. La spécification OpenGIS définit les éléments géométriques sous formes de classes non toutes instanciables (point, line, polygon, ...).
Les donnes spatiales sont traitées à l’aide de r-tree (arbre de rectangles, variante des arbres binaires). Les rectangles sont les rectangles englobants des figures géométriques (minimal bounding rectangles, bounding box). Ensuite les rectangles sont groupés deux par deux en fonction de leurs proximités dans un nouveau rectangle englobant ; et ainsi de suite jusqu’à n’avoir plus qu’un seul rectangle. En SQL cela se traduit par des index de type SPATIAL KEY sur des champs de type géométriques : POINT, LINESTRING, ....
Pour éclairer cela, voici un exemple simple qui associ les frontières d’un pays sous forme d’un polygone à son nom :
CREATE TABLE pays ( nom VARCHAR(255) NOT NULL, frontiere LINESTRING NOT NULL, PRIMARY KEY(nom), SPATIAL KEY(frontiere) ) ;
Il s’agit en suite de stoker les pays dans la base de donnes :
INSERT INTO pays SET nom="Navarre", frontiere=GeomFromText("Polygon((1.967222 45.8625,1.966389 45.858055,1.966944 45.854443,1.9675 45.850555, ... ,1.967222 45.8625))") ;
INSERT INTO pays SET nom="Atlantide", frontiere=GeomFromText("Polygon((4.380556 43.630833,4.379722 43.62722,4.3775 43.62389, ... ,4.380556 43.630833))") ;
On peut maintement faire des requêtes SQL sur notre base de donnes : Dans quel pays est le point 2°est, 45°nord :
SELECT nom FROM pays WHERE CONTAINS(frontiere,GeomFromText("Point(2 45)")) ;
Ou détecter d’éventuels problèmes frontallier, des pays s’intersectent ils ?
SELECT pays.nom, pays2.nom FROM pays, pays AS pays2 WHERE INTERSECTS(pays.frontiere,pays2.frontiere) and pays.nom !=pays2.nom ;
Réf :