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

Rencontres QGIS 2025

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

#1 Sat 24 February 2024 18:14

vbat
Juste Inscrit !
Date d'inscription: 24 Feb 2024
Messages: 4

QGIS: Points aleatoires, polygones … avec attributs

Bonjour,
Je tourne en rond depuis deux jours, sans être expert… (sur QGIS dernière version)
– j’ai une couche de polygones,
– j’ai une couche de points avec coordonnées et ID et REF. (unique).
Je veux disperser, pour raisons d’anonymat, les points à l’intérieur de leurs polygones.
J’ai réussi à faire une jointure des deux couches.
Tout ce que j’ai réussi à faire, ce sont des centroïdes par polygones.
Si à partir d’une jointure avec les centroïdes, j’utilise la fonction « Points aléatoires à l’intérieur des polygones » et que je mets comme « comptage de points » type de champs… mes REF., j’ai bien une nouvelle couche avec le bon nombre de points aléatoires par polygones, MAIS ils n’ont pas leurs attributs REF.
Quelle est la solution ?
C’est étrange que je n’aie pas trouvé. (J’ai essayé des solutions d’anonymat comme GeoPriv, mais la dispersion ne tient pas compte de polygones.)
Une idée quelqu’un ?
Merci d’avance…

Hors ligne

 

#2 Sun 25 February 2024 10:14

vbat
Juste Inscrit !
Date d'inscription: 24 Feb 2024
Messages: 4

Re: QGIS: Points aleatoires, polygones … avec attributs

