Suite

Rendu vectoriel Openlayers


Je viens d'ajouter quelques couches vectorielles WFS supplémentaires à une carte et les performances ont chuté. Lors du débogage, j'ai remarqué qu'openlayers prend en compte toutes les fonctionnalités des calques visibles lors du rendu.

Si je fais un zoom avant, il n'y a que quelques entités à partir de quelques couches, puis dites déplacer la carte vers le haut d'une petite quantité. Je m'attendrais à ce que openlayers utilise un index spatial pour identifier les caractéristiques qui doivent être restituées et ne restituer que celles-ci.

Cependant, je vois mes styles basés sur le contexte se voir demander des informations sur le symboliseur pour chaque entité de chaque couche. Par exemple. ma fonction externalGraphic a été appelée pour des fonctionnalités qui se trouvent à l'autre bout du pays !

externalGraphic : function(f) { return map.zoom < switchZoom ? icône : "/grails-app/feature/image/" + f.fid; }

Lors d'un zoom arrière, mes couches ne sont pas visibles, mais lors d'un zoom avant, des milliers d'entités sont soudainement prises en compte. Existe-t-il un moyen d'amener les openlayers à utiliser un filtre lors du rendu? J'avais pensé à ajouter des gestionnaires d'événements de zoom/panoramique de carte pour cartographier les entités dans et hors des couches à l'aide d'un filtre spatial, mais je suis presque sûr que je ne devrais pas avoir à le faire.

Je ne crois pas que le fait que mes données proviennent à l'origine d'une source WFS soit le problème ici. Mon application fonctionne également hors ligne, les données, une fois récupérées, sont stockées localement, la récupération et les ressources nécessaires pour les conserver en mémoire sont correctes.

Il doit y avoir un moyen d'amener OL à appliquer une certaine intelligence lors du rendu d'entités vectorielles lors d'un zoom avant, il ne devrait même pas considérer le rendu d'entités qui sont à des centaines de kilomètres des limites actuelles, cela déclenche la récupération d'images à partir du local système de fichiers ou le serveur lorsque le niveau de zoom passe d'une icône générique à une image spécifique à un périphérique plus détaillée.

Au total, j'ai environ 5000 fonctionnalités, cela devrait être une somme insignifiante. J'ai contourné ce problème en gérant les événements de déplacement/zoom et en cartographiant mes caractéristiques dans et hors des couches à l'aide d'un arbre quad de la bibliothèque sur mesure que j'ai écrite il y a des années et dont je veux m'éloigner. C'est un vilain hack que j'ai du mal à croire qu'il n'y a pas de façon plus élégante de gérer, je m'attendrais à fournir la carte avec mes vecteurs et à la laisser les gérer.


Je chercherais d'abord à optimiser la couche au niveau du serveur. Voici quelques options à considérer (si vos données proviennent de la table GeoServer/PostGIS) :

  • Utilisez l'option "Per-Request Feature Limit" (dans GeoServer web) pour limiter le nombre d'entités qui seront dessinées
  • Définir un index spatial sur la table (table PostGIS)

WFS n'est pas très adapté à la visualisation à la volée - il ne gère pas l'échelle/le zoom. Pour améliorer les performances d'affichage des vecteurs côté client, il convient de s'assurer que (1) seules les fonctionnalités de la vue sont chargées et rendues et (2) les fonctionnalités affichées sont correctement simplifiées et agrégées en fonction de chaque niveau de zoom.

Pour résoudre 1, indexation spatiale est une solution. Pour les couches d'objets volumineux et complexes, carrelage vectoriel est une option plus appropriée.

Pour résoudre 2, le format des données doit être fin pour assurer un temps de transfert rapide via le Web et également une analyse rapide par le client (préférez par exemple GeoJSON sur le terrible GML). De plus, vous devez utiliser techniques de généralisation côté serveur pour simplifier/agréger les données pour chaque couche de zoom. Les géométries simplifiées sont vraiment plus rapides à transférer et à rendre.


Si vous référencez un fichier, peu importe la façon dont il est indexé ou le format dans lequel il se trouve, il sera toujours en train de télécharger et d'inclure des fonctionnalités qui ne figurent pas dans votre fenêtre d'affichage. Ce qui est nécessaire dans ce cas, c'est d'utiliser un logiciel de serveur de carte. Un serveur de tuiles a été suggéré ci-dessus, mais un serveur de tuiles se situe généralement entre un serveur de cartes et l'utilisateur. Essayez d'implémenter quelque chose comme mapserver, mapnik ou geoserver. Un fil SO qui en parle : Mapnik, Mapserver ou Geoserver

Comment fonctionne un système comme celui-ci :

1-depuis votre front end, sans couture dans les openlayers, une demande est faite au serveur pour une couche avec les limites géospatiales appropriées.

2-le logiciel serveur interprète la demande et récupère le fichier pertinent ou interroge la table de base de données appropriée pour rassembler les données qui "s'adaptent" à votre port de vue actuel

3-le serveur de carte s'assure que le format est correct (png, kml, etc.) et le diffuse vers le navigateur

4-votre fonctionnalité openlayers s'occupera du rendu. bien sûr, vous devrez coder un peu pour vous assurer que votre style, etc. est ce que vous voulez.

Ainsi, voyez-vous, seules les données que vous souhaitez sont interrogées et déplacées via votre connexion Web… pas de fonctionnalités, pas de données ! Même si vous avez une requête qui sélectionne essentiellement tout, vous pouvez configurer la sortie pour avoir une prise en compte du niveau de zoom afin, par exemple, un zoom au niveau du pays ne fournirait pas de données secondaires.

Si vous utilisez beaucoup de cartes/données et que vous créez des pages Web, apprendre à utiliser un serveur de cartographie côté serveur en vaut la peine. Il n'y a pas si longtemps, nous devions créer nos propres programmes de serveurs de cartographie… ce qui faisait essentiellement du SIG Web le domaine des programmeurs, pas des gens de la cartographie. Le fait qu'il existe de nos jours des programmes robustes, gratuits et riches en fonctionnalités pour le faire pour nous est incroyable !


J'aurais ajouté ceci comme commentaire mais comme je n'ai pas la réputation, j'ai pensé le mettre comme réponse. Je pense que la simplification et une certaine forme d'indexation spatiale sont utilisées dans OpenLayers 3 pour améliorer les performances vectorielles. Cela peut valoir la peine d'essayer si vous utilisez actuellement OL2. Source http://www.slideshare.net/mobile/camptocamp/open-layers3


Voir la vidéo: Openlayers 6: Styling Vector data Markers, Chloropleth and Proportional Circles map on WebGIS (Octobre 2021).