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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Sat 04 April 2015 15:30

jlavaure
Participant assidu
Date d'inscription: 20 Apr 2013
Messages: 203

QGIS & MMQGIS : Utiliser l'algorithme d'un plugin dans le modeleur ?

Bonjour à tous,

Je souhaiterais automatiser une chaîne de traitement sous qgis, et n'étant pas un pro de python, j'utilise le modeleur de traitement.

Au sein de ma chaîne, je souhaiterais utiliser l’algorithme qui crée des "oursins" afin d'obtenir sous formes de points l'extrémité de chaque "hub distance".
C'est ce que propose le plugin MMQGIS
Sauf que je ne sais pas comment utiliser les fonctionnalités d'un plugin dans le modeleur....ou peut être ce n'est pas possible.

J'ai ainsi besoin d'une petite aide.

Merci, Jimmy

Hors ligne

 

#2 Wed 08 April 2015 14:44

jlavaure
Participant assidu
Date d'inscription: 20 Apr 2013
Messages: 203

Re: QGIS & MMQGIS : Utiliser l'algorithme d'un plugin dans le modeleur ?

En lisant à nouveau mon post, qui ne fais pas un grand succès, je me rend compte que j'ai peut être mal expliqué ma problématique, et mon objectif.

Je souhaiterais automatiser une suite de traitements (sélection, clip, reproj....) ainsi qu'une fonctionnalité d'un plugin "MMQGIS".

Savez-vous comment faire appel à un algo d'un plugin dans le modeleur de traitement ?

Python est-il le seul à pouvoir m'aider ?
Et si oui, je souhaiterais extraire mon modeleur sous forme de script python. J'ai regardé sur le site de QGIS qui explique qu'il faut l'importer dans la boite à outils, puis clic droit, enregistrer en python. Seulement je ne vois pas cette fonctionnalité...?

Someone can help me maybe ?

J

Hors ligne

 

#3 Wed 08 April 2015 17:08

PA
Membre
Lieu: Paris
Date d'inscription: 5 Sep 2005
Messages: 3259
Site web

Re: QGIS & MMQGIS : Utiliser l'algorithme d'un plugin dans le modeleur ?

Bonjour,

Hub Lines (qui est disponible dans la toolbox processing) ne vous permet pas de le faire?

Vous n'allez pas (facilement) pouvoir utiliser la fonction du plugin.


Pierre-André Le Ny
Modérateur QGIS, Données, Coin de l'OpenSource
Aidez l'association GeoRezo !

Hors ligne

 

#4 Wed 08 April 2015 17:13

jlavaure
Participant assidu
Date d'inscription: 20 Apr 2013
Messages: 203

Re: QGIS & MMQGIS : Utiliser l'algorithme d'un plugin dans le modeleur ?

Bonjour PA,

merci pour votre réponse.

Et non, Hub Lines permet de joindre les points entre eux avec des lines.
De mon côté, je souhaiterais calculer "l'influence" d'un points par rapport à d'autre. Et je voulais obtenir une carte en Oursin.

Quand vous dites pas (facilement), cela veut bien dire qu'il y a une possibilité ?

Hors ligne

 

#5 Wed 08 April 2015 18:39

gvellut
Participant actif
Lieu: Annecy
Date d'inscription: 13 Apr 2006
Messages: 112
Site web

Re: QGIS & MMQGIS : Utiliser l'algorithme d'un plugin dans le modeleur ?

Il y a aussi en standard dans Processing l'outil "Distance to nearest hub" (le code est visiblement différent de celui qui est exécuté par MMQGIS directement via l'outil "Hub Distance", mais à part des renommages de variables et optimisisations, il a l'air de faire la même chose).

Hors ligne

 

#6 Thu 09 April 2015 11:33

jlavaure
Participant assidu
Date d'inscription: 20 Apr 2013
Messages: 203

Re: QGIS & MMQGIS : Utiliser l'algorithme d'un plugin dans le modeleur ?

Merci gvellut, c'est ce dont j'avais besoin en effet, bien vue.

Je vais être un peu gourmand je pense, mais cette fonction permet de calculer les points les plus proches en fonction de points références.

Imaginons que je souhaite créer des secteurs avec autant de points pour chaque points références de façon a avoir une répartition homogène de l'espace....
En gros, j'ai 5 "responsables" et 50 "destinations", comment faire en sorte que QGIS trouve les 10 plus proches destinations pour chaque responsable ?

