Automatisation d’une cartographie à partir d’un flux RSS (Partie 2)

Dans la première partie, on a vu comment automatiser la bancarisation des données géographiques à partir du flux RSS. Par la suite, on s’occupe de la diffusion cartographique des sites de l’UNESCO.

2. Cartographie des sites de l’UNESCO

Pour partager les données géographiques des sites de l’UNESCO, on utilise GeoServer, puis l’API d’OpenLayers nous permettra de construire une interface cartographique interactive sur internet.

2.1. Ajout des données du SGBD dans le serveur cartographique GeoServer

Dans cet article, GeoServer sert de passerelle entre le SGBD et l’interface cartographique. Après l’ajout d’un espace de travail, on paramètre un entrepôt de type PostGIS qui permet de publier les tables avec les géométries spatiales d’une base de données.

Lors de la publication, on délimite l’étendue de la donnée spatiale en choisissant la projection définie précédemment dans le SGBD. La prévisualisation de la couche SIG, par exemple en format GML, nous assure de la bonne publication de la couche “sites_unesco”.

http://localhost/geoserver/unesco/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=unesco:sites_unesco&maxFeatures=50

Il est aussi possible de charger les sites de l’UNESCO en WMS et/ou WFS dans QGIS comme le montre la figure 2 ci-après :

Figure 2 : Import des sites de l’UNESCO par le protocole WFS dans QGIS.

Pour chaque mise à jour des données dans PostgreSQL / PostGIS, la couche SIG est automatiquement modifiée dans GeoServer.

En aparté, le style de la couche n’est pas défini dans le serveur, cela nous permettra de découvrir une fonction dans OpenLayers pour créer des classes de valeurs liées aux données.

2.2. Interface cartographique avec OpenLayers

La couche SIG “sites_unesco” de l’espace de travail “unesco” est cartographiée grâce à OpenLayers. Le protocole WFS est pris en charge dans cet exemple comme source de données afin de pouvoir affecter une fonction de style au vecteur. Dans OpenLayers, la gestion des styles peut paraître assez complexe mais l’API offre une vaste possibilité de styliser les couches SIG, et notamment les vecteurs. Pour faire simple, il faut retenir qu’il est possible d’affecter un style global pour la couche ou un style propre pour les objets géographiques qui la composent. Dans ce dernier cas, cela permet d’établir des classes de valeurs attributaires des objets et aussi de modifier le style en fonction de la résolution géographique de la carte. Et pour cela, OpenLayers a construit une fonction associée à la classe ol.style. On y reviendra de manière plus approfondie dans un prochain article.

Ici, plutôt que d’utiliser un popup pour montrer certains attributs de l’objet géographique sélectionné sur la carte, le nom ainsi que la photo du site de l’UNESCO sont visibles à partir d’une certaine résolution. Et pour favoriser la lecture des données, les sites sont discriminés par couleur en fonction de leur catégorie (Cultural, Natural ou Mixed).

Dans le script, on commence par ajouter la source WFS puis la couche vectorielle associée à l’objet Map. Pour le style des objets, la classe étendue ol.style.Style nous sert à définir les caractéristiques des points ol.style.Circle grâce à l’option image. Cette option est aussi utilisée pour définir les icônes appelés avec ol.style.Icon et l’option text est aussi prise en compte pour labelliser les icônes. On définit deux styles : un style basique visible à une résolution élevée (> 500) et un style pour les icônes.

// Style du point
var styleBasic = new ol.style.Style({
	image: new ol.style.Circle({
		radius: 7,
		fill: new ol.style.Fill({
			color: '...'
		}),
		stroke: new ol.style.Stroke({
			color: '...',
			width: 3	  
		}),
	})
});
// Style de l'icône et du texte
var styleIcon = new ol.style.Style({
	image: new ol.style.Icon({
		anchor: [0.5, 100],
		anchorXUnits: 'fraction',
		anchorYUnits: 'pixels',
		src: '...', // lien vers l'icône
		scale: 1.3
	}),											
	text: new ol.style.Text({
		text: '...',
		font: 'bold 16px Times New Roman',
		offsetY: -15,
		fill: new ol.style.Fill({
			color: '...'
		}),
		stroke: new ol.style.Stroke({
			color: '...', 
			width: 5
		})
	}), 
});

Maintenant, on veut que les styles varient selon certaines valeurs des objets géographiques du vecteur, la fonction de style s’écrit :

