#1 Fri 08 March 2019 03:00
- Yannick VEILLET
- Participant assidu
- Lieu: MONTREAL
- Date d'inscription: 5 Sep 2005
- Messages: 165
QGIS: Verrouiller l'affichage du projet
Bonjour,
Je souhaite verrouiller l'affichage de mon projet à une certaine échelle pour que utilisateur ne puisse plus faire de zoom moins.
Sinon peut-on effectuer le verrouillage par rapport à l'étendue du couche existante?
Est-ce possible?
Merci.
Yannick
Hors ligne
#2 Mon 11 March 2019 12:16
Re: QGIS: Verrouiller l'affichage du projet
Bonjour,
Voici un code à coller dans votre console python, pour tests puis à adapter le cas échéant en macro python.
Réalisé en QGIS 3
Code:
iface = qgis.utils.iface def lockZoom(layerName): print(layerName) cnv = iface.mapCanvas() lyr = QgsProject.instance().mapLayersByName(layerName)[0] # extents cnv_e = cnv.extent() lyr_e = lyr.extent() # geometries cnv_g = QgsGeometry.fromRect(cnv_e) lyr_g = QgsGeometry.fromRect(lyr_e) # contains ? cntns = cnv_g.contains(lyr_g) # est ce que l'emprise de mon canevas contient celle de ma couche ? print(cntns) if(cntns is not True) : cnv.setExtent(lyr_e) # on bloque l'extent cnv.extentsChanged.disconnect() layerName = 'masque' cnv.extentsChanged.connect(lambda: lockZoom(layerName))
geodata au cerema et petits billets en géomatique
Hors ligne
#3 Thu 28 March 2019 01:45
- Yannick VEILLET
- Participant assidu
- Lieu: MONTREAL
- Date d'inscription: 5 Sep 2005
- Messages: 165
Re: QGIS: Verrouiller l'affichage du projet
Bonjour,
Est-ce qu'il faut remplacer layerName par la couche sur laquelle le zoom extend va être verrouillé?
Ou on l'utilise tel quel? si c'est le cas, j'ai un message d'erreur IndentationError: unexpected indent
J'utilise QGIS 3.4.4 Madeira.
Désolé, je ne suis pas familier avec le python.
Merci,
Yannick
Hors ligne
#4 Mon 01 April 2019 11:26
Re: QGIS: Verrouiller l'affichage du projet
Bonjour,
Il faut remplacer "masque" par le nom de votre couche.
Normalement, en copiant collant le code tel quel dans l'éditeur de code python : extension > console python > nouvel éditeur, l'indentation devrait être ok
Sinon, il faut jouer avec la touche TAB ou la combinaison Shift + TAB jusqu'à obtenir l'indentation d'origine, telle qu'affichée ici
Cela dit, j'ai remarqué une petite erreur dans mon code, après coup, avec la non définition de la variable cnv
Voici le code corrigé :
Code:
iface = qgis.utils.iface cnv = iface.mapCanvas() def lockZoom(layerName): print(layerName) lyr = QgsProject.instance().mapLayersByName(layerName)[0] # extents cnv_e = cnv.extent() lyr_e = lyr.extent() # geometries cnv_g = QgsGeometry.fromRect(cnv_e) lyr_g = QgsGeometry.fromRect(lyr_e) # contains ? cntns = cnv_g.contains(lyr_g) # est ce que l'emprise de mon canevas contient celle de ma couche ? print(cntns) if(cntns is not True) : cnv.setExtent(lyr_e) # on bloque l'extent cnv.extentsChanged.disconnect() layerName = 'masque' cnv.extentsChanged.connect(lambda: lockZoom(layerName))
geodata au cerema et petits billets en géomatique
Hors ligne
#5 Fri 05 April 2019 22:56
- Yannick VEILLET
- Participant assidu
- Lieu: MONTREAL
- Date d'inscription: 5 Sep 2005
- Messages: 165
Re: QGIS: Verrouiller l'affichage du projet
Bonjour Mathieu,
Merci pour ton code, en effet, cela fonctionne... à un détail près que je souhaite faire l'inverse c'est à dire me servir de l'étendue d'une couche pour ne pas pouvoir zoomer out plus loin.
Je ne veux pas que l'utilisateur ne puisse aller à un autre endroit.
je ne sais pas si c'est clair.
Merci de ton aide.
Yannick
Hors ligne
#6 Fri 12 April 2019 16:50
Re: QGIS: Verrouiller l'affichage du projet
Alors, essayez ceci, qui réalise l'opération inverse :
Code:
iface = qgis.utils.iface cnv = iface.mapCanvas() layerName = 'masque' def lockZoom(layerName, d): print(layerName) cnv = iface.mapCanvas() lyr = QgsProject.instance().mapLayersByName(layerName)[0] # extents cnv_e = cnv.extent() lyr_e = lyr.extent() # geomtries cnv_g = QgsGeometry.fromRect(cnv_e) lyr_g = QgsGeometry.fromRect(lyr_e) if(cnv_g.contains(lyr_g) is True or cnv_g.intersects(lyr_g) is not True) : cnv.setExtent(lyr_g.buffer(-d, 5).boundingBox()) cnv.extentsChanged.disconnect() cnv.extentsChanged.connect(lambda: lockZoom('test', 100))
Code:
lyr_g.buffer(-d, 5)
permet de zoomer à l'intérieur de l'objet selon une distance d
fixée à 100 dans
Code:
cnv.extentsChanged.connect(lambda: lockZoom('test', 100))[
geodata au cerema et petits billets en géomatique
Hors ligne