J'imagine qu'il faut modifier le script python de "Distance to nearest hub", mais quelqu'un connait la fonction .py pour rajouter cette contrainte ?

Merci

Hors ligne

 

#7 Thu 09 April 2015 13:30

gvellut
Participant actif
Lieu: Annecy
Date d'inscription: 13 Apr 2006
Messages: 112
Site web

Re: QGIS & MMQGIS : Utiliser l'algorithme d'un plugin dans le modeleur ?

Modifier l'outil "Distance to nearest hub" pour ajouter ta condition supplémentaire est effectivement une possibilité.

Le fichier s'appelle HubDistance.py et il se trouve est dans le répertoire d'installation de QGIS:

/Applications/QGIS.app/Contents/Resources/python/plugins/processing/algs/qgis/ sous Mac OS X  C:/PROGRA~1/QGISDU~1/apps/qgis/python/plugins\processing\algs\qgis\ sous Windows
je ne sais pas sous Linux

Si tu ne veux pas modifier HubDistance (le fichier est standard dans QGIS après tout), tu peux aussi créer un script spécifique à ton besoin et le mettre dans le répertoire python/plugins/processing/algs/qgis/scripts (il y a normalement déjà des exemples dans le répertoire pour la syntaxe, notamment la déclaration des paramètres) ou suivre ça: http://docs.qgis.org/2.6/en/docs/user_m … ripts.html (ou http://www.qgis.nl/2014/07/10/qgis-proc … ?lang=en). Tu peux aussi créer un nouvel algorithme en dupliquant le fichier HubDistance.py et en ajoutant le nouvel algo dans la liste à l'intérieur du fichier QGISAlgorithmProvider.py (dans le constructeur).

Hors ligne

 

#8 Thu 09 April 2015 14:22

jlavaure
Participant assidu
Date d'inscription: 20 Apr 2013
Messages: 203

Re: QGIS & MMQGIS : Utiliser l'algorithme d'un plugin dans le modeleur ?

Merci gvellut pour cette explication, mon objectif serait en effet de créer un script à partir du code de "Distance to nearest hub".
Le seul problème c'est mes connaissances en python...

L'idée c'est de rajouter une contrainte dans les paramètres de l'outil, du style "sélection homogène" = sélectionner (nb de points "destination" / nb de points "responsable") pour chaque "responsable". Et faire fonctionner l'algorithme qui va sélectionner un nb x de points les plus proches en fonction de se paramètre.

Mais ça semble hors de porté pour un novice en python non ?
D'ailleurs, à partir d'un script, est-il possible de créer un plugin pour avoir une interface graphique ?

Hors ligne

 

#9 Fri 10 April 2015 14:08

jlavaure
Participant assidu
Date d'inscription: 20 Apr 2013
Messages: 203

Re: QGIS & MMQGIS : Utiliser l'algorithme d'un plugin dans le modeleur ?

Cela va paraitre surement un peu décalé, ou osé, mais y aurait-il une âme charitable pour m'aider un peu à réaliser ce petit bout de script ?

Pour un novice de python, cela me semble presque hors de porté, pourtant je suis persuadé que c'est assez simple à mettre en place pour un "pro" du python, ou du moins quelqu'un maitrisant un minimum ce langage dans Qgis.
Étant donné qu'il y a déjà tout le code et les algos sont déjà créer, l'idée serait simplement de rajouter un paramètre.

Est ce que quelqu'un connait une méthode, un livre, un site, des tutos pour s'initier avec python et Qgis ? De mon côté je m'attaque doucement au livre de Gérard Swinnen "Python 3".

Merci d'avance pour votre aide

Hors ligne

 

#10 Fri 10 April 2015 14:29

Robin
GeoRezo forever
Lieu: France
Date d'inscription: 31 Aug 2005
Messages: 13614
Site web

Re: QGIS & MMQGIS : Utiliser l'algorithme d'un plugin dans le modeleur ?

Bonjour,

Je n'ai pas tout suivi, mais à tout hasard, est-ce que la piste suivante pourrait aider ?
http://docs.qgis.org/2.6/fr/docs/pyqgis … cookbook//

Dernière modification par Robin (Fri 10 April 2015 14:30)

Hors ligne

 

#11 Fri 10 April 2015 14:30

gene
Participant actif
Lieu: Louvain-la-Neuve
Date d'inscription: 14 Dec 2006
Messages: 104
Site web

