Criando pontos espaçados regularmente dentro do polígono com base no valor do atributo usando o QGIS?

11

Eu tenho uma camada de polígono com um valor de atributo anexado representando a contagem de indivíduos dentro de um polígono. Estou usando o QGIS 3.0.

Preciso visualizar as contagens como uma grade de pontos dentro de um polígono (ou seja, 1 ponto = 100 sapos, coloridos por espécie). Os pontos não precisam necessariamente ocupar polígono inteiro e, de preferência, são desenhados em torno de um centróide com espaçamento predefinido (ou seja, 300 m), para que possam representar uma grade organizada em uma resolução específica.

A solução atual que encontrei é usar "Pontos regulares", com o parâmetro count, para criar grades dentro da extensão desenhada em um mapa e excluir os pontos extras criados pelo algoritmo (o algoritmo arredonda para uma grade e você pode obter 20 pontos em vez de 17 em entrada). Isso produz o resultado desejado, mas requer o desenho da extensão da área para pontos regulares para cada polígono, além da entrada manual de atributos e limpeza dos pontos criados. Além disso, como estou executando "Pontos regulares" com contagem especificada, em vez de espaçamento, cada polígono obtém pontos com espaçamento diferente.

Em resumo: pontos regulares (número de pontos definido, extensão desenhada) para cada polígono (lote)> Excluir pontos extras> atribuir valores de atributo aos # pontos

Alternativa (evita o espaçamento irregular, mas requer ainda mais manipulações):

Pontos regulares (espaçamento definido, ou seja, 300 m) na extensão de toda a camada> Clipe na extensão dos polígonos> Exclua pontos extras em cada polígono até obter o número de pontos desejado> atribua valores de atributo a pontos.

O principal problema com minhas soluções alternativas é o processamento de polígono por polígono, o que dificulta a atualização dos dados e o trabalho com um número maior de polígonos.

Uma pergunta análoga foi feita como Criando # regularmente pontos espaçados e definidos dentro do polígono no QGIS , mas as especificidades são diferentes.

Captura de tela do resultado desejado:

Tabela de atributosL:

Ruslan
fonte
1
A imagem na sua pergunta representa o que você espera como resultado? De onde vêm as contagens de pontos coloridos? Você poderia adicionar uma tabela de atributos da camada? Especialmente atributos de polígonos que incluem Edmonton e Sherwood Park, para uma melhor compreensão das cores e contagens.
Kadir Şahbaz 17/0518
1. Esses são apenas dados mascarados que não têm muito a ver com polígonos reais, mas sim, espero esse tipo de resultado, mas com pontos ao redor do centro do polígono. 2. As contagens vêm das colunas da tabela de atributos, pois existem três colunas / tipos de pontos que eu os agregava em uma coluna para primeiro obter o número certo de pontos por polígono e depois atribuir o atributo / cores usando expressões. edit: adicionou a tabela do excel em questão, não representa os valores, mas representa a estrutura dos meus dados.
Ruslan

Respostas:

5

O QGIS 3 vem com um novo método de deslocamento no renderizador de cluster chamado grid. Parece que isso é praticamente o que você precisa. Basta criar o número de pontos desejados no centróide do seu polígono.

insira a descrição da imagem aqui

Não conheço um método para gerar os pontos apenas com uma ferramenta de GUI, mas um script python relativamente simples deve fazer isso.

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 você quiser enlouquecer, envolva isso em um algoritmo de processamento personalizado.

Matthias Kuhn
fonte
Obrigado Matthias, isso parece ser ainda melhor do que outras soluções. Você pode sugerir uma maneira de criar rapidamente o número de pontos desejado com base na tabela de atributos para conseguir isso?
Ruslan
Não conheço um método fácil além de escrever um pequeno script python. O código é totalmente testado, por isso pode ter alguns erros de digitação;)
Matthias Kuhn
Obrigado novamente. Eu provavelmente terei que fazer uma visualização semelhante para muitas camadas / extensões etc., portanto, tentarei criar pelo menos um modelo de processamento para isso.
Ruslan
5

Pode ser uma outra maneira inspiradora pela resposta de Sarath SRK:

  1. Centróide de polígonos
  2. Buffer que emprega uma expressão com o quadrado e para se adaptar à sua escala: ie (1000 * (sqrt ("Sapos" + "Gatos" + "Diplodocs") / 2))) + 1 e Segmento = 1, Estilo de tampa final = Quadrado
  3. Novo ponto de grade com espaçamento coerente com a escala do buffer.
  4. Excluir ponto que não se cruza com a camada de buffer (selecione por local)
  5. atributo de junção por localização (atributo do buffer ou dos polígonos originais)

