Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#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

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

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

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

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

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

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

 

Pied de page des forums

Powered by FluxBB