Message posté par : Thomas Gratier (thomas.gratier(a)gmail.com)
----------------------------------------
Bonsoir,
Une solution testée ci-dessous.
La fin est "pompée" du fichier PostGISExecuteAndLoadSQL.py dans les scripts processing fournis avec QGIS
-----------------
Code :
from qgis.PyQt.QtCore import QCoreApplication
from qgis.core import (QgsProcessing,
QgsProcessingAlgorithm,
QgsProcessingException,
QgsProcessingContext,
QgsProcessingParameterString,
QgsProcessingOutputVectorLayer,
QgsProcessingOutputString,
QgsProcessingParameterNumber,
QgsVectorLayer,
QgsDataSourceUri,
QgsProject)
from qgis import processing
class ExampleProcessingAlgorithm(QgsProcessingAlgorithm):
"""
This is an example algorithm that takes string inputs,
to provide to DB connexion
"""
def tr(self, string):
"""
Returns a translatable string with the self.tr() function.
"""
return QCoreApplication.translate('Processing', string)
def createInstance(self):
# Must return a new copy of your algorithm.
return ExampleProcessingAlgorithm()
def name(self):
"""
Returns the unique algorithm name.
"""
return 'postgresconnexion'
def displayName(self):
"""
Returns the translated algorithm name.
"""
return self.tr('Return PostgreSQL layer')
def group(self):
"""
Returns the name of the group this algorithm belongs to.
"""
return self.tr('Example scripts')
def groupId(self):
"""
Returns the unique ID of the group this algorithm belongs
to.
"""
return 'examplescripts'
def shortHelpString(self):
"""
Returns a localised short help string for the algorithm.
"""
return self.tr('Example algorithm short description')
def initAlgorithm(self, config=None):
"""
Here we define the inputs and outputs of the algorithm.
"""
# 'INPUT' is the recommended name for the main input
# parameter.
self.addParameter(
QgsProcessingParameterString(
'HOST',
self.tr('Host'),
defaultValue = 'localhost'
)
)
self.addParameter(
QgsProcessingParameterNumber(
'PORT',
self.tr('Port'),
defaultValue = 5432
)
)
self.addParameter(
QgsProcessingParameterString(
'USERNAME',
self.tr('Username'),
)
)
# 'OUTPUT' is the recommended name for the main output
# parameter.
self.addParameter(
QgsProcessingParameterString(
'PASSWORD',
self.tr('Password')
)
)
self.addParameter(
QgsProcessingParameterString(
'DATABASE',
self.tr('Database')
)
)
self.addParameter(
QgsProcessingParameterString(
'SCHEMA',
self.tr('schema'),
defaultValue = 'public'
)
)
self.addParameter(
QgsProcessingParameterString(
'LAYERNAME',
self.tr('Layer name'),
defaultValue = 'Name of the layer'
)
)
self.addOutput(
QgsProcessingOutputVectorLayer(
'LAYER',
self.tr('Vector layer'),
QgsProcessing.TypeVectorAnyGeometry
)
)
def processAlgorithm(self, parameters, context, feedback):
"""
Here is where the processing itself takes place.
"""
# First, we get the count of features from the INPUT layer.
# This layer is defined as a QgsProcessingParameterFeatureSource
# parameter, so it is retrieved by calling
# self.parameterAsSource.
host = self.parameterAsString (parameters,
'HOST',
context)
# Retrieve the buffer distance and raster cell size numeric
# values. Since these are numeric values, they are retrieved
# using self.parameterAsDouble.
port = self.parameterAsString (parameters, 'PORT',
context)
username = self.parameterAsString (parameters, 'USERNAME',
context)
password = self.parameterAsString (parameters, 'PASSWORD',
context)
database = self.parameterAsString (parameters, 'DATABASE',
context)
schema = self.parameterAsString (parameters, 'SCHEMA', context)
layername = self.parameterAsString (parameters, 'LAYERNAME', context)
uri = QgsDataSourceUri()
uri.setConnection(host, port, database, username, password)
uri.setDataSource(schema, layername, "geom")
layer = QgsVectorLayer(uri.uri(), layername, "postgres")
if feedback.isCanceled():
return {}
if not layer.isValid():
raise QgsProcessingException(self.tr("""This layer is invalid!
Please check the PostGIS log for error messages."""))
context.temporaryLayerStore().addMapLayer(layer)
context.addLayerToLoadOnCompletion(
layer.id(),
QgsProcessingContext.LayerDetails('SQL layer',
context.project(),
'LAYER'))
# Return the results
return {'LAYER': layer.id()}
-----------------
Vous n'êtes pas obligé de passer par la définition de chaque paramètre de la base de données mais vous pouvez aussi réutiliser les connexions PostGIS existantes déjà définies en passant par QgsProcessingParameterProviderConnection (toujours en regardant le fichier PostGISExecuteAndLoadSQL.py)
Si vous souhaitez charger en une fois un ensemble de couches PostGIS en trouvant automatiquement leur nom, vous pouvez utiliser le code de https://gis.stackexchange.com/a/395994/638 (attention, pas dans le contexte d'un script processing et utilisant les connexions définies dans les connexions PostgreSQL définies dans QGIS)
Thomas
----------------------------------------
Le message est situé https://georezo.net/forum/viewtopic.php?pid=343479#p343479
Pour y répondre : qgis_fr(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net
Message posté par : Caligraf (yoyolehmann(a)gmail.com)
----------------------------------------
Bonjour,
Je cherche à élaborer un script permettant de charger des couches issues d'une base de donnée PostGIS. Je n'ai pour l'instant pas réussi à intégrer la classe QgsDataSourceUri() comme je l'esperais. En effet, je tombe sur l'erreur suivante : TypeError: invalid result from LoadLayer.processAlgorithm(), NoneType cannot be converted to a C/C++ QVariantMap in this context
Voici le code en question :
-----------------
Code :
from qgis.PyQt.QtCore import QCoreApplication
from qgis.core import (QgsProcessing,
QgsProcessingAlgorithm,
QgsProcessingException,
QgsProcessingParameterString,
QgsProcessingOutputString,
QgsProcessingParameterNumber,
QgsVectorLayer,
QgsDataSourceUri,
QgsProject)
from qgis import processing
from qgis.utils import *
class LoadLayer(QgsProcessingAlgorithm):
"""
Charge une couche vectorielle depuis la base de donnée PostGIS
"""
def tr(self, string):
"""
Returns a translatable string with the self.tr() function.
"""
return QCoreApplication.translate('Processing', string)
def createInstance(self):
# Must return a new copy of your algorithm.
return LoadLayer()
def name(self):
"""
Returns the unique algorithm name.
"""
return 'load_post_gis_layer'
def displayName(self):
"""
Returns the translated algorithm name.
"""
return self.tr('Load layers from PostGIS')
def group(self):
"""
Returns the name of the group this algorithm belongs to.
"""
return self.tr('Load single vector layer')
def groupId(self):
"""
Returns the unique ID of the group this algorithm belongs
to.
"""
return 'load_single_vector_layer'
def shortHelpString(self):
"""
Returns a localised short help string for the algorithm.
"""
return self.tr('Charge les couches depuis PostGIS')
def initAlgorithm(self, config=None):
"""
Here we define the inputs and outputs of the algorithm.
"""
self.addParameter(
QgsProcessingParameterString(
'HOST',
self.tr('Host'),
defaultValue = '172.16.0.116'
)
)
self.addParameter(
QgsProcessingParameterNumber(
'PORT',
self.tr('Port'),
defaultValue = 5432
)
)
self.addParameter(
QgsProcessingParameterString(
'USERNAME',
self.tr('Username'),
defaultValue = 'xyz'
)
)
self.addParameter(
QgsProcessingParameterString(
'PASSWORD',
self.tr('Password'),
defaultValue = '***'
)
)
self.addParameter(
QgsProcessingParameterString(
'DATABASE',
self.tr('Database'),
defaultValue = 'abc'
)
)
self.addParameter(
QgsProcessingParameterString(
'SCHEMA',
self.tr('schema'),
defaultValue = 'schema'
)
)
self.addParameter(
QgsProcessingParameterString(
'LAYERNAME',
self.tr('Layer name'),
defaultValue = 'Name of the layer'
)
)
self.addOutput(
QgsProcessingOutputString(
'CONNEXIONSTR',
self.tr('Imported layer')
)
)
def processAlgorithm(self, parameters, context, feedback):
host = self.parameterAsString (parameters,'HOST', context)
port = self.parameterAsString (parameters, 'PORT', context)
username = self.parameterAsString (parameters, 'USERNAME', context)
password = self.parameterAsString (parameters, 'PASSWORD',context)
database = self.parameterAsString (parameters, 'DATABASE', context)
schema = self.parameterAsString (parameters, 'SCHEMA', context)
layername = self.parameterAsString (parameters, 'LAYERNAME', context)
uri = QgsDataSourceUri()
uri.setConnection(host, port, database, username, password)
uri.setDataSource(schema, layername, "geom")
layer = QgsVectorLayer(uri.uri(), layername, "postgres")
if feedback.isCanceled():
return {}
# Return the results
return {'CONNEXIONSTR': layer}
-----------------
En poussant mes recherches, j'ai également étudié la possibilité d'ajouter une ligne de connexion, récupérant les infos que l'on peut retrouver en cliquant sur une couche importée dans "propriétés", en m'inspirant de cette discussion :
https://stackoverflow.com/questions/3582552/what-is-the-format-for-the-post…
-----------------
Code :
return {'CONNEXIONSTR' : f"postgresql://{user}:{password}@{host}:{port}/{database}"}
-----------------
Toutefois ce code est incomplet, il manque des informations normalement délivrée par la méthode setDataSource ( nom de la table, la géométrie et "postgres" ) mais j'ignore le formatage nécessaire...
Bref, je n'ai pour l'instant pas de solution concrète, si ce n'est éventuellement de passer par un module tiers tel que sqlalchemy par exemple.
----------------------------------------
Le message est situé https://georezo.net/forum/viewtopic.php?pid=343471#p343471
Pour y répondre : qgis_fr(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net
Message posté par : Caligraf (yoyolehmann(a)gmail.com)
----------------------------------------
Les tracés peuvent être découpé manuellement avec l'outil "Séparer les entités" accessible dans le menu édition, en sélectionnant au préalable le tracé et le passer en mode édition. Sélectionner ensuite le tracé découpé et enregistrer l'entité sélectionnée.
Les algorithmes "Collecter les géométries" ou "Exploser les lignes" peuvent aussi vous aider dépendamment du résultat attendu.
Pour obtenir la longueur, vous pouvez ajouter une colonne dans la table de votre couche avec la formule "$length" et obtenir le total de la longueur avec sum($length)/1000 (en km)
----------------------------------------
Le message est situé https://georezo.net/forum/viewtopic.php?pid=343470#p343470
Pour y répondre : qgis_fr(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net
Message posté par : MLsig
----------------------------------------
Bonjour à tous,
J'aurais besoin de récupérer dans une shape de points les valeurs de plusieurs couches lignes et polygones en intersection. J'ai cependant deux contraintes qui m'empêchent d'utiliser l'outil classique "joindre les attributs par localisation"
- Il faudrait que les valeurs des lignes et polygones qui touchent les points soient ajoutées dans des champs qui existent déjà (et qui sont vides), ce qui amène j'imagine à utiliser la calculatrice de champs ;
- Comme mes points ne touchent pas toujours exactement les lignes/polygones, j'aimerais pouvoir ajouter un valeur de "tolérance" (ex : si un point se trouve à moins de 20m d'un polygone, on récupère dans la table la valeur du polygone le plus proche, sinon on laisse NA)
La fonction geomwithin de refFunction pourrait fonctionner, mais elle ne possède pas de variable "tolérance" en entrée.
Merci d'avance de votre aide !
----------------------------------------
Le message est situé https://georezo.net/forum/viewtopic.php?pid=343465#p343465
Pour y répondre : qgis_fr(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net
Message posté par : jh_kd
----------------------------------------
Bonjour,
Je viens de me rendre compte d'un souci inattendu et inexpliqué.
Donc je fais ma carte comme d'habitude puis je charge le style et j'obtiens une (belle comme d'habitude) carte.
Maintenant comme mes codes sont cette fois un peu petits je décide de les mettre en gras, puis de passer la taille de 10 à 12.
Et dès le gras, un de mes points libellé 'ru' devient 'rb' comme un point voisin (qui n'a rien à voir).
Il n'y a pas de point supprimé, mais un changement de code.
Je n'ai rien changé d'autre que le gras.
Voyez les 2 jpgs attachés.
Une soluce?
Bien cordialement,
JH
----------------------------------------
Ce message est accompagné de fichiers, pour les télécharger, suivre le lien ci-dessous.
----------------------------------------
Le message est situé https://georezo.net/forum/viewtopic.php?pid=343452#p343452
Pour y répondre : qgis_fr(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net
Message posté par : Zoé François
----------------------------------------
Bonjour,
Est ce qu'il est absolument nécessaire de réimporter la couche pour que la géométrie soit mise à jour ? Il n'y a pas d'autre moyen ?
Merci d'avance
----------------------------------------
Le message est situé https://georezo.net/forum/viewtopic.php?pid=343451#p343451
Pour y répondre : qgis_fr(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net
Message posté par : Bruno IRATCHET (bruno(a)georezo.net)
----------------------------------------
Par ici, alors ;)
----------------------------------------
Le message est situé https://georezo.net/forum/viewtopic.php?pid=343449#p343449
Pour y répondre : qgis_fr(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net
Message posté par : Glo (glogeorezo(a)yopmail.com)
----------------------------------------
Bonjour à tous,
Je déterre ce sujet qui date un peu, je sais que ce n'est pas toujours une bonne idée mais parce que mon problème est absolument identique à celui de Neeko, et que je n'ai pas vu de réponse à son problème.
Comme le but de base parait hyper simple (une fois qu'on a identifié un pixel sur un raster on a un magnifique tableau avec toutes les valeurs des bandes pour ce pixel, et ça propose même de tracer des graphes et tout ! ; quand on sélectionne une plage de cellules dans ce tableau, tout est bien surligné en bleu, nickel, on copie avec ctrl+C et on colle dans excel et......... ça ne fait rien du tout ! ça copie juste une valeur, c'est extrêmement frustrant alors que ça semble largement "à portée de main"), j'imagine que depuis 2018 il y a bien dû y avoir des fonctions apportées en ce sens pour permettre ça, mais je ne les trouve pas (et j'ai vu plusieurs autres messages de forum, en anglais majoritairement, qui se posaient la même question).
Merci beaucoup à vous si quelqu'un peut m'indiquer la marche à suivre (un bouton tout bête à appuyer, sûrement), ou à défaut si vous avez des idées pour contourner l'absence de cette fonction (j'imagine que quelques lignes en python fonctionneraient vu que le tableau tant désiré est juste là sous nos yeux :) ).
Merci bonne journée et bon weekend prolongé pour ceux qui l'ont !
----------------------------------------
Le message est situé https://georezo.net/forum/viewtopic.php?pid=343438#p343438
Pour y répondre : qgis_fr(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net
Message posté par : Jean Cascalès
----------------------------------------
Mais sans succès
----------------------------------------
Le message est situé https://georezo.net/forum/viewtopic.php?pid=343361#p343361
Pour y répondre : qgis_fr(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net
Message posté par : Mathias L (lannegrand.mathias(a)yahoo.fr)
----------------------------------------
Bonjour à tous,
Je suis un utilisateur amateur de qgis et je n'arrive pas à faire une opération qui me semble simple dans l'idée.
Mon problème est le suivant j'ai un fichier excel avec des point géoref que j'intègre dans gis avec l'outil ajout de feuille de calcul. Chaque point à un nom et plusieurs points ont le même nom. Je voudrais créer des polygones automatiquement avec un certain nombre d'option et surtout créer des polygones où n'apparait qu'une fois chaque nom. (Dans le polygone 1 qu'un seul point A, B, C, D, dans le polygone 2 qu'un seul point A, B, C, D ; tous les polygones doivent être jointifs).
Donc pour résumer : comment créer des polygones de manière automatique en réglant les options de découpe de l'espace ?
Merci d'avance, Bien cordialement.
----------------------------------------
Le message est situé https://georezo.net/forum/viewtopic.php?pid=343356#p343356
Pour y répondre : qgis_fr(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net