Re: QGIS & MMQGIS : Utiliser l'algorithme d'un plugin dans le modeleur ?

Il faudrait tout de même signaler que la même question a été posée chez les voisins (http://www.forumsig.org/showthread.php/ … e-modeleur )

Hors ligne

 

#12 Fri 10 April 2015 15:41

jlavaure
Participant assidu
Date d'inscription: 20 Apr 2013
Messages: 203

Re: QGIS & MMQGIS : Utiliser l'algorithme d'un plugin dans le modeleur ?

Robin : Merci pour ce lien, j'ai de quoi me divertir en attendant de trouver quelqu'un m'aider. Je vais essayer de faire mon autodidacte, qui tente rien n'a rien non ?

gene : En effet, c'est également moi qui est posté cette question chez les voisins. Deux sujets, donc j'espère deux fois plus de chance de trouver une solution à mon problème. En espérant que ça ne dérange pas.

Hors ligne

 

#13 Fri 10 April 2015 16:52

gvellut
Participant actif
Lieu: Annecy
Date d'inscription: 13 Apr 2006
Messages: 112
Site web

Re: QGIS & MMQGIS : Utiliser l'algorithme d'un plugin dans le modeleur ?

Voici le port du HubDistance.py sous forme de script avec le nouvel argument ajouté (EqualizeHubs). Tu peux mettre à jour le fichier pour ton besoin.

Code:

# -*- coding: utf-8 -*
##Vector analysis tools=group
##SourcePoints=vector point
##DestinationHubs=vector point
##HubNameField=field DestinationHubs
##OutputShapeType=selection Point;Line to hub
##Units=selection Meters;Feet;Kilometers;Layer units
##EqualizeHubs=boolean False
##Output=output vector


from PyQt4.QtCore import *
from qgis.core import *
from processing.core.GeoAlgorithm import GeoAlgorithm
from processing.core.GeoAlgorithmExecutionException import \
        GeoAlgorithmExecutionException
from processing.core.parameters import ParameterVector
from processing.core.parameters import ParameterTableField
from processing.core.parameters import ParameterSelection
from processing.core.outputs import OutputVector
 

UNITS = ['Meters',
     'Feet',
     'Miles',
     'Kilometers',
     'Layer units'
    ]



class Hub:
    def __init__(self, point, name):
        self.point = point
        self.name = name
 

layerPoints = processing.getObject(SourcePoints)
layerHubs = processing.getObject(DestinationHubs)
fieldName = HubNameField
addLines = OutputShapeType
units = UNITS[Units]
equalize = EqualizeHubs
layerOutput=Output

if layerPoints.source() == layerHubs.source():
    raise GeoAlgorithmExecutionException(
    'Same layer given for both hubs and spokes')

geomType = QGis.WKBPoint
if addLines:
    geomType = QGis.WKBLineString

fields = layerPoints.pendingFields()
fields.append(QgsField('HubName', QVariant.String))
fields.append(QgsField('HubDist', QVariant.Double))
    
writer = QgsVectorFileWriter(layerOutput, None,
    fields, geomType, layerPoints.crs())
    
# Create array of hubs in memory
hubs = []
features = processing.features(layerHubs)
for f in features:
    hub=Hub(f.geometry().boundingBox().center(),
            unicode(f[fieldName]))
    hubs.append(hub)

distance = QgsDistanceArea()
distance.setSourceCrs(layerPoints.crs().srsid())
distance.setEllipsoidalMode(True)

featurePoints = processing.features(layerPoints)
count = len(features)
total = 100.0 / float(count)

if not equalize:    
    # Scan source points, find nearest hub, and write to output file
    for count, f in enumerate(featurePoints):
        src = f.geometry().boundingBox().center()
    
        closest = hubs[0]
        hubDist = distance.measureLine(src, closest.point)
        
        # determine la distance minimale et le hub correspondant
        for hub in hubs:
              dist = distance.measureLine(src, hub.point)
              if dist < hubDist:
                  closest = hub
                  hubDist = dist

        attributes = f.attributes()
        attributes.append(closest.name)
        if units == 'Feet':
            attributes.append(hubDist * 3.2808399)
        elif units == 'Miles':
            attributes.append(hubDist * 0.000621371192)
        elif units == 'Kilometers':
            attributes.append(hubDist / 1000.0)
        else:
            attributes.append(hubDist)

        feat = QgsFeature()
        feat.setAttributes(attributes)
    
        if geomType == QGis.WKBPoint:
            feat.setGeometry(QgsGeometry.fromPoint(src))
        else:
            feat.setGeometry(QgsGeometry.fromPolyline([src, closest.point]))
    
        writer.addFeature(feat)
        progress.setPercentage(int(count * total))
else:
    #homogeneiser ici ?
    pass
   
del writer

Tu peux le copier dans un fichier Python et le mettre dans le répertoire "scripts" du provider QGIS pour Processing: C:/PROGRA~1/QGISDU~1/apps/qgis/python/plugins\processing\algs\qgis\scripts
(le nom du script dans QGIS sera le nom du fichier Python)
Il faudra redémarrer QGIS.

Pour un résultat optimal (qui minimise la somme des distances de chaque point à son hub assigné), il me semble que tu dois pouvoir utiliser un solveur pour le problème d'affectation (http://fr.wikipedia.org/wiki/Probl%C3%A … ffectation) ou transport en se basant sur la matrice des distances Points-Hubs pour le coût.

Pour te former à Python, il vaut mieux lire un livre sur Python 2, comme c'est ce qui est utilisé par QGIS (Python 3 est proche mais pas compatible).

Hors ligne

 

#14 Sat 11 April 2015 11:55

jlavaure
Participant assidu
Date d'inscription: 20 Apr 2013
Messages: 203

Re: QGIS & MMQGIS : Utiliser l'algorithme d'un plugin dans le modeleur ?

Merci pour ta contribution, et ton aide pour mon projet.

J'ai copié le code à la fin de l'ancien dans un nouveau scirpt.py et j'ai créer un nouveau script.py seulement avec le code que tu a partagé. Déjà quelle solution est la bonne ?
Cependant, j'ai l'impression d'être largué.
Mes bases en python me permettent de comprendre un minimum les scripts, du coup je vois à peu près ce que fait ce code.
Cependant, j'ai un petit soucis pour son exécution.

Pour lancer ce script, je les ajouter dans "Scripts" de la boite à outils de notre amis QGIS.
Je le "run", et message d'erreur "name 'SourcePoints' is not defined See log for more details". Du coup j'ai appelé ma couche SourcePoints, et l'autre DestinationHubs, mais idem.

Via la console python, quand je tente de voir les paramètres avec la commande suivante si je ne me trompe pas : "processing.alghelp("script:hubdistanceequalize")" J'obtiens seulement "ALGORITHM: HubDistanceEqualize"", et quand je tente de le lancer directement, il ne trouve pas l'algo : "processing.runalg("HubDistanceEqualize")
Error: Algorithm not found)


