¿Crear puntos regularmente espaciados dentro del polígono basado en el valor del atributo usando QGIS?

11

Tengo una capa de polígono con un valor de atributo adjunto que representa el recuento de individuos dentro de un polígono. Estoy usando QGIS 3.0.

Necesito visualizar los recuentos como una cuadrícula de puntos dentro de un polígono (es decir, 1 punto = 100 ranas, coloreado por especie). Los puntos no necesariamente necesitan ocupar un polígono completo, y preferiblemente deben dibujarse alrededor de un centroide con espaciado predefinido (es decir, 300 m), para que puedan representar una cuadrícula ordenada en una resolución específica.

La solución actual que encontré es usar "Puntos regulares", con el parámetro recuentos, para crear cuadrículas dentro de la extensión dibujada en un mapa, luego eliminar los puntos adicionales creados por el algoritmo (el algoritmo se redondea a una cuadrícula y puede obtener 20 puntos en lugar de 17 en entrada). Esto produce el resultado deseado, pero requiere dibujar la extensión del área para los puntos regulares para cada polígono, así como la entrada manual de atributos y la limpieza de los puntos creados. Además, como estoy ejecutando "Puntos regulares" con recuento especificado, en lugar de espaciado, cada polígono obtiene puntos espaciados de manera diferente.

En pocas palabras: puntos regulares (número definido de puntos, extensión dibujada) para cada polígono (lote)> Eliminar puntos adicionales> asignar valores de atributo a los puntos #

Alternativa (evita el espaciado irregular, pero requiere aún más manipulaciones):

Puntos regulares (espaciado definido, es decir, 300 m) en la extensión de la capa completa> Recortar a la extensión de los polígonos> Eliminar puntos adicionales en cada polígono hasta obtener el número deseado de puntos> asignar valores de atributo a los puntos.

El principal problema con mis soluciones es el procesamiento de polígono por polígono, lo que dificulta la actualización de los datos y el trabajo con un mayor número de polígonos.

Se hizo una pregunta análoga como Creación de un número de puntos definidos y separados regularmente dentro del polígono en QGIS , pero los detalles son diferentes.

Captura de pantalla del resultado deseado:

Tabla de atributos L:

Ruslan
fuente
1
¿La imagen en su pregunta representa lo que espera como resultado? ¿De dónde vienen los recuentos de puntos coloreados? ¿Podría agregar la tabla de atributos de la capa? Especialmente los atributos de los polígonos que incluyen Edmonton y Sherwood Park, para una mejor comprensión de los colores y los recuentos.
Kadir Şahbaz
1. Estos son solo datos enmascarados que no tienen mucho que ver con los polígonos reales, pero sí espero ese tipo de resultado, pero con puntos alrededor del centro del polígono. 2. Los recuentos provienen de las columnas de la tabla de atributos, ya que hay tres columnas / tipos de puntos que los estaba agregando en una columna para obtener primero el número correcto de puntos por polígono y luego asignar los atributos / colores usando expresiones. editar: tabla de Excel agregada en cuestión, no representa los valores, pero representa la estructura de mis datos.
Ruslan

Respuestas:

5

QGIS 3 viene con un nuevo método de desplazamiento en el renderizador de clúster llamado grid. Parece que esto es más o menos lo que necesitas. Simplemente cree el número de puntos deseados en el centroide de su polígono.

ingrese la descripción de la imagen aquí

No conozco un método para generar los puntos solo con una herramienta GUI, pero un script de Python relativamente simple debería hacerlo.

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 quieres volverte loco, envuélvelo en un algoritmo de procesamiento personalizado.

Matthias Kuhn
fuente
Gracias Matías, eso parece ser incluso mejor que otras soluciones. ¿Puede sugerir una forma de crear rápidamente el número deseado de puntos basado en la tabla de atributos para lograr esto?
Ruslan
No conozco un método fácil aparte de escribir un pequeño script de Python. El código no se ha probado por completo, por lo que puede tener algunos errores tipográficos;)
Matthias Kuhn
Gracias de nuevo. Probablemente tendré que hacer una visualización similar para muchas capas / extensiones, etc., así que intentaré construir al menos un modelo de procesamiento para esto.
Ruslan
5

Puede ser otra manera inspiradora por la respuesta de Sarath SRK:

  1. Centroide de polígonos
  2. Buffer empleando una expresión con el cuadrado y para adaptarlo con su escala: es decir (1000 * (sqrt ("Frogs" + "Cats" + "Diplodocs") / 2)) + 1 y Segment = 1, End cap style = Square
  3. Nuevo punto de cuadrícula con un espaciado coherente con la escala del búfer.
  4. Eliminar el punto que no se cruza con la capa de búfer (seleccionar por ubicación)
  5. unir atributo por ubicación (atributo del búfer o los polígonos originales)

