#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