Suite

Zoom sur l'étendue de la couche dans PyQGIS ?

Zoom sur l'étendue de la couche dans PyQGIS ?


Concernant mon plugin pyqgis 2.2, je peux charger une couche vectorielle avec succès. Mais lorsque j'essaie de zoomer sur l'étendue du calque, cela ne fonctionne pas.

Comment faire pour zoomer sur l'étendue de la couche ?


Je viens d'essayer votre proposition. J'ai collé votre morceau de code dans mon plugin. Mais malheureusement, lorsque je charge une couche vectorielle. J'essaie de zoomer sur l'étendue du calque (grâce au clic droit -> zoom sur l'étendue du calque). Je n'ai pas de message d'erreur mais il n'y a pas de changement de zoom dans l'étendue du calque vectoriel.

Vous pouvez lire le python.py (lien du plugin github) ici :

https://github.com/picardie-nature/clicnat-qgis/blob/master/plugin.py

Des pensées?


Quelque chose comme ci-dessous devrait fonctionner.

vLayer = iface.activeLayer() canvas = iface.mapCanvas() extent = vLayer.extent() canvas.setExtent(extent)

Une façon de le faire serait de sélectionner toutes les entités de la couche, de zoomer sur sélectionné, puis de tout désélectionner :

utilise ce code :

vlayer.selectAll() mCanvas = iface.mapCanvas() mCanvas.zoomToSelected() vlayer.removeSelection()

Le CRS dans lequel se trouvent toutes les données ainsi que la carte elle-même s'appelle WGS84. Il s'agit d'un système de coordonnées géographiques (GCS) très courant pour la représentation des données. Mais il y a un problème, comme nous le verrons.

  • Enregistrez votre carte actuelle.
  • Ensuite, ouvrez la carte du monde que vous trouverez sous exercice_données/monde/monde.qgs .
  • Zoomez sur l'Afrique du Sud en utilisant le Agrandir outil.
  • Essayez de régler une échelle dans le Échelle domaine, qui est dans le Barre d'état au bas de l'écran. Au-dessus de l'Afrique du Sud, définissez cette valeur sur 1:5000000 (un à cinq millions).
  • Parcourez la carte tout en gardant un œil sur Échelle domaine.

Vous remarquez que l'échelle change ? C'est parce que vous vous éloignez du point sur lequel vous avez zoomé 1:5000000 , qui était au centre de votre écran. Tout autour de ce point, l'échelle est différente.

Pour comprendre pourquoi, pensez à un globe terrestre. Il a des lignes qui le longent du nord au sud. Ces lignes de longitude sont éloignées l'une de l'autre à l'équateur, mais elles se rejoignent aux pôles.

Dans un GCS, vous travaillez sur cette sphère, mais votre écran est plat. Lorsque vous essayez de représenter la sphère sur une surface plane, une distorsion se produit, semblable à ce qui se produirait si vous coupiez une balle de tennis et essayiez de l'aplatir. Ce que cela signifie sur une carte, c'est que les lignes de longitude restent également éloignées les unes des autres, même aux pôles (où elles sont censées se rencontrer). Cela signifie que, à mesure que vous vous éloignez de l'équateur sur votre carte, l'échelle des objets que vous voyez devient de plus en plus grande. Ce que cela signifie pour nous, pratiquement, c'est qu'il n'y a pas d'échelle constante sur notre carte !

Pour résoudre ce problème, utilisons plutôt un système de coordonnées projetées (PCS). Un PCS « projette » ou convertit les données de manière à tenir compte du changement d'échelle et à le corriger. Par conséquent, pour garder l'échelle constante, nous devons reprojeter nos données pour utiliser un PCS.


Solution proposée

Une couche de maillage (QgsMeshLayer) se compose des principaux éléments suivants :

fournisseur de données - tout comme la façon dont les fournisseurs sont utilisés pour les couches vectorielles et raster, il s'agit d'une abstraction pour accéder à la structure du maillage et aux données au-dessus du maillage.

renderer - prend en charge le rendu de la couche de maillage pour mapper les images selon la configuration spécifiée par l'utilisateur

cache - étant donné que la récupération des données du fournisseur de données peut être lente, un cache est utilisé pour conserver certaines données en mémoire pour un accès rapide

Fournisseur de données

Il peut y avoir plusieurs fournisseurs de données disponibles pour différents formats de fichiers, mais une couche pointe toujours vers un seul fournisseur de données (QgsMeshDataProvider)

Les principales responsabilités d'un fournisseur de données sont les suivantes :

  • retourner la structure du maillage (liste des nœuds, des arêtes et des faces)
  • renvoyer des métadonnées sur les jeux de données (semblable à l'obtention d'une liste de canaux raster et de leurs métadonnées)
  • retourner une fenêtre de données à partir d'un ensemble de données

Dans l'implémentation initiale, nous supposons que les fournisseurs de données seront en lecture seule. À l'avenir, cela peut changer et il peut y avoir des appels pour modifier la structure du maillage ou ajouter/supprimer/modifier des jeux de données.

Rendu

Rendu de couche de maillage (QgsMeshLayerRenderer) est responsable du dessin de la carte d'une étendue de carte donnée.
Il est dérivé de QgsMapLayerRenderer et est appelé à partir du moteur de rendu de carte QGIS.

Le moteur de rendu rend les données du jeu de données actif - les utilisateurs pourront choisir quel jeu de données est le jeu de données actif.

Le rendu se compose de trois étapes et l'utilisateur doit pouvoir configurer quelles étapes seront utilisées :

rendu des contours. Cela interpole les valeurs de l'ensemble de données actif et attribue une couleur à chaque pixel couvert par le maillage. Pour les jeux de données vectorielles, les magnitudes des vecteurs sont utilisées comme valeurs.

rendu des vecteurs. Cela dessine des symboles de flèche avec une mise à l'échelle appropriée pour les données de l'ensemble de données actif. Évidemment, cela n'est possible que pour les ensembles de données vectorielles.

rendu du maillage. L'ensemble de données actif n'est pas utilisé ici - seule la structure de maillage est rendue, éventuellement avec des étiquettes.

L'algorithme de rendu comprend les étapes suivantes :

  1. Compte tenu de l'étendue de la carte, utilisez l'index spatial pour déterminer quels éléments du maillage sont nécessaires pour le rendu
  2. À l'aide de la liste des éléments, déterminez quels blocs de données seront nécessaires à partir de l'ensemble de données actif.
  3. Essayez de récupérer les blocs de données requis dans le cache. Si les blocs ne sont pas disponibles dans le cache, récupérez-les auprès du fournisseur de données et stockez-les temporairement dans le cache.
  4. Parcourez les éléments du maillage dans l'étendue de la carte et effectuez le rendu un par un (d'abord les contours, puis les vecteurs, puis le maillage).

