Créer des points régulièrement espacés à l'intérieur du polygone en fonction de la valeur d'attribut à l'aide de QGIS?

11

J'ai une couche de polygones avec une valeur d'attribut attachée représentant le nombre d'individus à l'intérieur d'un polygone. J'utilise QGIS 3.0.

J'ai besoin de visualiser les comptes comme une grille de points à l'intérieur d'un polygone (c.-à-d. 1 point = 100 grenouilles, colorées par espèce). Les points n'ont pas nécessairement besoin d'occuper tout le polygone et doivent de préférence être dessinés autour d'un centroïde avec un espacement prédéfini (c'est-à-dire 300 m), afin qu'ils puissent représenter une grille nette à une résolution spécifique.

La solution de contournement actuelle que j'ai trouvée consiste à utiliser des "points réguliers", avec le paramètre count, pour créer des grilles à l'intérieur de l'étendue dessinée sur une carte, puis supprimer les points supplémentaires créés par l'algorithme (l'algorithme arrondit à une grille et vous pourriez obtenir 20 points au lieu de 17 dans contribution). Cela produit le résultat souhaité, mais nécessite de dessiner l'étendue de la zone pour les points réguliers pour chaque polygone, ainsi que la saisie manuelle des attributs et le nettoyage des points créés. De plus, comme j'exécute des "points réguliers" avec un nombre spécifié, au lieu de l'espacement, chaque polygone obtient des points espacés différemment.

En bref: points réguliers (nombre défini de points, étendue dessinée) pour chaque polygone (lot)> Supprimer des points supplémentaires> attribuer des valeurs d'attribut aux # points

Alternative (évite l'espacement irrégulier, mais nécessite encore plus de manipulations):

Points réguliers (espacement défini, c.-à-d. 300 m) dans l'étendue de la couche entière> Couper dans l'étendue des polygones> Supprimer des points supplémentaires dans chaque polygone jusqu'à obtenir le nombre de points souhaité> attribuer des valeurs d'attribut aux points.

Le principal problème avec mes solutions de contournement est le traitement polygone par polygone, ce qui rend difficile la mise à jour des données et le travail avec un plus grand nombre de polygones.

Une question analogue a été posée: créer un nombre de points défini et régulièrement espacé dans un polygone dans QGIS , mais les spécificités sont différentes.

Capture d'écran du résultat souhaité:

Table d'attributsL:

Ruslan
la source
1
L'image dans votre question représente-t-elle ce que vous attendez en conséquence? D'où viennent les décomptes de points colorés? Pourriez-vous ajouter une table attributaire de la couche? Surtout les attributs des polygones qui incluent Edmonton et Sherwood Park, pour une meilleure compréhension des couleurs et des dénombrements.
Kadir Şahbaz
1. Il s'agit simplement de données masquées qui n'ont pas grand-chose à voir avec les polygones réels, mais oui, je m'attends à ce genre de résultat, mais avec des points autour du centre du polygone. 2. Les chiffres proviennent des colonnes de la table d'attributs, car il y a trois colonnes / types de points que je les agrégeais en une seule colonne pour obtenir d'abord le bon nombre de points par polygone, puis attribuer l'attribut / les couleurs à l'aide d'expressions. edit: ajouté le tableau Excel en question, ne représente pas les valeurs, mais représente la structure de mes données.
Ruslan

Réponses:

5

QGIS 3 est livré avec une nouvelle méthode de déplacement dans le rendu de cluster appelée grille. On dirait que c'est à peu près ce dont vous avez besoin. Créez simplement le nombre de points souhaités au centre de gravité de votre polygone.

entrez la description de l'image ici

Je ne connais pas de méthode pour générer les points uniquement avec un outil gui, mais un script python relativement simple devrait le faire.

with edit(point_layer):
    for polygon_feature in polygon_layer.getFeatures():
        point_feature = QgsFeature(point_layer.fields())
        point_feature.setGeometry(polygon_feature.geometry().centroid())

        point_feature['type'] = 'Frog'
        for i in range(polygon_feature['Frogs']):
            point_layer.addFeature(point_feature)

        point_feature['type'] = 'Cat'
        for i in range(polygon_feature['Cats']):
            point_layer.addFeature(point_feature)

        point_feature['type'] = 'Diplodoc'
        for i in range(polygon_feature['Diplodocs']):
            point_layer.addFeature(point_feature)

Si vous voulez devenir fou, enveloppez-le dans un algorithme de traitement personnalisé.

Matthias Kuhn
la source
Merci Matthias, cela semble être encore mieux que d'autres solutions. Pouvez-vous suggérer un moyen de créer rapidement le nombre de points souhaité en fonction de la table d'attributs pour y parvenir?
Ruslan
Je ne connais pas de méthode facile à part écrire un petit script python. Le code est totalement non testé, il peut donc y avoir quelques fautes de frappe;)
Matthias Kuhn
Merci encore. Je devrai probablement faire une visualisation similaire pour de nombreuses couches / étendues, etc. Je vais donc essayer de construire au moins un modèle de traitement pour cela.
Ruslan
5

Peut être une autre façon d'inspirer la réponse de Sarath SRK:

  1. Centroïde de polygones
  2. Tampon employant une expression avec le carré et s'adaptant à votre échelle: ie (1000 * (sqrt ("Frogs" + "Cats" + "Diplodocs") / 2)) + 1 et Segment = 1, Style capuchon d'extrémité = Square
  3. Nouveau point de grille avec un espacement cohérent avec l'échelle du tampon.
  4. Supprimer le point qui ne coupe pas la couche tampon (sélectionner par emplacement)
  5. joindre l'attribut par emplacement (attribut du tampon ou des polygones d'origine)

Pourtant, vous aurez quelque chose comme ça entrez la description de l'image ici

  1. Utilisez un modeleur graphique pour créer un nouveau champ avec la commande "@row_number" entrez la description de l'image ici

  2. Exécuter le modèle avec une itération sur la couche tampon entrez la description de l'image ici

  3. Fusionner tout nouveau calque

  4. Supprimez tout le point avec un champ ID_pt supérieur à la somme de votre champ ("Grenouilles" + "Chats" + "Diplodocs")

  5. Catégoriser avec des règles (par ex.
    • "ID_pt" <= "Grenouilles"
    • "ID_pt"> "Grenouilles" et "ID_pt" <= ("Chats" + "Grenouilles")
    • "ID_pt"> ("Chats" + "Grenouilles") et "ID_pt" <= ("Chats" + "Grenouilles" + "Diplodocs") entrez la description de l'image ici
Christophe
la source
Merci pour cela! Je n'aurais pas le temps d'essayer cela aujourd'hui, mais cela semble être une solution viable étant donné que vous avez obtenu la sortie souhaitée.
Ruslan
1

Vous pouvez utiliser des générateurs de géométrie pour cela.

  1. Ajoutez 3 sous-couches dans le symbole, une pour chaque couleur / attribut.
  2. Créez une expression qui génère un multipolygone pour chaque sous-couche.
  3. Maintenant, la partie dure, générez des parties carrées pour le multipolygone en fonction de l'attribut. Je suppose que cela nécessitera une fonction d'expression python personnalisée.
  4. Facultatif, utilisez les variables de rendu pour l'échelle de la carte pour déterminer la mise à l'échelle des polygones et l'espacement.
Matthias Kuhn
la source
Désolé, je suis trop occupé en ce moment pour une réponse complète, mais ce sera un défi très intéressant d'essayer de préparer quelque chose à partir de cette recette ici. Peut-être que quelqu'un arrive à nous fournir une solution intéressante basée sur cela.
Matthias Kuhn
1

Une solution pourrait être de créer une couche de points avec des points au centre de gravité de chaque polygone. Ainsi, par exemple, vous avez obtenu au centre de gravité d'Edmonton 25 points superposés: 5 avec un attribut grenouille, 20 points avec chat et 0 avec diplodocs.

Ensuite, en utilisant le rendu de déplacement de point avec la méthode de placement définie comme grille, vous devriez pouvoir obtenir l'effet.

La difficulté est de créer la couche de points ....

JR
la source
0

Une alternative très simple pourrait être d'utiliser le graphique à secteurs disponible dans les propriétés de la couche? Les attributs et les tailles peuvent être dictés par une expression.

entrez la description de l'image ici

Christophe
la source
2
Eh bien, je connais d'autres façons de cartographier les données. Le but de la question est de rendre ce workflow de visualisation possible. Les graphiques circulaires ne fonctionnent pas vraiment parce que lorsque vous regardez la grille, vous obtenez un très bon sens sur le nombre d'individus. Il est presque impossible d'essayer d'estimer les nombres individuels précis de chaque polygone à partir de graphiques circulaires.
Ruslan
0

Vous pouvez générer les points sur un chemin en spirale à partir du centre de gravité du polygone. Le post Stack Overflow suivant a du code python pour créer des points équidistants mais je ne peux pas le tester pour le moment étant donné mon manque de temps libre.

Techie_Gus
la source
Semble être assez proche, mais comme mentionné dans la question, je ne suis pas assez compétent pour coder ceci / changer le code suggéré ici.
Ruslan
Avec un peu de chance, quelqu'un avec suffisamment de connaissances et de temps pourrait sonner.
Techie_Gus
0

Dans ton cas,

  1. Créez des points régulièrement espacés en utilisant une distance donnée pour toute la zone d'intérêt
  2. Créez des points centroïdes pour tous les polygones (entrée).
  3. Créez un tampon pour ces points centroïdes en utilisant un tampon de distance fixe avec une valeur de segments «1». Il créera un tampon carré au lieu d'un cercle (utilisez l'outil de rotation dans Qgis si vous souhaitez faire pivoter les polygones de tampon).
  4. Créez une sélection de points à l'intérieur des polygones tampons en utilisant le vecteur -> Outils de recherche -> Sélectionner par emplacement (règle des points dans les polygones).
  5. Changez de sélection et supprimez les points en dehors des polygones de tampon. Alors maintenant, vous avez des points régulièrement espacés autour du centre de gravité des polygones.
  6. Donnez un attribut Majorité pour des points entiers et les autres points doivent être classés manuellement. Utilisez l' outil QuickMultiAttributeEdit pour mettre à jour les attributs facilement.
Sarath SRK
la source
Merci, cela semble réduire les étapes de traitement, mais cela ne résout pas le problème avec la nécessité de sélectionner manuellement (les tampons à l'intérieur des polygones seraient identiques en taille = même nombre de points par polygone), de supprimer et d'attribuer les points créés pour chacun des polygones, qui est le principal problème avec cela et mon flux de travail.
Ruslan