Creare punti spaziati regolarmente all'interno del poligono in base al valore dell'attributo usando QGIS?


11

Ho un livello poligonale con un valore di attributo associato che rappresenta il conteggio degli individui all'interno di un poligono. Sto usando QGIS 3.0.

Devo visualizzare i conteggi come una griglia di punti all'interno di un poligono (ovvero 1 punto = 100 rane, colorate per specie). I punti non devono necessariamente occupare l'intero poligono e preferibilmente devono essere disegnati attorno a un centroide con spaziatura predefinita (cioè 300 m), in modo che possano rappresentare una griglia pulita a una risoluzione specifica.

La soluzione attuale che ho trovato è quella di utilizzare "Punti regolari", con il parametro conteggi, per creare griglie all'interno dell'estensione tracciate su una mappa, quindi eliminare i punti extra creati dall'algoritmo (l'algoritmo arrotonda a una griglia e si potrebbero ottenere 20 punti anziché 17 in ingresso). Questo produce il risultato desiderato, ma richiede di disegnare l'estensione dell'area per i punti regolari per ciascun poligono, nonché l'inserimento manuale degli attributi e la pulizia dei punti creati. Inoltre, poiché sto eseguendo "Punti regolari" con il conteggio specificato, anziché la spaziatura, ogni poligono ottiene punti distanziati in modo diverso.

In breve: punti regolari (n. Definito di punti, estensione disegnata) per ciascun poligono (batch)> Elimina punti extra> assegna valori di attributo ai # punti

Alternativa (evita la spaziatura irregolare, ma richiede ancora più manipolazioni):

Punti regolari (spaziatura definita, ad es. 300 m) nell'estensione dell'intero livello> Clip all'estensione dei poligoni> Elimina punti extra in ciascun poligono fino ad ottenere il numero desiderato di punti> assegna i valori degli attributi ai punti.

Il problema principale con le mie soluzioni alternative è l'elaborazione poligono per poligono, che rende difficile aggiornare i dati e lavorare con un numero maggiore di poligoni.

Una domanda analoga è stata posta come Creazione di n. Di punti regolari distanziati all'interno del poligono in QGIS , ma le specifiche sono diverse.

Schermata del risultato desiderato:

Tabella degli attributi L:


1
L'immagine nella tua domanda rappresenta ciò che ti aspetti di conseguenza? Da dove vengono i conteggi dei punti colorati? Potresti aggiungere una tabella degli attributi del layer? Soprattutto gli attributi dei poligoni che includono Edmonton e Sherwood Park, per una migliore comprensione dei colori e dei conteggi.
Kadir Şahbaz,

1. Questi sono solo dati mascherati che non hanno molto a che fare con i poligoni reali, ma sì, mi aspetto quel tipo di risultato, ma con punti attorno al centro del poligono. 2. I conteggi provengono dalle colonne della tabella degli attributi, in quanto vi sono tre colonne / tipi di punti che stavo aggregando in una colonna per ottenere prima il giusto numero di punti per poligono e quindi assegnare l'attributo / i colori usando le espressioni. modifica: aggiunta la tabella excel in questione, non rappresenta i valori, ma rappresenta la struttura dei miei dati.
Ruslan,

Risposte:


5

QGIS 3 viene fornito con un nuovo metodo di spostamento nel renderer del cluster chiamato grid. Sembra che questo sia praticamente ciò di cui hai bisogno. Basta creare il numero di punti desiderati nel centroide del poligono.

inserisci qui la descrizione dell'immagine

Non sono a conoscenza di un metodo per generare i punti solo con uno strumento gui, ma uno script Python relativamente semplice dovrebbe farlo.

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)

Se vuoi impazzire, avvolgilo in un algoritmo di elaborazione personalizzato.


Grazie Matthias, sembra essere persino migliore di altre soluzioni. Puoi suggerire un modo per creare rapidamente il numero desiderato di punti in base alla tabella degli attributi per raggiungere questo obiettivo?
Ruslan,

Non sono a conoscenza di un metodo semplice a parte la scrittura di un piccolo script Python. Il codice è totalmente non testato, quindi potrebbero esserci degli errori di battitura;)
Matthias Kuhn,

Grazie ancora. Probabilmente dovrò fare una visualizzazione simile per molti livelli / estensioni ecc., Quindi cercherò di costruire almeno un modello di elaborazione per questo.
Ruslan,

5

Potrebbe essere un altro modo ispiratore della risposta di Sarath SRK:

  1. Centroide di poligoni
  2. Buffer che utilizza un'espressione con il quadrato e per adattarsi alla tua scala: ie (1000 * (sqrt ("Frogs" + "Cats" + "Diplodocs") / 2)) + 1 e Segmento = 1, Stile tappo terminale = Quadrato
  3. Nuovo punto griglia con una spaziatura coerente con la scala del buffer.
  4. Elimina punto che non si interseca con il livello buffer (seleziona per posizione)
  5. attributo join per posizione (attributo del buffer o dei poligoni originali)

