Message posté par : vbat
----------------------------------------
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)
-----------------
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=365953#p365953
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