So, peux-tu m'éclairer concernant l'exécution du code ?

Merci en tout cas

Hors ligne

 

#15 Tue 14 April 2015 14:20

jlavaure
Participant assidu
Date d'inscription: 20 Apr 2013
Messages: 203

Re: QGIS & MMQGIS : Utiliser l'algorithme d'un plugin dans le modeleur ?

Il ne reste plus grand chose avant d'arriver à mes fins, seulement je n'arrive pas à utiliser ce script.
Je fais mon chi*** je sais, mais je sens que je suis pas loin.

Merci à ceux qui ont la patience pour m'aider.

J.

Hors ligne

 

#16 Tue 14 April 2015 19:55

jlavaure
Participant assidu
Date d'inscription: 20 Apr 2013
Messages: 203

Re: QGIS & MMQGIS : Utiliser l'algorithme d'un plugin dans le modeleur ?

Bon, points positifs, en fouillant et persévérant j'ai réussi à lancer le script.
J'ai rencontré une erreur d'encodage, visiblement # -*- coding: utf-8 -* le gênait, j'ai du mettre #-*- codage: utf-8 -*

Mais je me suis rendu compte après que le script "Distance to nearest hub" ne fait pas du tout la même chose que celui de MMQGIS "Hub Distance".
En effet, il cherche simplement deux points les plus proches et crée une line entre.
Ce que je cherchais, c'est vraiment la fonctionnalité "Oursin" de Hub Distance by MMQGIS mais Equalize....

gvellut, penses-tu que le script que tu as partagé ici peut "s'incruster" dans le plugin MMQGIS ? ou cela s'annonce bien compliqué, et donc dois-je renoncer en attendant d'être un génie en python ?

Merci en tout cas

Hors ligne

 

Pied de page des forums

Powered by FluxBB