sogis / json2qgs

Repo für json2qgs, jsons mit assets und serviceübergreifendes permission.json
0 stars 2 forks source link

json2qgs

Kommandozeilentool, welches aus dem Inhalt des qgsContent.json und einem Template-QGS das *.qgs für die Dienste des QGIS-Server erzeugt.

Die Inhalte des qgsContent.json werden dabei mittels Jinja in das Template-QGS eingesetzt.

Im qgsContent.json ist der Inhalt der in SIMI verwalteten QGIS Ebenendarstellung (.qml) base64-codiert enthalten (Ganzer XML-Inhalt der .qml ist 1:1 base64 codiert).
Allfällige im *.qml referenzierte Assets (SVG, ...) sind ebenfalls base64-codiert im qgsContent.json enthalten.

Konfiguration

WMS / Print

Beispielkonfiguration **Zu beachten:** Falls `print_templates` in der Config enthalten ist, wird automatisch das Print-Projekt (`somap_print.qgs`) generiert, sonst das WMS-Projekt (`somap.qgs`) ```jsonc { "$schema": "https://github.com/simi-so/json2qgs/raw/master/schemas/sogis-wms-qgs-content.json", // top-level WMS Layers direkt unterhalb WMS Root Layer "wms_top_layers": [ "ch.so.agi.agi_hoheitsgrenzen_pub.hoheitsgrenzen_gemeindegrenze", "Grundstücke", "BelasteteStandorte", "ch.so.agi.uebersichtsplan", "1_hintergrundkarte_wms", "2_hintergrundkarte_wmts" ], // referenzierte Layer und Productsets "layers": [ // Productset: Layergruppe oder Facadelayer { "name": "Grundstücke", "type": "productset", "title": "Grundstücke", // Referenzen auf Sublayer "sublayers": [ "mopublic_grundstueck" ] }, { "name": "BelasteteStandorte", "type": "productset", "title": "", "sublayers": [ "afu_altlasten_pub" ] }, // Vektorlayer { "name": "ch.so.agi.agi_hoheitsgrenzen_pub.hoheitsgrenzen_gemeindegrenze", "type": "layer", "title": "Gemeindegrenzen", "datatype": "vector", // Datenquelle "postgis_datasource": { // PostGIS Connection wie in einer QGIS Datasource (hier als PG Service) "dbconnection": "service=sogis_services", // Variante ohne PG Service: // "dbconnection": "dbname='somap' host=sogis-postgis port=5432 user='dbuser' password='xxxx'", "schema": "agi_hoheitsgrenzen_pub", "table": "hoheitsgrenzen_gemeindegrenze", "unique_key": "t_id", "geometry_field": "geometrie", "geometry_type": "MULTIPOLYGON", "srid": 2056 }, // QML und zugehörige Assets mit Base64 Encoding "qml_base64": "ABCD123=", "qml_assets": [ { // Asset Pfad relativ zum QGIS Projekt "path": "fillpattern/myCrossPattern.png", "base64": "EFGH456=" } ], // Attribute und deren Aliases (Alias optional) "attributes": [ { "name": "gemeindename", "alias": "Gemeindename" }, { "name": "bfs_gemeindenummer", "alias": "BFS-Nr." }, { "name": "bezirksname", "alias": "Bezirksname" } ], // BBox des Layers "bbox": { "bounds": [ 2592560.719, 1213703.19, 2644759.746, 1261330.177 ], "srid": 2056 } }, // analog: // "mopublic_grundstueck", // "afu_altlasten_pub" // Rasterlayer { "name": "ch.so.agi.uebersichtsplan", "type": "layer", "title": "Übersichtsplan", "datatype": "raster", // Datenquelle "raster_datasource": { "datasource": "/vsicurl/https://data.sourcepole.com/srtm_1km_3857.tif", "srid": 2056 }, // Raster QML mit Base64 Encoding "qml_base64": "MNOP012=", // BBox des Layers "bbox": { "bounds": [ 2590983.475, 1212806.1156, 2646267.025, 1262755.0094 ], "srid": 2056 } }, // WMS Layer (v.a. als interner Print Layer für Hintergrundkarte) { "name": "1_hintergrundkarte_wms", "type": "layer", "title": "Swisstopo Landeskarten (farbig) WMS", "datatype": "wms", // Datenquelle "wms_datasource": { "wms_url": "https://wms.geo.admin.ch/", "layers": "ch.swisstopo.pixelkarte-farbe", "format": "image/jpeg", "styles": "", "srid": 2056, "featureCount": 10 }, // BBox des Layers "bbox": { "bounds": [ 2590983.475, 1212806.1156, 2646267.025, 1262755.0094 ], "srid": 2056 } }, // WMTS Layer (v.a. als interner Print Layer für Hintergrundkarte) { "name": "2_hintergrundkarte_wmts", "type": "layer", "title": "Swisstopo Landeskarten (grau) WMTS", "datatype": "wmts", // Datenquelle "wmts_datasource": { "wmts_capabilities_url": "https://wmts.geo.admin.ch/EPSG/2056/1.0.0/WMTSCapabilities.xml", "layer": "ch.swisstopo.pixelkarte-grau", "style": "ch.swisstopo.pixelkarte-grau", // tile_dimensions ist üblicherweise leer, beim Swisstopo WMTS muss aber Time gesetzt werden "tile_dimensions": "Time=current", "tile_matrix_set": "2056_27", "srid": 2056, "format": "image/jpeg" }, // BBox des Layers "bbox": { "bounds": [ 2590983.475, 1212806.1156, 2646267.025, 1262755.0094 ], "srid": 2056 } } ], // Print Templates (nur für Print-Projekt) "print_templates": [ { // QPT und zugehörige Assets mit Base64 Encoding "template_base64": "QRST345=", "template_assets": [ { // Asset Pfad relativ zum QGIS Projekt "path": "logos/myPrintLogo.png", "base64": "UVWX678=" } ] } ], // Farbe für Selektion im WMS "selection_color_rgba": [ 255, 255, 0, 255 ], // WMS Metadaten "wms_metadata": { // WMS GetCapabilities "service_name": "", "service_title": "", "service_abstract": "", "keywords": [ "somap" ], "online_resource": "", "contact_person": "", "contact_organization": "", "contact_position": "", "contact_phone": "", "contact_mail": "", "fees": "", "access_constraints": "", // Name und Titel des WMS Root Layers "root_name": "somap", "root_title": "", // Liste der angebotenen Referenzsysteme "crs_list": [ "EPSG:2056" ], // gesamte BBox / Default BBox für Layer "bbox": { "bounds": [ 2590983, 1212806, 2646267, 1262755 ], "srid": 2056 } } } ```

