Skip to content

sogis/json2qgs

Repository files navigation

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

  • JSON Schema
  • generiertes WMS-Projekt: somap.qgs
  • generiertes Print-Projekt: somap_print.qgs
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)

{
  "$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
{
  "$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

About

Repo für json2qgs, jsons mit assets und serviceübergreifendes permission.json

Resources

Stars

Watchers

Forks

Packages

No packages published

Contributors 6