Aller au contenu | Aller au menu | Aller à la recherche

WebWorkers, OpenLayers et JSTS Topology Suite

Commençons par présenter le dernier élément cité. JSTS Topology Suite est une bibliothèque de prédicats spatiaux et de fonctions de traitement géométriques conforme à la spécification Simple Feature for SQL publiée par l'Open Geospatial Consortium en JavaScript . C'est aussi un portage de la bibliothèque en Java, JTS Topology Suite, pour qu'il soit compatible avec OpenLayers. D'ailleurs les classes Geometry sont en fait des extensions des classes OpenLayers.Geometry avec une API aussi proche que possible de celle de la version Java, JTS Topology Suite.

Pour la petite histoire, le prix Sol Katz 2011 a été remis au développeur principal de la JTS Topology Suite, Martin Davis, au cours des FOSS4G 2011

Autre aparté, la bibliothèque GEOS, que l'on retrouve dans de nombreux logiciels Open Source SIG (PostGIS, QGIS, etc), est aussi un portage de JTS Topology Suite mais en C

Donc JSTS est une bibliothèque de fonctions qui permet de réaliser des traitements sur des géométries comme par exemple un buffer, des intersections, etc. Des exemples sont d'ailleurs fourni :

Ces traitements se font dans le même environnement d'exécution que tout ce qui gère l'affichage. Cela signifie que si le traitement est long, l'interface risque de se figer. Afin de remédier à ce genre de problème le W3C a planché sur une API permettant d'exécuter du code JavaScript dans un autre contexte que celui de l'affichage. C'est les Web Workers.

J'ai donc décidé d'essayer d'exploiter JSTS à l'aide de Web Workers. Pour cela il me fallait vérifier la compatibilité des scripts avec un environnement Web Workers, c'est à dire un environnement d'exécution sans objet window ni document :

  • OpenLayers est fortement dépendant de window et document
  • javascript.util.js fait référence une fois à window
  • jsts.js ne présente aucune dépendance à window ou document

Donc OpenLayers en l'état n'est pas utilisable dans un Web Worker ni une version alléger minimisant les besoins à window ou document. Mais j'avais déjà rencontrer ce problème pour le ZOO-project qui permet l'exécution de code JavaScript côté serveur. J'avais donc écrit une adaptation d'OpenLayers à un environnement dépourvu d'objet window et document. J'ai donc réutiliser ce code qui décrit un objet ZOO de la façon suivante :

importScripts('zoo-api.js');
var OpenLayers = ZOO;
OpenLayers.Feature.Vector = ZOO.Feature;

Avec cette astuce, une légère amélioration de l'objet ZOO et l'adaptation de javascript.util.js, j'ai pu utiliser JSTS Topology Suite dans un Web Worker. Dont voici un exemple :

Commentaires

1. Le lundi 3 octobre 2011, 15:56 par Nicolas Moyroud

Impressionnant le résultat ! L'adaptation d'OpenLayers a demandé beaucoup de travail ?

La discussion continue ailleurs

1. Le lundi 26 septembre 2011, 10:27 par relucblog

relucblog's status on Monday, 26-Sep-11 08:27:41 UTC

WebWorkers, OpenLayers et JSTS Topology Suite http://ur1.ca/573dw !OSGeo