Quantcast
Channel: qgis | Blog SIG & Territoires
Viewing all 115 articles
Browse latest View live

Développer une application avec pgrouting sous Windows (7):OpenLayers 3

$
0
0

Nous arrivons à la fin de cette série. Après avoir mis en place la base de données Postgres/Postgis, nous avons configuré Geoserver pour servir les résultats de pgrouting en un lux WMS. Il ne reste plus qu’à  créer une page html avec openlayers pour pouvoir entrer les points de départ et d’arrivée et de visualiser l’itinéraire calculé.

Bien sûr, il y a moyen de réaliser une application complexe. Mais ici nous resterons sur quelque chose d’assez modeste. Nous allons afficher un fond de carte OpenStreetMap, et permettre à l’utilisateur de cliquer sur cette carte pour déterminer le point de départ de l’itinéraire. Quand il cliquera sur un deuxième point de la carte, nous considérerons que c’est le point d’arrivée souhaité. La page enverra alors la requête au flux WMS de Geoserver pour récupérer une entité vecteur représentant l’itinéraire calculé par pgrouting  et nous l’afficherons sur la carte.

Pour compléter la page nous mettrons un bouton pour réinitialiser la carte, une ligne de message pour tenir au curant l’utilisateur de l’action en cours, et une image pour indiquer l’état du transfert entre le serveur et l’application.

Texte de la page html

<!DOCTYPE html>
<html>
<head>
<title>Recherche d’itinéraire avec pgRouting </title>
<meta charset=”utf-8″>
<style>
#map {
width: 100%;
height: 800px;}
</style>
</head>
<body>
<div id=”map”></div>
<div id=”desc”>Cliquez sur la carte pour définir le point de départ – cliquez à nouveau pour définir le point d’arrivée – la route sera tracée</div><div align=”center”><img src=”0.png” id=”image” width=”60″ height=”60″></div>
<button id=”clear”>Effacer</button>
<script src=”http://openlayers.org/en/v3.16.0/build/ol.js”></script>
<script type=”text/javascript”>
var map = new ol.Map({
target: ‘map’,
layers: [
new ol.layer.Tile({
source: new ol.source.OSM()
})
],
view: new ol.View({
center: [-500000, 6172000],
zoom: 12
}),
controls: ol.control.defaults({
attributionOptions: {
collapsible: false
}
})
});

// Les points de départ et d’arrivée.
var startPoint = new ol.Feature();
var destPoint = new ol.Feature();

// La couche vecteur utilisée pour afficher les points de départ et d’arrivée.
var vectorLayer = new ol.layer.Vector({
source: new ol.source.Vector({
features: [startPoint, destPoint]})
});

map.addLayer(vectorLayer);
var params = {
LAYERS: ‘pgrouting:itineraire’,
FORMAT: ‘image/png’
};
// La fonction de transformation des coordonnées à partir de l’EPSG:3857
// vers  EPSG:4326.
var transform = ol.proj.getTransform(‘EPSG:3857’, ‘EPSG:4326’);

// Mise en place d’une écoute sur les évenements de la carte.
map.on(‘click’, function(event) {
if (startPoint.getGeometry() == null) {
// Premier click.
startPoint.setGeometry(new ol.geom.Point(event.coordinate));
} else if (destPoint.getGeometry() == null) {
// Deuxième click.
destPoint.setGeometry(new ol.geom.Point(event.coordinate));
// Transformations des coordonnées à partir de celle de la carte (EPSG:3857)
// vers celle du serveur (EPSG:4326).
var startCoord = transform(startPoint.getGeometry().getCoordinates());
var destCoord = transform(destPoint.getGeometry().getCoordinates());
var viewparams = [
‘x1:’ + startCoord[0], ‘y1:’ + startCoord[1],
‘x2:’ + destCoord[0], ‘y2:’ + destCoord[1] ];
params.viewparams = viewparams.join(‘;’);
var source =new ol.source.ImageWMS({
url: ‘http://localhost:8080/geoserver/pgrouting/wms’,
params: params
})
result = new ol.layer.Image({
source: source
});
source.on(‘imageloadstart’, function() {
document.getElementById(“desc”).innerHTML =”chargement…”;
document.getElementById(“image”).src =”tree_loading.gif”;
});
source.on(‘imageloadend’, function() {
document.getElementById(“desc”).innerHTML =”terminé OK!”;
document.getElementById(“image”).src =”OK.jpg”;
});
source.on(‘imageloaderror’, function() {
document.getElementById(“desc”).innerHTML =”erreur!”;
document.getElementById(“image”).src =”no.png”;
});
map.addLayer(result);
}
});

var clearButton = document.getElementById(‘clear’);
clearButton.addEventListener(‘click’, function(event) {
// Réinitialise les entités  “start” et “destination” .
startPoint.setGeometry(null);
destPoint.setGeometry(null);
document.getElementById(“desc”).innerHTML =”Cliquez sur la carte pour définir le point de départ – cliquez à nouveau pour définir le point d’arrivée – la route sera tracée”;
document.getElementById(“image”).src =”0.png”;
// Remove the result layer.
map.removeLayer(result);
});
</script>
</body>
</html>

 

Voyons maintenant en détail les différentes parties du code.

Pour ce qui est du début, que du classique:

<style>
#map {
width: 100%;
height: 800px;}

Nous définissons la taille de la carte sur notre page: elle occupera toute la largeur de la page et aura 800 pixels en hauteur.

<div id=”map”></div>
<div id=”desc”>Cliquez sur la carte pour définir le point de départ – cliquez à nouveau pour définir le point d’arrivée – la route sera tracée</div>
<div align=”center”><img src=”0.png” id=”image” width=”60″ height=”60″></div>
<button id=”clear”>Effacer</button>

Nous plaçons donc le div de la carte, en dessous une ligne de texte qui nous servira comme zone de messages, puis une image pour indiquer l’état de transfert et tout en dessous un bouton Effacer qui permettra de réinitialiser la page. L’image 0.png est une image vide.

Nous retrouvons la référence à la bibliothèque openlayers utilisée:

<script src=”http://openlayers.org/en/v3.16.0/build/ol.js”></script>

et ensuite la création de notre carte :

 var map = new ol.Map({
    target: ‘map’,
    layers: [   new ol.layer.Tile({
        source: new ol.source.OSM() }) ],
    view: new ol.View({
      center: [-500000, 6172000],
      zoom: 12 }),
    controls: ol.control.defaults({
      attributionOptions: {
        collapsible: false  }  }) });

Nous chargeons dans notre carte la couche OpenStreetMaps, nous centrons l’affichage sur les coordonnées EPSG:3857 du centre de notre zone d’intérêt, nous définissons l’étendue affichée au départ avec le facteur de zoom (12) et finalement les contrôles souhaités.

La suite du code traite les points de départ et d’arrivée.

Nous créons deux entités (features) pour accueillir ces points

// Les points de départ et d’arrivée.
var startPoint = new ol.Feature();
var destPoint = new ol.Feature();

Puis nous définissons une couche vecteur pour les afficher

// La couche vecteur utilisée pour afficher les points de départ et d’arrivée.
var vectorLayer = new ol.layer.Vector({
source: new ol.source.Vector({
features: [startPoint, destPoint]})
});

map.addLayer(vectorLayer);

Nous créons une variable params avec certains paramètres fixes de notre requête à envoyer à Geoserver, le nom de a couche Geoserver à interroger et le format sous lequel nous voulons recevoir le résultat.

var params = {
LAYERS: ‘pgrouting:itineraire’,
FORMAT: ‘image/png’
};

Puis nous défissons une fonction de transformatons de coordonnées. OpenStreetMap travaille en coordonnées sphériques Pseudo-Mercator (EPSG:3857). Mais nos données PostGis sont en coordonnées géographiques (EPSG:4326).

Quand nous allons récupérer le clic sur la carte, les coordonnées seront en 3857. Nous devrons es transformer en 4326 avant d’envoyer la requête vers Geoserver.
// La fonction de transformation des coordonnées à partir de l’EPSG:3857
// vers  EPSG:4326.
var transform = ol.proj.getTransform(‘EPSG:3857’, ‘EPSG:4326’);

Maintenant nous mettons en place l’écoute de l’événement click sur notre carte. Cette partie du code sera activée quand l’utilisateur cliquera sur la carte.

