Skip to content

outils VRT

Apporté par OGR GDAL sous le format raster mais aussi vectoriel

Definition

Outils qui permet de connecter des données

concept : reproductibilité + que l'automatisation

Outils logique ETL de transformation de fichiers : - Power Query - FME - Modeleur - Postgis avec les vues : Pour changer une donné comme on le souhaite à la fin

Une vue en BDD : on ne duplique pas la donnée. La vue est une présentation, via un script rejoué.

L'intérêt du VRT est un format qui défini une vue virtuelle sur une donnée En général un fichier vrt qui correspond Il est lisible nativement par OGR, QGIS, FME Peut servir a faire des mises à jour.

Comment ne pas changer le fichier d'origine Permet de faire de l'automatisation mai sdans le sens d'une vue c'est à dire qu'il ne créé pas un fichier conséquent

Principe du XML : Format très structuré très hiérarchique

EXEMPLE DE FICHIER VRT servant à récupérer des communes 47 et 32

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?xml version="1.0" encoding="UTF-8"?>
<OGRVRTDataSource>
  <OGRVRTUnionLayer name="communes4732">
    <SourceLayerFieldName>source</SourceLayerFieldName>
    <OGRVRTLayer name="Gers">
      <SrcDataSource relativeToVRT="1" shared="1">32/COMMUNE.shp</SrcDataSource>
      <!-- <SrcSql dialect="sqlite">SELECT * FROM 'COMMUNE' WHERE "INSEE_DEP"='32'</SrcSql> -->
      <SrcSql dialect="sqlite">SELECT *, 'coucou les gens de '||"NOM" AS hello FROM 'COMMUNE' WHERE "INSEE_DEP"='32'</SrcSql>
      <!-- <SrcSql dialect="sqlite">SELECT *, 'coucou les gens de '||"NOM" AS hello ,ST_Area(GEOMETRY)/10000 AS surf_total_ha FROM 'COMMUNE' WHERE "INSEE_DEP"='32'</SrcSql> -->
      <!-- <SrcLayer>COMMUNE</SrcLayer> --> 
Ici je crée tous mes noms de champs avec le typage et la minusculisation des noms qui supplante ensuite la partie SQL plus haut
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
      <Field name="ID" src="ID" type="String" width="24"/>
      <Field name="insee_com" src="INSEE_COM" type="String" width="5"/>
      <Field name="hello" src="hello" type="String" width="50"/>
      <Field name="INSEE_DEP" src="INSEE_DEP" type="String" width="5"/>
      <Field name="INSEE_REG" src="INSEE_REG" type="String" width="5"/>
      <Field name="NOM" src="NOM" type="String" width="80"/>
      <!-- <Field name="surf_total" src="surf_total" type="real"/> -->
    </OGRVRTLayer>
    <OGRVRTLayer name="Lot-et-garonne">
      <SrcDataSource relativeToVRT="1" shared="1">47/COMMUNE.shp</SrcDataSource>
      <SrcSql dialect="sqlite">SELECT * FROM 'COMMUNE' WHERE "INSEE_DEP"='47'</SrcSql>
      <!-- <SrcLayer>COMMUNE</SrcLayer> -->
      <Field name="ID" src="ID" type="String" width="24"/>
      <Field name="insee_com" src="INSEE_COM" type="String" width="5"/>
      <Field name="INSEE_DEP" src="INSEE_DEP" type="String" width="5"/>
      <Field name="INSEE_REG" src="INSEE_REG" type="String" width="5"/>
      <Field name="NOM" src="NOM" type="String" width="80"/>
    </OGRVRTLayer>
  </OGRVRTUnionLayer>
</OGRVRTDataSource>

GDAL OGR

Licence permissive réutilisé par les logiciels qui vendent

Vient du géospatial

FME utilise GDAL en sous jacent, il supporte tous les formats utilisés par GDAL

GDAL est le nom de la librairie il se réfère à toutes les fonctionnalités RASTER

OGR se réfère à toutes les couches vecteurs

Mais depuis il y a eu des évolutions. Ils ont fournis des programmes de commandes, pour inspection, transformation, reprojection. C'est le concept ENTREE/ SORTIE, savoir lire et savoir ensuite écrire

Aujourd'hui on est intéressé par les outils vecteur : https://gdal.org/en/stable/programs/index.html#vector-programs Il n'y en a pas beaucoup mais il y a des OTUILS très important comme ogr2ogr et ogrinfo

Le cours peut être défini ici : VRT en vecteur et VRT en raster

A défaut d'utiliser des FME et d'oublier ce que l'on a fait, Faire de modifier des flux de façon reproductible Originaire de la librairie GDAL - OGR VRT, ça vous permet notamment de : - Faire l’économie d’un ETL - Autonomiser vos collègues amateurs d’Excel (et donc alléger votre charge de travail) - Augmenter la reproductibilité de vos flux de traitement de données - Automatiser vos flux de traitement de données - Frimer pendant une soirée (de géomaticiens) - Supporté par QGIS - Pas limité aux données tabulaires, loin de là. Mais les supporte - Fichier XML, de configuration de la source de données. Permet de : - renommer des champs - changer le type des champs (entier, réel, date, texte) - ne conserver qu’un sous-ensemble des champs - choisir les champs définissant la géométrie (si présents) - filtrer le jeu de données via une requête SQL - découper sur une étendue via une requête SQL - reprojeter un jeu de données - fusionner plusieurs sources - charger des sources de données en ligne

OGRINFO Elle permet d'aller inspecter de la donnée vecteur notamment

1
ogrinfo -so -al XX_nom_fichier_XX
Pour dézipper
1
ogrinfo /vsizip/XX_nom_fichier_XX.zip

Pour aller chercher url

1
ogrinfo /vsicurl/XX_nom_fichier_XX.zip

This driver supports virtual I/O operations (/vsimem/, etc.) peut aller lire à l'intérieur

To point to a file inside a zip file, the filename must be of the form

1
/vsizip/path/to/the/file.zip/path/inside/the/zip/file

vsistdin ou stdout envoi les données dans la console pour les réseaux on peut choisir un des deux en fonction s des serveurs. si il y en a un qui marche pas alors il faut changer /vsicurl/ et /vsicurl_streaming/ permettent de se connecter à des informations sur le web sans télécharger

POURQUOI VRT vs CSV dans QGIS

Déjà parce que je peux renommer les champs etc ... Ensuite la méthode est manuelle sur qgis alors que si je veux importer dans un nouveau projet qgis je suis obligé de refaire Autre avantage tout es rassemblé si je mets d'autres CSV

SPREAD SHEET

depuis un fichier excel ou csv permet de créer un fichier VRT de base assez bien pour commencer son fichier vrt final

Ensuite pour faire des comandes SQL il faut changer

1
<SrcLayer>DEP</SrcLayer>

par

1
<SrcSQL dialect="sqlite">SELECT *, pp_vacant_24/pp_total_24 as tx_vacant_2024 FROM 'DEP'</SrcSQL>

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
  Generate a VRT file from a OGR-compatible source. The result is to be
  considered as a "kickoff" VRT file, to refine according to your desires but
  it will save you some time.

  SOURCE can be a local file or a remote URL

