Alimentation et diffusion simple vecteur
Modifié le
Téléversement de fichiers vecteur, intégration en base de données, diffusion en WMS et WFS
Diffusion en tuiles vectorielles précalculées
Cette étape supplémentaire permet une diffusion à plus grande échelle de données vecteur. Seules les parties nouvelles sont détaillées.
Calcul de la pyramide de tuiles vectorielles #
Consultation des traitements disponibles #
https://data.geopf.fr/api/datastores/{datastore}/processings
[
{
"name": "Intégration de données vecteur livrées en base",
"description": "Ce traitement permet de stocker dans les bases de données PostgreSQL de la plateforme des données vecteur livrées. Les formats pris en charge sont le CSV, le Shapefile, le Geopackage et le GeoJSON. Il est également possible de préciser un autre système afin de réaliser une reprojection à l'intégration",
"_id": "0de8c60b-9938-4be9-aa36-9026b77c3c96"
},
{
"name": "Recopie d'une archive livrée",
"description": "Génération ou mise à jour d'une donnée stockée ARCHIVE à partir d'une archive livrées. Si un fichier livré existait déjà dans la donnée en sortie, celui ci va écraser l'ancienne version",
"_id": "12cdc646-3976-4f18-b273-f34fca37e2a6"
},
{
"name": "Calcul de pyramide raster",
"description": "Génération ou mise à jour d'une pyramide de tuiles raster à partir d'une livraison d'images géo-référencées",
"_id": "2ae50661-986c-4f47-a3f0-e380417b522c"
},
{
"name": "Calcul ou mise à jour de pyramide raster par moissonnage WMS",
"description": "Il n'y a pas besoin de donnée en entrée. Sont fournis en paramètres toutes les informations sur le service WMS et le jeu de données à moissonner, ainsi que la zone sur laquelle faire le moissonnage",
"_id": "6a54dc92-fc93-4c8e-9f02-046bf889550e"
},
{
"name": "Fusion de pyramides raster",
"description": "Ce traitement permet de générer une pyramide raster par composition de plusieurs pyramides indépendantes. Seules les dalles présentes dans plusieurs entrées seront recalculées. Celles présentes dans une seule entrée seront référencées. La pyramide en sortie a donc des dépendances avec celles en entrée.",
"_id": "7cdca031-9e86-4804-8764-9b1d783b087d"
},
{
"name": "Calcul de pyramide vecteur",
"description": "Génération ou mise à jour d'une pyramide de tuiles vectorielles à partir d'une donnée vecteur en base",
"_id": "aa5f9391-0bdb-4b97-9209-fcde351b82f6"
}
]
Consultation du traitement qui nous intéresse #
https://data.geopf.fr/api/datastores/{datastore}/processings/aa5f9391-0bdb-4b97-9209-fcde351b82f6
{
"name": "Calcul de pyramide vecteur",
"description": "Génération ou mise à jour d’une pyramide de tuiles vectorielles à partir d’une donnée vecteur en base",
"input_types": {
"upload": [],
"stored_data": ["VECTOR-DB", "ROK4-PYRAMID-VECTOR"]
},
"output_type": {
"stored_data": "ROK4-PYRAMID-VECTOR",
"storage": ["S3"]
},
"parameters": [
{
"name": "composition",
"description": "Tables à exporter et niveaux limites d’utilisation",
"mandatory": false,
"constraints": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": ["table", "bottom_level", "top_level"],
"properties": {
"layer": {
"type": "string"
},
"table": {
"type": "string"
},
"filter": {
"type": "string"
},
"top_level": {
"type": "string"
},
"attributes": {
"type": "array",
"items": {
"type": "string"
}
},
"bottom_level": {
"type": "string"
}
}
}
},
{
"name": "bottom_level",
"description": "Niveau du bas de la pyramide (obligatoire si pas de composition fournie)",
"mandatory": false
},
{
"name": "width",
"description": "Nombre de tuiles dans une dalle, dans le sens de la largeur",
"mandatory": false,
"default_value": 16
},
{
"name": "top_level",
"description": "Niveau du haut de la pyramide (obligatoire si pas de composition fournie)",
"mandatory": false
},
{
"name": "tippecanoe_options",
"description": "Options de l’outil tippecanoe pour la généralisation des données vecteur",
"mandatory": false
},
{
"name": "area",
"description": "WKT de la zone sur laquelle le moissonnage doit se faire, en EPSG:4326 (obligatoire si la base vecteur en entrée n’a pas d’étendue)",
"mandatory": false
},
{
"name": "height",
"description": "Nombre de tuiles dans une dalle, dans le sens de la hauteur",
"mandatory": false,
"default_value": 16
},
{
"name": "parallelization",
"description": "Nombre de scripts d’écriture des dalles en parallèle",
"mandatory": false,
"default_value": 1
}
],
"_id": "aa5f9391-0bdb-4b97-9209-fcde351b82f6",
"required_checks": []
}
Configuration d’une exécution de ce traitement #
Les niveaux sur lesquels on transforme les données vecteur en tuiles vectorielles sont importants : en calculant un niveau trop résolu (trop bas), le temps de génération et le volume occupé par la pyramide en sortie sera inutilement grand. En utilisant une table volumineuse dans des niveaux trop hauts, les tuiles seront très lourdes car contenant trop de données (ou vidées de la majorité des objets). Il faut donc prêter une attention particulière aux niveaux d’utilisation des tables.
Dans notre exemple ici, on choisit un cas simple : les pays sont présents dans tous les niveaux, et les écorégions ne seront présentes que jusqu’au niveau 5. On ne filtre pas les données et on ne change pas les noms des tables dans les tuiles. On veut tous les attributs.
https://data.geopf.fr/api/datastores/{datastore}/processings/executions
{
"processing": "aa5f9391-0bdb-4b97-9209-fcde351b82f6",
"inputs": {
"stored_data": ["{stored data}"]
},
"output": {
"stored_data": {
"name": "Pays et éco-régions",
"storage_tags": ["PYRAMIDE"]
}
},
"parameters": {
"composition": [
{
"table": "ecoregions",
"bottom_level": "9",
"top_level": "5",
"attributes": ["*"]
},
{
"table": "pays",
"bottom_level": "9",
"top_level": "0",
"attributes": ["*"]
}
]
}
}
Description des paramètres en entrée :
-
inputs/stored_data: Il s’agit ici d’une liste (présence des caractères «[ ]») qui prend comme valeur au moins un identifiant entrepôt destored_datade typeVECTOR-DB(voir étape précédente) -
output/stored_data/name: Le nom défini ici est un nommage libre.Cette information n’est lisible que par un autre utilisateur membre de cet entrepôt, pas par l’utilisateur final. Vous êtes donc invité à renseigner ici des informations parlantes pour vous - producteur de donnée.
Cette information est modifiable après coup.
-
output/stored_data/storage_tags: Il s’agit ici d’une liste (présence des caractères «[ ]») qui prend comme valeur au moins un tag associé au stockage qui va accueillir la donnée de sortie.Vous pouvez retrouver ces tags via la route
GET /datastores/{datastore}/storages(rubrique Entrepôt du swagger) dans l’attribut de réponselabelsassocié à chaque stockage.Pour une donnée de type tuiles vecteur pré-calculées en sortie, seul le stockage S3 est accessible, ce qui correspond au label, donc au
storage_tag:PYRAMIDE. -
parameters: C’est là que toute la configuration du traitement prend corps :composition: Définit les couches qui vont être tuilées avec pour chaque couche :table: Le nom technique de la relation à tuiler, tel que défini dans lastored_data.layer: Le nom technique de la relation telle qu’elle sera présentée dans le flux. Paramètre optionnel, utile à définir en cas de renommage.filter: Critère de filtrage pour ne diffuser que le objets correspondant au critère de filtrage. Utilisez une syntaxe de type PostgreSQL :"filter": "mon_champ='ma valeur'".top_level: Niveau haut (le plus dézoomé, le chiffre le plus faible) de la pyramide auquel la couche sera tuilée et donc visible.bottom_level: Niveau bas (le plus zoomé, le chiffre le plus grand) de la pyramide auquel la couche sera tuilée et donc visible.attributes: Liste des attributs, entre doubles quotes et séparés par des virgules à diffuser dans le flux. Pour diffuser tous les attributs, déclarez le caractère «*» .
top_level: Niveau haut (le plus dézoomé, le chiffre le plus faible) de la pyramide auquel la couche sera tuilée et donc visible. Permet de définir un niveau global à l’ensemble de la pyramide.Ce paramètre est obligatoire s’il n’est pas défini pour chaque table dans la composition.
S’il est précisé en plus de la composition, il est préférable d’adopter une valeur cohérente au regard de celles définies dans la composition : à savoir égale au plus grand
top_levelde la composition.bottom_level: Niveau bas (le plus zoomé, le chiffre le plus grand) de la pyramide auquel la couche sera tuilée et donc visible. Permet de définir un niveau global à l’ensemble de la pyramide.Ce paramètre est obligatoire s’il n’est pas défini pour chaque table dans la composition.
S’il est précisé en plus de la composition, il est préférable d’adopter une valeur cohérente au regard de celles définies dans la composition : à savoir égale au plus petit
bottom_levelde la composition.area: WKT de la zone sur laquelle le moissonnage doit se faire, en EPSG:4326. Ce paramètre est obligatoire si la base vecteur en entrée n’a pas d’étendue et est utile si la donnée est disséminée à travers le globe (France + DOM par exemple).tippecanoe_options: Plus d’informations sur ces options et leur syntaxe peuvent être trouvées sur la documentation de l’outil.La caractéristique à retenir d’une tuile vectorielle générée avec Tippecanoe est qu’elle ne peut contenir plus de 5 000 objets, et ce quelle que soit la tuile ou son niveau.
C’est la première cause d’échec de traitement par les utilisateurs
Les options sont donc essentielles pour adapter le jeu de donnée en entrée à cette contrainte. Elles proposent différentes méthodes de généralisation à petite échelle pour assurer une représentation fiable de la donnée tout en limitant le nombre d’objets par tuile.
Vous êtes invités à vous référer au swagger pour avoir les détails et options complètes sur cette partie.
Comme pour la livraison il vous est possible de configurer l’envoi d’un courriel automatique à la fin du traitement.
Pour ce faire, il suffit d’ajouter l’élément JSON ci-dessous après l’élément parameters dans le corps de requête de déclaration d’exécution.
"callback": {
"type": "email",
"to_address": [
"example@mail.fr"
]
}
Consultation de la donnée stockée en sortie #
À la fin du traitement, des informations concernant la donnée finale sont remontées afin d’apparaître au niveau de l’API (taille, étendue, système de coordonnées, grille et niveaux).
https://data.geopf.fr/api/datastores/{datastore}/stored_data/{stored data pyramide}
{
"name": "Pays et éco-régions",
"type": "ROK4-PYRAMID-VECTOR",
"srs": "EPSG:3857",
"contact": "contact@ign.fr",
"extent": {
"type": "Polygon",
"coordinates": [
[
[175, -85],
[175, 83.623596],
[-175, 83.623596],
[-175, -85],
[175, -85]
]
]
},
"last_event": {
"title": "Génération",
"date": "2023-07-12T09:04:07.271074",
"initiator": {
"_id": "{user}"
}
},
"tags": {},
"storage": {
"type": "S3",
"labels": []
},
"size": 79570364,
"status": "GENERATED",
"_id": "{stored data pyramide}",
"type_infos": {
"tms": "PM",
"levels": ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
}
}
Dès le lancement de l’exécution du traitement, dans le corps de réponse ou à chaque interrogation de la requête d’état d’exécution vous disposez dans le corps de réponse de ces requêtes de l’élément JSON :
"output": {
"stored_data": {
"name": "Pays et éco-régions",
"type": "ROK4-PYRAMID-VECTOR",
"status": "GENERATING",
"_id": "{stored data}"
}
}
Ce qui vous donne l’élément _id à isoler pour identifier ensuite votre stored_data de sortie.
La stored_data de sortie n’est exploitable et interrogeable qu’une fois l’exécution du traitement terminée avec succès.
Diffusion des tuiles vectorielles #
Les données de la pyramide de tuiles vectorielles sont diffusables selon l’API Tile Map Service. Cette API est disponible sur un point d’accès de type WMTS-TMS.
Création de la configuration #
https://data.geopf.fr/api/datastores/{datastore}/configurations
{
"type": "WMTS-TMS",
"name": "Pays et écorégions",
"layer_name": "pays_ecoregions",
"type_infos": {
"title": "Mes écorégions",
"abstract": "Grandes régions naturelles mondiales",
"used_data": [
{
"bottom_level": "9",
"top_level": "0",
"stored_data": "{stored data}"
}
]
}
}
La donnée n’est pas représentée côté serveur, il n’y a donc pas de fichier de style à préciser au niveau de la configuration.
Consultation des points de diffusion disponibles #
https://data.geopf.fr/api/datastores/{datastore}
[
{
"name": "Service de diffusion WFS principal",
"technical_name": "gpf-geoserver-wfs",
"type": "WFS",
"urls": [
{
"type": "WFS",
"url": "https://data.geopf.fr/wfs/geoserver/ows"
}
],
"_id": "ae012611-13eb-4a18-8d04-9b7604a031cc",
"open": true,
"metadata_fi": "gpf-geoserver-wfs"
},
{
"name": "Service de diffusion WMTS/TMS principal",
"technical_name": "gpf-rok4-server-wmts-tms",
"type": "WMTS-TMS",
"urls": [
{
"type": "WMTS",
"url": "https://data.geopf.fr/wmts"
},
{
"type": "TMS",
"url": "https://data.geopf.fr/tms/"
}
],
"_id": "ae032611-13eb-4a18-8d04-9b7604a031cc",
"open": true,
"metadata_fi": "gpf-rok4-server-wmts-tms"
},
{
"name": "Service de diffusion WMS Raster principal",
"technical_name": "gpf-rok4-server-wms-r",
"type": "WMS-RASTER",
"urls": [
{
"type": "WMS",
"url": "https://data.geopf.fr/wms-r/wms"
}
],
"_id": "ae042611-13eb-4a18-8d04-9b7604a031cc",
"open": true,
"metadata_fi": "gpf-rok4-server-wms-r"
},
{
"name": "Service de diffusion WMS Vecteur principal",
"technical_name": "gpf-geoserver-wms-v",
"type": "WMS-VECTOR",
"urls": [
{
"type": "WMS",
"url": "https://data.geopf.fr/wms-v/geoserver/ows"
}
],
"_id": "ae022611-13eb-4a18-8d04-9b7604a031cc",
"open": true,
"metadata_fi": "gpf-geoserver-wms-v"
},
{
"name": "Service de Téléchargement principal",
"technical_name": "gpf-download",
"type": "DOWNLOAD",
"urls": [
{
"type": "DOWNLOAD",
"url": "https://data.geopf.fr/telechargement/"
}
],
"_id": "ae052611-13eb-4a18-8d04-9b7604a031cc",
"open": true,
"metadata_fi": "gpf-download"
},
{
"name": "Service de diffusion CSW",
"technical_name": "gpf-geonetwork",
"type": "METADATA",
"urls": [
{
"type": "METADATA",
"url": "https://data.geopf.fr/csw"
}
],
"_id": "ae062611-13eb-4a18-8d04-9b7604a031cc",
"open": true,
"metadata_fi": "gpf-geonetwork"
},
{
"name": "Service de téléchargement private",
"technical_name": "gpf-download-private",
"type": "DOWNLOAD",
"urls": [
{
"type": "DOWNLOAD",
"url": "https://data.geopf.fr/private/telechargement/"
}
],
"_id": "b5bf7ab2-8998-4829-8c80-cd2ec02e6e58",
"open": false,
"metadata_fi": "gpf-download-private"
},
{
"name": "Service de diffusion WFS privé",
"technical_name": "gpf-geoserver-wfs-private",
"type": "WFS",
"urls": [
{
"type": "WFS",
"url": "https://data.geopf.fr/private/wfs/"
}
],
"_id": "d02feec9-1169-403f-bfc3-7ba6d6015ed4",
"open": false,
"metadata_fi": "gpf-geoserver-wfs-private"
},
{
"name": "Service de diffusion WMS Vecteur privé",
"technical_name": "gpf-geoserver-wms-v-private",
"type": "WMS-VECTOR",
"urls": [
{
"type": "WMS",
"url": "https://data.geopf.fr/private/wms-v/"
}
],
"_id": "519c8bb1-9b7f-414a-9850-1a73dfd467ed",
"open": false,
"metadata_fi": "gpf-geoserver-wms-v-private"
},
{
"name": "Service de diffusion WMS Raster privé",
"technical_name": "gpf-rok4-server-wms-r-private",
"type": "WMS-RASTER",
"urls": [
{
"type": "WMS",
"url": "https://data.geopf.fr/private/wms-r/"
}
],
"_id": "66866100-48eb-4340-bbc9-f5c7d9707928",
"open": false,
"metadata_fi": "gpf-rok4-server-wms-r-private"
},
{
"name": "Service de diffusion WMTS/TMS privé",
"technical_name": "gpf-rok4-server-wmts-tms-private",
"type": "WMTS-TMS",
"urls": [
{
"type": "TMS",
"url": "https://data.geopf.fr/private/tms/"
},
{
"type": "WMTS",
"url": "https://data.geopf.fr/private/wmts/"
}
],
"_id": "7e0a92d1-8213-4ce0-8903-eb4c305a1849",
"open": false,
"metadata_fi": "gpf-rok4-server-wmts-tms-private"
}
]
Cette étape est l’étape clé pour décider si le flux que vous vous apprêtez à publier va être publié en open data ou au contraire seulement aux utilisateurs accrédités. Dans l’écosystème Géoplateforme on appelle ce dernier mode, le mode privé.
Si vous souhaitez publier en open data, vous allez chercher, dans la réponse ci-dessus, un endpoint du type de la configuration créée (pour le tutoriel, WMTS-TMS) dont l’élément open est à true.
Si vous souhaitez publier en mode privé, vous allez chercher, dans la réponse ci-dessus, un endpoint du type de la configuration créée (pour le tutoriel, WMTS-TMS) dont l’élément open est à false.
Le tutoriel est déroulé en mode open data. Pour accéder à une donnée publiée en privé, référez vous au tutoriel sur le contrôle des accès.
Publication #
https://data.geopf.fr/api/datastores/{datastore}/configurations/{configuration wmts-tms}/offerings
{
"endpoint": "ae032611-13eb-4a18-8d04-9b7604a031cc",
"open": true
}
L’exemple ci-dessus présente une publication en mode open data.
Si vous choisissez de publier en mode privé, le corps de requête sera :
{
"endpoint": "7e0a92d1-8213-4ce0-8903-eb4c305a1849",
"open": false
}
Pour accéder à une donnée publiée en privé, référez vous au tutoriel sur le contrôle des accès.
On peut vérifier la présence de notre couche pays_ecoregions dans le GetCapabilities du service TMS. On peut également avoir des détails sur cette couche.
On peut également récupérer nos données dans QGIS. Il faut ajouter une source de donnée « Tuile vectorielle » et préciser comme URL https://data.geopf.fr/tms/1.0.0/pays_ecoregions/{z}/{x}/{y}.pbf
Hébergement du style sous forme d’annexe #
L’affichage des tuiles vectorielles implique l’application d’un style côté client. Il suffit donc de fournir un style accessible pour faciliter la consommation de telles données. On va exploiter la fonctionnalité des annexes pour mettre à disposition une URL publique pour un tel style.
Ce style d’exemple est au format Mapbox.
https://data.geopf.fr/api/datastores/{datastore}/annexes
| Corps de requête Multipart |
|---|
| file = <pays_ecoregions.json> |
| paths = styles/mapbox/pays_ecoregions.json |
| published = true |
{
"paths": ["/styles/mapbox/pays_ecoregions.json"],
"size": 10768,
"mime_type": "application/json",
"published": true,
"_id": "{annexe}"
}
Nous avons demandé à ce que cette annexe soit directement publiée. Nous pouvons donc maintenant y accéder publiquement. On va pouvoir définir une couche « Tuile vectorielle » dans QGIS, en précisant la source des tuiles et l’URL du style :
- URL :
https://data.geopf.fr/tms/1.0.0/pays_ecoregions/{z}/{x}/{y}.pbf - URL du style :
https://data.geopf.fr/annexes/{technical_name}/styles/mapbox/pays_ecoregions.json

En zoomant en dessous du niveau 5, on voit bien nos régions écologiques et les limites des pays, avec le style mis en ligne.