WFS

Beispielkonfiguration ```jsonc { "$schema": "https://github.com/simi-so/json2qgs/raw/master/schemas/sogis-wfs-qgs-content.json", // WFS Layerliste "layers": [ // Vektorlayer { "name": "ch.so.agi.agi_hoheitsgrenzen_pub.hoheitsgrenzen_gemeindegrenze", "title": "Gemeindegrenzen", // Datenquelle "postgis_datasource": { // PostGIS Connection wie in einer QGIS Datasource (hier als PG Service) "dbconnection": "service=sogis_services", // Variante ohne PG Service: // "dbconnection": "dbname='somap' host=sogis-postgis port=5432 user='dbuser' password='xxxx'", "schema": "agi_hoheitsgrenzen_pub", "table": "hoheitsgrenzen_gemeindegrenze", "unique_key": "t_id", "geometry_field": "geometrie", "geometry_type": "MULTIPOLYGON", "srid": 2056 }, // Attribute und deren Aliases (Alias optional) "attributes": [ { "name": "gemeindename", "alias": "Gemeindename" }, { "name": "bfs_gemeindenummer", "alias": "BFS-Nr." }, { "name": "bezirksname", "alias": "Bezirksname" } ], // BBox des Layers "bbox": { "bounds": [ 2592560.719, 1213703.19, 2644759.746, 1261330.177 ], "srid": 2056 } } ], // WFS Metadaten "wfs_metadata": { // WFS GetCapabilities "service_name": "", "service_title": "", "service_abstract": "", "keywords": [ "somap" ], "online_resource": "", "fees": "", "access_constraints": "", // Default BBox für Layer "bbox": { "bounds": [ 2590983, 1212806, 2646267, 1262755 ], "srid": 2056 } } } ```

Benutzung

Skript für Python 3.5 oder neuer

Kommandozeilenparameter

usage: json2qgs.py [-h] [--qgsTemplateDir [QGSTEMPLATEDIR]] [--qgsName [QGSNAME]] [--log_level [{info,debug}]] qgsContent {wms,wfs} destination {2,3}

positional arguments:
  qgsContent            Path to qgsContent config file
  {wms,wfs}             Available modes: wms, wfs
  destination           Directory where the generated QGS and QML assets should be saved in
  {2,3}                 Wether to use the QGIS 2 or QGIS 3 service template

optional arguments:
  -h, --help            show this help message and exit
  --qgsTemplateDir [QGSTEMPLATEDIR]
                        Path to template directory (default: 'qgs/')
  --qgsName [QGSNAME]   Target name of generated QGS file (default: 'somap')
  --log_level [{info,debug}]
                        Specifies the log level (default: info)

Zu beachten: Für WMS, Print und WFS müssen unterschiedliche --qgsName gewählt werden, damit diese nicht gegenseitig überschrieben werden (z.B. somap, somap_print und somap_wfs)

Skript

Alle Befehle anzeigen:

python json2qgs.py --help

WMS-Projekt generieren (für WMS oder Print):

python json2qgs.py demo-config/qgsContentWMS.json wms ./ 3 --qgsName somap

WFS-Projekt generieren:

python json2qgs.py demo-config/qgsContentWFS.json wfs ./ 3 --qgsName somap_wfs

Entwicklung

Erstellen einer virtuellen Umgebung:

virtualenv --python=/usr/bin/python3 .venv

Virtuelle Umgebung aktivieren:

source .venv/bin/activate

Anforderungen installieren:

pip install -r requirements.txt

Erzeugen von QGIS-Projektdateien:

python json2qgs.py demo-config/qgsContentWMS.json wms ./ 3 --qgsName somap
python json2qgs.py demo-config/qgsContentPrint.json wms ./ 3 --qgsName somap_print
python json2qgs.py demo-config/qgsContentWFS.json wfs ./ 3 --qgsName somap_wfs

Testumgebung

Umgebungsvariabeln für die Testumgebung setzen:

export QGIS_SERVER_URL=http://localhost:8001/ows
export PATH_TO_QGIS_SERVER_DIRECTORY=tests/docker/volumes/qgs-resources/

Tests laufen lassen:

python test.py