// Déclaration des variables des couleurs de remplissage et de contour
var fillColor;
var strokeColor;
var fonctionStyle = function(feature, resolution){
	// On obtient les valeurs des objets géographiques
	var nomSite=feature.get('nom');
	var categorieSite=feature.get('categorie');
	var photoSite=feature.get('photo');
	// Mise en place de classe selon les catégories des sites
	if(categorieSite=="Natural"){
		fillColor='rgba(0, 255, 0, 0.3)';
		strokeColor='rgba(34, 121, 34, 1.0)';
	}else if(categorieSite=="Cultural"){
		fillColor='rgba(255, 0, 0, 0.3)';
		strokeColor='rgba(255, 0, 0, 1.0)';
	}else if(categorieSite=="Mixed"){
		fillColor='rgba(0, 0, 255, 0.3)';
		strokeColor='rgba(0, 0, 255, 1.0)';
	}
	var styleBasic = new ol.style.Style({
		image: new ol.style.Circle({
			radius: 7,
			fill: new ol.style.Fill({
				color: fillColor
			}),
			stroke: new ol.style.Stroke({
				color: strokeColor,
				width: 3	  
			}),
		})
	});
	var styleIcon = new ol.style.Style({
		image: new ol.style.Icon({
			anchor: [0.5, 100],
			anchorXUnits: 'fraction',
			anchorYUnits: 'pixels',
			src: photoSite,
			scale: 1.3
		}),											
		text: new ol.style.Text({
			text: nomSite,
			font: 'bold 16px Times New Roman',
			offsetY: -15,
			fill: new ol.style.Fill({
				color: '#fff'
			}),
			stroke: new ol.style.Stroke({
				color: strokeColor, 
				width: 5
			})
		}), 
	});
}

Puis, selon la résolution géographique, l’un des deux styles est pris en compte. Le script suivant est placé à la fin de la fonction :

if(resolution > 500){
	return [styleBasic];
}else{
	return [styleIcon];
}

La fonction fonctionStyle est enfin affectée au style de la couche vectorielle. Attention, la mise en place d’une fonction de style allonge le temps de chargement des objets géographiques.

La cartographie dynamique des sites de l’UNESCO et le script entier sont disponibles dans les exemples de webmapping (figure 3). Dans la démonstration, la couche SIG est un fichier GeoJSON, créé depuis PostgreSQL et seuls les 1064 sites localisés sur les 1073 bancarisés au jour de l’écriture de cet article sont exportés. Ce format de fichier est certes une source de données différente du protocole WFS présentée dans cet article mais cela ne modifie en rien la création du style dans OpenLayers pour les vecteurs.

Figure 3 : Variation de la représentation cartographique des sites de l’UNESCO en fonction de la catégorie du site et de la résolution de la carte.

On a donc créé l’interface de webmapping pour montrer les données géographiques au public. Je voulais finalement vous présenter une manière relativement simple de les diffuser en temps réel : le GeoRSS.

2.3. Diffusion des informations géographiques en GeoRSS

Il est possible de partager et de diffuser les données géographiques par d’autres méthodes qu’une interface cartographique et les protocoles HTTP WMS, WFS, WPS, etc. Le GeoRSS, de format XML, est un standard qui inclue des objets géographiques dans un flux RSS (points, lignes, etc). Deux éléments de standard ont été définis : le GeoRSS simple et le GeoRSS GML défini par l’Open Geospatial Consortium (OGC). On peut utiliser le GeoRSS simple comme une extension de RSS 1.0, 2.0 et Atom. Cette dernière extension est prise en charge par GeoServer pour diffuser le contenu des informations géographiques des couches SIG. Il suffit d’utiliser l’URL suivant en précisant l’espace de travail et la couche SIG souhaitée.

http://localhost/geoserver/wms/reflect?layers=unesco:sites_unesco&format=rss

Ce flux de données géographiques peut ensuite être directement implémenté dans d’autres cartographies dynamiques avec Google Maps par exemple. En aparté, vous l’aurez remarqué, le flux RSS mis en place par l’UNESCO ne correspond pas aux normes de diffusion de contenu géographique défini pour le GeoRSS.

En conclusion, la mise en place d’une architecture SIG avec des technologies Open Sources nous a montré comment gérer et partager des données géographiques de manière automatisée. A travers l’exemple des sites de l’UNESCO, la bancarisation, la mise à jour et la diffusion d’un jeu de données est possible grâce aux interactions des outils utilisés. L’objectif de cartographier des objets géographiques mis à jour automatiquement est atteint. La gestion du SIG par le géomaticien devient alors minime et il est donc possible de se consacrer à de nouvelles tâches. Toutes proportions gardées, quand on évoque l’automatisation, j’aime bien me souvenir de cette citation de Bill Gates : “I choose a lazy person to do a hard job. Because a lazy person will find an easy way to do it.“. Bien entendu, dans cet exemple, la conception du modèle est relativement simple due notamment à la faible quantité et diversité des données prises en charge.

Enfin, La principale limite est de s’assurer de la disponibilité de la source de données importées, aussi bien d’un point de vue technique que légal. Le bon fonctionnement de l’import est vérifié grâce aux logs alors que l’acquisition du jeu de données pose la question du droit d’utilisation et de diffusion des informations.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *