Géoréférencement en ligne de commande avec #GDAL et l’assistance de #QGIS 2/2

Cet article fait suite à une première partie qui explique simplement comment faire le géoréférencement d’une image avec QGIS. Nous allons maintenant nous pencher sur la façon d’automatiser ce traitement.

 

NB : Sur Linux (testé sur Debian 8 et 9, Ubuntu 16 et « bash sur Ubuntu sur Windows« ) il vous faudra installer le paquet « gdal-bin »

Installation de GDAL
apt update && apt install gdal-bin

 

4. L’automatisation avec GDAL

Imaginons que nous voulons récupérer cette carte à intervalle régulier afin de l’afficher sur notre propre carte Leaflet par exemple. Il faut automatiser ce géoréférencement, et cela va se faire très simplement. Si vous n’avez pas fermé la fenêtre du géoréférenceur de QGIS, vous allez pouvoir directement générer le script GDAL en fonction de la configuration que nous avons faite. Si vous avez fermé la fenêtre du géoréférenceur, pas de panique, on la rouvre, on recharge l’image à référencer et ensuite on recharge les points de contrôle préalablement créé et enregistré : « Fichier » -> « Charger les points de contrôle ».

Pour afficher le script prégénéré : « Fichier » -> « Générer un script GDAL »

Tout simplement.

Une fenêtre s’affiche nous montrant les deux commandes permettant de géoréférencer notre image :

Script GDAL
gdal_translate -of GTiff -gcp 691.813 613.06 855600 5.49243e+06 -gcp 465.945 742.932 353248 5.22664e+06 -gcp 212.1 671.939 -199420 5.36922e+06 -gcp 63.5091 329.014 -526709 6.1124e+06 -gcp 432.238 103.998 282378 6.6373e+06 -gcp 720.407 261.108 916775 6.2693e+06 -gcp 606.139 468.838 662801 5.80123e+06 -gcp 419.46 448.713 253900 5.84789e+06 "france.png" "france_translate.png"
gdalwarp -r near -order 2 -co COMPRESS=NONE  "france_translate.png" "france_warp.tif"

 

On voit que la première ligne s’occupe d’attacher les points de contrôle à des coordonnées géographiques. La seconde ligne s’occupe de transformer et éventuellement déformer l’image pour correspondre aux points de contrôle.

En exécutant ces deux lignes, on aura le même résultat qu’en appuyant sur le bouton « Débuter le géoréférencement » (attention au chemin des fichiers cependant).

 

5. L’intégration dans Leaflet

Pour pouvoir intégrer notre image à une carte Leaflet, il reste encore quelques détails à régler. Tout d’abord notre image géoréférencée est au format Tiff. Il faut donc la convertir en PNG. On va utiliser l’utilitaire « convert » issu de « Imagemagick » (pour l’installer : apt-get update && apt-get install imagemagick)

Conversion de l'image TIF vers PNG
convert france_warp.tif france_warp_georef.png

 

Tant qu’on y’est on va essayer de supprimer ce fond gris pour le rendre transparent :

Suppression du gris en fond par du transparent
convert france_warp_georef.png -fuzz 20%% -transparent '#E1E1E1' france_warp_georef_2.png

 

Ce n’est pas parfait, mais c’est clairement mieux ! Nous voilà donc avec un calque du cumul de précipitations des dernières 24h produit par l’association Infoclimat. Ne reste plus qu’à l’afficher sur une carte Leaflet. La dernière opération consiste donc à connaitre l’emprise de la couche pour avoir les coordonnées géographiques des angles Sud-Ouest et Nord-Est de l’image.

Pour cela, retour dans QGIS, on clique droit dans le gestionnaire de couches sur l’image que nous avions géoréférencée à la fin de l’étape 3 et ensuite sur « Propriétés de la couche »

QGIS - Propriétés de la couche - Emprise de la couche
QGIS – Propriétés de la couche – Emprise de la couche

 

On va convertir ces coordonnées métriques en degrés grâce à l’outil « Google Maps et Conversion de coordonnées » :

Conversion des coordonnées de Pseudo Mercator (3857) à WGS 84 (4326)

 

Et on se sert des coordonnées WGS84(« GPS ») pour remplir la variable « imageBoundsIC » comme ci-dessous :

Leaflet JS 'map'
// Cumul 24h IC
	var imageUrlIC     = "france_georef_2.png";
	var imageBoundsIC  = [[40.5121,-5.9716], [52.4943,10.0393]];
	var cumul24IC        = L.imageOverlay(imageUrlIC, imageBoundsIC,{opacity:0.7, attribution:'Cumul 24h Infoclimat'}).addTo(map);

 

