asit-asso / extract

EXTRACT makes it easy to extract and deliver of your geodata
GNU General Public License v3.0
9 stars 4 forks source link

Nouveau plugin de tâche QGIS Print Layout / Atlas (QGIS Server) #287

Closed guillaumestark closed 4 months ago

guillaumestark commented 1 year ago

Objectif

Créer un nouveau plugin de tâche permettant d'imprimer des Atlas QGIS en PDF en utilisant Print Layout.

Principe de fonctionnement

Un Atlas QGIS permet de prédéfinir des zones d'impression, qui seront utilisées par une Mise en page (print layout / print template) pour impression.

Ce plugin va utiliser l'API QGIS Server (WMS + WFS) pour lancer l'impression de l'atlas sur la le périmètre de requête.

Configuration

atlas_plugin

Champ Type Obligatoire Exemple
URL de base QGIS Server Chaîne de caractères Oui 'https://monserveur.lan/qgis-server'
Template à utiliser pour le layout Chaîne de caractères Oui 'myplan'
Chemin du projet QGIS Chaîne de caractères Non '/etc/qgis-server/maps/world/world.qgs'
Login distant Chaîne de caractères Non 'monUser'
Mot de passe Mot de passe Non 'superSecret'
Layers à utiliser (séparation par des virgules) Chaîne de caractères Non 'places,airports,water'
CRS (Code EPSG) Chaîne de caractères Non 'EPSG:2056'

Aide :

Le plugin d'extraction QGIS Server permet d'imprimer des Atlas au format PDF.
TODO !!!!
[...]

Appels à QGIS Server pour l'impression PDF

Note : les valeurs d'exemple de configuration (ci-dessus) ont été utilisées dans les appels (ci-dessous)

1. Obtenir le détail des layouts, pour récupérer la couche de 'Coverage' (features qui pilotent la zone l'impression) [WMS GET] :

GetProjectSettings : GET https://monserveur.lan/qgis-server?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetProjectSettings&MAP=/etc/qgis-server/maps/world/world.qgs

On devra en extraire le coverage layer pour le template (pseudo xpath ci dessous) /WMS_Capabilities/Capability/ComposerTemplates/ComposerTemplate[@name='myplan']/@atlasCoverageLayer

2. Lister les features dans le périmètre de requête [WFS POST]

GetFeature : POST https://monserveur.lan/qgis-server?MAP=/etc/qgis-server/maps/world/world.qgs body :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<wfs:GetFeature maxFeatures="5000" version="1.1.0" service="WFS" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd" xmlns:wfs="http://www.opengis.net/wfs" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <wfs:Query typeName="MY_COVERAGE_LAYER">
    <ogc:Filter>
      <ogc:Intersects>
        <ogc:PropertyName>the_geom</ogc:PropertyName>
          <Polygon xmlns="http://www.opengis.net/gml" srsName="EPSG:4326">
            <exterior>
              <LinearRing>
                <posList srsDimension="2">6.904809316884131 46.445147801931604 6.904511260615304 46.44536023617469 6.905209363082197 46.44564162252219 6.905951438924574 46.445877208874904 6.906586641229295 46.44633044643151 6.907835703094311 46.44689045221654 6.908457065788995 46.44696353109655 6.908648245758518 46.44684388210399 6.907904997673016 46.446725253908994 6.906745292077869 46.446141820152185 6.906105531914959 46.445749169409744 6.905239061797321 46.44545902316597 6.904809316884131 46.445147801931604</posList>
              </LinearRing>
            </exterior>
          </Polygon>
      </ogc:Intersects>
    </ogc:Filter>
  </wfs:Query>
</wfs:GetFeature>

Extraire les IDs des features (pseudo xpath ci dessous): /wfs:FeatureCollection/gml:featureMember/qgs:MY_COVERAGE_LAYER/@gml:id

3. Imprimer l'Atlas avec les IDs reçus précédemment [WMS GET] :

GetPrint : https://monserveur.lan/qgis-server?SERVICE=WMS&REQUEST=GetPrint&CRS=EPSG:4326&TEMPLATE=myplan&FORMAT=pdf&MAP=/etc/qgis-server/maps/world/world.qgs&LAYERS=cadastre,wastewater,water&ATLAS_PK=193,192

Notes :