X

Style GeoServer automatisé : exemple des cas de Coronavirus Covid-19

Sur le blog SIG, le suivi des cas de Coronavirus Covid-19 dans le monde a commencé en février 2020. Pour rappel, chaque jour, on importe les données par pays dans le SGBD PostgreSQL provenant du CSSE/JHU et de l’OMS. Puis, GeoServer permet de diffuser le protocole HTTP WMS sur l’interface de WebMapping. A l’origine, l’échelle de l’analyse thématique s’étalait d’un intervalle de 0 à plus de 5000 individus infectés par le virus. Et les chiffres des cas de Covid-19 demeuraient relativement faibles voire nuls pour certains pays. Puis, avec la propagation du virus, les cas n’ont cessé d’augmenter partout dans le monde. Ainsi, les intervalles choisis pour la représentation cartographique devinrent rapidement caduques. Aujourd’hui, la quasi-totalité des pays ont plus de 5000 cas avérés de Covid-19. Par conséquent, l’objectif est de faire évoluer le style GeoServer utilisé pour la légende selon les statistiques quotidiennes. Alors, comment automatiser un style GeoServer dynamique?

La première étape est de savoir comment représenter statistiquement les données spatialisées des cas atteints du Covid-19 par pays. Ensuite, on extrait ces statistiques afin de créer l’analyse thématique et les classes correspondantes. Enfin, un script prendra en charge l’API de GeoServer afin d’affecter le style à la couche SIG.

I. Symbologie graduée du style GeoServer

A ce jour, le 3 septembre 2020, l’OMS enregistre plus de 24 millions de cas confirmés de Coronavirus Covid-19 à travers le monde. Concernant les pays relayant leurs données à l’organisme mondial, le pays le plus touché est les États-Unis dénombrant plus de 6 millions de cas. Le Sénégal, quant à lui, enregistre moins de 15 000 personnes infectés par le virus. Comme ces chiffres le montrent, il existe une grande variation d’un pays à l’autre. D’un point de vue statistique, plusieurs solutions sont possibles pour représenter cette disparité quantitative sur une cartographie :

  • L’ensemble de l’échantillon peut être divisé par le nombre de classes souhaitées. Par conséquent, on obtiendra des classes avec des intervalles égaux.
  • Le nombre total de l’échantillon est séparé par quantiles. C’est-à-dire que dans chaque classe, on aura un nombre égal de population de l’échantillon, ici les cas de Coronavirus par pays.

Ces deux méthodes statistiques sont les plus utilisées pour réaliser l’analyse thématique quantitative. Pour les utilisateurs de QGIS (figure 1), d’autres modes de symbologie graduée existent afin de définir les classes comme les ruptures naturelles.

Figure 1 : QGIS : Modes d’élaboration des classes pour la Symbologie graduée.

Pour notre analyse thématique, on utilise le mode par quantile. En effet, il possède l’avantage d’élaborer une cartographie graphiquement plus homogène.

I.1. Statistiques PostgreSQL : Fonction NTILE

On se souvient que les données spatialisées du Coronavirus Covid-19 sont bancarisées dans PostgreSQL de manière journalière. L’objectif est de séparer le nombre des cas confirmés de Coronavirus par pays en plusieurs quantiles en langage SQL. Le SGBD offre de nombreuses fonctions utiles pour les statistiques. On peut citer les fonctions d’agrégat de PostgreSQL et les fonctions window.

PostgreSQL possède la fonction NTILE qui affecte à chaque donnée une valeur de 1 au nombre de classes voulues (valeur de ntile) en séparant les classes avec des partitions les plus égales possibles. La requête SQL suivante classe les pays par cas confirmés (confirmed) en six classes (NTILE(6)) avec un même nombre de pays par classe.

SELECT country,confirmed, NTILE(6) OVER( ORDER BY confirmed ) bucket FROM sante.coronavirus_countries_last

Ensuite, on obtient les valeurs minimales des cas confirmés (MIN(confirmed)) de chaque classe (bucket) par la sous-requête ci-après :

WITH subquery AS( SELECT country,confirmed, NTILE(6) OVER( ORDER BY confirmed ) bucket FROM sante.coronavirus_countries_last )
SELECT MIN(confirmed) confirmed_range,bucket FROM subquery GROUP BY bucket ORDER BY bucket

Dès lors, l’étape suivante consiste à préparer le fichier SLD du style GeoServer.

I.2. Ensemble de règles du style GeoServer

Dans cette section, on parle bien de préparation du fichier SLD. Ce dernier sera modifié chaque jour avec l’incorporation des nouvelles valeurs de classes issues de la base de données.

L’analyse thématique du fichier SLD se traduit par un ensemble de règles <Rule> basées sur les valeurs du champ attributaire. Ici, ce dernier est le champ confirmed identique à celui de la base de données. Le code suivant montre une règle composée d’un nom <Name>, d’un titre <Title>, du filtre des valeurs attributaires (ici, valeur 1, valeur 2) <ogc:Filter>, du symbole du polygone <PolygonSymbolizer> et celui du texte <TextSymbolizer>. Pour chaque classe de valeurs attributaires, on reproduit la règle.

