Suite

Problème de visibilité basé sur l'échelle pyQGis

Problème de visibilité basé sur l'échelle pyQGis


Je charge des couches à partir de postgis à l'aide de pyqgis dans mon application qgis autonome. Pour chaque couche, je charge également un style en utilisant :

lyr.loadNamedStyle("style.qml")

J'ai configuré 2 versions de styles dans le bureau qgis, une avec et une sans paramètres de visibilité de plage d'échelle pour la couche. Le problème est que lorsque j'utilise le style avec une visibilité à l'échelle (peu importe si je définis une très grande plage de 1:100 000 000 à 1:1), mes fonctionnalités ne sont pas affichées, jamais. Si je n'utilise aucun style ou un style sans paramètres de visibilité de l'échelle, les calques sont visibles normalement.

Je dois ajouter que les styles fonctionnent dans QGIS Desktop comme prévu.

Ce qui me dérange légèrement, c'est que lorsque j'imprime la propriété d'échelle actuelle du canevas de la carte dans mon application, la valeur a une valeur incroyablement grande, par exemple 10e14 pour commencer, même si l'échelle devrait se situer autour de 4000000 (1:4000000) . Ce qui est encore plus étrange, c'est que cette valeur d'échelle (canvas.scale()) change de manière significative lorsque je fais un panoramique (pas un zoom) sur la carte.

Une idée de ce qui se passe?

Parce que je pensais que le srid mapCanvas n'était pas configuré correctement et que l'échelle ne rentrerait jamais dans ma plage d'échelle, j'ai essayé de définir explicitement le srid du canevas de la carte, je l'ai fait sur des calques, toujours sans succès. J'utilise QGIS 2.8.1

MISE À JOUR : Il semble que dans tous les cas, je dois définir le CRS explicitement

canvas.mapRenderer().setDestinationCrs(QgsCoordinateReferenceSystem(32632))

mais ça ne change rien. Je pensais juste que les couches appliqueraient implicitement mon CRS local, mais ce n'est pas le cas.


D'accord. Résolu. Il y avait 2 choses que je devais faire, pour que les styles fonctionnent.

  1. Vous devez définir le système de coordonnées explicitement. Le chargement des couches Postgis avec un CRS prédéfini ne le faisait pas automatiquement (car nous sommes utilisés depuis le bureau QGis). Vous pouvez le faire en :

    map.setDestinationCrs(QgsCoordinateReferenceSystem(srid))

  2. Vous devez définir explicitement les unités de carte en mètres, ou tout ce qui est utilisé dans votre CRS projeté. L'échelle est alors calculée correctement :

    map.setMapUnits(QGis.UnitTypes.Meters)


Ajout ci-dessus (pas assez de points pour commenter)

map.setMapUnits(QGis.UnitTypes.Meters)

Ne fonctionne pas pour moi (version 2.14). Je dois référencer les compteurs avec l'index de ce type d'unité, noté ici dans la documentation API. L'utilisation de cela fonctionne pour moi (0 = mètres).

map.setMapUnits(0)

Avec QGIS 3, extrait de https://qgis.org/api/api_break.html

setMapUnits() a été supprimé. Les unités de la carte sont dictées par les unités du SCR de destination.

Vous avez maintenant seulement besoinmap.setDestinationCrs(QgsCoordinateReferenceSystem(srid))