Giter Club home page Giter Club logo

server's Introduction

Serveur de diffusion WMS, WMTS et TMS

ROK4 Logo

Le serveur implémente les standards ouverts de l’Open Geospatial Consortium (OGC) WMS 1.3.0, WMTS 1.0.0 et OGC API Tiles 1.0.0, ainsi que le TMS (Tile Map Service). Il vise deux objectifs principaux :

  • L’utilisation d’un cache de données raster unique permettant de servir indifféremment des flux WMS, WMTS, API Tiles et TMS
  • Des performances de traitement d’image et de diffusion accrues
  • La diffusion de tuiles vecteur telles qu'elles sont stockées, sans transformation (TMS uniquement)
  • La diffusion en WMTS selon des Tile Matrix Sets différents de celui de la pyramide utilisée.

Les pyramides de données utilisées sont produites via les outils de prégénération et de génération.

L'implémentation s'appuie essentiellement sur la librairie C++ du projet.

Installer le serveur outils (Debian)

Installations système requises (listées dans le paquet debian, installées avec l'applicatif lors du apt install) :

  • librok4-dev (disponible sur GitHub)
  • libcurl4-openssl-dev
  • libssl-dev
  • libfcgi-dev
  • libtinyxml-dev
  • libproj-dev
  • libboost-log-dev
  • libboost-filesystem-dev
  • libboost-system-dev
### librok4-dev
curl -o librok4-dev.deb https://github.com/rok4/core-cpp/releases/download/x.y.z/librok4-base-x.y.z-ubuntu-20.04-amd64.deb
# or, with ceph driver
curl -o librok4-dev.deb https://github.com/rok4/core-cpp/releases/download/x.y.z/librok4-ceph-x.y.z-ubuntu-20.04-amd64.deb

apt install ./librok4-dev.deb

### rok4-server
curl -o rok4-server.deb https://github.com/rok4/server/releases/download/x.y.z/rok4-server-x.y.z-ubuntu-20.04-amd64.deb

apt install ./rok4-server.deb

### installation des styles et des tile matrix sets 
curl -o tilematrixsets.deb https://github.com/rok4/tilematrixsets/releases/download/4.1/rok4-tilematrixsets-4.1-linux-all.deb
apt install ./tilematrixsets.deb

curl -o styles.deb https://github.com/rok4/styles/releases/download/4.1/rok4-styles-4.1-linux-all.deb
apt install ./rok4-styles.deb

Utiliser le serveur

Le serveur ROK4 est lancé en mode stand alone. Nous utiliserons ici Nginx comme serveur front pour "traduire" les requêtes HTTP en FCGI et les rediriger vers le serveur ROK4.

Variables d'environnement utilisées

Leur définition est contrôlée à l'usage.

  • Pour le stockage CEPH
    • ROK4_CEPH_CONFFILE
    • ROK4_CEPH_USERNAME
    • ROK4_CEPH_CLUSTERNAME
  • Pour le stockage S3
    • ROK4_S3_URL
    • ROK4_S3_KEY
    • ROK4_S3_SECRETKEY
  • Pour le stockage SWIFT
    • ROK4_SWIFT_AUTHURL
    • ROK4_SWIFT_USER
    • ROK4_SWIFT_PASSWD
    • ROK4_SWIFT_PUBLICURL
    • Si authentification via Swift
      • ROK4_SWIFT_ACCOUNT
    • Si connection via keystone (présence de ROK4_KEYSTONE_DOMAINID)
      • ROK4_KEYSTONE_DOMAINID
      • ROK4_KEYSTONE_PROJECTID
    • ROK4_SWIFT_TOKEN_FILE afin de sauvegarder le token d'accès, et ne pas le demander si ce fichier en contient un
  • Pour configurer l'usage de libcurl (intéraction SWIFT et S3)
    • ROK4_SSL_NO_VERIFY
    • HTTP_PROXY
    • HTTPS_PROXY
    • NO_PROXY

Configurer le serveur

Dans le fichier server.json, on précise le port d'écoute :

    "port": ":9000"

On configure les logs de manière à les retrouver dans un fichier par jour :

"logger": {
    "output": "rolling_file",
    "level": "info",
    "file_prefix": "/var/log/rok4",
    "file_period": 86400
}

Les répertoires dans lesquels sont les tile matrix sets et les styles peuvent être des dossiers (comme file:///usr/share/rok4/tilematrixsets) ou des préfixes objets (comme s3://tilematrixsets). Sans préfixe précisant le type de stockage, le chemin est interprété en mode fichier.

  • Les paramètres possibles du fichier de configuration server.json sont décrits ici
  • Les paramètres possibles du fichier de configuration services.json sont décrits ici

Lancer le serveur

En ligne de commande

La ligne de commande permettant de lancer ROK4 comme instance autonome est la suivante :

rok4 -f /chemin/vers/fichier/server.json &

En tant que service systemctl

Selon l'emplacement d'installation, le fichier dans service/rok4.service peut déjà être à un endroit pris en compte par systemctl (comme /usr/lib/systemd/system). Celui ci est écrit pour un déploiement à la racine, modifiez les chemins pour qu'il soit adapté à votre déploiement. Si l'installation a été faite via le paquet debian, le service est déjà correctement installé, et les configurations sont dans /etc/rok4.

EnvironmentFile=/etc/rok4/env
WorkingDirectory=/etc/rok4/

Le fichier /etc/rok4/env permet de définir les variables d'environnement propres au serveur pour configurer l'utilisation de stockages objets (voir ici).

Le serveur est lancé en tant que user (et group) rok4. Il convient donc de le créer : useradd rok4.

Il suffit alors de recharger le démon systemctl avec la commande systemctl daemon-reload. Vous pouvez maintenant piloter le serveur ROK4 via ce système, comme le démarrer avec systemctl start rok4.

Installer et configurer NGINX

  • Sous Debian : apt install nginx
  • Sous Centos : yum install nginx

Remplacer le fichier default présent dans le répertoire /etc/nginx/sites-enabled par le contenu suivant :

upstream rok4 { server localhost:9000; }

server {
    listen 80;
    root /var/www;
    server_name localhost;

    access_log /var/log/rok4_access.log;
    error_log /var/log/rok4_error.log;

    location /rok4 {
        rewrite /rok4/?(.*) /$1 break;
        fastcgi_pass rok4;
        include fastcgi_params;
    }
}

On redémarre nginx : systemctl restart nginx

Accès aux capacités du serveur

Fonctionnement général du serveur

Identification du service et du type de requête

Lorsque le serveur reçoit une requête, c'est le premier élément du chemin qui détermine le service :

  • / -> requête globale
  • /healthcheck -> requête d'état de santé ou statut du serveur
  • /wmts -> requête WMTS
  • /wms -> requête WMS
  • /ogcapitiles -> requête API Tiles
  • /tms -> requête TMS
  • /admin -> requête d'administration

En WMS et WMTS, si c'est une requête POST, le corps est interprété pour extraire les informations. Seuls le getCapabilities, le getMap et le getTile sont disponibles en POST. Le paramètre de requête ou le corps doit confirmer le service pour que la requête soit valide.

Les requêtes gérées par le serveur sont décrites dans des spécifications au format Open API.

Accès aux données

L'accès aux données stockées dans les pyramides se fait toujours par tuile. Dans le cas du TMS et WMTS, la requête doit contenir les indices (colonne et ligne) de la tuile voulue. La tuile est ensuite renvoyée sans traitement, ou avec simple ajout/modification de l'en-tête (en TIFF et en PNG). Dans le cas d'un GetMap en WMS, l'emprise demandée est convertie dans le système de coordonnées de la pyramide, et on identifie ainsi la liste des indices des tuiles requises pour calculée l'image voulue. De la même manière qu'en WMTS et TMS, le serveur sait à partir des indices où récupérer la donnée dans l'espace de stockage des pyramides.

Avec les indices de la tuile à lire, le serveur calcule le nom de la dalle qui la contient et le numéro de la tuile dans cette dalle. Le serveur commence par récupérer le header et l'index de la dalle, contenant les offsets et les tailles de toutes les tuiles de la dalle. Le header fait toujours 2048 octets et l'index a une taille connue par le serveur.

Dans le cas du stockage objet (CEPH, S3, SWIFT), les objets symboliques ne font jamais plus de 2047 octets. Cette première lecture permet donc de les identifier (on lit moins que voulu). Dans ce cas, ce qu'on a lu contient le nom de l'objet contenant réellement la donnée (précédé de la signature SYMLINK#). On va donc reproduire l'opération sur ce nouvel objet, qui lui ne doit pas être un objet symbolique (pas de lien en cascade). En mode fichier, ce mécanisme est transparent pour le serveur car géré par le système de fichiers.

Une fois que l'on a récupéré l'index, et grâce au numéro de la tuile dans la dalle, on va pouvoir connaître l'offset et la taille. On va donc faire une deuxième lecture de la dalle pour récupérer la donnée de la tuile.

Gestion des configurations

Au démarrage du serveur, le fichier de configuration globale du serveur est chargé, puis celui des services. Si un fichier / objet est précisé pour les couches, il est lu. C'est interprété comme la liste des chemins vers les descripteurs des couches à charger à l'initialisation. Sinon, le serveur ne contient aucune couche.

Lorsqu'une couche est chargée, les descripteurs de pyramide, de TMS et de styles nécessaire sont chargés à la volée.

    "configurations": {
        "services": "/etc/rok4/services.json",
        "layers": "s3://layers/list.txt",
        "styles": "file:///usr/share/rok4/styles",
        "tile_matrix_sets": "file:///usr/share/rok4/tilematrixsets"
    }

Pour les TMS et les styles, ils sont cherchés dans les répertoires (fichier ou objet) renseignés dans le server.json, avec comme nom de fichier objet <ID du style>.json. Un annuaire est tenu à jour pour ne charger qu'une seule fois le style ou le TMS.

Chargement du serveur

Personnalisation des points d'accès aux services

Pour que les URLs présentes dans les réponses des services soient correctes malgré des réecritures, il est important de bien renseigner les champs suivant dans le fichier services.json:

    "wms": {
        "endpoint_uri": "http://localhost/rok4/wms",
    },
    "wmts": {
	    "endpoint_uri": "http://localhost/rok4/wmts"
    },
    "tms": {
        "endpoint_uri": "http://localhost/rok4/tms"
    },
    "ogctiles": {
        "endpoint_uri": "http://localhost/rok4/ogcapitiles"
    }

Compiler le serveur (Debian)

Dépendances supplémentaires

  • build-essential
  • cmake
  • Pour les tests unitaires
    • libcppunit-dev
  • Pour la documentation
    • doxygen
    • graphviz

apt install build-essential cmake libcppunit-dev doxygen graphviz

Variables CMake

  • UNITTEST_ENABLED : active la compilation des tests unitaires. Valeur par défaut : 1, 0 pour désactiver.
  • DOC_ENABLED : active la compilation de la documentation. Valeur par défaut : 1, 0 pour désactiver.
  • BUILD_VERSION : version de la librairie compilée. Valeur par défaut : 0.0.0. Utile pour la compilation de la documentation.
  • DEBUG_BUILD : active la compilation en mode debug. Valeur par défaut : 0, 1 pour activer.

Compilation, tests unitaires et documentation et installation

mkdir build && cd build
cmake -DBUILD_VERSION=0.0.0 -DCMAKE_INSTALL_PREFIX=/opt/rok4 ..
make
make test
make doc
make install

Contribuer

Consulter les directives de contribution

server's People

Contributors

dolite avatar lowzonenose avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

Forkers

shenry82

server's Issues

Customiser les TMS dans le getcap WMTS

Pour que les outils comme GDAL ou QGis n'essayent pas de demander des tuiles pour des niveaux absents dans la couches, il faut dupliquer le TMS utilisé pour le définir uniquement sur les niveaux présents. Cette duplication ne doit être faite que dans le getcap WMTS.

Développement : C++
Charge de développement : 2 semaines
Charge de test : 1 jour

Interroger le getcapabilities en mode inspire

Il est aujourd'hui possible de démarrer le serveur en mode inspire : il doit y avoir une métadonnée de service et cela empêchera la publication de couches qui ne respectent pas certaines contraintes (présence d'une métadonnée, de mots-clés...). Cela peut être trop contraignant.

Il serait donc intéressant de permettre l'interrogation du getcapabilities en précisant que l'on veut la version inspire : on ajoutera les champs spécifiques et on ne mettra que les couches respectant toutes les contraintes. Les services WMS et WMTS sont concernés.

En WMS

  • Au niveau général
  • Au niveau des couches

En WMTS

  • Au niveau général
  • Au niveau des couches

Sortir proprement lors d'un problème de socket

Lorsque l'on essaye de démarrer le serveur sur un port déjà occupé, il sort en erreur sans logger la raison. Il faudrait ajouter un log fatal explicite

Développement : C++
Charge de développement : 0.5 jour
Charge de test : 0.5 jour

⏳ Implémenter l'API OGC Tiles (~WMTS)

⏳ En attente de stabilisation des API

L'OGC est en train de spécifier des nouvelles API modernes, pour venir remplacer les anciennes. Concernant le serveur ROK4, on va venir compléter les interfaces gérées avec l'API Tiles (GitHub)

Specs OpenAPI :

Il faut partir sur les routes permettant la fourniture d'un style et le nom de la collection (couche).

Celle ci ressemble énormément au Tile Map Service

Développement : C++
Charge d'analyse : 1 semaine
Charge de développement : 1.5 semaine
Charge de test : 2 jours

Racine du service : /ogcapitiles

GetCapabilities

  • /collections
    • gestion du paramètre limit
    • gestion du paramètre bbox
    • gestion du paramètre bbox-crs
  • /collections/{id}/tiles : (les données vecteur, avec forcément un seul tileset, celui correspondant au TMS natif)
  • /collections/{id}/map/tiles : (les données raster, avec un tile set par tms d'exposition)

Tile Matrix Sets

  • /tilematrixsets
  • /tilematrixsets/{id}

URI pour afficher les tilematrixsetLimits

  • /tiles/{tileMatrixSetId}
  • /map/tiles/{tileMatrixSetId}

ou l'utilisation de la route coverage :

  • /collections/{collectionId}/coverage/map/tiles/{tileMatrixSetId}
  • /collections/{collectionId}/coverage/tiles/{tileMatrixSetId}

GetTile raster

  • /styles//map/tiles/{tms id}/{level}/{row}/{col} : avec le paramètre collections obligatoire et de longueur 1
  • /map/tiles/{tms id}/{level}/{row}/{col} : avec le paramètre collections obligatoire et de longueur 1 et le style par défaut de la couche
  • /collections/{id}/styles//map/tiles/{tms id}/{level}/{row}/{col}
  • /collections/{id}/map/tiles/{tms id}/{level}/{row}/{col} : avec le style de la couche par défaut

GetTile vector (sans subset ou reprojection)

  • /tiles/{tms id}/{level}/{row}/{col} : avec le paramètre collections obligatoire et de longueur 1, et tms id = celui natif de la pyramide
  • /collections/{id}/tiles/{tms id}/{level}/{row}/{col} : avec tms id = celui natif de la pyramide

⏳ Implémenter l'API OGC Maps (~WMS)

⏳ En attente de stabilisation des API

L'OGC est en train de spécifier des nouvelles API modernes, pour venir remplacer les anciennes. Concernant le serveur ROK4, on va venir compléter les interfaces gérées avec l'API Maps

Specs OpenAPI :

Il faut partir sur les routes permettant la fourniture d'un style et le nom de la collection (couche).

Développement : C++
Charge d'analyse : 1 semaine
Charge de développement : 2 semaines
Charge de test : 2 jours

Racine du service : /ogcapimaps

GetCapabilities

  • /collections
  • /collections/{id}/map : liste des styles dispos pour cette collection

GetMap

  • /map/{style id} : multi couche
  • /collections/{id}/map/{style id} : simple couche

GetFeatureInfo

  • /collections/{id}/map/{style id}/info : simple couche
  • /map/{style id}/info : multi couche

Gérer proprement les coordonnées en EPSG:4326

Pour le moment, quand ce système (ou un système EPSG lonlat) est détecté, on inverse systématiquement les coordonnées pour avoir la première coordonnée x dans le sens est ouest, le sens des colonnes des tuiles.

Cette façon de faire implique des tests régulier pour lire ou écrire les coordonnées en accord avec la définition officielle du système de coordonnées.

Il serait beaucoup plus propre de gérer nativement ces coordonnées, dans leur ordre "naturel".

Cela implique aussi de modifier le TMS 4326 (rok4/tilematrixsets#1)

Chargement à la volée des configurations

Aujourd'hui les configurations du serveurs sont toutes en mode fichier. Pour les configurations fixes comme le server.json ou le services.json, ce n'est pas un problème qu'elles soient dupliquées entre les instances. En revanche, pour la définition des couches styles et tilematrixsets, amenés à changer durant la vie du serveur, c'est plus problématique.

L'idée est donc de permettre au serveur de lire ces configurations sur du stockage objets, facilitant leur centralisation et leur partage.

En ce qui concerne les styles et les tile matrix sets, ils seront chargés à la demande, lorsqu'une couche en a besoin (avec gestion d'un annuaire).

Pour les couches, pour éviter de devoir calculer le contenu d'un dossier (fichier ou objet), on fournira au serveur un fichier/objet contenant la liste initiale des descripteurs de couche fichiers/objets.

  • Chargement à la demande des styles avec gestion d'un annuaire
  • Chargement à la demande des tile matrix sets avec gestion d'un annuaire
  • Chargement des couches à partir d'une liste

Cette évolution nécessite des modifications du projet rok4/core-cpp

Ajout d'un paramètre FILENAME

Il serait intéressant de permettre à l'utilisateur d'ajouter un paramètre filename dans la requête url afin de préciser un nom de fichier pour sauver la données renvoyée (utilisation de l'entête Content-Disposition).

Spécifications

Pour toutes les requêtes effectuées (GetCapabilities, GetMap, ...), permettre d'ajouter le mot clef FILENAME :

  • Propriété à ajouter : FILENAME
  • Valeurs possibles : libre
  • Vérification entre l’extension du nom de fichier et le FORMAT demandé : pas nécessaire, à voir si c'est facile ou non
  • Résultat : Content-Disposition: attachment; filename="$FILENAME" ajouté dans le header de la réponse

Cas d'usage

Générer un lien permettant à un utilisateur de récupérer un fichier correctement nommé.

Exemple :

Source

Doc Mozilla sur le header : https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition

C'est inspiré de : https://docs.geoserver.org/2.22.x/en/user/services/wms/vendor.html

Il pourrait être intéressant de voir si d'autre paramètres sont intéressants éventuellement.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.