<Rule>
  <Name>valeur 1 - valeur 2</Name>
  <Title>valeur 1 - valeur 2</Title>
  <ogc:Filter>
	<ogc:And>
	  <ogc:PropertyIsGreaterThanOrEqualTo>
		<ogc:PropertyName>confirmed</ogc:PropertyName>
		<ogc:Literal>valeur 1</ogc:Literal>
	  </ogc:PropertyIsGreaterThanOrEqualTo>
	  <ogc:PropertyIsLessThan>
		<ogc:PropertyName>confirmed</ogc:PropertyName>
		<ogc:Literal>valeur 2</ogc:Literal>
	  </ogc:PropertyIsLessThan>
	</ogc:And>
  </ogc:Filter>
  <PolygonSymbolizer>
	<Fill>
	  <CssParameter name="fill">#fba31a</CssParameter>
	</Fill>
  </PolygonSymbolizer>
  <TextSymbolizer>
   <Label>
	 <ogc:PropertyName>country</ogc:PropertyName>
	 (<ogc:PropertyName>confirmed</ogc:PropertyName>)
   </Label>
   <LabelPlacement>
	 <PointPlacement>
	   <AnchorPoint>
		 <AnchorPointX>0.5</AnchorPointX>
		 <AnchorPointY>0.5</AnchorPointY>
	   </AnchorPoint>
	 </PointPlacement>
   </LabelPlacement>
   <Halo>
	 <Radius>2</Radius>
	 <Fill>
	   <CssParameter name="fill">#FFFFFF</CssParameter>
	 </Fill>
   </Halo>
 </TextSymbolizer>
</Rule>

Une fois construit, un script implémente le remplacement des variables (valeur 1, valeur2, …) par les valeurs du champ confirmed issues de la base de données.

La figure 2 montre le résultat de l’aperçu de la légende des cas confirmés de Coronavirus Covid-19 dans GeoServer.

Figure 2 : GeoServer : Aperçu de la légende des cas confirmés de Coronavirus Covid-19.

Donc, le fichier de style SLD de GeoServer est prêt mais il faut l’affecter chaque jour à la couche SIG. Et, comme vous le devinez, on n’ira pas tous les jours sur le GUI du logiciel pour réaliser cette manipulation. On automatise alors ce procédé grâce à l’API de GeoServer.

II. Style GeoServer : utilisation de l’API Rest

Dans un précédent article, on a introduit succinctement l’API Rest de GeoServer par le listing des espaces de travail. Les logiciels PostMan ou encore Insomnia favorisent les tests rapides des requêtes HTTP.

II.1. API GeoServer pour les styles des couches SIG

L’API de GeoServer permet de réaliser de nombreuses opérations sur les styles. Par exemple, on liste l’ensemble des styles disponibles via la requête GET : { URL de GeoServer }/rest/styles.json .

Ici, le style SLD est déjà attribué à un espace de travail et à la couche SIG. Toutefois, à chaque fois que le contenu du fichier est modifié sans changer son nom, il faut de nouveau publier le style GeoServer à la donnée SIG.

Et pour cela, petite astuce, il ne faut pas utiliser l’API GeoServer utilisée pour les styles mais pour les couches layers. En s’assurant que le style donné est celui par défaut de la couche SIG, on utilise la requête PUT : { GEOSERVERHOST }/rest/layers/{Nom de l'espace de travail : Nom de la couche SIG} avec le body de format JSON (ou XML possible) de type :

{ "layer":{ "defaultStyle": { "name":"Nom du style"} } }

A titre d’illustration, La figure 3 montre la publication du style coronavirus_last pour la couche SIG sante:coronavirus_countries_last à partir du logiciel Insomnia.

Figure 3 : API GeoServer : Publication d’un style pour la couche SIG des cas de Coronavirus Covid-19

II.2. Automatisation du style GeoServer : Script Curl – PHP

Dans cette section, on construit le script Curl – PHP qui permet de publier le style à la couche SIG via l’API GeoServer. De plus, voici quelques observations :

  • L’URL utilisée est celle correspondante à l’API de GeoServer pour les layers;
  • Puis, on précise le type de requête PUT via l’option Curl CURLOPT_CUSTOMREQUEST;
  • L’objet JSON indiquant le nom du style GeoServer par défaut est posté grâce à l’option CURLOPT_POSTFIELDS.
    $json = '{ "layer":{ "defaultStyle": { "name":"Nom du style"} }';

    $url = "{ URL de GeoServer }/rest/layers/{ Nom de l'espace de travail : Nom de la couche SIG }";
    $ch = curl_init();
    $passwordStr = "Utilisateur : Mot de Passe"; 
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_USERPWD, $passwordStr);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
    curl_setopt($ch, CURLOPT_POSTFIELDS, $json );
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json','Accept: application/json'));
    $data = curl_exec($ch);
    var_dump($data);
    curl_close($ch);

Enfin, on automatise l’exécution de ce script après celle du script construisant le fichier SLD grâce à un crontab (ou planificateur de tâches pour Windows).

En conclusion, cet article du blog SIG a présenté l’automatisation de la publication d’un style GeoServer. Ainsi, l’utilisation de la fonction NTILE de PostgreSQL a permis d’extraire les valeurs des classes contenant un même nombre d’échantillon. Puis, on implémente cette symbologie graduée dans le fichier SLD de GeoServer grâce à un ensemble de règles. Enfin, on se sert de l’API pour publier le style GeoServer à la couche SIG. Par conséquent, la légende et la carte des cas confirmés de Coronavirus Covid-19 se met à jour quotidiennement et surtout …. automatiquement (figure 4).

Figure 4 : Représentation cartographique des cas confirmés de Coronavirus Covid-19.
Partager l'article
Florian Delahaye: Passionné de Géomatique
Related Post