Sin embargo, tendrás algo como esto ingrese la descripción de la imagen aquí

  1. Utilice un modelador gráfico para crear un nuevo campo con el comando "@row_number" ingrese la descripción de la imagen aquí

  2. Ejecute el modelo con una iteración en la capa de almacenamiento intermedio ingrese la descripción de la imagen aquí

  3. Fusionar todas las capas nuevas

  4. Elimine todo el punto con un campo ID_pt más grande que la suma de su campo ("Ranas" + "Gatos" + "Diplodocs")

  5. Categorizar con reglas (es decir
    • "ID_pt" <= "Ranas"
    • "ID_pt"> "Ranas" y "ID_pt" <= ("Gatos" + "Ranas")
    • "ID_pt"> ("Gatos" + "Ranas") y "ID_pt" <= ("Gatos" + "Ranas" + "Diplodocs") ingrese la descripción de la imagen aquí
Christophe
fuente
¡Gracias por esto! No tendría tiempo para probar esto hoy, pero parece una solución viable considerando que obtuviste el resultado deseado.
Ruslan
1

Podrías usar generadores de geometría para esto.

  1. Agregue 3 subcapas en el símbolo, una para cada color / atributo.
  2. Cree una expresión que genere un multipolígono para cada subcapa.
  3. Ahora la parte difícil, genera partes cuadradas para el multipolígono basado en el atributo. Supongo que esto requerirá una función de expresión de python personalizada.
  4. Opcional, use las variables de representación para la escala del mapa para determinar la escala de los polígonos y el espaciado.
Matthias Kuhn
fuente
Lo siento, estoy demasiado ocupado en este momento para obtener una respuesta completa, pero será un desafío muy interesante intentar cocinar algo de esta receta aquí. Tal vez alguien nos brinde una buena solución basada en esto.
Matthias Kuhn
1

Una solución podría ser crear una capa de puntos con puntos en el centroide de cada polígono. Entonces, por ejemplo, tienes en el centroide de Edmonton 25 puntos superpuestos: 5 con un atributo de rana, 20 puntos con cat y 0 con diplodocs.

Luego, utilizando el renderizador de desplazamiento de puntos con el método de Colocación establecido como cuadrícula, debería poder obtener el efecto.

La dificultad es crear la capa de puntos ...

JR
fuente
0

¿Una alternativa muy simple podría ser utilizar el gráfico circular disponible en las propiedades de la capa? Los atributos y tamaños pueden ser dictados por una expresión.

ingrese la descripción de la imagen aquí

Christophe
fuente
2
Bueno, sé sobre formas alternativas de mapear los datos. El punto de la pregunta es hacer posible ese flujo de trabajo de visualización. Los gráficos circulares realmente no funcionan porque cuando miras la cuadrícula obtienes una muy buena idea del recuento de personas. Intentar estimar recuentos individuales precisos de cada polígono a partir de gráficos circulares es casi imposible.
Ruslan
0

Puede generar los puntos en una ruta en espiral a partir del centroide del polígono. La siguiente publicación de Stack Overflow tiene un código de Python para crear puntos equidistantes, pero no puedo probarlo en este momento dada mi falta de tiempo libre.

Techie_Gus
fuente
Parece estar lo suficientemente cerca, pero como se menciona en la pregunta, no soy lo suficientemente competente para codificar esto / cambiar el código sugerido allí.
Ruslan
Esperemos que alguien con suficiente conocimiento y tiempo
intervenga
0

En tu caso,

  1. Cree puntos regularmente espaciados usando la distancia dada para el AOI completo
  2. Crear puntos centroides para todos los polígonos (entrada).
  3. Cree un búfer para esos puntos de centroide usando el búfer de distancia fija con un valor de segmento '1'. Creará un búfer cuadrado en lugar de un círculo (use la herramienta de rotación en Qgis si desea rotar los polígonos del búfer).
  4. Crear una selección de puntos dentro de los polígonos del búfer usando el vector -> Herramientas de investigación -> Seleccionar por ubicación (puntos dentro de la regla de polígonos).
  5. Cambie la selección y elimine puntos fuera de los polígonos del búfer. Entonces ahora tienes puntos regularmente espaciados alrededor del centroide de polígonos.
  6. Proporcione el atributo Mayoría para puntos completos y el resto de los puntos deben clasificarse manualmente. Utilice la herramienta QuickMultiAttributeEdit para actualizar los atributos fácilmente.
Sarath SRK
fuente
Gracias, esto parece reducir los pasos de procesamiento, pero esto no resuelve el problema con la necesidad de seleccionar manualmente (los búferes dentro de los polígonos serían idénticos en tamaño = el mismo número de puntos por polígono), eliminar y atribuir puntos creados para cada uno de los polígonos, que es el problema principal con esto y mi flujo de trabajo.
Ruslan