// Mise en place d’une écoute sur les évenements de la carte.
map.on(‘click’, function(event) {

Si le startpoint est vide, cela indique que c’est le premier click sur la carte et que c’est le point de départ qui doit être renseigné.
if (startPoint.getGeometry() == null) {
// Premier click.
startPoint.setGeometry(new ol.geom.Point(event.coordinate));

Si, par contre, le startpoint est déjà rensigné, nous sommes en présence du deuxième click. Nous allons donc renseigner le destPoint :
} else if (destPoint.getGeometry() == null) {
// Deuxième click.
destPoint.setGeometry(new ol.geom.Point(event.coordinate));

Et nous enchaînons directement sur le processus de soumission de la requ^ùete à Geoserver.

Nous transformons les coordonnées des deux points cliqués:
// Transformations des coordonnées à partir de celle de la carte (EPSG:3857)
// vers celle du serveur (EPSG:4326).
var startCoord = transform(startPoint.getGeometry().getCoordinates());
var destCoord = transform(destPoint.getGeometry().getCoordinates());

et nous construisons la chaîne de caractères avec les paramètres x1, y1,x2 et y2 nécessaires à  notre couche Geoserver (voir l’article précédent)
var viewparams = [
‘x1:’ + startCoord[0], ‘y1:’ + startCoord[1],
‘x2:’ + destCoord[0], ‘y2:’ + destCoord[1]
];

Voilà, nous avons tous les éléments nécessaires pour construire le message à envoyer à Geoserver. Ce mesage nous le mettons dans une variable source.

params.viewparams = viewparams.join(‘;’);
var source =new ol.source.ImageWMS({
url: ‘http://localhost:8080/geoserver/pgrouting/wms’,
params: params

Et nous envoyons la requête vers Geoserver en demandant de mettre le résultat dans une nouvelle couche Image (nous avons demandé le retour sous forme d’image png un peu plus haut) à afficher dans notre map

result = new ol.layer.Image({
source: source

Comme l’interrogation n’est pas instantanée, il vaut mieux tenir au courant l’utilisateur de ce qui se passe sans l’obliger à rester devant un écran semblant figé.

Les lignes suivantes affichent un texte de message et une image montrant que la requête est en cours, puis quand le transfert est terminé, indiquant s’il ‘est bien passé ou non.

source.on(‘imageloadstart’, function() {
document.getElementById(“desc”).innerHTML =”chargement…”;
document.getElementById(“image”).src =”tree_loading.gif”;
});
source.on(‘imageloadend’, function() {
document.getElementById(“desc”).innerHTML =”terminé OK!”;
document.getElementById(“image”).src =”OK.jpg”;
});
source.on(‘imageloaderror’, function() {
document.getElementById(“desc”).innerHTML =”erreur!”;
document.getElementById(“image”).src =”no.png”;
});

Nous chargeons la couche dans notre carte:

map.addLayer(result);

Finalement, nous traitons le click sur le bouton Effacer:

var clearButton = document.getElementById(‘clear’);
clearButton.addEventListener(‘click’, function(event) {
// Réinitialise les entités  “start” et “destination” .
startPoint.setGeometry(null);
destPoint.setGeometry(null);
document.getElementById(“desc”).innerHTML =”Cliquez sur la carte pour définir le point de départ – cliquez à nouveau pour définir le point d’arrivée – la route sera tracée”;
document.getElementById(“image”).src =”0.png”;
// Remove the result layer.
map.removeLayer(result);
});

En vidant les entités startPoint et destPoint, en remettant le message d’accueil et l’image vide et en effaçant la couche vecteur contenat l’itinéraire précédent.

Nous pouvons ouvrir cette page dans notre navigateur et voir l’application tourner:


Utiliser Script Runner avec QGis

$
0
0

Le plugin QGIS Python ScriptRunner fournit un outil intermédiaire pour les processus d’automatisation de QGis, entre la console interactive Python et les développements compliqués de plugins. Il fournit une boîte de dialogue de gestion de scripts qui vous permet de charger facilement, créer, modifier et exécuter des scripts pour l’automatisation de QGIS à grande échelle.

Tout d’abord vous devez installer et activer le plugin à partir du gestionnaire d’extensions.
activation du plugin script runner de qgis

Vous trouverez alors le menu de lancement de Script Runner sous le menu Extensions

menu de lancement du pugin script runner de qgis

Avant de commencer à l’utiliser, vous devez configurer l’éditeur de texte à utiliser pour éditer vos scripts.

  • Ouvrez Script Runner,
  • cliquez sur l’icône de Préférences (la roue dentée)
  • Dans les Options générales cochez la case Edit Scripts Using…
  • Cliquez sur le bouton et pointez sur le programme d’édition de texte choisi

configuration de l'éditeur de texte du plugin script runner de qgis

Vous pouvez utiliser le bloc-notes de Windows que vous trouverez dans C:/Windows/System32/notepad.exe, mais vous pouvez aussi utiliser des outils plus performants tels que Notepad++ (gratuit et disponible sur le site https://notepad-plus-plus.org/download/v6.9.2.html
Si vous suivez l’installation par défaut vous devrez rentrer C:/Program Files (x86)/Notepad++/notepad++.exe dans la fenêtre de Script Runner.

Ce qu’il faut savoir

Le point d’entrée de tout script dans Script Runner est la fonction:

def run_script(iface):

run_script avec au moins un argument, l’objet iface. Vous n’avez aucune obligation d’utiliser cet objet dans votre code, mais il doit obligatoirement être passé comme premier ou unique argument.

Quand vous cliquez sur l’icône New Script, de toutes façons vous trouverez cette fonction déjà déclarée.

odèe de script créé par l'outil nouveau script de script runner de qgis

Cette structure vous permet d’utiliser directement, sans déclaration explicite, la classe QGisInterface. Mais sans autre déclaration, vous êtes limité aux méthodes contenues dans cette classe.

Par contre, vous pouvez ajouter des import de tous les modules souhaités et les utiliser dans votre code. La création d’un nouveau script avec Script Runner possède déjà quatre imports par défaut:

  • from PyQt4.QtCore import *
  • from PyQt4.QtGui import *
  • from qgis.core import *
  • from qgis.gui import *

que vous pouvez laisser ou enlever à votre convenance, et aussi compléter avec tout autre module Python nécessaire.

Comment ça marche?

Le fonctionnement de Script Runner est très simple. Vous avez la barre d’outils:

barre d'outils du plugin script runner de qgis

Qui permet de créer un nouveau fichier .py, ajouter un fichier Python existant, exécuter le script sélectionné dans la liste des fichiers scripts, recharger un fichier modifié, etc.

Et un menu contextuel (clic droit sur un script de la liste de gauche) qui vous permet principalement d’ouvrir le fichier Python dans votre programme d’édition de texte et de le créer ou de le modifier .

menu contextuel de script runner de qgis

Une fois sauvegardé le contenu de l’éditeur de texte, n’oubliez pas de recharger le script pour que script runner prenne en compte les modifications que vous venez d’apporter.

Quand vous exécutez un script avec script runner, toutes les commandes print sont dirigées vers la console de sortie de script runner:

console de sortie du plugin script runner de qgisLes messages d’erreur sont aussi dirigés vers cette fenêtre.

Pour terminer, le paramétrage de vos scripts

La dernière chose à savoir sur le fonctionnement de vos scripts dans script runner est comment passer des arguments à votre script.

La première méthode est de rentrer ces arguments dans la commande de lancement du script:

def run_script(iface, data_path, buffer_size):

Dans cet exemple, vous souhaitez deux arguments, un chemin de fichier et une valeur de tampon.

Au moment de l’exécution du script, une fenêtre vous demandera de renseigner les paramètres:

arguments d'un script dans le plugin script runner de qgis

Une autre façon de passer des arguments est de créer une chaîne de paramétrage

def run_script(iface, **myargs):

Dans ce cas, vous devrez rentrer les différents arguments sous forme de couples nom/valeur

chaîne d'arguents pour un script du plugin script runner de qgis

Dans votre code vous accédez aux différents arguments sous la forme:

def run_script(iface, **myargs):
    data_path = myargs['data_path']
    my_buffer_size = myargs['buffer_size']

Configurer Eclipse pour développer des scripts ou des plugins QGis

$
0
0

Eclipse est un projet, décliné et organisé en un ensemble de sous-projets de développements logiciels, de la fondation Eclipse visant à développer un environnement de production de logiciels libre qui soit extensible, universel et polyvalent, en s’appuyant principalement sur Java.

Figurant parmi les grandes réussites de l’Open source, Eclipse est devenu un standard du marché des logiciels de développement, intégré par de grands éditeurs logiciels et sociétés de services.

Vous pouvez développer un plugin pour QGis avec un simple éditeur de texte, mais si vous voulez disposer d’un véritable environnement de développement, vous permettant de déboguer rapidement vos scripts, Eclipse est la meilleure solution.

Par où commencer?

Vous devez télécharger et installer Eclipse ET le plugin PyDev.

Pour télécharger la dernière version d’Eclipse :

https://www.eclipse.org/downloads/download.php?file=/oomph/epp/neon/R/eclipse-inst-win64.exe&mirror_id=17

Exécutez le fichier d’installation, en sélectionnant l’installation « Eclipse IDE for Java Developers »

option d'intallation d'eclipse

Une fois l’installation terminée, Eclipse se lance. Vous devez installer alors le plugin PyDev pour Eclipse. Pour cela:

Allez dans le menu Help->Install New software

Dans « Work with » cliquez sur le bouton Add

ajout du plugin PyDev dans eclipse

Dans name tapez PyDev et dans Location l’adresse du site de téléchargement : http://pydev.org/updates, puis cliquez sur OK

ec3

Cochez la case PyDev, puis sur Next et complétez l’installation du plugin.

Une fois terminé, vous devez relancer Eclipse. Vous devez définir l’interpréteur Python à utiliser:

Allez dans le menu Windows->Preferences

défiition de l'interpreteur Python

Dans la fenêtre de gauche, recherchez l’item PyDev -> Interpreters -> Python Interpreter puis cliquez sur le bouton New

ec5

Rentrez PyQGis comme nom et pointez sur le fichier python.exe de votre installation QGis. Il se trouve dans le répertoire bin de celle-ci.

Quand vous cliquez sur OK, le programme d’installation recherche à ajouter automatiquement toutes les bibliothèques Python disponibles. Si vous les laissez, vous allez tout droit sur des conflits entre bibliothèques. Vous devez renseigner ces bibliothèques manuellement pour être sûr qu’elles ne rentreront pas en conflit.

ec6

Cliquez sur Deselect ALL puis sur OK.

Un message d’avertissement apparaît vous indiquant qu’aucune bibliothèque n’a été indiquée. Cliquez sur Proceed anyway.

Maintenant c’est la partie la plus ennuyeuse de l’installation. Armez vous de patience…

On va faire des aller-retour entre Eclipse et QGis pour renseigner toutes les bibliothèques nécessaires.

Pour chaque Path repéré dans QGis, vous devrez cliquez sur le bouton New Folder d’Eclipse et pointer sur le répertoire concerné:

ec7

Dans QGis nous allons utiliser la console Python. Ouvrez-la et tapez simplement qgis . Vous aurez en retour le path de l’API PyQGIS.

ec8Usez de votre perspicacité pour décoder la réponse, en sachant que ça correspond à votre installation QGis. Dans cet exemple le début est Programmes/QgisEssen. Ignorez les /./ ainsi que le dernier élément. En effet, ce que vous devrez renseigner dans Eclipse c’est le répertoire de ce dernier élément.

Dans Eclipse cliquez sur New Folder et dans la fenêtre qui s’ouvre allez pointer sur le répertoire

ec9Cliquez sur OK. Vous verrez alors le répertoire s’afficher dans la liste des System PYTHONPATH

ec10Bon. Le plus dur reste à faire. Tapez das la console Python

import sys
sys.path

Vous aurez quelque chose comme

ec11Pour chaque élément du path vous devrez répéter ce que nous venons de faire pour l’api PyQGIS, sauf pour les éléments dont vous êtes sûr qu’ils n’interviennent pas dans votre développement, à savoir ceux qui ne correspondent pas à votre nom d’utilisateur quand il s’agît des path commençant par \\Users\ ou ceux qui correspondent à d’autres environnements logiciels que QGis (dans cet exemple les path commençant par \\PCI Geomatics).

Une fois ceci fait pour tous les paths, ce n’est pas fini! Il reste à renseigner les dlls de QGis.

Dans la fenêtre de Préférences d’Eclipse, cliquez sur l’onglet Environnement

ec12Cliquez sur le bouton New. Dan la fenêtre qui s’ouvre tapez PATH dans Name et dans Value vous devrez rentrer la liste des répertoires de QGis contenant des fichiers binaires, séparés par des ; .

Sous Windows prenez la ligne suivante en modifiant la version de QGis pour qu’elle corresponde à celle installée sur votre poste:

C:\Program Files\QGIS Brighton;C:\Program Files\QGIS
Brighton\bin;C:\Program Files\QGIS Brighton\apps\qgis\bin;C:\Program
Files\QGIS Brighton\apps\Python27\DLLs

La configuration d’Eclipse est terminée!!

Comment déboguer les scripts Python dans QGis?

Les deux QGIS et Eclipse doivent être configurés pour le débogage de sorte que les deux logiciels puissent communiquer. Eclipse se lie à QGIS afin de vous donner un aperçu des scripts Python en cours d’exécution dans QGIS. Cette approche vous permet d’exécuter des scripts de manière contrôlée, de suspendre l’exécution pendant que vous inspectez le programme pour détecter des bugs au moment et à l’endroit où ils ont lieu.

Quand vous lancez un script dans QGis, celui-ci passe la main à Eclipse pour exécuter le code, qui à sont tour et renvoyé vers QGis.

On doit donc configurer QGis pour qu’il envoie le flux vers Eclipse et Eclipse pour qu’il renvoie les résultats vers QGis.

Configuration de QGis.

Dan cette étape nous allons ajouter deux plugins à QGIS, qui permettent à Eclipse de communiquer avec QGIS. Un plugin, Plugin Reloader, vous permet de recharger un plugin QGIS en mémoire sans redémarrer QGIS, pour effectuer les tests plus rapidement. Le second plugin, Remote Debug, relie QGIS à Eclipse.
Remote Debug est un plugin expérimental, donc vous devez vous assurer que les plugins expérimentaux sont visibles dans la liste des plugins disponibles du Gestionnaire d’extensions QGIS.

ec13

Installez les deux plugins. Profitez pour installer aussi le HelloWorldPlugin qui vous servira à tester votre configuration.Notez l’emplacement du plugin :

ec14

Configuration d’Eclipse.

Lancez Eclipse

Allez dans le menu File->New->Project

ec15

Sélectionnez General puis Project et cliquez sur Next

ec16

Donnez un nom au projet, par exemple, pour tester le fonctionnement, ProjetHelloWorld, puis cliquez sur le bouton Finish.

ec17Sélectionnez le projet que vous venez de créer, puis clic-droit et New -> Folder

ec18

 

Dans la fenêtre New Folder qui s’ouvre, cliquez sur le bouton Advanced

ec19

Cochez la case « Link to alternate location (Linked Folder) » puis avec le bouton browse pointez sur le répertoire du plugin à déboguer, dans notre exemple HelloWorld, dans le répertoire que vous avez noté lors de son installation.

ec20Test de la configuration

Pour tester la configuration, nous allons placer un point d’arrêt dans le code du script HelloWorld, le lancer dans QGis, constater que le code est bien sur arrêt dans Eclipse, relancer l’exécution dans Eclipse et voir la fenêtre s’afficher dans QGis.

Pour placer le point d’arrêt:

Dans Eclipse, ouvrez le fichier HelloWorld.py en double-cliquant sur lui.

ec21

Allez dans le menu Window -> Perspective -> Open Perspective -> Other…

ec23

Dans la nouvelle fenêtre sélectionnez Debug et cliquez sur OK

ec24

La « perspective » de type débogage est prise par Eclipse

ec25

Cherchez la première ligne du plugin (def hello_world(self):) et double-cliquez à gauche du numéro de ligne pour placer un point d’arrêt (punaise verte)

A partir du menu PyDev, sélectionnez Start Debug Server.

ec26Vous devrez voir s’afficher le message

Debug Server at port: 5678

Dans la console (en bas de la fenêtre Eclipse).

ec27

Maintenant, allez sur QGis. Dans le menu Extensions cliquez sur Remote Debug -> Remote Debug

c28

La fenêtre de Remote Debugger s’ouvre. Une dernière configuration est nécessaire.

ec29Assurez-vous que Debugger est bien placé sur PyDev(Eclipse). Dans PyDevd path, comme son nom l’indique, il faut indiquer où se trouve le fichier pydevd.py.

Le plus simple est de lancer une recherche dans le gestionnaire de fichiers Windows et de copier coller le path de ce fichier. Cette opération ne doit être faite que la première fois que vous utilisez Remote Debugger.

Une fois fait, cliquez sur le bouton Connect. la fenêtre se ferme et un message apparaît dans QGis vous indiquant: Python Debugging Active.

Lancez le plugin HeloWorld à partir du menu Extension -> HelloWorld ->HelloWorld.

Ceci entraîne, habituellement, l’affichage d’une fenêtre de message avec le texte Hello World. Par contre, ici, rien ne se passe.

Allez dans Eclipse.

Vous constaterez que la ligne avec le point d’arrêt est surlignée. Ceci veut dire que l’exécution du script est bien arrêtée à ce point la.

ec31Pour redémarrer l’exécution, allez dans le menu Run->Resume

Allez dans QGis. La fenêtre Hello World est apparue!

ec32La configuration de votre environnement de développement est terminée.

Recettes Python pour QGis: accéder aux données vecteur(shapefile)

$
0
0

Dans cette série d’articles nous allons voir comment accéder aux données de type vecteur avec Python et QGis. Tout d’abord nous verrons comment charger les différents formats de données vecteur (shapefile, postgis et spatialite), puis comment accéder aux propriétés géométriques et attributaires, et enfin, quelques exemples de traitement spatial de ce type de données.Parmi le grand nombre de formats possibles pour les données vecteur, nous allons voir les deux principaux: shapefile et postgis.

Pour les exemples nous allons utiliser le plugin Script Runner de QGis, mais vous pouvez taper directement les lignes de code dans la console Python de QGis.

Charger un shapefile avec Python

Nous allons utiliser un fichier shapefile disponible sur Github pour cet exemple. Vous pouvez le télécharger ici:

Nous supposons dans la suite de l’article que vous décompressez ce fichier dans un répertoire c:/data.

Démarrez QGis et ouvrez Script Runner (ceci suppose que vous l’avez déjà installé et activé).

menu de lancement du pugin script runner de qgisCliquez sur l’outil Nouveau Script

nouveau script dans scriptrunner

et nommez votre script charger_vecteur.py

Dans l’onglet Source vous aurez le contenu du fichier créé.

odèe de script créé par l'outil nouveau script de script runner de qgisOuvrez le menu contextuel du script en cliquant droit sur le nom du script et sélectionnez Edit script in external editor

editer le script avec l'éditeur externe

# Customize this starter script by adding code
# to the run_script function. See the Help for
# complete information on how to create a script
# and use Script Runner.

«  » » Your Description of the script goes here «  » »

# Some commonly used imports

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from qgis.gui import *

def run_script(iface):
layer = QgsVectorLayer(« /data/NYC_MUSEUMS_GEO.shp », « Musees de la ville de New York », « ogr »)
if not layer.isValid():
print « erreur de chargement de la couche %s  » % layer.name()
QgsMapLayerRegistry.instance().addMapLayers([layer])

Vous pouvez faire du copier-coller de ce texte, mais ATTENTION!! : vous devrez corriger l’indentation des lignes pour que le script fonctionne. L’affichage html ignore les espaces en début de ligne, mais Python…NON!

Votre script doit apparaître dans Scriptrunner comme suit:

pv6Je sais que Musées prend un accent, mais si vous voulez que le script marche il faut l’enlever. Sur la gestion des caractères accentués dans Python, cet article ne suffirait pas pour aborder ce casse-tête.

Si vous avez un message comme celui-ci:

message d'ertreur de scriptrunner lors de l'actualisation d'un script

c’est qu’il y a une erreur de syntaxe (ou un caractère accentué) dans votre script et que ScriptRunner n’arrive pas à interpréter votre code source.

Si vous exécutez le script à partir de scriptrunner vous aurez alors:

pv5

votre shapefile chargé dans QGis.

Voyons maintenant en détail ce que nous avons fait dans ce script:

layer = QgsVectorLayer(« /data/NYC_MUSEUMS_GEO.shp », « Musees de la ville de New York », « ogr »)

Cette ligne de code crée la couche (layer). QgsVectorLayer nécessite trois arguments:

  • un chemin de fichier vers les données à charger : « /data/NYC_MUSEUMS_GEO.shp« 
  • le nom que nous souhaitons donner à cette couche dans la fenêtre de QGis: « Musees de la ville de New York« 
  • et le fournisseur de données (data provider) à utiliser : ici « ogr » de la librairie GDAL. OGR détermine le format des données à partir de l’extension du fichier et adapte le driver à utiliser en fonction. Voici la liste des formats gérés par ogr:
Liste des formats vecteur OGR

Nom du Format Code Création Géoréférencement Compilé par défaut
fichiers Aeronav FAA AeronavFAA Non OUI OUI
AmigoCloud API AmigoCloud OUI OUI Non, nécessite la librairie libcurl
ESRI ArcObjects ArcObjects Non OUI Non, nécessite la librairie ESRI ArcObjects
Arc/Info Binary Coverage AVCBin Non OUI OUI
Arc/Info .E00 (ASCII) Coverage AVCE00 Non OUI OUI
Arc/Info Generate ARCGEN Non Non OUI
Atlas BNA BNA OUI Non OUI
AutoCAD DWG DWG Non Non Non, nécessite la librairie Open Design Alliance Teigha
AutoCAD DXF DXF OUI Non OUI
Carto Carto OUI OUI Non, nécessite la librairie libcurl
Cloudant / CouchDB Cloudant OUI OUI Non, nécessite la librairie libcurl
CouchDB / GeoCouch CouchDB OUI OUI Non, nécessite la librairie libcurl
Comma Separated Value (.csv) CSV OUI Non OUI
OGC CSW (Catalog Service for the Web) CSW Non OUI Non, nécessite la librairie libcurl
Czech Cadastral Exchange Data Format VFK Non OUI Non, nécessite la librairie libsqlite3
DB2 Spatial DB2ODBC OUI OUI Non, nécessite la librairie ODBC
DODS/OPeNDAP DODS Non OUI Non, nécessite la librairie libdap
EDIGEO EDIGEO Non OUI OUI
ElasticSearch ElasticSearch OUI OUI Non, nécessite la librairie libcurl
ESRI FileGDB FileGDB OUI OUI Non, nécessite la librairie FileGDB API
ESRI Personal GeoDatabase PGeo Non OUI Non, nécessite la librairie ODBC
ESRI ArcSDE SDE Non OUI Non, nécessite la librairie ESRI SDE
ESRI Shapefile / DBF ESRI Shapefile OUI OUI OUI
FMEObjects Gateway FMEObjects Gateway Non OUI Non, nécessite la librairie FME
GeoJSON GeoJSON OUI OUI OUI
Géoconcept Export Geoconcept OUI OUI OUI
Geomedia .mdb Geomedia Non Non Non, nécessite la librairie ODBC
GeoPackage GPKG OUI OUI Non, nécessite la librairie libsqlite3
GeoRSS GeoRSS OUI OUI OUI (la lecture nécessite la librairie libexpat)
Tables Google Fusion GFT OUI OUI Non, nécessite la librairie libcurl
GML GML OUI OUI OUI (la lecture nécessite la librairie Xerces or libexpat)
GMT GMT OUI OUI OUI
GPSBabel GPSBabel OUI OUI OUI (nécessite la librairie GPSBabel et GPX driver)
GPX GPX OUI OUI OUI (la lecture nécessite la librairie libexpat)
GRASS Vector Format GRASS Non OUI Non, nécessite la librairie libgrass
GPSTrackMaker (.gtm, .gtz) GPSTrackMaker OUI OUI OUI
Hydrographic Transfer Format HTF Non OUI OUI
Idrisi Vector (.VCT) Idrisi Non OUI OUI
Informix DataBlade IDB OUI OUI Non, nécessite la librairie Informix DataBlade
INTERLIS « Interlis 1 » et « Interlis 2 » OUI OUI Non, nécessite la librairie Xerces
INGRES INGRES OUI Non Non, nécessite la librairie INGRESS
JML OpenJUMP .jml OUI Non OUI (la lecture nécessite la librairie libexpat)
KML KML OUI OUI OUI (la lecture nécessite la librairie libexpat)
LIBKML LIBKML OUI OUI Non, nécessite la librairie libkml
Fichiers Mapinfo MapInfo File OUI OUI OUI
Microstation DGN DGN OUI Non OUI
Access MDB (PGeo et Geomedia) MDB Non OUI Non, nécessite la librairie JDK/JRE
Memory Memory OUI OUI OUI
MongoDB MongoDB OUI OUI Non, nécessite la librairie Mongo C++ client
MySQL MySQL Non OUI Non, nécessite la librairie MySQL
NAS – ALKIS NAS Non OUI Non, nécessite la librairie Xerces
NetCDF netCDF OUI OUI Non, nécessite la librairie libnetcdf
Oracle Spatial OCI OUI OUI Non, nécessite la librairie OCI
ODBC ODBC Non OUI Non, nécessite la librairie ODBC
MS SQL Spatial MSSQLSpatial OUI OUI Non, nécessite la librairie ODBC
Open Document Spreadsheet ODS OUI Non Non, nécessite la librairie libexpat
OGDI Vectors (VPF, VMAP, DCW) OGDI Non OUI Non, nécessite la librairie OGDI
OpenAir OpenAir Non OUI OUI
ESRI FileGDB OpenFileGDB Non OUI OUI
OpenStreetMap XML et PBF OSM Non OUI Non, nécessite la librairie libsqlite3 (et libexpat pour OSM XML)
PCI Geomatics Database File PCIDSK OUI OUI OUI, utilisant en interne PCIDSK SDK (de GDAL 1.7.0)
Geospatial PDF PDF OUI OUI OUI (la lecture nécessite libpoppler ou libpodofo)
PDS PDS Non OUI OUI
Planet Labs Scenes API PLScenes Non OUI Non, nécessite la librairie libcurl
PostgreSQL SQL dump PGDump OUI OUI OUI
PostgreSQL/PostGIS PostgreSQL/PostGIS OUI OUI Non, nécessite la librairie PostgreSQL client (libpq)
EPIInfo .REC REC Non Non OUI
S-57 (ENC) S57 Non OUI OUI
SDTS SDTS Non OUI OUI
SEG-P1 / UKOOA P1/90 SEGUKOOA Non OUI OUI
SEG-Y SEGY Non Non OUI
format Selafin/Seraphin Selafin OUI Partial (seulement codes EPSG) OUI
Norwegian SOSI Standard SOSI Non OUI Non, nécessite la librairie FYBA
SQLite/SpatiaLite SQLite OUI OUI Non, nécessite la librairie libsqlite3 or libspatialite
SUA SUA Non OUI OUI
SVG SVG Non OUI Non, nécessite la librairie libexpat
Storage et eXchange Format SXF Non OUI OUI
UK .NTF UK. NTF Non OUI OUI
U.S. Census TIGER/Line TIGER Non OUI OUI
VRT – Virtual Datasource VRT Non OUI OUI
OGC WFS (Web Feature Service) WFS OUI OUI Non, nécessite la librairie libcurl
MS Excel format XLS Non Non Non, nécessite la librairie libfreexl
MS Office Open XML spreadsheet XLSX OUI Non Non, nécessite la librairie libexpat
X-Plane/Flightgear aeronautical data XPLANE Non OUI OUI
VDV-451/VDV-452/IDF VDV OUI OUI OUI
Walk Walk Non OUI Non, nécessite la librairie ODBC
WAsP .map format WAsP OUI OUI OUI

 

Ensuite, nous avons introduit les deux lignes de code:

if not layer.isValid():
print « erreur de chargement de la couche %s  » % layer.name()

Si pour une raison ou pour une autre QgsVectorLayer échoue dans la création de la couche (erreur dans le nom de fichier, données corrompues, etc…) il ne renvoie pas de message d’erreur. Votre script continuera à s’exécuter et il plantera plus loin. Le message d’erreur que vous aurez a de fortes chances de ne rien avoir avec le véritable problème. Il convient donc de tester la validité de chaque couche créée et d’afficher l’erreur immédiatement.

En fin, dans la dernière ligne, nous ajoutons la couche vectorielle à l’QgsMapLayerRegistry, ce qui la rend disponible et visible sur la carte.

QgsMapLayerRegistry.instance().addMapLayers([layer])

Le registre conserve la trace de toutes les couches du projet. La raison pour laquelle QGIS fonctionne de cette façon est pour vous permettre de charger plusieurs couches, leur affecter un style , les filtrer, ainsi que plusieurs autres opérations, avant de les afficher sur la carte.

 Coder le choix du fichier à charger

Dans notre code, le fichier à charger est écrit en dur, ce qui est rarement le cas dans la réalité des développements. Nous allons voir comment coder la recherche du fichier avec la fenêtre »ouvrir un fichier » .

Dans scriptrunner créez un nouvel script dialogue_fichier.py.

Rentrez le code suivant

# Customize this starter script by adding code
# to the run_script function. See the Help for
# complete information on how to create a script
# and use Script Runner.

«  » » Your Description of the script goes here «  » »

# Some commonly used imports

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from qgis.gui import *

def run_script(iface):
qfd = QFileDialog()
title = ‘Ouvrir un fichier’
path = « C:/ »
f = QFileDialog.getOpenFileName(qfd, title, path)
print f

Votre script doit ressembler à ça:

pv7Quand vous l’exécutez, il affiche la fenêtre de recherche de fichiers. Quand vous cliquez sur « Ouvrir », le script vous affiche le nom complet de votre fichier.

La ligne from PyQt4.QtGui import * est indispensable pour pouvoir appeler le dialogue.

QFileDialog utilise trois paramètres:

  • l’objet QFileDialog : qfd
  • le titre de la fenêtre du dialogue: title
  • le chemin de départ de la fenêtre : dans cet exemple C:/ (mais vous pouvez indiquer n’importe quel répertoire)

Le résultat (f) contient une chaîne de caractères avec le chemin et nom du fichier sélectionné. Si l’utilisateur ne clique pas sur Ouvrir mais sur Annuler, la chaîne est vide.

Nous pouvons maintenant modifier le premier script (chargement d’un shape) pour utiliser le dialogue à la place du codage en dur:

pv8A l’exécution du script, la fenêtre de dialogue s’ouvre, vous choisissez le fichier à charger, puis le script le charge dans QGis.

Dans le prochain article nous verrons comment faire la même chose mais à partir d’une table Postgis  ou d’une base de données Spatialite.

 

Recettes Python pour QGis: accéder aux données vecteur (postgis,spatialite)

$
0
0

Dans cette série d’articles nous abordons comment accéder aux données de type vecteur avec Python et QGis. Tout d’abord nous avons vu dans l’article précédent (Recettes Python pour QGis: accéder aux données vecteur (shapefile)) comment charger un fichier shapefile. Dans celui-ci nous verrons comment charger une table Postgresql/Postgis et une table Spatialite.

Charger une couche Postgis

L’autre source de données habituelle pour une application QGis est une couche vecteur contenue dans une base de données Postgres/Postgis. Nous allons voir comment la charger à partir du code Python.

Le principe est le même que pour une couche shapefile, sauf que nous allons utiliser un autre fournisseur de données (data provider) et que, contrairement à un fichier shp, il faut créer la connexion à la base de données.

Dans ScripRunner créez un nouveau script et nommez-le charger_database.py.

Rentrez le code suivant:

# Customize this starter script by adding code
# to the run_script function. See the Help for
# complete information on how to create a script
# and use Script Runner.

«  » » Your Description of the script goes here «  » »

# Some commonly used imports

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from qgis.gui import *

def run_script(iface):
uri = QgsDataSourceURI()
uri.setConnection(« localhost », « 5432 », « postgres », »user1″, « user1 »)
uri.setDataSource(« public », « details », « geom », »version=1″)
layer = QgsVectorLayer(uri.uri(), « Recifs », « postgres »)
if not layer.isValid():
print « Layer %s did not load » % layer.name()
QgsMapLayerRegistry.instance().addMapLayers([layer])

Le script doit ressembler à ça:

pv10Vous observerez que la ligne de code qui crée le layer

layer = QgsVectorLayer(uri.uri(), « Recifs », « postgres »)

contient un fournisseur postgres à la place de ogr et que le nom de fichier est remplacé par un objet uri. C’est cet objet qui est en charge de la connexion avec la base Postgis.

uri = QgsDataSourceURI()

crée l’objet,

uri.setConnection(« localhost », « 5432 », « postgres », »user1″, « user1 »)

crée la chaîne de connexion:

  • adresse du serveur (ici localhost)
  • port d’écoute de postgres (ici 5432)
  • nom de la base de données(ici postgres)
  • nom de l’utilisateur (ici user1)
  • mot de passe de l’utilisateur (ici user1)

Si vous voulez exécuter le script sur votre machine, vous devez modifier ces valeurs pour celles d’une base de données existante sur votre poste (si vous gardez localhost) ou rentrer une adresse de base accessible par Internet.

uri.setDataSource(« public », « details », « geom », »version=1″)

Cette ligne défini quelles table Postgis utiliser dans la base de données connectée:

  • nom du schéma (ici public)
  • nom de la table (ici details)
  • nom du champ géométrie de la table (ici geom)
  • éventuellement une clause SQL de type WHERE.

Ici version=1 correspond à une clause

SELECT * FROM details WHERE version=1

Si vous ne voulez pas appliquer un filtre à la table, rentrez simplement «  ».

Charger une couche Spatialite

Trop peu utilisées et pourtant tellement pratiques et puissantes, les bases Spatialite peuvent aussi être chargées simplement avec Python.

Voici le code pour un script comparable au précédent mais qui charge une table d’une base Sopatialite:

# Customize this starter script by adding code
# to the run_script function. See the Help for
# complete information on how to create a script
# and use Script Runner.

«  » » Your Description of the script goes here «  » »

# Some commonly used imports

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from qgis.gui import *

def run_script(iface):
uri = QgsDataSourceURI()
uri.setDatabase(« H:/repertoiresblog/QGis/validation.sqlite »)
uri.setDataSource(«  », « com2011orig », « geom », »cod_reg=9″)
layer = QgsVectorLayer(uri.uri(), « Communes », « spatialite »)
if not layer.isValid():
print « Layer %s did not load » % layer.name()
QgsMapLayerRegistry.instance().addMapLayers([layer])

Votre script doit ressembler à ça:

pv11uri.setDatabase(« H:/repertoiresblog/QGis/validation.sqlite »)

Cette ligne défini le chemin et nom de la base Spatialite concernée.

  uri.setDataSource(«  », « com2011orig », « geom », »cod_reg=9″)

Le premier paramètre, schéma, ne s’applique pas aux bases Spatialite.

  • nom de la table à charger (ici com2011orig)
  • nom du champ géométrie (ici geom)
  • clause de filtrage SQL, optionnelle (ici cod_reg=9)

 layer = QgsVectorLayer(uri.uri(), « Communes », « spatialite »)

On crée la couche avec l’objet uri que nous venons de construire et nous faisons appel au fournisseur de données spatialite.

Les autres fournisseurs de données disponibles

Nous avons vu trois fournisseurs de données pour QgsVectorLayer: ogr, postgres, et spatialite. Le premier est en réalité une bibliothèque qui permet l’accès à de nombreux formats.

En plus de ces trois fournisseurs, vous pouvez utiliser les suivants:

  • memory qui permet de charger des couches créées en mémoire
  • mssql qui permet de charger une couche d’une base Microsoft SQL
  • wfs qui permet de charger une couche d’un flux WFS
  • delimitedtext qui permet de charger une couche à partir d’un fichier texte
  • gpx qui charge des routes et des waypoints à partir d’un fichier gpx
  • grass qui charge une couche GRASS

Dans l’article suivant nous verrons comment consulter les attributs et les géométries des couches vecteur chargée dans QGis.

Recettes Python pour QGis: inspecter les données vecteur

$
0
0

Une fois une couche chargée, on souhaite le plus souvent accéder aux données contenues dans la couche, soit les géométries, soit les attributs. Nous verrons ici comment coder en Python l’accès à ces deux types de données.

Accéder à la géométrie d’une couche vecteur

Nous allons reprendre le script de chargement d’un shapefile crée précédemment (charger_vecteur.py)

# Customize this starter script by adding code
# to the run_script function. See the Help for
# complete information on how to create a script
# and use Script Runner.

«  » » Your Description of the script goes here «  » »

# Some commonly used imports

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from qgis.gui import *

def run_script(iface):
qfd = QFileDialog()
title = ‘Ouvrir un fichier’
path = « C:/ »
f = QFileDialog.getOpenFileName(qfd, title, path)
layer = QgsVectorLayer(f, « Musees de la ville de New York », « ogr »)
if not layer.isValid():
print « erreur de chargement de la couche %s  » % layer.name()
QgsMapLayerRegistry.instance().addMapLayers([layer])

Remplacez la dernière ligne

QgsMapLayerRegistry.instance().addMapLayers([layer])

par

features=layer.getFeatures()
feat=features.next()
g=feat.geometry()
print g.asPoint()

On évite de charger la couche dans QGis et on affiche dans la console Python les coordonnées x et y du premier point de la couche.

Le script doit ressembler à ça:

pv12

La procédure est la suivante:

features=layer.getFeatures()

Crée un pointeur nommé features sur la couche layer

feat=features.next()

On déplace le curseur sur l’entité suivante, ici c’est la première entité de la table et on charge cette entité dans l’objet feat.

g=feat.geometry()

Charge la géométrie de l’entité courante du curseur dans l’objet g.

Une fois exécuté, on obtient le résultat dans la console Python:

pv13NOTES:

On pourrait accéder par d’autres moyens à la géométrie d’une entité, mais l’utilisation des pointeurs dans Python permet de travailler sur des volumes de données très importants sans charger toute la table en mémoire.

Ici on a chargé un fichier shapefile, mais quelle qu’elle soit la source de données, une fois créée la couche (layer) le code Python ne change pas.

Accéder aux attributs  d’une couche vecteur

Pour accéder aux attributs non géométriques des entités, nous allons modifier le script précédent

Remplacez les deux dernières lignes

g=feat.geometry()
  print g.asPoint()

par

print feat.attributes()

Le script doit ressembler à ça:

pv14

Et son exécution donne le résultat suivant dans la console Python:

pv15

On obtient bien une liste Python avec l’ensemble des attributs de la première entité de la table.

Cette information est généralement reliée aux noms des champs de la table. Pour obtenir la liste des noms des champs, remplacez dans le script précédent la ligne

print feat.attributes()

par

print [c.name() for c in feat.fields().toList()]

Le script doit ressembler à ça:

pv16

Et son exécution donne le résultat suivant dans la console Python

pv17

Partagez vos ressources(symboles,images,scripts) pour Qgis avec le nouveau plugin Resource Sharing

$
0
0

Le plugin QGis resource sharing est maintenant disponible. Ce plugin permet de partager tout type de ressources pour QGis: des bibliothèques de symboles, de styles, des images et des scripts. Ces éléments peuvent être entreposés  à distance (pour l’instant le plugin supporte Github et Bitbucket comme dépôts publics), le système de fichiers local, ou un serveur http avec des collections zippées.

L’installation se fait de manière classique avec le Gestionnaire d’extensions (menu Extensions->Installer/Gérer les extensions).
installation, du plugin Resource Sharing dans QGis

Pour lancer le plugin : Extensions-> Resource Sharing -> Resource Sharing

lancement du plugin Resource sharing dans qgis

La fenêtre du plugin s’ouvre:

fenêtre du plugin resource sharing dansd qgis

Installer des ressources partagées

Nous allons commencer par installer les symboles des cartes marines que nous avons déjà utilisés dans l’article Affichage des cartes marines S57 dans QGis

Nous les avons mis à disposition à travers ce plugin.

Sélectionnez Nautical symbols for marine charts parmi les entrepôts de resources, puis cliquez sur Install.

installation des symboles nautiquesVous devez obtenir un message de fin d’installation

rs5Et si vous sélectionnez maintenant le bouton Installed sur la fenêtre de gauche, vous verrez votre nouvelle ressource.

rs6Vous pouvez fermer la fenêtre du plugin et vérifier que les symboles sont bien disponibles pour le style de vos couches.

Utilisation des ressources partagées

Les différentes ressources sont accessibles de la même manière que les ressources par défaut. Dans notre exemple, nous avons installé des symboles svg. Nous les retrouverons parmi les bibliothèques disponibles par défaut dans QGis: Propriétés de la couche-> Style

Puis sélectionnez Symbole svg dans la fenêtre déroulante de Type de symbole.

Les symboles chargés apparaissent sous la forme d’un groupe svg nommé Resource Sharing.

emplacement des symboles svg chargés

Ajouter des ressources partagées autres

Par défaut, vous avez comme sources de ressources partagées les entrepôts publiques. Mais vous pouvez partager au sein de votre entreprise, organisation ou groupe de travail, des ressources non publiques.

Pour ajouter un entrepôt de ressources, dans la fenêtre du plugin, sélectionnez Settings, puis Add.

ajout d'un entrepôt de ressources

Il existe pour le moment 4 types d’entrepôts que vous pouvez renseigner:

Type  Example d’URL Description
Github https://github.com/akbargumbira/qgis_resources_sharing.git Pour renseigner des entrepôts publiques de Github
Bitbucket https://bitbucket.org/akbargumbira/qgis-style-repo-dummy.git Pour renseigner des entrepôts publiques de Bitbucket
Fichiers locaux file:///c:/ressources/qgis_resources Vous devez pointer sur la racine de votre entrepôt sur votre disque
serveur HTTP(s) avec collections zippées http://www.nasca.ovh/downloads/nautical Vous devez pointer sur l’adresse de base de l’entrepôt. Les métadonnées doivent se trouver à l’adresse http(s)://[base_url]/metadata.ini. Les collections doivent se trouver à l’adresse http(s)://[base_url]/collections/[nom_collection]>.zip

Pour construire l’entrepôt, vous pouvez consulter le mode opératoire directement sur la page du Plugin: http://www.akbargumbira.com/qgis_resources_sharing/author/creating-repository.html

Si vous voulez en créer sous forme de système de fichiers, la structure de l’entrepôt doit se conformer à ce modèle:

rs9Chaque collection peut avoir un ou plusieurs types (image, processing, svg, symbol).

Le fichier metadata.ini doit respecter la forme suivante:

[general]
collections=osm_spatialite_googlemaps,flowmap

[osm_spatialite_googlemaps]
name=OSM Spatialite Googlemaps
author=Anita Graser
email=anitagraser@gmx.at
tags=osm, spatialite, google maps, roads
description=The collection contains a complete resources to create a coherent map that looks similar to the old Google Maps style from OSM data in a SpatiaLite database


[flowmap]
name=Flowmap
author=Anita Graser
email=anitagraser@gmx.at
tags=flows, arrows
description=The collection contains styles for flow maps

Dans cet exemple, nous avons deux collections (osm_spatialite_googlemaps et flowmap). Pour chaque collection il est obligatoire d’indiquer un nom, un auteur, une adresse mail, des mots-clés et une description.

Pour mettre cet entrepôt en ligne sur un serveur, il faut créer un fichier zip de chaque collection. Toute la démarche est expliquée sur les pages du plugin.

QGis 2.18 est disponible

$
0
0

Depuis quelques jours la nouvelle version de QGis Las Palmas (2.18) est disponible pour téléchargement.

Cliquez ici pour aller à la page de téléchargement du projet QGis.

qgis 2.18 las palmas

Pour l’instant il n’y a pas de page en français décrivant les « nouveautés » de cette version.

Vous pouvez consulter la page en anglais des changements (« Visual changelogs ») en cliquant ici.

Il vaut mieux le dire tout de suite, il n’y a pas de changement majeur. L’essentiel des modifications concerne des algorithmes de traitement des géométries:

  • l’algorithme de fusion de polygones accepte maintenant multiples champs en entrée,
  • l’algorithme de découpe de polygones a été amélioré,
  • l’algorithme de fusion de lignes a été réécrit,
  • on peut positionner les étiquettes sur les contours des polygones,
  • etc…

Et surtout, pour ceux qui doivent travailler avec des sources dxf, une nouvelle interface d’import (même si je n’ai pas pu voir, pour le moment, un changement en ce qui la concerne ).

Ce qu’il faut retenir est que cette version est la dernière de la lignée 2.X

La prochaine version sera la version 3.0 avec deux modifications majeures: l’intégration de Python 3.0 et de QT5.

C’est difficile, en tant que non participant au projet QGis, d’avoir des informations sûres sur les sujets autour de la version 2.18

A mon avis, et je n’engage que moi, je pense qu’il n’y aura pas de documentation 2.18

Depuis un certain temps, l’équipe projet de QGis s’est occupé de faire la documentation seulement pour les version de type LTR. La 2.18 n’a pas été cataloguée LTR, on peut supposer alors que la dernière version de la documentation pour la lignée 2.X sera la documentation de  la version 2.14.

On a donc 3 mois avec un certain flou, avant la livraison de la version 3.0, prévue  en février (?) 2017.

En tout cas, on ne devrait pas s’inquiéter outre-mesure sur la disponibilité des fonctionnalités de la 2.18 dans la 3.0, l’équipe projet QGis s’étant fixé le portage de tout ce qui est disponible actuellement.

Par contre la période de flou sera un peu plus longue pour les plugins, car ils doivent être revus et corrigés pour rentrer dans le moule Python 3.0…


Points to Line avec QGis

$
0
0

Dans un article précédent nous avons vu comment créer une couche de lignes à partir d’un fichier texte ou Excel avec Arcmap. Voici le tour de QGis.Par rapport à ArcMap il y a seulement deux différences:

  • la première est qu’il n’est pas nécessaire de charger la table Excel, puis de la sauvegarder en tant que couche (shapefile)
  • le deuxième est qu’il n’y a pas d’option pour fermer automatiquement les lignes en reliant le dernier point au premier point de chaque ligne.

Le fichier contenant cette information est un tableau Excel sous la forme:

tableau excel de bathymétrie
En ce qui le concerne, comme pour créer une couche de points, il faut disposer d’un champ X et d’un champ Y qui permettront de créer le point correspondant. Pour avoir des entités ligne, il nous faut un troisième champ indispensable qui contienne un identifiant de ligne: tous les points d’une ligne auront la même valeur pour ce champ. Un quatrième champ est nécessaire pour indiquer l’ordre des points. mais ce champ nous verrons comment le créer au moment d’utiliser l’outil de traitement.

Voyons la procédure en détail.

Pour créer une couche virtuelle à partir d’une feuille Excel, il faut le plugin Spreadsheet Layers.

Pour cela allez dans le menu Extensions ->Installer/gérer les extensions et double-cliquez sur l’extension « Spreadsheet layers« .

installation du plugin spreadsheet layer de qgisDans la barre d’outils verticale de gauche vous verrez un nouvel outil

outil de chargement de table Excel dans QGisCliquez sur cet outil.

chargement d'une table Excel avec spreadsheet layers dans qgisAvec le bouton Parcourir… pointez sur votre fichier Excel, et, si nécessaire, avec le menu déroulant Feuille sélectionnez la feuille contenant vos données.

Donnez un nom à la couche.

Cochez la case Géométrie et rentrez les noms de champ correspondants aux X et Y.

Sélectionnez le SRC (système de référence) correspondant à vos données (par exemple EPSG:4236 si c’est des latitudes/longitudes).

Cliquez sur OK.

couche Excel chargée dans qgisLa couche de points est affichée dans QGis.

Dans le panneau Traitements, allez dans Géotraitements QGis -> Outils de création de vecteurs -> points vers lignes.

outil de tyraitement points vers lignes de qgisAvant de lancer l’outil, vérifiez qu’il existe bien un champ Id qui donne l’ordre des enregistrements. Si ce n’est pas le cas:

  • sélectionnez la couche que vous venez de charger
  • cliquez sur l’outil « Calculatrice de champ », ceci ouvre la table correspondante
  • calcul d'un champ de triLaissez cochée la case Créer un nouveau champ
  • Nommez le champ, par exemple Tri ou Ordre
  • Pour l’expression double-cliquez sur row_number ou sur Enregistrements->$id
  • Cliquez sur OK. Vous aurez un champ de tri disponible pour l’outil Points vers lignes.

Double-cliquez sur l’outil de traitement pour l’exécuter.

paramétrage du traitementy points vers lignes de qgisRenseignez les champs Couche en entrée et champ de regroupement et champ de tri.

Si vous souhaitez créer un fichier sur le disque, cliquez sur le bouton de Chemins et donnez un nom au fichier en sortie.

Cliquez sur RUN.

Le résultat final s’affiche dans QGis.

résultat final de points vers lignes dans qgis

Jointures 1-n dans QGis: les couches virtuelles

$
0
0

Une des techniques les plus répandues en SIG pour pouvoir traiter des données non spatiales est celle de la jointure. On utilise une couche géographique, possédant des géométries, comme support d’une autre couche ne possédant pas de données de localisation. Pour faire cela, on utilise un champ commun aux deux tables, qui permet de « joindre » les enregistrements de la table géographique à ceux de la table non géographique. On créé ainsi une nouvelle table virtuelle ou les attributs de la table non géographique peuvent être utilisés pour être cartographiés avec la géométrie de la première table. Pour que cette jointure marche il faut que pour un enregistrement de la table géographique on retrouve un enregistrement dans la table non géographique, ou qu’on n’en trouve pas. Car si l’on trouve plus d’un, la jointure ne peut pas marcher. On parle alors de « relation » entre les tables et non de « jointure ».

Pendant longtemps, les logiciels SIG n’ont permis que de travailler avec des jointures. Les relations ne supportaient pas la plupart des opérateurs spatiaux applicables aux jointures.

Une des raisons de cette limitation était le sous-ensemble restreint du langage SQL applicable aux couches géographiques. Que ce soit sur les fichiers shapefile, ou autres, les requêtes applicables se limitaient à une clause préformatée  de type « SELECT * FROM la_table WHERE » et où on pouvait construire la fin de la requête, c’est à dire la clause WHERE.

Pour pouvoir créer une table virtuelle avec plusieurs enregistrements de la table B correspondants à un enregistrement de la table A (cardinalité de type 1,n) il faut utiliser la capacité de jointure de tables du SQL et donc, utiliser deux tables dans la requête. Ceci est possible dans QGis aujourd’hui (ça n’a pas toujours été le cas), en utilisant les « couches virtuelles ». Elles sont apparues sous forme de plugin dans la version 2.10, et intégrées aux corps de QGis dans la version 2.14 .

Les couches virtuelles de QGis

Fonctionnalités des couches virtuelles

•Vous pouvez créer une nouvelle couche virtuelle avec le bouton « New virtual layer »:
•Une couche virtuelle peut être créée à partir d’une sélection de couche (clic droit dans la fenêtre couche)

•Si vous voulez filtrer une couche avec une jointure, Qgis proposera de créer une couche virtuelle

•Dans DBMANAGER, il y a une nouvelle entrée « Virtual Layers » où vous pouvez utiliser la Fenêtre SQL pour créer une couche virtuelle

La génération des couches virtuelles est sauvegardée dans le fichier projet. La couche virtuelle se comporte comme une table native, notamment avec les champs issus d’une jointure.

Utilisation des couches virtuelles

Prenons un exemple:

Nous disposons d’un fichier Excel contenant les différentes aires communales (campings, grandes surfaces,naturelles, stationnements,…). Ce tableau a une colonne INSEE où l’on trouve le code Insee de la commune sur laquelle se trouve l’aire.

Nous disposons d’un shapefile des communes sous forme de polygones, dans lequel nous trouvons un attribut INSEE_COM avec le code Insee de la commune.

Ce que nous souhaitons c’est d’avoir une couche où chaque aire soit représentée par le polygone de la commune correspondante. Au lieu d’avoir les X polygones de la couche communes nous voulons avoir les Y polygones correspondants aux Y lignes de la table Excel des aires communales.

Nous chargeons la couche Communes dans QGis, ainsi que la table Excel CCAires. Pour charger la table Excel vous devez activer et utiliser le plugin Spreadsheet Layers.

Pour créer la couche virtuelle, on clique sur le bouton Ajouter/Editer couche virtuelle

Nous utilisons le bouton Importer pour ajouter les deux couches dans la liste des Couches intégrées.

Dans la fenêtre Requête, on rentre la commande SQL suivante:

SELECT * FROM communes29, CCAires  where INSEE_COM = INSEE

Vous pouvez (et devez) tester la syntaxe de votre requête SQL avec le bouton Tester

On clique sur OK et la couche virtuelle est ajoutée à la carte.

Remarquez les deux communes absentes, car elles n’ont pas d’aire communale dans le fichier Excel.

Si on affiche la table attributaire de la couche virtuelle:

On peut voir que plusieurs enregistrements correspondent à une même commune, et que le nombre d’enregistrements (419) correspond au nombre de lignes du tableau Excel et non au nombre des communes du shapefile (283).

On peut aller plus loin et ajouter une clause WHERE pour ne sélectionner qu’une partie des aires communales, par exemple les campings

On obtient seulement 148 enregistrements, correspondant au nombre de campings présents dans le tableau Excel.

Cartes allemandes de l’Angleterre de la deuxième guerre mondiale sous ArcGis ou QGis

$
0
0

Nous avons vu dans des articles précédents comment accéder au fond cartographique des alliés pendant la guerre 39-45 à la librairie de l’Université du Texas (http://www.lib.utexas.edu/maps ). Voici comment accéder et utiliser les cartes réalisés par l’État Major de Armées Allemandes en vue de l’invasion de l’Angleterre, sur  le site de David Rumsey Map Collection . Vous pouvez accéder gratuitement à quelque 70000 documents. Je vous laisse découvrir par vous-mêmes la portée géographique et historique de ce fonds impressionnant.

Voyons ici une petite partie, la numérisation du fond cartographique de l’Armée allemande pendant la deuxième Guerre Mondiale (2800 documents) et comment les intégrer dans votre SIG préféré (ArcGis ou QGis).

Accès aux documents

Allez sur la page http://www.davidrumsey.com/luna/servlet/view/all  et commencez par vous enregistrer. Pas de panique, vous rentrez un nom, un mot de passe, une adresse mail, et c’est fait. Pas de mail de confirmation ni autres données à fournir.

enregistrement sur le site david rumsey map collectionSur le bandeau de gauche, vous pouvez cliquer pour sélectionner une partie de la collection.

critèeres de sélection dans David Rumsey Map CollectionSi vous cliquez sur Generalstab des Heeres vous aurez le sous-ensemble correspondant au Haut Commandement Militaire (2824 documents):

affichage de la sélection dans David Rumsey Map CollectionMaintenant si vous cliquez sur un autre élément (le bandeau a été mis à jour en fonction de votre sélection), par exemple Military, vous n’aurez que les 155 cartes militaires au sein des documents du Generalstab des Heeres. Et ainsi de suite: si vous cliquez sur Leeds, vous n’aurez que les cartes de la ville de Leeds.

Voilà pour la navigation. Maintenant, pour récupérer le raster correspondant, par exemple pour la ville de Sunderland:

téléchargement de la sélection dans David Rumsey Map CollectionCliquez sur le bouton Export

définition de l'image téléchargée  dans David Rumsey Map CollectionSélectionnez la plus grande définition. Un message vous indique de patienter…

Puis le fichier est disponible pour téléchargement. N’oubliez pas de changer la valeur par défaut en Enregistrer le fichier …

enregistrement du téléchargement de la sélection dans David Rumsey Map CollectionVoilà, votre fichier est disponible dans votre répertoire de téléchargement.

imùage téléchargée prête à georeferencerPar contre, l’image n’est pas géoréférencée. Pour pouvoir l’intégrer dans votre SIG, il va falloir la géoréférencer à partir des grilles présentes sur la carte. Mais tout d’abord, il va falloir définir le système de coordonnées.

Le système Gauss-Kruger 3 degrés

Pour toute information, vous avez cet encadré sur la carte:

Traduction: Gauss-Krugger maillage zone 119.

La projection Gauss-Krugger est similaire à la projection UTM. Par contre elle peut avoir des fuseaux de 3 ou de 6° d’amplitude. Pendant la Deuxième Guerre mondiale, l’Allemagne utilisait les fuseaux de 3°.

Voici un petit tableau synthétique des fuseaux 3° pour l’Europe:

tableau des fuseau gauss-kruger 3 degrés pour l'EuropeLa ligne du dessus donne le méridien central du fuseau, la ligne de dessous le numéro du fuseau.

Parmi les cartes disponibles vous trouverez des cartes réalisées avec le fuseau 119 et le fuseau 0.

Les paramètres pour le fuseau 119 sont

paramètres du fuseau 119 gauss-kruger 3 degresPour le fuseau 0, il faut remplacer le « central meridian:357.0 » par 0.

Voici pour la projection. Maintenant voyons l’ellipsoïde. Cette information n’est pas portée sur le cartes, je vous la donne alors: Bessel 1841

Les paramètres de cette ellipsoïde sont

  • a = 6 377 397,155 m
  • f = 1 / 299,152 815 351 323 3 (0,003 342 773 154 ± 0,000 005)
  • b = 6 356 078,963 m

Dernier problème, le système géodésique. Le système géodésique utilisé est la triangulation allemande. Pour passer de cette triangulation au système WGS84 il faut une transformation à 3 paramètres

deltaX= 631

deltaY=27

deltaZ=446

(Source https://www.researchgate.net/publication/292690350_GIS_integration_of_the_German_Army_Grid_DHG_and_its_geodetic_datums)

Comme il se doit, l’erreur moyenne de transformation est d’autour de 20m. Ne vous attendez pas à des miracles. Avec les pliures des cartes papier et autres sources d’erreur, vous pouvez vous retrouver avec une centaine de mètres d’écart.

La projection Gauss-Kruger 3 degrés sous ArcGis

Les fichiers de projection n’existent pas par défaut dans ArcGis. Nous devons les créer.

Ouvrez ArcMap

Avec un clic droit sur le bloc de données, ouvrez la fenêtre de propriétés, onglet système de coordonnées.

nouveau système de coordonnées dans arcmap/arcgisCliquez sur le bouton Ajouter un système de coordonnées ->Nouveau -> Systèmes se coordonnées projetées

paramètres du nouveau système de coordonnées gauss-kruger dans arcmapDonnez un nom explicite avec le numéro de fuseau, sélectionnez Gauss-kruger (Ou Universal transverse mercator) dans la liste des projections, puis rentrez 500 000 comme False_easting et 357 comme Central_Meridian pour le fuseau 119 et 0 si vous rentrez les paramètres du fuseau 0.

Cliquez sur le bouton Modifier

et sélectionnez le système Deutches Hauptdreiecksnetz (Réseau de triangulation allemand).

systèeme géodésique du nouveau système de coordonnées gauss-kruger dans arcmapCliquez sur Ok et sur OK.

Votre document est prêt pour géoréférencer votre image.

Chargez-là dans ArcMap est activez la barre d’outils « géoréférencement » si ce n’est pas déjà fait. Cliquez sur OK sur le message d’avertissement d’absence de système de coordonnées.

Vous allez rentrer au moins quatre points, dans les quatre coins de la carte, au croisement du quadrillage de la carte.

georeferencement dans arcmapPour le coin supérieur gauche, par exemple, cliquez sur l’outil « ajouter un point de calage » de la barre d’outils « géoréférencement », puis cliquez sur le croisement des lignes sur la carte, puis cliquez avec le bouton droit. Une fenêtre s’ouvre pour rentrer manuellement les coordonnées XY.

calcul de coordonnées de georeferencement dans arcmapPour les coordonnées X, l’étiquette de la carte indique 119600. Ce chiffre ce décompose en deux parties: la première 119 est le numéro du fuseau, la deuxième 600, est la coordonnée X du point, en km. Comme nous travaillons avec des unités en mètres il faut convertir 600km en m= 600000.

pour les coordonnées Y, les étiquettes sont en km. Ici 6089. Nous rentrons alors cette valeur en m: 6089000.

Faites de même avec les autres 3 points. Puis, dans la barre d’outils géoréférencement, dans le menu déroulant, cliquez sur Rectifier pour créer une nouvelle image géoréférencée au format tif.

Vous pourrez maintenant charger cette image dans vos différents projets. Quand vous le ferez, étant donné que le système géodésique est différent de celui de vos projets (en principe WGS84 ou assimilé), un message d’avertissement va apparaître.

transformation du système Bessel 1841 dans arcmap

Cliquez sur le bouton « transformations » pour rentrer les paramètres de transformation entre le système Deutches Hauptdreiecksnetz  et le GCS WGS84

transformation du système Bessel 1841 vers le WGS84 dans arcmapCliquez sur Nouveau, puis rentrez les trois paramètres de la transformation géocentrique: 631, 27, et 446. Puis OK et OK.

Votre image s’affiche maintenant dans votre document et se superpose aux couches actuelles.

rtésultat final dans arcmap

La projection Gauss-Kruger 3 degrés sous QGis

Sous QGis, la gestion des projections est beaucoup plus simple. Il suffit de créer votre projection personnalisée qui contient tous les éléments: projection, système géodésique, transformation.

Avant de charger votre image ou de la géoréférencer, commencez par créer vos deux projections personnalisées pour les fuseaux 0 et 119.

creer une projection personnalisée dans qgisCliquez sur le menu Préférences->Projection personnalisée

Cliquez sur le bouton + pour ajouter une nouvelle projection.

Dans le champ nom rentrez, par exemple, Gauss_kruger_3degres_119 pour le fuseau 119.

Dans le champ Paramètres, rentrez

+proj=tmerc +lat_0=0 +lon_0=357 +k=1 +x_0=500000 +y_0=0 +ellps=bessel +units=m +no_defs +towgs84=631,27,446,0,0,0,0

Cliquez sur OK.

Répétez l’opération pour le fuseau 0 en rentrant Gauss_kruger_3degres_0 pour le nom et

+proj=tmerc +lat_0=0 +lon_0=0 +k=1 +x_0=500000 +y_0=0 +ellps=bessel +units=m +no_defs +towgs84=631,27,446,0,0,0,0

pour les paramètres.

Voilà! C’est prêt. Vous pouvez charger votre image géoréférencée ou ouvrir l’outil de Géoréférencement (Raster -> Géoréferencer ->Géoréferencer)

Indiquez la projection à utiliser (une des deux que vous venez de créer), puis rentrez les mêmes quatre points de contrôle que ceux que nous avons vu plus haut avec ArcMap.

Introduction à l’analyse exploratoire des données pour la géostatistique

$
0
0

Voici une petite série d’articles motivés par une question un peu vaste d’un étudiant qui utilise Geostatistical Analyst d’ArcGis : comment interpréter le QQplot, trend analyst et la variogramme?. Que ce soit avec Geostatistical Analyst ou tout autre outil de géostatistique, on est censés commencer, avant toute interpolation , par l’analyse exploratoire des données. Pourquoi? Tout simplement parce que les outils de géostatistiques assument un certain nombre de caractéristiques des données et que si ces assomptions ne s’appliquent pas à notre jeu de données, nos résultats seront faux. Nous verrons donc ici sur quels principes s’appuient les outils géostatistiques et comment utiliser les outils d’analyse exploratoire pour corroborer les hypothèses nécessaires.

 Quelques principes de la géotatistique

Voyons tout d’abord les bases de la géostatistique. Contrairement aux approches d’interpolation déterministes, la géostatistique suppose que toutes les valeurs à l’intérieur de votre zone d’étude sont le résultat d’un processus aléatoire. Un processus aléatoire ne signifie pas que tous les événements sont indépendants.

La géostatistique est basée sur des processus aléatoires avec dépendance.

Un tel type de processus est, par exemple, le lancer en l’air de trois pièces de monnaie. On observe si elles sont des piles ou des faces. La quatrième pièce ne sera pas lancée.

La règle pour déterminer le résultat du lancer de la quatrième pièce est :

  • si la deuxième et la troisième pièce sont égales, le résultat du lancer de la quatrième pièce de monnaie est le même que la première;
  • si non, le résultat du lancer de la quatrième pièce de monnaie sera l’opposé à celui de la la première.

Dans un contexte spatial ou temporel, une telle dépendance est appelée autocorrélation.

Comme ceci est la notion à la base de toute la géostatistique, il vaut mieux s’attarder un peu. Le lancer d’une pièce est le symbole du hasard. On va donc l’appeler un « processus aléatoire ». Jusque là, rien de nouveau.

D’un autre côté, si on lance la pièce en l’air 100 fois, on s’attend à avoir autant de fois pile que face. Et ça, ça ne vous choque pas non plus. Si on a lancé la pièce 99 fois et qu’on a obtenu 50 piles et 49 faces, qu’est-ce que vous prédiriez pour le 100 lancer?

Si vous dites face, vous faites de la géostatistique. Vous savez que le lancer est un processus aléatoire, mais vous êtes aussi convaincu qu’il y a une certaine dépendance des résultats par rapport à un modèle théorique (sur un grand nombre de lancers il y aura 50% de piles et 50% de faces).

Pourtant il y a autan de chances de prévoir le centième lancer que le premier (1 chance sur deux). Voilà pourquoi comprendre la géostatistique n’est pas si simple.

Laissons maintenant nos pièces et prenons un exemple un peu plus géographique. Si on tire au hasard une paire de coordonnées XY dans le monde, quelle chance auriez vous de trouver son altitude ?

Si maintenant je vous dis que l’on suit un trajet GPS, en vous donnant les altitudes des points toutes les 50m. Quelles sont vos chances de trouver l’altitude du prochain point?

C’est comme pour les pièces: en théorie vos chances sont les mêmes dans les deux cas, mais en pratique, si vous analysez la suite des points GPS vous pourrez prédire à peu de chose près l’altitude du prochain point.

Prévision de processus aléatoires avec dépendance

Comment tout cela se rapporte-t-il à la géostatistique et à la prévision des valeurs non mesurées? Dans l’exemple des pièces, les règles de dépendance ont été données, dans celui du GPS il faut les trouver. Dans la réalité, les règles de dépendance sont toujours inconnues. En géostatistique, il y a donc deux tâches principales: (1) découvrir les règles de dépendance et (2) faire des prédictions. Comme vous pouvez le voir à partir des exemples, les prédictions ne peuvent être faites que si l’on connait les règles de dépendance.
Le krigeage repose sur ces deux tâches: (1) l’analyse des semi-vectoriogramme et de covariance (autocorrélation spatiale) et (2) la prédiction des valeurs inconnues. En raison de ces deux tâches distinctes, il a été dit que la géostatistique utilise les données deux fois: d’abord pour estimer l’autocorrélation spatiale et la seconde pour faire les prédictions

Comprendre la stationnarité

Considérons à nouveau l’exemple des pièces. Il y a une seule règle de dépendance pour les lancers des pièces. Avec ce seul ensemble de valeurs mesurées, il n’y a aucun espoir de connaître les règles de dépendance si elle ne sont pas explicitées par quelqu’un. Toutefois, grâce à des observations continues de nombreux échantillons (nos points GPS), les dépendances peuvent devenir évidentes. En général, les statistiques s’appuient sur une notion de réplication, de répétition, à partit de laquelle on peut penser que l’on peut faire des estimations  et que la variabilité et l’incertitude de l’estimation peuvent être comprises à partir de séries d’observations répétées.
Dans un contexte spatial, l’idée de stationnarité est utilisée pour obtenir la réplication nécessaire. La stationnarité est une hypothèse qui est souvent raisonnable pour les données spatiales. Il existe deux types de stationnarité.
L’une est appelée stationnarité de la moyenne.On suppose ici que la moyenne est constante entre les échantillons et qu’elle est indépendante de l’emplacement des échantillons.
Le second type de stationnarité est appelé stationnarité de second ordre pour la covariance et stationnarité intrinsèque pour les semi-variogrammes.

La stationnarité de second ordre est l’hypothèse selon quoi, la covariance est la même entre deux points quelconques s’ils sont à la même distance et dans la même direction, indépendamment des points que vous choisissez. La covariance dépendra de la distance entre deux valeurs quelconques et non de leur emplacement.

Dans le schéma ci-dessus, la covariance entre les paires de points reliés par le trait noir, est assumée être la même.

Que tout ceci est clair en thermes statistiques. Mais comme vous n’êtes pas obligé d’être un statisticien, traduisons ceci en français dans le texte.

Ici nous avons des points A et des points B reliés par les traits noirs. La covariance est une mesure de comment varient deux variables. Peu importe la formule de calcul, dans cet exemple c’est une mesure de la différence de hauteur de A et B par rapport à la hauteur moyenne du terrain. Si les valeurs de A étaient complètement indépendantes de B, la covariance serait nulle (0). Si elle n’est pas nulle, on peut penser qu’il y a un lien entre les deux variables A et B. Si on prend des points séparés par une même distance, pour qu’on puisse dire que la stationnarité de second ordre est respectée, il faut que la covariance de tous ces paires de points soient sensiblement égales.

Dans le schéma ci-dessus ça semble bien être le cas.

Dans celui qui suit, est-ce que vous pensez que c’est aussi le cas?

Et bien, oui. Même si les différences de valeur entre les paires situées dans le replat et dans les zones à forte pente sont très différents, la covariance mesure la différence entre la hauteur de A et la moyenne des points A et la hauteur de B et la moyenne des points B. Elle sera sensiblement la même quelle qu’elle soit la pente.

Par contre, dans le schéma suivant

La covariance des paires rouges sera différente de celle des paires bleues. Si on prend que les paires bleues, la stationnarité de second ordre est respectée, si on prend l’ensemble des paires, elle ne l’est pas.

Pour les semi-variogrammes, on applique ce même principe à la variance. La stationnarité intrinsèque est l’hypothèse que la variance de la différence des valeur observées est la même entre deux points quelconques s’ils sont à la même distance et dans la même direction, peu importe les deux points que vous choisissez.

La stationnarité de second ordre et intrinsèque sont des hypothèses nécessaires pour obtenir la réplication nécessaire, et donc pour estimer les règles de dépendance, ce qui nous permet de faire des prédictions et d’évaluer l’incertitude dans les prédictions. Notez que c’est l’information spatiale (distance similaire entre deux points quelconques) qui fournit la réplication.

La notion de distance sera tout le temps présente dans l’analyse géostatistique. Pour l’instant disons simplement que nous utiliserons une notion de sens commun: plus deux points sont proches, plus ils auront tendance à avoir des valeurs similaires, plus il y aura un lien entre eux.

Par contre plus on s’éloignera, moins ce lien sera visible. Jusqu’à ce que les valeurs des deux points soient complétement indépendantes.

Nous voila donc avec une série d’hypothèses sur nos données qui vont nous permettre d’utiliser les outils géostatistiques pour prévoir les valeurs là où nous n’avons pas de données.

Mais, qu’est-ce qu’il arriverait si nos hypothèses sot fausses? Tout simplement que nos prédictions seraient fausses aussi. Il faut donc vérifier, AVANT d’utiliser les outils géostatistiques, que les hypothèses de base utilisées par ces outils sont bien remplies. C’est cette étape qu’on dénomme Analyse Exploratoire des Données Spatialisées (AEDS).

L’analyse exploratoire des données spatialisées (AEDS)

L’analyse exploratoire des données spatiales vous permet d’examiner vos données de différentes façons. Avant de créer une surface, l’AEDS vous permet d’acquérir une compréhension plus profonde des phénomènes que vous étudiez afin que vous puissiez prendre de meilleures décisions sur les questions relatives à vos données.

Nota pour les utilisateurs d’ArcGis Geostatistical Analyst:

Dans ArcGis, l'environnement de l'AEDS se compose d'une série d'outils, chacun permettant une vue particulière des données. Chaque vue peut être manipulée et explorée, permettant différents points de vue sur les données. Chaque vue est interconnectée avec toutes les autres vues ainsi qu'avec ArcMap. C'est-à-dire que si une barre est sélectionnée dans l'histogramme, les points de la barre sont également sélectionnés sur QQPlot (si ouvert), sur toute autre vue de l'AEDS ouverte et sur la carte ArcMap.

Chaque outil AEDS vous permet d'examiner vos données sous différentes vues. Chaque vue est affichée dans une fenêtre séparée et interagit entièrement avec l'affichage ArcMap ainsi qu'avec d'autres fenêtres AEDS. Les outils disponibles sont Histogramme, Carte de Voronoi, QQPlot Normal, Analyse de Tendance, Nuage de Semivariogramme / Covariance, QQPlot Général et Nuage de Crosscovariance

Nota pour les autres :

Que ce soit dans QGis ou dans d'autres logiciels de SIG, même si les outils ne sont pas empaquetés comme dans l'application Geostatistical Analyst, vous disposez des mêmes outils d'analyse exploratoire. Tout ce qui sera dit ici est valable, quel qu'il soit l'outil informatique que vous utiliserez.

L’exploration de la distribution des données, la recherche de valeurs aberrantes globales et locales, la recherche de tendances globales, l’examen de l’autocorrélation spatiale et la compréhension de la covariance entre plusieurs ensembles de données sont autant de tâches utiles, voir indispensables,à effectuer sur vos données. Cet ensemble d’analyses compose l’AEDS.

Dans le prochain article nous verrons l’utilisation des histogrammes dans le cadre de l’AEDS.

 

Geotag and import photos remplace photo2shape dans QGis

$
0
0

Cet article est une actualisation de « Intégrer des photos géolocalisées dans QGis avec Photo2shape« . En effet, le plugin photo2shape n’est plus maintenu et pose pas mal de problèmes. Nous allons effectuer les mêmes opérations avec le nouvel plugin « Geotag and import photos ».

Dans cet article nous verrons comment créer une couche de points dans QGis contenant les positions et les liens vers des photos « geotaggées ». Pour cela nos allons utiliser le plugin QGis Photo2Shape.

Introduction

Le geotagging consiste à préciser les coordonnées géographiques de photographies en modifiant leurs données (ou tags) EXIF. Les données EXIF (Exchangeable image file format ) d’une photo contiennent diverses informations comme le type d’appareil photo, la date et l’heure de la prise de vue etc…

Si vous disposez d’un appareil pour la prise de vue équipé d’un GPS, les données de géolocalisation peuvent être incluses automatiquement. Par exemple, si vous disposez d’un iPhone vous pouvez activer la géolocalisation des photos (voir comment l’activer sur cette page:How to turn photo geotagging on or off on your iPhone or iPad).

Si non, au lieu d’utiliser des logiciels tels que Locr GPS Photo (gratuit) ou Robogeo (payant) pour inclure une localisation dans vos images, vous pourrez utiliser ce nouvel plugin (options geotag photos et tag photos).

 

Installation du plugin Geotag and import photos

L’ancien plugin photo2shape utilisait un module Python complémentaire,  ExifReadGeotag and import photos utilise un exécutable externe à QGis pour gérer le format EXIF. Cet exécutable, ExifTool,  est gratuit et libre de droits pour toutes les plate-formes.

Vous pouvez télécharger la dernière version à l’adresse http://www.sno.phy.queensu.ca/~phil/exiftool/

Sous Windows, une fois téléchargé le fichier compressé, décompressez le fichier dans un répertoire permanent et renommez le fichier en exiftool.exe.

Vous aurez à indiquer au plugin l’emplacement de cet exécutable pour qu’il puisse fonctionner.

Pour installer le plugin dans QGis, ouvrez le menu Extensions -> Installer/Gérer les extensions

extensions qgis expérimentalesAssurez-vous que les extensions expérimentales sont affichées. Si ce n’est pas le cas, vous ne trouverez pas le plugin pour l’installer.

Sélectionnez Toutes et parcourez la liste pour trouver « Geotag and import photos« . Cliquez sur la ligne pour la sélectionner et cliquez sur le bouton Installer l’extension.

Fermez la fenêtre. Vous avez maintenant une nouvelle ligne de menu sous Vecteur :

menu extension geotag and import photos de qgisCliquez sur Settings et renseignez la première ligne avec l’emplacement ou vous avez mis exiftools.exe

parametrage de l'extension geotag and import photos de qgisLaissez la deuxième ligne vide.

L’installation et configuration du plugin est terminée.

Chargement des photos dans QGis

Supposons que vous utilisez un iPhone ou équivalent. La procédure d’intégration des images dans QGis est extrêmement simple.

1- copiez vos images dans un répertoire. Avec la visionneuse de photos Windows, par exemple, assurez vous que les photos sont orientées correctement. Comme vous allez lier les images à la couche créée, les images pourront être visualisées directement avec QGis. Il est donc indispensable qu’elles soient stockées à l’endroit.

2-Lancez la création d’un shapefile correspondant aux geotags de vos photos avec le plugin Geotag anf import photos:

menu Vecteur -> Geotag and import photos -> Import photos

fenêtre import de l'extension geotag and import photos de qgisRenseignez le répertoire où vous avez vos photos. Sélectionnez les tags à prendre en compte (Ici on a choisi Select all). Pour chaque tag, le plugin va créer une colonne dans la table du shape en sortie qui sera renseignée avec la valeur trouvée pour chaque photo.

Rentrez l’emplacement et le nom à donner au shapefile en sortie.

Cliquez sur OK et si vous avez coché la case Add result to canvas, vous verrez les points correspondants aux photos:

résultat de l'import avec l'extension geotag and import photos de qgisSi vous ouvrez la table correspondante vous voyez les champs qui ont été créés.

table attributaire générée par l'extension geotag and import photos de qgisLe plus important est le champ qui contient le répertoire et nom de fichier image, car c’est celui qu’on va utiliser pour afficher les images dans QGis. Le nom de ce champ est par défaut, filepath.

Affichage des photos dans QGis

Pour afficher automatiquement les photos lors du déplacement de la souris sur un point du shape, nous allons utiliser les infobulles.

  • Ouvrez le menu contextuel de la couche shape créée.
  • Sélectionnez l’item Infobulles
  • Sélectionnez HTML
  • cliquez sur Insérer une expression

paramétrage des infobullesDans la fenêtre Expression tapez la commande suivante:

CONCAT(‘<img src=  » ‘,filepath,’  » width= « 400 »></img>’)

La valeur de width est à adapter selon la taille de vos photos.

expressionde l'infobulle

  • Cliquez sur OK et OK.

Maintenant, quand vous sélectionnez l’outil Infobulles, quand vous vous arrêtez sur un point du shape, l’image apparaît automatiquement.

Visualiser les photo avec eVis

Un autre moyen de visualiser les photos, sans activer les infobulles html, est l’extension eVis.

Cette extension est installée par défaut dans QGis 2.18.

Simplement vérifiez qu’elle est bien activée en ouvrant le gestionnaire d’extensions.

Vous allez utiliser les deux outils eVis:

Si vous ne les voyez pas dans les barres d’outils, allez dans le menu Vue-> Barres d’outils et cochez la case Barre d’outils de la Base de données

Cliquez d’abord sur l’outil Navigateur d’événements d’eVis (le bouton de droite)

La fenêtre de navigation s’ouvre:

Cliquez sur l’onglet Options, définissez le champ à prendre en compte pour l’affichage des images (filepath) et cochez la case Se souvenir de, puis cliquez sur Enregistrer.

Vous pouvez maintenant utiliser l’outil Outil eVis Id Événement (bouton de gauche). Quand vous cliquez sur un point de photo sur la carte, l’outil ouvre une fenêtre avec les données des champs attributaires ainsi qu’un fenêtre avec l’affichage de l’image.

Utiliser R dans les traitements QGis

$
0
0

La plupart des logiciels SIG d’aujourd’hui, y compris ArcGIS, QGIS, GRASS et d’autres applications industrielles et open source, utilisent Python comme langage de script et de complément pour les plugins. Ce langage est aussi utilisé pour les besoins de programmation qui peuvent accroître les fonctions d’analyse spatiale et de traitement spatial.

Dans la suite de cette logique, une intégration récente du paquet statistique R a été réalisée pour son utilisation dans QGIS. Les utilisateurs peuvent accéder à la bibliothèque d’analyse spatiale de R (de plus en plus utilisée) dans le panneau de traitements.

Le fournisseur de traitements R dans QgisBien que R soit essentiellement un ensemble de statistiques, son utilisation s’est étendue à un certain nombre de domaines, comme le traitement du langage naturel. Cette bibliothèque possède également de solides outils d’analyse spatiale, y compris l’analyse des distributions de points et la modélisation géostatistique bayésienne. Il peut lire et gérer une variété de données vectorielles et raster, y compris les fichiers shapefiles, NetCDF et GDAL.

Les programmes traditionnels de SIG ont souvent été limités par  leurs statistiques spatiales et leurs capacités d’analyse étaient relativement mineures, y compris une petite gamme de fonctions intégrées, obligeant les utilisateurs à utiliser d’autres plateformes pour l’analyse avancée, la modélisation et la simulation. ESRI l’a bien senti en faisant l’acquisition du programme MapStudio de l’Université de Minsk, devenu depuis 2001 l’extension Geostatistical Analyst d’ArcGis.

Avec R, de nombreuses procédures statistiques populaires et des analyses plus avancées, y compris une variété d’applications de simulation, peuvent être appliquées directement dans des outils tels que QGIS.

Installation de R pour QGis.

Inutile de vous précipiter sur le panneau traitements de QGis pour trouver R. Il ne fait pas partie des fournisseurs de traitement fournis avec l’installation de QGis.

Vous devez télécharger et installer R sur votre poste avant de configurer QGis pour pouvoir l’utiliser.

Pour télécharger R, voici le lien: https://cran.r-project.org/bin/windows/base/

Une fois téléchargé, double-cliquez sur le fichier R-3.3.2-win.exe pour installer R sur votre poste.

Le programme installe R dans le répertoire C:\Program Files\R\R-3.3.2

Configuration des options de traitement de QGis

Pour configurer R, ouvrez la fenêtre d’Options des traitements (menu Traitements -> Options…)

La fenêtre options des traitements de QgisDéployez l’item Fournisseurs de traitements -> R scripts

configuration du fournisseur de traitement R dans qgisCochez la case Activate pour activer l’option R et qu’elle apparaisse dans le panneau Traitements.

Si vous avez une version Windows 64bits, vous pouvez cocher la case Utiliser la version 64 bits. Si vous avez un poste 32 bits, seule la version 32 bits de R est installée. Si vous avez un poste 64 bits, les deux versions (32 et 64 bits) sont installées. Si vous ne cochez pas la case vous utiliserez la version 32 bits même si votre PC est un 64 bits.

Vous avez à configurer le répertoire avec la librairie R pour QGis. Ce répertoire,rlibs ,se trouve dans C:/User/votre nom d’utilisateur/.qgis2/processing

S’il n’existe pas, créez un répertoire rscripts à côté de rlibs et indiquez ce répertoire en tant que Répertoire de scripts R.

Pointez le Répertoire R sur le répertoire d’installation, par défaut C:\Program Files\R\R-3.3.2

Cliquez sur OK pour fermer le fenêtre d’Options des Traitements.

Vous avez maintenant le fournisseur R qui apparaît dans le panneau de traitements, avec deux sous-items:

panneau de traitements de qgis avec le fournisseur de traitements R configuréLe premier Create new R script ouvre une fenêtre d’édition ou vous pouvez taper un script Python. Si vous avez des entrées à définir pour l’exécution, il faudra le faire.

Le deuxième, Get R scripts from on-line scripts collection, vous permet d’utiliser des scripts Python prêt à l’usage avec des fenêtres de traitement appropriée déjà configurées.

Voyons un exemple. Vous souhaitez effectuer un histogramme R d’un champ d’une couche vecteur.

Double-cliquez sur Get R scripts from on-line scripts collection pour ouvrir la fenêtre Obtenir des scripts et des modèles:

ajout d'un traitement R à qgisOuvrez l’item Non installés :

exemple d'ajout de l'histogramme R comme traitement dans qgisRecherchez l’outil Histogramme, cochez la case correspondante et cliquez sur OK.

Dans la version 2.18.2 que j’utilise, la fenêtre de traitements ne se met pas à jour immédiatement. Si vous ouvrez à nouveau la fenêtre Obtenir des scripts et des modèles vous verrez un nouvel item sous Mise à jour disponible (dans le cas de l’histogramme) ou sous l’item Installés.

Quand vous refermez cette fenêtre, la fenêtre de traitements R dans le panneau Traitements est mise à jour et votre nouvel outil est maintenant disponible sous Script R utilisateur -> Histogram

Si vous double-cliquez sur l’outil, vous aurez la fenêtre de paramétrage qui s’ouvre:

Quand vous cliquez sur Run, le traitement s’effectue:

Si vous n’êtes pas familier avec R, c’est la manière la plus simple de commencer à utiliser les outils que R met à votre disposition.

Si vous faites un cliq droit sur l’outil dans le panneau de traitements, vous pouvez sélectionner l’option Éditer le script pour voir la construction du script Python:

Voilà. On a entrouvert la porte, à vous de découvrir les possibilités que R peut vous apporter.

 

QField:le dispositif mobile de QGis pour Android

$
0
0

QField permet de travailler sur des projets QGis sur des téléphones ou tablettes équipés d’Android, pour réaliser du travail de terrain

Dans cet article nous verrons comment installer QField sur un dispositif mobile, puis comment installer et  travailler sur un projet QGis.

Tout d’abord, qu’est-ce que vous pouvez faire avec QField?

QField permet d’installer sur votre téléphone ou tablette un projet QGis. Vous aurez un affichage correspondant à votre affichage QGis sur votre PC et vous pourrez éditer les informations attributaires ou géométriques, sur le terrain. Il ne faut pas confondre QField et la version Android de QGis. Cette dernière ouvre une interface équivalente à celle que vous avez sur votre PC, avec toutes les fonctionnalités de QGis. QField ouvre une interface simplifiée où vous êtes limité essentiellement à la mise à jour des données contenues dans votre projet.

Téléchargement de QField sur votre dispositif mobile.

Il y a plusieurs manières de télécharger QField : par la Play Store, par la page de téléchargements de QGis, ou tout simplement en faisant une recherche dans votre navigateur avec les termes « qgis android » :

qfield dans la play storeTouchez l’option QField for QGis Experimental (et pas QGis Experimental)

installation de qfield sur un dispositif mobile androidPuis touchez Installer

acceptation de la localisation sur androidTouchez à nouveau Installer pour permettre à l’application d’accéder aux données de localisation

Une fois terminé, fermez la fenêtre de la Play Store et touchez l’icône QField qui vient d’être ajouté à votre bureau:

icone qfield sur le bureau du dispositif mobileUne fenêtre vous indique que les différents modules sont en cours d’installation

postinstallation de qfield sur un dispositif android

Puis une fenêtre vous indique que l’installation est terminée et prête à l’emploi:

fin de l'installation de qfield sur un dispositif mobile androidComme le message l’indique, maintenant vous devez créer un projet sur votre version PC de QGis, la transférer sur votre dispositif mobile et l’ouvrir à partir du bouton présent sur cette page.

Créer un projet QGis

Vous devez créer un projet sur votre PC avec QGis. Vous aurez un fichier .qgs que vous devrez transférer sur votre mobile. Mais vous aurez aussi à transférer les données nécessaires à votre projet. Voyons une exemple:

projet qgis sur un pc

Créez un répertoire avec tous les fichiers nécessaires au projet

Toutes les données nécessaires doivent être physiquement sur votre mobile. Les connexions WFS, WMS, les connexions internet comme OSM, etc, ne fonctionneront pas.

Dans notre exemple, nous utilisons OpenStreetMap comme  fond de carte. Pour pouvoir l’utiliser sur notre mobile, nous sommes obligés de sauvegarder le fond de carte en tant qu’image, puis la charger dans notre projet en lieu et place de la couche OSM.

Pour ce qui est des couches WFS, WMS, etc, nous sommes aussi obligés d’enregistrer la couche en tant que fichier shp et remplace les couches par leurs fichiers dans notre projet.

Dans notre exemple, nous créons un répertoire » Campus » dans lequel nous enregistrons l’image issue d’OSM ainsi que le fichier avec les données des bâtiments. Nous sauvegardons le projet dans ce même répertoire.

Créez la symbologie souhaitée pour le travail sur le terrain.

Pour chaque couche vous pouvez utiliser l’ensemble des fonctionnalités de QGis pour leurs symbologie et leur étiquetage. Dans QField vous n’aurez pas la possibilité de modifier ces paramètres.

Transfert du projet sur votre mobile

Connectez votre mobile sur votre PC et recopiez le répertoire avec votre projet et ses données. Même si vous pouvez le faire un peu n’importe où, il est conseillé de le faire dans le répertoire Android/Data

transfert du projet qgis sur le dispositif mobile androidLancement de QField sur votre mobile

Lancez QField à partir du bureau de votre mobile. Vous aurez la fenêtre de choix de projet à ouvrir. Touchez le bouton pour parcourir les fichiers

lancement de qfield sur androidParcourez les répertoires, dans notre exemple Android/Data/Campus, sélectionnez le fichier .qgs du projet et cliquez sur Ouvrir.

localisation du fichier projet qgis sur le dispositif mobile androidQField ouvre la fenêtre de projet sur votre mobile

ouverture de qfield sur le dispositif mobile androidVous avez deux boutons en haut à gauche. Le bouton bleu vous permet d’activer la localisation de votre mobile et d’afficher un point rouge sur la carte indiquant la position géographique du mobile.

Le bouton menu ouvre un  panneau:

paneau d'options de qfield  sur le dispositif mobile androidLe panneau comporte en haut deux boutons. Le premier (menu) referme le panneau. Le deuxième ouvre les options possibles:options de qfield  sur le dispositif mobile androidA part l’option Ouvrir un projet qui permet de changer de projet, l’option importante est l’option Mode.

modes de travail de qfield  sur le dispositif mobile androidElle propose deux modes de travail: Parcourir et Dessiner.

La première se réfère aux attributs des entités, la deuxième aux géométries.

Mode Parcourir

mode parcouyrir de qfield  sur le dispositif mobile androidLe mode Parcourir permet l’affichage sur le bandeau de droite des identifiants des entités que vous pouvez sélectionner en les touchant sur la carte.

Si vous touchez l’identifiant du panneau de droite, une nouvelle fenêtre s’ouvre avec la table attributaire de l’entité:

édition de la table attributaire de qfield  sur le dispositif mobile androidLe crayon en haut à droite passe en mode édition. Vous pouvez alors rentrer/modifier les valeurs des attributs.

Mode Dessiner

mode dessiner de qfield  sur le dispositif mobile androidSur le bandeau de gauche vous sélectionnez la couche à éditer. Le crayon en bas à gauche passe en mode édition.

création de gféométries avec qfield  sur le dispositif mobile androidLe curseur est placé au centre de l’écran. Contrairement au PC, vous déplacez la carte et pas le curseur.

  • Le bouton + vert enregistre un nouveau point
  • Le bouton X annule l’entité et sort du mode édition
  • Le bouton – annule le dernier point rentré
  • Le bouton jaune termine la saisie de l’entité et la sauve, en quittant le mode édition.

Geotagger des photos avec QGis et geotag and import photos

$
0
0

Suite à l’article Geotag and import photos remplace photo2shape dans QGis  on m’a fait remarquer qu’une autre partie du plugin, celle qui permet de géoréférencer des photos qui n’ont pas de geotags, n’était pas très simple à utiliser.
Et il faut être honnête, le moins que l’on puisse dire c’est que ce n’est pas très intuitif. Voici donc un petit mode d’emploi de l’option geotag photos du plugin Geotag and import photos de QGis.

Pour ce qui est de l’installation du plugin , je vous renvoie sur l’article précédent.

Nous allons ici prendre une série de photos, prises avec un appareil ne disposant pas de GPS et donc, ne disposant pas automatiquement de la localisation de la prise de vue.

Pour lancer la procédure de geotaggage, allez dans le menu Vecteur -> Geotagf and import photos -> Geotag photos

Lancement du plugin geotag and import photos de qgis

La fenêtre suivante permet de configurer la procédure:

fenêtre de paramétrage de geotag photosOn peut déplorer l’absence d’un bouton « Aide », car à première vue ce n’est pas très parlant. Notre attention est naturellement attirée par le Vector Layer qui apparaît comme la première information à renseigner. Mais nous ce que nous avons c’est un répertoire avec des photos…

Commençons par le tout début: comment fonctionne le plugin?

Le plugin va ajouter les geotags Latitude et Longitude (en degrés) à toutes les photos contenues dans un répertoire et, éventuellement, tous les sous-répertoires présents. Mais, attention, il ajoute les mêmes valeurs de Latitude et Longitude à toutes les photos du répertoire.

Vous devez donc distribuer vos photos dans autant de répertoires que vous souhaitez  de positions différentes. Eh oui! Dans certains cas ce sera assez lourd. Si vous avez fait un parcours en voiture et quelques arrêts pour les prises de vue, vous aurez autant de répertoires que d’arrêts. Par contre si vous avez fait une randonnée à pied et que vous avez pris des photos tout le long du parcours, vous aurez un répertoire pour chaque photo…

N’oubliez pas que le plugin renseigne aussi les sous-répertoires. Dans les deux exemples cités vous devez mettre les différents répertoires au même niveau.

Maintenant que nous avons nos répertoires, voyons comment on créé les geotags:

entrée des coordonnées des geotagsNous allons créer une ligne par répertoire à geotagger.

Pour le faire manuellement, cliquez sur le bouton Add row. En cliquant sur Path to folder vous avez l’option Parcourir pour pointer sur un répertoire de photos.

option parcourir pour pointer sur le répertoire de photos à geotaggerVous rentrez les valeurs de X (Longitude) et Y (Latitude), en degrés, et vous êtes prêts à exécuter le geotaggage. Vous pouvez ajouter autant de lignes que de répertoires à traiter.

Remarquez les options cochées par défaut.

Si vos coordonnées de Longitude sont des valeurs Est, la première case doit être cochée. Si elle est décochée les Longitudes seront Ouest.

Si vos coordonnées de Latitude sont des valeurs Sud, la deuxième case doit être cochée. Si elle est décochée les Latitudes seront Nord.

La troisième case mérite une explication. Cochée ou pas, le plugin copie la photo originale dans le même répertoire en changeant le nom en ajoutant « filename_original » dans le nom. La photo géotaggée aura le même nom qu’à l’origine si la case est décochée. Si la case est cochée, le nom de la photo taggée sera modifié avec les path de la photo (à partir du répertoire entré dans Path to folder), la date et heure de prise de vue de la photo, et un numéro d’ordre.

Nous sommes arrivés à la fin du traitement et toujours pas de Vector Layer!

Au fait, celui-ci correspond à une option mais il n’est pas du tout indispensable.

Nous n’avons pas vu comment obtenir les coordonnées à rentrer dans les champs X et Y.

Un moyen est de créer une couche vecteur de type point et d’utiliser QGis pour repérer les localisations souhaitées, par exemple sur OpenStreetMap ou sur Google Maps. Dans cette couche, pensez à mettre un champ qui serve à identifier les points, c’est le fameux Label Field à indiquer dans la fenêtre de paramétrage.

Si vous disposez de cette couche vecteur vous la chargez dans QGis, vous la renseignez renseignez dans la fenêtre de paramétrage, et il suffit de cliquer sur le bouton Populate table from layer pour qu’elles soient ajoutées autant de lignes dans la table de paramétrage que de points dans la couche vecteur.

Le champ Label vous permet d’identifier le point, les champs X et Y sont automatiquement remplis à partir des coordonnées des points de la couche vecteur:

remplissage automatique de la tableUtilisez la sélection d’une ligne(en cliquant dessus) et le bouton Delete row, pour enlever les points qui ne vous intéressent pas.

Dernière chose à savoir: si vous avez des images geotaggées et vous exécutez le plugin dessus, les valeurs seront modifiées. Faites très attention à l’arborescence et à ne pas exécuter le plugin deux fois, avec des valeurs différentes, à partir d’un répertoire supérieur.

L’analyse spatiale avec SQL:2-les fausses idées reçues

$
0
0

Nous avons dit dans l’article précédent(L’analyse spatiale avec SQL:1-Introduction) que l’idée la plus répandue est que le langage SQL est un très bon outil de requête sur les tables SIG mais qu’il faut un logiciel SIG tel que QGis ou ArcGis pour réaliser les tâches d’analyse spatiale. Voyons d’où vient cette idée reçue.

La dépréciation du SQL par les logiciels SIG

Le langage SQL a été victime des carences des logiciels de SIG pendant des décades. Le format « phare » du SIG entre les années 70 et 2000, le shapefile d’ESRI, n’implémentait qu’une version réduite du standard SQL. Impossible d’utiliser des sous-requêtes faisant appel à d’autres tables, on était cantonné aux champs d’une seule table.

A cela il faut ajouter les assistants SQL mis en place par les différents logiciels, tels que le wizzard d’ArcGis:

assistant de requêtre de QGisDans les faits, on a réduit le langage SQL à la clause WHERE en proposant une version ultra-simpliste qui était censée affranchir l’utilisateur de connaître le langage SQL.

Depuis quelques années la situation s’est nettement améliorée. Ne citons comme exemple que le Gestionnaire de bases de données de QGis:

gestionnaire de bd de qgisqui permet d’utiliser toute l’étendue du SQL, de ces extensions comme Postgis, et de récupérer le résultat d’une requête et l’afficher dans la fenêtre cartographique de QGis.

Le langage SQL est compliqué et pas intuitif

Cette assertion est vraie,… seulement si vous ne connaissez pas du tout les bases du SQL!

Prenons la requête SQL de l’exemple final de l’article précédent:

SELECT sum(prix_terrain)::numeric::money, classepropriete
FROM parcelles, zones_inondables
WHERE st_intersects(parcelles.geometry,zones_inondables.geometry)
GROUP BY classepropriete;

Comme pour toutes les requêtes SQL vous avez deux lignes obligatoires:

  • SELECT et une liste d’information que l’on souhaite avoir comme résultat
  • FROM et une liste de tables où se trouvent les informations

Puis une ligne optionnelle

  • WHERE et les conditions pour extraire les informations résultat

et finalement une ou plusieurs lignes qui mettent en forme les informations résultat (GROUP BY, ORDER BY,…)

Si vous prenez juste le temps de répondre à ces quatre questions avant de commencer à écrire une requête SQL, vous verrez que l’écriture est tout à fait intuitive:

  • quelles sont les données que je veux obtenir? (->clause SELECT)
  • où est-ce qu’elles sont stockées? (->clause FROM)
  • quelles sont les conditions que je veux appliquer, spatiales ou pas?(->clause WHERE)
  • quelle mise en forme des résultats je souhaite?(->clauses GROUP BY, ORDER BY,…)

Prenons un exemple: Je veux les adresses de toutes les parcelles limitrophes de la mienne.

Pour construire la requête je me pose la série de questions:

  • quelles sont les données que je veux obtenir?: je veux l’adresse des parcelles (numéro et rue) ->clause SELECT:

SELECT num_voie ||’ ‘ || adresse

  • où est-ce qu’elles sont stockées? : dans la table parcelles ->clause FROM:

FROM parcelles

  • quelles sont les conditions que je veux appliquer, spatiales ou pas? sélectionner seulement les parcelles qui touchent la parcelle avec le parcel_id=1144->clause WHERE:

 WHERE st_touches(parcelles.geometry,  ??????)

La commande spatiale teste si deux géométries se touchent. Pour ce qui est de parcelles.geometry, cela va parcourir toute la table pour tester si chaque enregistrement touche la deuxième partie de la commande.

Cette deuxième partie on la construit en suivant la même méthode:

  • quelles sont les données que je veux obtenir?: je veux la géométrie d’une parcelle ->clause SELECT:

SELECT geometry

  • où est-ce qu’elles sont stockées? : dans la table parcelles ->clause FROM:

FROM parcelles

  • quelles sont les conditions que je veux appliquer, spatiales ou pas? la parcelle qui a l’identifiant 1144->clause WHERE:

WHERE parcel_id=1144

Nous mettons cette deuxième partie entre parenthèses et remplaçons les ?????? dans la première partie de la requête

SELECT num_voie ||’ ‘ || adresse
FROM parcelles
WHERE st_touches(parcelles.geometry, (SELECT geometry FROM parcelles WHERE parcel_id=1144))
Si nous exécutons cette requête dans le gestionnaire de bases de données de QGis:

exécution de la requête dans le gestionnaire de bases de données de qgisOn obtient la liste des adresses recherchées, et si nous chargeons le résultat de la requête dans QGis on a:

résultat de la requête chargé dans la fenêtre cartographique de QGisLa parcelle jaune est la parcelle 1144, les parcelles bleues sont celles retournées par la requête, avec leur adresse respective.

Si vous voulez être définitivement convaincu du fait que SQL est réellement intuitif et que ça vous fait gagner du temps, je vous invite à obtenir le même résultat que celui qui est affiché ici, mais en utilisant les outils classiques (non sql) de QGis ou d’ArcGis.

La suite?

Dans le prochain article nous verrons les opérateurs spatiaux de Postgis. Là aussi, on ne prendra pas le chemin habituel. En général, on commence par les opérateurs de définition des géométries, la définition des SRC, etc.

Mais de la même manière que quand on veut apprendre les opérateurs sur les nombres, en SQL, on ne démarre pas avec la transformation en nombres imaginaires, mais avec les opérateurs de base: addition, soustraction, division, multiplication… nous allons voir le petit groupe de fonctions spatiales de base. Elles ne représentent pas plus d’une dizaine parmi le millier de fonctions disponibles avec Postgis. Bien assimiler ces fonctions permet de se lancer sans problème dans l’analyse spatiale avec SQL. Et vous ferrez comme pour les fonctions sur les nombres rarement utilisées (telles que BIT_count ou MOD ou OCT), vous n’irez les chercher que quand vous en aurez vraiment besoin.

L’analyse spatiale avec SQL:3-les fonctions de relation spatiale

$
0
0

Après les deux article introductifs,L’analyse spatiale avec SQL:1-Introduction, 2-les fausses idées reçues, voici, maintenant, la dizaine de fonctions de relation spatiale de Postgis (mais que vous trouverez aussi avec Spatialite). Comme dit précédemment, ce n’est qu’une toute petite partie des fonctions disponibles, mais c’est vraiment le noyau indispensable pour démarre l’analyse spatiale avec SQL.

Les types ou dimensions des géométries

Avant de voir les différentes fonctions il faut rappeler sur quoi nous allons travailler. Les différentes fonctions ont comme paramètres  deux géométries. Mais les géométries ne sont pas toutes de même type (on parle aussi de dimensions): nous avons trois types majeurs (point, ligne, surface) et trois type dérivés (multipoints, multilignes, multisurfaces). La distinction est importante car les fonctions fonctionnent sur la détermination, pour chaque entité (géométrie) de ce que l’on considère l’intérieur de l’entité et de ce que l’on considère l’extérieur. Pour une couche de polygones vous voyez tout de suite de quoi on parle et vous n’aurez aucun mal à distinguer l’intérieur  des polygones de leur extérieur.

Pour les points, ça commence à se corser car l’intérieur d’un point est un peu plus difficile à concevoir. Et ça devient presque métaphysique quand on parle de l’intérieur d’une entité multipoint.
Cette image peut représenter trois entités ponctuelles, dans le cas d’une couche de points, ou bien une seule entité constituée par trois points, dans le cas d’une couche multipoints. Mais dans les deux cas, l’intérieur est constitué par le ou les points seulement.

Par exemple, dans la figure suivante, est-ce que la ligne traverse la géométrie de la couche multipoint?

La réponse est NON. Pour traverse une géométrie, il faut qu’il y ait une partie commune « interne » aux deux géométries.

Dans la figure suivante, par contre, la réponse est OUI, la ligne traverse l’entité multipoint.

Vous aurez compris que l’intérieur d’une ligne est la ligne elle-même, comme pour les points.

On peut séparer les fonctions de relation spatiale en deux grands groupes: celles qui s’appliquent à tous les types de géométrie et ceux qui ne s’appliquent qu’à certains types.

Pour une description détaillée des fonctions, reportez vous à la documentation Postgis: https://postgis.net/docs/manual-1.5/reference.html#Spatial_Relationships_Measurements

Les fonctions applicables à tous les types de géométrie

Les fonction d’intersection, de différence,  de contenance ou de contenu et la fonction toucher acceptent dans les deux paramètres de la fonction n’importe quel type de géométrie de base ou multiple. On peut donc calculer l’intersection d’une couche multipoint avec un couche polyligne, de polygones et de multipolygones, etc.

st_Intersect

C’est la fonction la plus générique. Elle renvoie VRAI si l’intérieur d’une géométrie occupe la même place qu’un autre point intérieur de la deuxième géométrie, en d’autres termes si elles ont au moins un point de l’espace en commun. Si les autres fonctions telles que st_Crosses, st_Overlaps, st_touches, st_Within ou st_Contains retournent une valeur VRAI sur des géométries, st_Intersect retournera aussi une valeur VRAI.

L’exemple suivant montre le résultat de la requête permettant de trouver les parcelles qui sont affectées par une zone inondable de risque maximal:

SELECT parcelles.*
FROM parcelles,carto_risque
WHERE ST_Intersects(parcelles.geometry,carto_risque.geometry)
AND carto_risque.zone = ‘max’

Toute parcelle qui partage ne serait-ce qu’un point dans l’espace avec la zone inondable est sélectionnée.

st_Disjoint

Est la fonction inverse de st_intersect. Elle renvoie VRAI si l’intérieur d’une géométrie n’occupe pas la même place qu’un autre point intérieur de la deuxième géométrie, en d’autres termes si elles n’ont aucun point de l’espace en commun.

On obtient le même résultat qu’avec la commande st_intersects avec la requête:
SELECT parcelles.*
FROM parcelles,carto_risque
WHERE ST_Disjoint(parcelles.geometry,carto_risque.geometry)=false
AND carto_risque.zone = ‘max’

C’est un peu tiré par les cheveux de faire une requête inversée, mais si vous cherchez vraiment les géométries disjointes, il vaut mieux utiliser st_Intersects =false, car une requête utilisant st_intersect s’effectue avec les index spatiaux tandis que st_disjoint se fait en parcourant séquentiellement toutes les entités. les temps de réponse seront nettement différents!

st_Contains et st_Within

Ces deux fonctions testent si une géométrie est totalement à l’intérieur d’une autre. st_Within(geomA,geomB) retourne VRAI si la première géométrie (geomA) est complètement contenue dans l’autre (geomB).

st_Contains(geomA,geomB) retourne VRAI si la deuxième géométrie (geomB) est complètement contenue dans la première (geomA).

L’exemple suivant montre le résultat de la requête permettant de trouver les parcelles totalement incluses dans une zone inondable de risque maximal:

SELECT parcelles.*
FROM parcelles, carto_risque
WHERE ST_Within(parcelles.geometry, carto_risque.geometry)
AND carto_risque.zone = ‘max’

resultat de st_withinSeules les parcelles dont tous les points sont à l’intérieur de la zone inondable sont sélectionnées.

On obtient exactement le même résultat avec la requête

SELECT parcelles.*
FROM parcelles, carto_risque
WHERE ST_Contains(carto_risque.geometry, parcelles.geometry)
AND carto_risque.zone = ‘max’

st_Touches

Nous avons vu un exemple de cette fonction dans l’article précédent. Cette fonction retourne VRAI si les deux géométries ont au moins un point en commun mais que leurs intérieurs ne s’intersectent pas. En d’autres termes seuls les contours ont un ou plusieurs points en commun.

Les fonctions applicables selon le type de géométrie

st_Equals

St_Equals ne fonctionne que sur des géométries de même type. Il renvoie VRAI si les deux géométries partagent tous les points de l’espace, c’est à dire si toutes les coordonnées XY de la première géométrie sont identiques aux coordonnées de la deuxième. L’ordre des entités dans la couche n’intervient pas du tout dans la comparaison.

st_Crosses

St_Crosses ne s’applique pas à toutes les combinaisons de géométries. Elle s’applique aux combinaisons suivantes:

Les couches de points sont exclues. La fonction retourne VRAI si le résultat de l’intersection se retrouve à l’intérieur des deux géométries

Si on reprend notre exemple précédent, la figure suivante montre le résultat de la requête permettant de trouver les parcelles qui sont partiellement affectées par une zone inondable de risque maximal:

SELECT parcelles.*
FROM parcelles,carto_risque
WHERE ST_Overlaps(parcelles.geometry,carto_risque.geometry)
AND carto_risque.zone = ‘max’

Seules les parcelles qui ont des points à l’intérieur ET à l’extérieur de la zone inondable sont sélectionnées.

St_Distance

Contrairement aux autres fonctions, cette fonction ne renvoie pas VRAI ou FAUX mais la valeur de la plus petite distance calculée entre les deux géométries.

Si une partie (ou toute) de la géométrie de A se retrouve à l’intérieur de la géométrie B, la distance calculée sera 0.

L’exemple suivant montre le résultat de la requête permettant de trouver les parcelles situées à moins de 200 mètres d’une zone inondable de risque maximal:

SELECT parcelles.*
FROM parcelles,carto_risque
WHERE ST_Distance(parcelles.geometry,carto_risque.geometry) < 200
AND carto_risque.zone = ‘max’

Mais cette fonction est surtout utilisée pour calculer les distances entre géométries, car elle n’utilise pas les index spatiaux et fait un traitement séquentiel qui prend beaucoup plus de temps. Pour obtenir le même résultat que dans cette figure on utilise la fonction St_DWithin.

st_DWithin

La fonction prend la forme St_DWithin( geomA, geomB, Distance). Elle renvoie la valeur VRAI si la plus petite distance entre geomA et geomB est inférieure ou égale à Distance.

Pour l’exemple précédent la requête prend la forme:

SELECT parcelles.*
FROM parcelles,carto_risque
WHERE ST_Distance(parcelles.geometry,carto_risque.geometry,200)
AND carto_risque.zone = ‘max’

Et on obtient le même résultat cartographique.

Cette fonction est très utile pour répondre à une question telle que « Combien de parcelles se situent dans un buffer de 200 mètres autour de ce cours d’eau? ou de cette route? », sans avoir à calculer le buffer. On teste tout simplement la distance entre les géométries.

st_Covers et st_CoveredBy

J’ai laissé pour la fin ces deux fonctions qui sont presque équivalentes à st_Contains et st_Within. Le résultat sera presque toujours le même sauf dans certains cas très particuliers. C’est un peu tordu, mais il faut revenir à la notion de début de cet article, celle d’intérieur et extérieur d’une géométrie.

Quand nous avons un polygone, l’intérieur c’est l’espace contenu par les bords du polygone. Mais cette ligne imaginaire qui fait office de contour ne fait pas partie de l’intérieur, ni de l’extérieur non plus. C’est une limite.

Quand nous avons une ligne, même si elle n’a pas de dimension « épaisseur » on considère que la ligne est la zone « intérieure » de la géométrie.

Si nous avons par exemple une limite administrative de département, et cette limite correspond à une route qui est contenue dans une couche de polylignes, la fonction st_contains(polygone,ligne) va retourner FAUX car la zone intérieure de la ligne ne sera pas à l’intérieur du polygone (elle sera sur le contour).

La fonction st_Covers agit différemment. Elle trouvera que la limite du polygone « recouvre » le tronçon de route. La fonction st_CoveredBy cherche à savoir si la géométrie A et recouverte par la géométrie B et fonctionne de la même manière que st_Covers.

 

L’analyse spatiale avec SQL: 4-fonctions de traitement spatial

$
0
0

Dans l’article précédent nous avons vu les fonctions SQL de relation spatiale. Voyons maintenant les fonctions de traitement spatial de SQL.Commençons par voir quelle est la différence entre la notion de relation spatiale et de traitement spatial.

Le plus simple est de prendre un exemple. Nous avons des géométries qui partagent l’occupation de l’espace

Une fonction de relation spatiale, telle que st_intersects, va répondre à la question « est-ce que ces géométries s’intersectent? » par VRAI ou FAUX.

Une fonction de traitement spatial, telle que st_intersection, va extraire la partie commune des géométries en renvoyant comme résultat une géométrie :

Supposons que nous avons deux tables: rectangles et cercles, et que nous voulons extraire le résultat de cette image. Comment construit-on la requête SQL appropriée?

En faisant la même démarche que décrite dans le deuxième article de cette série:

  • quelles sont les données que je veux obtenir?: je veux les géométries résultantes de l’intersection des cercles et des rectangles->clause SELECT:

SELECT st_intersection(cercles.geometry,rectangles.geometry) as geometry

  • où est-ce qu’elles sont stockées? : dans les tables cercles et rectangles->clause FROM:

FROM cercles,rectangles

  • quelles sont les conditions que je veux appliquer, spatiales ou pas? sélectionner seulement les entités qui occupent un espace commun->clause WHERE:

 WHERE st_intersects(cercles.geometry,rectangles.geometry)

Ce qui nous fait la requête:

SELECT st_intersection(cercles.geometry,rectangles.geometry) as geometry
FROM cercles,rectangles
WHERE st_intersects(cercles.geometry,rectangles.geometry)

Vous pouvez omettre la clause WHERE et vous obtiendrez le même résultat, sauf que ça prendra beaucoup plus de temps. C’est logique de limiter l’opération d’intersection de st_intersection aux endroits où les géométries s’intersectent.

Les outils batch et les outils interactifs

Avant de voir les fonctions de traitement spatial dans le détail, faisons une petite digression. Dans les SIG bureautique, tel que ArcGis, vous avez l’habitude de travailler avec deux groupes d’outils différents selon qu’il s’agisse de traiter la couche dans son ensemble ou bien des entités en particulier.

Quand il s’agît de traiter la couche dans son ensemble, vous utiliserez les outils de la Toolbox. Quand il s’agît de traiter des entités en particulier vous utiliserez les outils interactifs d’ArcMap.

Un avantage du SQL est que vous ne travaillez qu’avec un seul outil. Reprenons la requête précédente pour l’appliquer à l’intersections entre une couche carto_risques(en beige)  et zones_inondables (en bleu)

Nous pouvons utiliser la requête:

SELECT st_intersection(carto_risque.geometry,zones_inondables.geometry) as geometry
FROM carto_risques,zones_inondables
WHERE st_intersects(carto_risque.geometry,zones_inondables.geometry)

Pour intersecter toutes les entités présentes dans la cartographie des risques avec les zones inondables:

Ou seulement la zone avec un risque maximal avec les zones inondables

SELECT st_intersection(carto_risque.geometry,zones_inondables.geometry) as geometry
FROM carto_risques,zones_inondables
WHERE st_intersects(carto_risque.geometry,zones_inondables.geometry) AND
carto_risque.zone=’max’

La seule différence se situe dans la clause WHERE où nous ajoutons « AND
carto_risque.zone=’max’« 

Les fonctions de traitement spatial

Si vous regardez la page d’aide d’ArcGis du jeu d’outils Superposition (https://pro.arcgis.com/fr/pro-app/tool-reference/analysis/an-overview-of-the-overlay-toolset.htm) vous trouverez la description d’une série de fonctions de traitement spatial:

Ils sont au nombre de sept  : Effacer, Identité, Intersection, Jointure spatiale, Différence symétrique, Agrégation et Mise à jour.

En SQL nous utiliserons seulement trois fonctions: st_difference, st_intersection et st_union pour construire les requêtes équivalentes.

Voyons tout d’abord ces trois fonctions et leur équivalent dans le Toolset d’ArcGis, puis nous verrons comment obtenir l’équivalence des autres outilst du Toolset en combinant les trois fonctions de base.

st_Difference = Effacer (Erase)

Elle est de la forme st_difference(géométrie A, géométrieB). Cette fonction retourne la partie de la géométrie A qui n’intersecte pas la géométrie B.

Dans l’exemple de la cartographie des risques et les zones inondables, on peut souhaiter, par exemple, voir la partie des zones classées comme risque maximal qui ne sont pas inondables :

SELECT st_Difference(carto_risque.geometry,zones_inondables.geometry) as geometry
FROM zones_inondables,carto_risque
WHERE carto_risque.zone=’max’

Le résultat de la commande apparaît en jaune.

st_intersection = Intersection (Intersection)

Elle est de la forme st_intersection(géométrie A, géométrie B). Cette fonction retourne la partie de la géométrie A qui intersecte  la géométrie B.

Nous avons déjà détaillé la requête

SELECT st_intersection(carto_risque.geometry,zones_inondables.geometry) as geometry
FROM carto_risques,zones_inondables
WHERE st_intersects(carto_risque.geometry,zones_inondables.geometry)

dans le paragraphe précédent sur les fonctions batch et interactives. Mais nous allons compléter l’usage des fonctions avec un autre élément. Dans les exemples utilisés jusqu’ici nous obtenons comme résultat de la requête que des géométries. Mais la plupart du temps nous avons besoin de récupérer aussi des attributs des entités concernées.

Par exemple, dans les entités résultantes de la requête nous voulons savoir de quelle version de « zones_inondables » il s’agît et de quelle niveau de risque. Nous ajoutons ces champs dans la partie SELECT de la requête

SELECT zones_inondables.version, carto_risque.zone, st_intersection(carto_risque.geometry, zones_inondables.geometry) as geometry
FROM carto_risque,zones_inondables
WHERE st_intersects(carto_risque.geometry, zones_inondables.geometry)

et le résultat sera:

Les champs attributs sont ajoutés dans la table résultante. Chaque géométrie aura la valeur de l’attribut des géométries qui s’intersectent à cet endroit.

st_union

Elle est de la forme st_union(géométrie A, géométrie B). Cette fonction prend chaque géométrie de A et l’unifie avec la ou les géométries de B, en fusionnant les points qui les composent.

Si vous avez x géométries en A, vous aurez le même nombre de géométries en résultat. Ce n’est pas le nombre qui change mais bien la géométrie de chaque entité de A qui se voit adjoindre l’espace occupé par la ou les géométries de B.

Cette fonction SQL prête à confusion, surtout en anglais, avec l’opération Union (en français Agrégation) du Toolset d’ArcGis. Voyons tout de suite celle-ci pour éviter toute méprise.

Agrégation (Union en anglais)

Cette fonction permet de récupérer tout l’espace qui est occupé par les géométries A et par les géométries B:

  • les zones dans lesquelles les géométrie s’intersectent
  • les zones où l’on ne trouve que des géométries A
  • les zones où l’on ne trouve que des géométries B

Le schéma suivant montre, en entrée une couche A avec deux rectangles, et une couche B avec un cercle.

Le résultat de l’union de ces deux couches comprend 5 géométries:

  • les deux parties des rectangles qui ne s’intersectent pas avec B
  • les deux parties des rectangles qui s’intersectent avec le cercle
  • la partie du cercle qui ne s’intersecte pas avec les rectangles

Nous avons vu que la fonction st_union garde le même nombre de géométries de A dans le résultat. Dans l’outil Union du Toolset, il y a toujours plus de géométries dans le résultat que dans la couche A, le ,nombre dépendant des zones d’intersections des deux couches.

La suite…

Nous avons vu  les trois fonctions de base de SQL pour  le traitement spatial . Dans le prochain article nous verrons comment combiner ces fonctions de base pour obtenir les fonctions telles que Identité, Agrégation et Mettre à jour.

Faire une carte topographique avec QGis

$
0
0

A partir du projet SRTM on dispose aujourd’hui d’une couverture mondiale de données d’élévation de terrain. Il est devenu très simple de réaliser ses propres cartes topographiques avec QGis.

Nous verrons ici:

-comment télécharger les données d’élévation pour la zone qui nous intéresse

-comment mettre en forme le style d’affichage pour qu’il corresponde aux standards des cartes topographiques

-comment accentuer la visualisation grâce à une couche de type « ombrage »

-et finalement comment générer les contours (courbes de niveau)

Télécharger les données d’élévation

Pour télécharger les données d’élévation de votre zone d’intérêt, allez sur la page http://viewfinderpanoramas.org/dem3.html

Cette vidéo vous montre le déroulement du téléchargement.

Les données disponibles partout correspondent à une définition de 3″ d’arc, environ 75m. Chaque pixel de votre MNT fera donc cette taille. Pour que le MNT et la carte correspondante soient corrects, il faut travailler avec une zone d’environ une quinzaine de kilomètres de large. Pour des zones plus restreintes, la pixellisation devient visible et la qualité de la carte topographique se ressent.

Les tuiles téléchargées font une taille d’un degré par un degré et sont au format hgt.

Ce format est directement lisible par QGis. Vous pouvez donc charger les tuiles en utilisant l’ajout de raster à la fenêtre cartographique.

Mettre en forme le style d’affichage

Par défaut, le raster est affiché en nuances de gris. Il est donc nécessaire d’appliquer une rampe de couleur adaptée qui accentue la topographie. Bien qu’il soit possible de créer votre propre rampe de couleurs ou d’utiliser une des rampes de couleurs fournies par QGIS, des rampes de couleurs de qualité supérieure peuvent être téléchargées à l’aide du plugin Color Ramp Manager.

Pour l’installer, allez dans le menu Extensions -> Installer/Gérer les extensions, sélectionnez le plugin Color Ramp Manager et cliquez sur Installer l’extension. Vous aurez un nouvel outil ajouté dans votre barre d’outils:

Cliquez sur l’outil pour ouvrir la fenêtre de configuration. En effet, toutes les rampes de couleurs ne sont pas installées automatiquement. Celle qui nous intéresse particulièrement, cpt-city, doit être installée manuellement.

  1. Cochez la case Full cpt-city package
  2. Choisissez le répertoire pour installer le package. Attention! Par défaut c’est la première option qui est cochée, mais étant donné que le répertoire Program Files est protégé en écriture, ça ne marchera pas. Choisissez plutôt votre répertoire de personnalisation de QGis.
  3. Cliquez sur Check for update pour lancer l’installation du paquet.

Une fois le package téléchargé, quittez le dialogue.

Suivez les instructions de la vidéo pour appliquer une rampe de couleurs à votre couche raster

 

Ajouter une couche de type « ombrage » (hillshade)

Pour créer cette couche il suffit d’aller dans le menu Raster -> Analyse de terrain -> Ombrage

Rentrez un nom de fichier pour archiver cette nouvelle couche.

Par contre, il est indispensable de modifier le facteur Z. En effet, la commande présuppose que vous travaillez en projection plane, c’est à dire que les coordonnées XY de votre couche raster sont en mètres. Comme la couche est en degrés décimaux (latitude/longitude) il faut entrer un facteur de conversion approprié? La valeur a rentrer est 11120.

Cliquez sur OK pour obtenir votre nouvelle couche d’ombrage.

Il ne vous reste qu’à modifier le style de cette couche pour avoir une vision topographique.

Ouvrez les propriétés de la couche d’ombrage

  • Modifiez la valeur Min en 125 et la valeur Max en 255
  • Modifiez le Mode de fusion en Multiplier
  • Modifiez la Luminosité en 45
  • Modifiez le Contraste en 20

Le résultat final est le suivant:

Générer les contours (courbes de niveau)

Si vous voulez ajouter des contours, des courbes de niveau, il suffit d’aller dans le menu Raster-> Extraction -> Création de contours:

  • Donnez un emplacement et un nom pour le fichier de contours à créer
  • Rentrez l’intervalle, en mètres, entre les différents contours
  • Cochez Nom d’attribut si vous souhaitez avoir l’élévation comme champ attributaire des contours (si non, vous ne pourrez pas étiquetter les contours)

Une fois exécutée la commande, vous aurez les contours chargés:

 

Viewing all 115 articles
Browse latest View live