SOLUTION : Je réponds à ma propre question, car ça peut être utile à d’autres.
SI l’on part d’une couche de polygone (nommée ici « Géométries simplifiées » et d’une couche de points (nommée ici « Centroides ») qui partagent (grâce à une jointure) au moins ce même champ « fid » dans la table d’attribution (c’est l’identifiant de chacun des polygones : tous les points sont ainsi associés à un polygone), j’ai pu faire générer à force de tâtonnements par ChatGPT 4 ce script qui fonctionne très bien. Il produit une nouvelle couche avec les points de la couche Centroides dispersés de façon aléatoire dans chacun de leur propre polygone ET en conservant toute la table attributaire de la couche originale Centroides. Il suffit de le copier/coller dans la console Python de QGIS.
Bon usage !

Code:

from qgis.core import QgsFeatureRequest, QgsGeometry, QgsPointXY, QgsVectorLayer, QgsFeature, QgsProject
import random

# Remplacez 'Géométries simples' et 'Centroides' par les noms exacts de vos couches dans QGIS
polygons_layer = QgsProject.instance().mapLayersByName('Géométries simples')[0]
points_layer = QgsProject.instance().mapLayersByName('Centroides')[0]

# Copiez la structure des champs de la couche originale de points
fields = points_layer.fields()

# Créez une nouvelle couche en mémoire avec la même structure de champs
dispersed_layer = QgsVectorLayer('Point?crs=epsg:4326', 'Points dispersés', 'memory')
dispersed_prov = dispersed_layer.dataProvider()
dispersed_prov.addAttributes(fields.toList())
dispersed_layer.updateFields()

# Assurez-vous que la nouvelle couche est prête pour l'édition
dispersed_layer.startEditing()

# Pour chaque point, dispersez-le aléatoirement à l'intérieur de son polygone respectif
for point_feat in points_layer.getFeatures():
    fid = point_feat['fid']  # Utilisez le bon champ pour l'ID du polygone
    request = QgsFeatureRequest().setFilterExpression(f'"fid" = \'{fid}\'')
    poly_feat = next(polygons_layer.getFeatures(request), None)
    
    if poly_feat:  # Si un polygone correspondant est trouvé
        poly_geom = poly_feat.geometry()
        while True:
            # Générez des coordonnées aléatoires dans les limites du polygone
            x_random = random.uniform(poly_geom.boundingBox().xMinimum(), poly_geom.boundingBox().xMaximum())
            y_random = random.uniform(poly_geom.boundingBox().yMinimum(), poly_geom.boundingBox().yMaximum())
            random_point = QgsPointXY(x_random, y_random)
            if poly_geom.contains(QgsGeometry.fromPointXY(random_point)):
                # Créez un nouveau point et ajoutez-le à la liste
                new_feat = QgsFeature(fields)
                new_feat.setGeometry(QgsGeometry.fromPointXY(random_point))
                new_feat.setAttributes(point_feat.attributes())  # Copiez les attributs
                dispersed_prov.addFeatures([new_feat])
                break

# Appliquez les changements
dispersed_layer.commitChanges()

# Ajoutez la couche dispersée au projet
QgsProject.instance().addMapLayer(dispersed_layer)

Hors ligne

 

#3 Sun 25 February 2024 19:38

Benoit D
Participant assidu
Date d'inscription: 17 Jul 2018
Messages: 151

Re: QGIS: Points aleatoires, polygones … avec attributs

Pouvez vous expliquer le but de votre démarche ? Cela facilitera la recherche pour d’autres. S’agit-il d’une la Eure d’anonymiser les données en faussant les coordonnées exactes d’entités ponctuelles ?

Hors ligne

 

#4 Mon 26 February 2024 11:13

vbat
Juste Inscrit !
Date d'inscription: 24 Feb 2024
Messages: 4

Re: QGIS: Points aleatoires, polygones … avec attributs

Oui, l’idée était de faire du Geomasking, mais de façon pertinente : pour rendre anonymes les données, c’est-à-dire qu’afin que mes points (d’échantillons) ne tombent pas au milieu d’exploitations agricoles nominales, je souhaitais disperser mes points, mais pas n’importe comment.
Ma première étape a été d’arrondir (de diminuer le nombre de décimales de mes coordonnées DD), mais une partie de mes points tombaient alors dans des zones qui ne correspondaient pas du tout à de l’agriculture. Ce n’était donc pas pertinent.
Une seconde étape a été de chercher des plug-ins qui feraient l’affaire… je n’ai pas trouvé.
La dernière et fastidieuse étape a été de :
– dessiner des polygones de zones géographiques pertinentes (à savoir, des zones agricoles qui avaient une homogénéité spatiale, agricoles, sociales, etc.). Mes 500 points originaux sont associés ainsi dans une trentaine de zones (une trentaine de polygones),
– créer ce script (fourni ci-dessus) qui disperse de façon aléatoire les points originaux dans les limites de la zone (polygone) qui leur est associée.
Voilà.

Hors ligne

 

#5 Mon 26 February 2024 20:16

Benoit D
Participant assidu
Date d'inscription: 17 Jul 2018
Messages: 151

Re: QGIS: Points aleatoires, polygones … avec attributs

Merci. Lors de nos travaux pour anonymiser des données ponctuelles nous avons délibérément rassemblé à la commune sur son centroïde sauf en cas d’une valeur unique qui dans ce cas est non restituée.
En effet avec votre méthode des points peuvent se retrouver sur l’exploitation de quelqu’un d’autre pouvant laisser penser que cette donnée est associée à cette parcelle.

Hors ligne

 

#6 Fri 01 March 2024 09:50

vbat
Juste Inscrit !
Date d'inscription: 24 Feb 2024
Messages: 4

Re: QGIS: Points aleatoires, polygones … avec attributs

Bonjour,
Oui, en effet, je suis aussi passé par des centroïdes, donc clairement associés à un polygone/zone, mais j'avais besoin de visualiser une dispersion des points, qu'ils ne soient pas tous juste superposés, que l'on mesure l'effort d'échantillonnage (variable) selon les zones. C'est plus parlant graphiquement, et les points acquièrent aussi ainsi des coordonnées uniques, qui demeurent "vraies géographiquement d'un point de vue social, agronomiques, etc. (le tout dépend des besoins et des manières de délimiter ces polygones/zones, évidemment).
Évidemment aussi, lors de la diffusion de ces données, il est précisé que ces données sont anonymisées de la sorte. :-)

Hors ligne

 

Pied de page des forums

Powered by FluxBB