Et voilà que notre image s’affiche (enfin) sur notre carte Leaflet :

Leaflet - Résultat final
Leaflet – Résultat final

 

6. Pour finir

Pour finir, on pourra imaginer un script bash comme ci-dessous pour télécharger l’image, la géoréférencer, la convertir en PNG, et enfin supprimer le fond gris à intervalle régulier et de manière automatique :

georef_IC_cumul_24h
#!/bin/bash

cd /mon_dossier
# Téléchargement de l'image
wget http://www.infoclimat.fr/api/B2ZUZVFmVGQENlR9UmsGZlAiBWcFZAc3US0Bb1RjVW0BfAcyUmFTZAMrBDEBMFQ1B2sBYFAwAjVRNAlnAj1SYQdhVGNRag%3D%3D/radar/adaric?d644a4afcd98b0057352e0adb7aaeaf4 -O france.png

# Géoréférencement de l'image
gdal_translate -of GTiff -gcp 691.813 613.06 855600 5.49243e+06 -gcp 465.945 742.932 353248 5.22664e+06 -gcp 212.1 671.939 -199420 5.36922e+06 -gcp 63.5091 329.014 -526709 6.1124e+06 -gcp 432.238 103.998 282378 6.6373e+06 -gcp 720.407 261.108 916775 6.2693e+06 -gcp 606.139 468.838 662801 5.80123e+06 -gcp 419.46 448.713 253900 5.84789e+06 "france.png" "france_translate.png"
gdalwarp -r near -order 2 -co COMPRESS=NONE  "france_translate.png" "france_warp.tif"

# Conversion de Tif en PNG
convert france_warp.tif france_warp_georef.png

# Suppression du gris
convert france_warp_georef.png -fuzz 20%% -transparent '#E1E1E1' france_warp_georef_2.png

# Déplacement de l'image dans le dossier web et nettoyage
cp france_warp_georef_2.png /var/www/html/cumul_24h_IC.png
rm france.png france_translate.png france_warp.tif france_warp_georef.png

 

Et pour info, une carte Leaflet simple avec l’ajout de notre image :

index.html
<!DOCTYPE html>
<html>
<head>
	<title>Leaflet</title>
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<link rel="shortcut icon" type="image/x-icon" href="docs/images/favicon.ico" />
	<link rel="stylesheet" href="https://unpkg.com/leaflet@1.2.0/dist/leaflet.css" integrity="sha512-M2wvCLH6DSRazYeZRIm1JnYyh22purTM+FDB5CsyxtQJYeKq83arPe5wgbNmcFXGqiSH2XR8dT/fJISVA1r/zQ==" crossorigin=""/>
	<script src="https://unpkg.com/leaflet@1.2.0/dist/leaflet.js" integrity="sha512-lInM/apFSqyy1o6s89K4iQUKg6ppXEgsVxT35HbzUupEVRh2Eu9Wdl4tHj7dZO0s1uvplcYGmt3498TtHq+log==" crossorigin=""></script>
</head>
<body>
<style type="text/css">
	body {
			padding: 0;
			margin: 0;
		}
		html, body, #mapid {
			/*width:100vw;
			height:100vh;*/
			height: 100%;
		}
</style>
<div id="mapid"></div>
<script>
	//Init map
		map = L.map('mapid', {
			center         :[46.85, 2.3518],
			zoom           : 5,
			zoomControl    : false,
			attributionControl: false,
		});
		L.control.attribution({
				position: 'bottomright',
				prefix: '<span style="color:red;">Doc. de travail - BETA</span>'
		}).addTo(map);

	L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', {
		maxZoom: 18,
		attribution: 'Map data © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, ' +
			'<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
			'Imagery © <a href="http://mapbox.com">Mapbox</a>',
		id: 'mapbox.streets'
	}).addTo(map);

	// Cumul 24h IC
	var imageUrlIC     = "cumul_24h_IC.png";
	var imageBoundsIC  = [[40.5121,-5.9716], [52.4943,10.0393]];
	var cumul24IC        = L.imageOverlay(imageUrlIC, imageBoundsIC,{opacity:0.7, attribution:'Cumul 24h Infoclimat'}).addTo(map);

</script>

</body>
</html>
fringilla adipiscing amet, risus non consequat. libero sem, efficitur. nec et, luctus
Partagez
Tweetez
Partagez
0 Partages