Eppure, avrai qualcosa del genere inserisci qui la descrizione dell'immagine

  1. Utilizzare un modellatore grafico per creare un nuovo campo con il comando "@row_number" inserisci qui la descrizione dell'immagine

  2. Eseguire il modello con un'iterazione sul livello buffer inserisci qui la descrizione dell'immagine

  3. Unisci tutto il nuovo livello

  4. Elimina tutto il punto con un campo ID_pt maggiore della somma del tuo campo ("Rane" + "Gatti" + "Diplodocs")

  5. Classificare con le regole (es
    • "ID_pt" <= "Rane"
    • "ID_pt"> "Frogs" e "ID_pt" <= ("Gatti" + "Rane")
    • "ID_pt"> ("Gatti" + "Rane") e "ID_pt" <= ("Gatti" + "Rane" + "Diplodocs") inserisci qui la descrizione dell'immagine

Grazie per questo! Non avrei tempo di provare questo oggi, ma sembra una soluzione praticabile considerando che hai ottenuto l'output desiderato.
Ruslan,

1

A tale scopo, è possibile utilizzare generatori di geometrie.

  1. Aggiungi 3 sottolivelli nel simbolo, uno per ciascun colore / attributo.
  2. Crea un'espressione che genera un multipoligono per ogni sublayer.
  3. Ora la parte difficile, genera parti quadrate per il multipoligono in base all'attributo. Immagino che questo richiederà una funzione di espressione di pitone personalizzata.
  4. Facoltativo, utilizzare le variabili di rendering per la scala della mappa per determinare il ridimensionamento dei poligoni e la spaziatura.

Mi dispiace, sono troppo occupato in questo momento per una risposta completa, ma sarà una sfida molto interessante provare a cucinare qualcosa da questa ricetta qui. Forse qualcuno riesce a fornirci una bella soluzione basata su questo.
Matthias Kuhn,

1

Una soluzione potrebbe essere quella di creare uno strato di punti con punti al centroide di ciascun poligono. Quindi, ad esempio, hai ottenuto il centroide di Edmonton con 25 punti sovrapposti: 5 con un attributo rana, 20 punti con gatto e 0 con diplodocs.

Quindi, utilizzando il renderizzatore di spostamento dei punti con il metodo di posizionamento impostato come griglia, dovresti essere in grado di ottenere l'effetto.

La difficoltà è creare il livello punto ....


0

Un'alternativa molto semplice potrebbe essere l'uso del diagramma a torta disponibile nelle proprietà del livello? Attributi e dimensioni possono essere dettati da un'espressione.

inserisci qui la descrizione dell'immagine


2
Bene, conosco modi alternativi per mappare i dati. Il punto della domanda è rendere possibile quel flusso di lavoro di visualizzazione. I grafici a torta non funzionano davvero perché quando guardi la griglia hai un buon senso sul conteggio delle persone. Cercare di stimare conteggi individuali precisi di ciascun poligono dai grafici a torta è quasi impossibile.
Ruslan,

0

È possibile generare i punti su un percorso a spirale a partire dal centroide del poligono. Il seguente post Stack Overflow ha un codice Python per creare punti equidistanti, ma al momento non posso provarlo a causa della mia mancanza di tempo libero.


Sembra essere abbastanza vicino, ma come menzionato nella domanda non sono abbastanza competente per codificare questo / cambiare il codice suggerito lì.
Ruslan,

Si spera che qualcuno con abbastanza conoscenza e tempo si
avvicini

0

Nel tuo caso,

  1. Crea punti spaziati regolarmente usando la distanza data per l'intero AOI
  2. Crea punti centroidi per tutti i poligoni (input).
  3. Crea buffer per quei punti centroidi usando il buffer a distanza fissa con il valore dei segmenti '1'. Creerà un buffer quadrato anziché un cerchio (utilizzare lo strumento di rotazione in Qgis se si desidera ruotare i poligoni del buffer).
  4. Crea una selezione di punti all'interno dei poligoni del buffer usando il vettore -> Strumenti di ricerca -> Seleziona per posizione (punti all'interno della regola dei poligoni).
  5. Cambia la selezione ed elimina i punti fuori dai poligoni del buffer. Quindi ora hai punti regolarmente distanziati attorno al centroide dei poligoni.
  6. Assegna l'attributo Maggioranza per interi punti e il resto dei punti deve essere classificato manualmente. Usa lo strumento QuickMultiAttributeEdit per aggiornare facilmente gli attributi.

Grazie, questo sembra ridurre le fasi di elaborazione, ma ciò non risolve il problema con la necessità di selezionare manualmente (i buffer all'interno dei poligoni sarebbero identici per dimensione = stesso numero di punti per poligono), eliminare e attribuire punti creati per ciascuno dei poligoni, che è il problema principale con questo e il mio flusso di lavoro.
Ruslan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.