Options:
  -o, --out_file TEXT  Output file name. Default: name of the template,
                       without the jinja extension
  --relative_to_file   When building the datasource string, wheter to use
                       absolute path or not. Defaults to absolute
  -d, --db_friendly    convert layer and field names to DB-friendly names (no
                       space, accent, all-lowercase)
  --no_vsicurl         do not even try to use vsicurl. Prefer download and
                       local use
  --data_formats TEXT  file extensions to look for when querying an archive
                       (zip, tgz, etc). Defaults to a list of common data file
                       extensions
  --logfile TEXT       logfile path. Default: prints logs to the console
  -t, --template TEXT  template file path. Default: templates/vrt.j2
  -v, --verbose        verbose output (debug loglevel)
  --help               Show this message and exit.

  ```
  -d = database friendly cad renomme les champs  en petite casse et sans accent
  -o = crée le fichier dans le dossier
  Si on lui donne une url il va essayer de faire un lien optimisé

**EXERCICE 2** 
 ``` 
   ogr2vrt_cli generate-vrt -d -o donnee_commune.vrt https://www.data.gouv.fr/api/1/datasets/r/b7ce51bf-5675-4843-b618-247ef209416d
 ```

**EXERCICE 3** 
 Pour vérifier les 10 premières lignes  du résultat potenteil du VRT

  ``` 
 ogr2ogr -f CSV /vsistdout/ bourse.vrt | head
 ``` 

 /mnt/d/olivier/A2_VRT/dev/formation_VRT/exos/exo3

## CRON 

**EXERCICE 7**

Intéressant pour faire une tache toute seule a des intervalles de temps réguliers

### Déroulé
#### Mise en route de cron

A défaut d'accéder à un serveur, on va activer temporairement cron sur votre instance WSL2. Dans une console linux : 

On regarde si cron tourne (en principe non)

sudo service cron status

S'il n'est en effet pas activé, on le démarre

sudo service cron start

1
2
3
4
5
6
7
8
9
Vous trouverez plein de docs sur crontab sur le net. Par exemple : https://www.linuxtricks.fr/wiki/cron-et-crontab-le-planificateur-de-taches. 

#### Utilisation de cron

On va commencer par une tâche bêbête : créer un fichier et changer sa date de modif. Comme ça on saura si cron marche

`crontab -e` pour éditer le ficher de config cron.

Et on ajoute la ligne
* * * * * touch ~/cron-marche.txt
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
Sauvegardez.

Attendons maintenant une minute, et le fichier devrait avoir été créé dans ~/cron-marche.txt : `ls -la ~/` devrait vous le montrer.

Attendez encore une minute ou deux, recommencez la commande ls, la date de modif du fichier doit avoir changé. Ca marche.

#### Publication/mise à jour automatique de la donnée

Vous avez noté la commande utilisée pour la publication de l'exercice 5 ? Allez, on l'automatise.

A savoir que cron ne sait pas tout. Pas tout ce qu'on sait. Il n'a pas accès à nos variables d'environnement. Le mot de passe postgresql par exemple. Et ne sait pas toujours où trouver les fichiers exécutables, en dehors de la base. On va donc lui faciliter la tâche : 

1. on localise le chemin complet vers la commande ogr2ogr : `which ogr2ogr`. On utilisera ce chemin pour l'appeler dans la ligne cron
1. on va faire simple, on va utiliser le mot de passe et les autres valeurs en clair dans la commande. Ajustez votre commande ogr2ogr en fonction. Dans la "vie réelle", on procéderait différemment, par exemple avec un fichier `.pgpass`.
1. allez, zou, `crontab -l` et programmez une publi de votre fichier toutes les 5 minutes (on pensera à supprimer cette tâche en fin de cours, afin de ne pas republier cette donnée éternellement).

_**Faites un `crontab -l` et faites-en une copie d'écran, pour le livrable de cet exercice.**_


Cela vous donne-t-il des idées de tâches de votre quotidien (pro) que vous pourriez automatiser ainsi ? On peut prendre un instant pour en discuter.

---

*[Exercice suivant](exercice8.md)*

## Exercice 8 : faisons une 'appli' basique de crowdsourcing

***Nous allons faire cet exercice ensemble.***

Google Sheet est capable d'exposer son contenu sur le web au format CSV :   Fichier->Partager->Publier sur le web.  
Il faut bien faire attention à 

- définir un lien pour le document complet, pas juste la feuille
- choisir un format CSV
- activer la publication


### Source de donnée

Nous allons utiliser une feuille Google Sheet pour collecter des observations d'ours sur l'Ariège.

J'ai créé une feuille, sur laquelle vous pouvez saisir vos observations de plantigrades : 

https://docs.google.com/spreadsheets/d/1S5FwbLntADv9ztYlmUrHw83PFOyWCycM5WD8308ttBo/edit?usp=sharing


### Déroulé

- Créer le fichier VRT qui permet de publier cette donnée. Pour obtenir le lien correct, on va dans Fichier -> Partager-> Publier sur le web : https://docs.google.com/spreadsheets/d/e/2PACX-1vRRhuM4Y4JVH-f_ggR8EiHG8cEkqHR5hfLMzursUWTj130ffZEkRY9o8uEwUe63Nr8v-F5pFHqJRYo_/pub?output=csv
- La publier en BD
- La joindre avec la couche des communes, filtrée sur l'Ariège
- Faire une jolie carte montrant combien d'observations ont eu lieu par commune.

Avec une tâche cron, on peut mettre cette donnée à jour toutes les qq minutes, et avoir une carte quasi temps-réel pour suivre une collecte en mode collaboratif.

---

*[Lien suivant](conclusion.md)*

# Infos utiles

## Connexion à la base de données

On utilisera la base de donnée servie sur l'ordi du formateur (s'appuyer sur docker/docker-compose.yml). 

Les paramètres de connexion seront es suivants : 
- hôte : IP à voir en fonction de la config réseau
- port : `5432` 
- user: `cpgeom`
- mot de passe: `secret`
- schema : vous créerez un schema qui vous sera propre : première lettre du prénom suivi du nom de famille (dans mon cas par exemple : `jpommier`)

Oui, je sais. Ce n'est absolument pas sécurisé. Ce n'est en effet pas un cours sur les bases de données, plutôt sur l'étape en amont (publication/transfo des données).

### *Pour info*, cas d'une connexion à une BD distante, sécurisée, accès via tunnel ssh

En général, vous ne pourrez pas accéder directement à une BD externe sur le port 5432. En effet, pour que cela soit possible en sécurité, cela implique de configurer une connexion cryptée, à minima. Et malgré tout, la BD reste un peu exposée.

En général, ce qui se fait, c'est de maintenir la BD dans un réseau interne, qui n'est pas accessible directement depuis internet. Ensuite, trois options : 
1. ben... pas d'accès externe du tout. Pas pratique, mais le plus secure.
2. accès via un VPN
3. accès via un tunnel SSH. Dans ce cas, un accès SSH sur une machine du réseau interne est possible. Cette machine pouvant elle-même accéder à la BD. Dans ce cas, on peut configurer ce qu'on appelle un *tunnel SSH* : une connexion sécurisée est établie entre votre PC et la machine SSH, avec une configuration permettant de relier la BD *à travers* ce tunnel. On joue à saute-moutons si vous voulez.


Le tunnel SSH, nous permettra de faire correspondre un port de notre machine (localhost) avec le port 5432 de la machine *comme si on était dessus*, via une connection cryptée SSH.

La commande est la suivante :
ssh -L 15432:localhost:5432 my_user@my_server
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
*Il faudra garder cette connection ssh ouverte tout le temps qu'on voudra accéder à la base à distance*
Et la BD sera accessible localement, sur notre ordi, à localhost:15432

**Note** :
- sous Windows, ça peut aussi se configurer, avec un outil comme Putty par exemple
- pgadmin4 aussi, sait configurer une connexion via tunnel SSH. Le hic étant qu'on ne va pas utiliser que pgadmin4, donc ça ne fera pas l'affaire ici. QGIS par exemple a besoin qu'on établisse le tunnel par nous-même.


## Changer l'encodage d'un fichier
VRT nécessite qu'on travaille avec des fichiers en UTF8. Si ce n'est pas le cas, on doit changer l'encodage préalablement. Par exemple, en ligne de commande, avec la commande suivante :
uconv -f windows-1252 -o monfichier-utf8.csv monfichier.csv
1
## Publier un fichier en BD avec ogr

Ou bien on utilise le driver PostgreSQL d'OGR

ogr2ogr -f "PostgreSQL" -nln "roads" -nlt PROMOTE_TO_MULTI -lco OVERWRITE=YES -lco SCHEMA=yourusername PG:"dbname='cqpgeom' host='localhost' port='5433' user='cqpgeom' password='pass'" roads.vrt

Ou bien on passe par un dump PG (utile dans certains cas)

ogr2ogr -f PGDUMP -nln roads -lco PG_USE_COPY=YES -lco SCHEMA=yourusername -nlt PROMOTE_TO_MULTI /vsistdout/ roads.vrt | psql -h localhost -p 5433 -d cqpgeom -U cqpgeom -f - ```

EN plus

On peut regarder qq cas concrets dans lesquels le VRT m'a bien servi et fait gagner beaucoup de temps :

https://github.com/pi-geosolutions/vrt2rdf un cas de réorganisation des données, pour le projet SAGUI : https://github.com/HydroMetGuyane-Hydro-Matters/sagui_backend/tree/main/data les VRT utilisés couramment par l'équipe SIG de la région des Hauts de France : https://github.com/geo2france/vrt/ Combiné à un peu de code python, on peut faire des miracles en termes de traitement de données.

Ah, et j'oubliais : remarquez dans la doc de vrt2rdf comment on peut même pointer vers une source WFS