No entanto, você terá algo parecido com isto insira a descrição da imagem aqui

  1. Use um modelador gráfico para criar um novo campo com o comando "@row_number" insira a descrição da imagem aqui

  2. Execute o modelo com uma iteração na camada de buffer insira a descrição da imagem aqui

  3. Mesclar toda a nova camada

  4. Exclua todo o ponto com um campo ID_pt maior que a soma do seu campo ("Sapos" + "Gatos" + "Diplodocs")

  5. Categorize com regras (ou seja,
    • "ID_pt" <= "Sapos"
    • "ID_pt"> "Sapos" e "ID_pt" <= ("Gatos" + "Sapos")
    • "ID_pt"> ("Gatos" + "Sapos") e "ID_pt" <= ("Gatos" + "Sapos" + "Diplodocs") insira a descrição da imagem aqui
Christophe
fonte
Obrigado por isso! Hoje não tenho tempo para tentar isso, mas parece uma solução viável, considerando que você obteve a saída desejada.
Ruslan
1

Você pode usar geradores de geometria para isso.

  1. Adicione 3 subcamadas no símbolo, uma para cada cor / atributo.
  2. Crie uma expressão que gere um multipolígono para cada subcamada.
  3. Agora, a parte mais difícil, gere partes quadradas para o multipolígono com base no atributo. Eu acho que isso exigirá uma função de expressão python personalizada.
  4. Opcionalmente, use as variáveis ​​de renderização para map-scale para determinar o dimensionamento dos polígonos e espaçamento.
Matthias Kuhn
fonte
Desculpe, estou muito ocupado agora para obter uma resposta completa, mas será um desafio muito interessante tentar preparar algo desta receita aqui. Talvez alguém queira nos fornecer uma boa solução com base nisso.
Matthias Kuhn
1

Uma solução poderia ser criar uma camada de pontos com pontos no centróide de cada polígono. Então, por exemplo, você chegou ao centróide de Edmonton 25 sobreposto: 5 com um atributo de sapo, 20 com gato e 0 com diplodocs.

Em seguida, usando o renderizador de deslocamento de ponto com o método Placement definido como grade, você poderá obter o efeito.

A dificuldade é criar a camada de pontos ....

JR
fonte
0

Uma alternativa muito simples pode ser usar o gráfico de pizza disponível nas propriedades da camada? Atributos e tamanhos podem ser ditados por uma expressão.

insira a descrição da imagem aqui

Christophe
fonte
2
Bem, eu sei sobre formas alternativas de mapear os dados. O objetivo da questão é tornar possível esse fluxo de trabalho de visualização. Os gráficos de pizza não funcionam realmente porque, quando você olha para a grade, tem uma noção muito boa da contagem de indivíduos. Tentar estimar contagens individuais precisas de cada polígono a partir de gráficos de pizza é quase impossível.
Ruslan
0

Você pode gerar os pontos em um caminho em espiral a partir do centróide do polígono. A seguinte postagem do Stack Overflow possui código python para criar pontos equidistantes, mas não posso testá-lo no momento, devido à minha falta de tempo livre.

Techie_Gus
fonte
Parece estar próximo o suficiente, mas, como mencionado na pergunta, não sou proficiente o suficiente para codificar isso / alterar o código sugerido lá.
Ruslan
Esperemos que alguém com conhecimento e tempo suficiente seria gritei.
Techie_Gus
0

No seu caso,

  1. Crie pontos espaçados regularmente usando a distância fornecida para toda a AOI
  2. Crie pontos centróides para todos os polígonos (entrada).
  3. Crie um buffer para esses pontos centróides usando o buffer de distância fixa com o valor de segmentos '1'. Ele criará um buffer quadrado em vez de um círculo (use a ferramenta de rotação no Qgis se desejar girar polígonos do buffer).
  4. Crie uma seleção de pontos dentro dos polígonos do buffer usando o vetor -> Ferramentas de pesquisa -> Selecionar por local (pontos na regra de polígonos).
  5. Alterne a seleção e exclua pontos fora dos polígonos do buffer. Então agora você tem pontos espaçados regularmente em torno do centróide de polígonos.
  6. Forneça o atributo Maioria para pontos inteiros e o restante dos pontos precisará ser classificado manualmente. Use a ferramenta QuickMultiAttributeEdit para atualizar atributos facilmente.
Sarath SRK
fonte
Obrigado, isso parece reduzir as etapas de processamento, mas isso não resolve o problema com a necessidade de selecionar manualmente (os buffers dentro dos polígonos teriam o mesmo tamanho = o mesmo número de pontos por polígono), excluir e atribuir pontos criados para cada um dos polígonos, que é o principal problema com esse e com meu fluxo de trabalho.
Ruslan