Cacher

Afin de s'assurer que l'accès aux données est suffisamment rapide, nous devrons conserver un cache. Il comprendra les parties suivantes :

Structure en maille. Cette structure de données sera consultée très souvent et elle est relativement petite et peut donc être mise en cache dans son ensemble.

Blocs de données. L'accès aux données des fournisseurs de données peut être relativement lent et très souvent, le moteur de rendu cartographique aura besoin d'accéder au même sous-ensemble de données ou à un sous-ensemble similaire au fil du temps. Dans le même temps, la quantité totale de données stockées dans les blocs de données peut être importante (de l'ordre du gigaoctet), donc cette partie du cache devra être limitée par une taille de cache maximale et les blocs de données seraient remplacés par les moins récents. stratégie utilisée (LRU).

Maillage triangulaire "dérivé". Utilisé pour accélérer et simplifier le rendu, ainsi que pour fournir un maillage pour le rendu en vue cartographique 3D. Plus de détails ci-dessous.

Indice spatial. Pour le rendu de la carte et l'identification des couches, nous avons besoin de requêtes spatiales rapides ("quels éléments de maillage sont dans ce rectangle").

Maillage dérivé

Raisons pour lesquelles nous avons besoin d'un maillage triangulaire dérivé :

  • la structure de maillage en général peut contenir des triangles, des quadrilatères ou même des polygones avec un plus grand nombre de sommets. L'interpolation sur des formes autres que les triangles est plus chère/difficile et pour le rendu en 3D, nous devons de toute façon avoir un maillage triangulaire.
  • lors du rendu d'éléments 1D (bords), nous devons les transformer en quads en fonction de leur épaisseur (et les quads sont transformés en une paire de triangles).
  • lorsque la carte CRS est différente de la couche de maillage CRS, nous devons faire une reprojection à la volée. Garder le maillage dérivé dans la carte CRS nous évite de reprojeter sur chaque rendu.
  • niveau de détail - lors du rendu d'une grande zone, nous pouvons simplifier et utiliser moins de triangles pour le rendu, pour une zone plus petite, nous pouvons vouloir diviser des éléments tels que des quads en plus de deux triangles pour une meilleure qualité de rendu.

Le maillage dérivé est conservé pour des paramètres de configuration de carte particuliers (en particulier l'échelle et le SCR). Chaque fois que les paramètres de la carte sont modifiés, le maillage dérivé doit être invalidé. L'hypothèse est que ces paramètres de paramètres de carte restent souvent les mêmes lors de plusieurs appels de rendu.

Le chargement des couches de maillage doit être possible via le panneau de navigateur intégré et/ou via la boîte de dialogue d'ajout de couche unifiée.

Une fois qu'une couche de maillage est chargée, elle aura une boîte de dialogue de propriétés de couche de carte similaire à celles des couches vectorielles/raster, avec une configuration de rendu similaire aux maquettes de l'interface graphique ci-dessus.


Voir la vidéo: Automated GIS Workflows with PyQGIS: Creating an NDVI.