6 votos

¿Añadir características de atributos a partir de la intersección de una malla con un shapefile de puntos?

Quiero calcular la frecuencia de observación de un animal en un hábitat forestal dentro de las diferentes zonas de mi área de estudio. Para ello utilizaré la sencilla ecuación (número de individuos)/(esfuerzo de estudio). Quiero hacer esto dentro de una cuadrícula de 150mx150m, donde un gradiente de escala de grises indicará las diferentes densidades de población.

Hasta ahora, tengo una cuadrícula de polígonos (fishnet) recortada a un área de estudio de 150mx150m. El esfuerzo de estudio por cuadrícula se ha calculado utilizando la función "suma de líneas". (vector->herramientas de análisis->suma de líneas)

enter image description here

Imagen: representación visual del emplazamiento del campo (polígono verde), con los senderos de la encuesta (líneas rosas) y los lugares de observación (puntos rojos oscuros).

A continuación, quiero calcular el número de individuos observados por cuadrícula. El shapefile de puntos que representa las ubicaciones de observación contiene una característica en la tabla de atributos llamada 'tamaño del clúster' que es el número de animales que se observaron para cualquier punto de observación. Quiero tener la suma total del 'tamaño del cluster' para todos los puntos dentro de cada cuadrícula. Preferiblemente como una característica (columna) en el shapefile de la "línea de suma" para que pueda hacer un cálculo simple usando la ecuación (número de individuos)/(esfuerzo de estudio) para la densidad de población dentro de cada celda de la cuadrícula.

He intentado utilizar la función de recuento de puntos que se encuentra en vector->análisis, pero ésta sólo proporciona el número de puntos por celda de la cuadrícula, mientras que yo querría la suma de los tamaños de los clusters por celda de la cuadrícula. ¿Puede alguien sugerirme cómo hacerlo?

Estoy utilizando QGIS 2.18.7

0 votos

Su última parte no está clara: ¿qué quiere decir con Preferiblemente como una característica en el shapefile de la característica "suma de líneas". ? ¿Cómo cree usted que conectar el valor de la suma almacenada en el punto a una línea, que puede cruzar muchos puntos diferentes al mismo tiempo? Además, ¿qué quiere decir con Función 'suma de líneas' ?

0 votos

Lo siento, hay algunos errores: i) Quiero la suma de los tamaños de los clusters dentro de cada cuadrícula como una columna extra (característica) para el shapefile de la suma de líneas ii) Esperaba que, dado que a cada celda se le ha dado un valor de identificación en el shapefile de la suma de líneas, pudiera enlazarlas usando eso iii) Función de la suma de líneas = Vector -> herramientas de análisis -> suma de longitudes de líneas

0 votos

Gracias, pero no has respondido a las preguntas: ¿qué es el "suma de líneas función? ¿Dónde la has encontrado y cómo la has utilizado? Entonces, una línea puede atravesar diferentes celdas de la cuadrícula y, como cada una de ellas almacena un suma para los tamaños de los racimos, ¿cuál es el valor final que hay que asignarle? Espero que ahora esté más claro.

4voto

Geoffrey Puntos 228

En primer lugar, puede ejecutar un código sencillo desde el Consola Python . Sólo es necesario cargar preliminarmente la capa de puntos y la capa de polígonos en el Panel de Capas y, a continuación, escribir su nombre y el nombre del campo donde se encuentra el tamaño del grupo se almacena el valor:

from PyQt4.QtCore import QVariant

point_layer_name = 'points' # name of the point layer
grid_layer_name = 'grid' # name of the polygon layer
cluster_size_field = 'observations' # field name where the observations are stored

point_layer = QgsMapLayerRegistry.instance().mapLayersByName(point_layer_name)[0]
grid_layer = QgsMapLayerRegistry.instance().mapLayersByName(grid_layer_name)[0]

# Create the output layer
crs = grid_layer.crs().toWkt()
outLayer = QgsVectorLayer('Polygon?crs='+ crs, 'outLayer' , 'memory')
prov = outLayer.dataProvider()
fields = grid_layer.pendingFields() # Fields from the input layer
fields.append(QgsField('OBS_SUM', QVariant.Int, '', 10, 0))
prov.addAttributes(fields) # Add input layer fields to the outLayer
outLayer.updateFields()

points = [feat for feat in point_layer.getFeatures()]
cells = [ft for ft in grid_layer.getFeatures()]

all_points = {}
index = QgsSpatialIndex() # this spatial index contains all the features of the point layer
for point in points:
    index.insertFeature(point)
    all_points[point.id()] = point

for cell in cells:
    obs_sum = 0
    inAttr = cell.attributes() # Input attributes
    tmp_geom = cell.geometry() #Input geometry
    idsList = index.intersects(tmp_geom.boundingBox())
    for idf in idsList:
        tmp_pt_geom = all_points[idf].geometry()
        if tmp_pt_geom.intersects(tmp_geom):
            obs_sum += all_points[idf][cluster_size_field]

    inAttr.append(obs_sum)
    outGeom = QgsFeature()
    outGeom.setAttributes(inAttr) # Output attributes
    outGeom.setGeometry(tmp_geom) # Output geometry
    prov.addFeatures([outGeom]) # Output feature
# Add the layer to the Layers panel
QgsMapLayerRegistry.instance().addMapLayer(outLayer)

Obtendrá una nueva capa de memoria de polígono que almacena la suma de las observaciones dentro de cada celda (los valores se almacenarán en el "OBS_SUM" campo).

Una vez hecho esto, puede ejecutar un únase a con la capa de puntos original. Para ello, puede ejecutar la función Unir atributos por ubicación algoritmo de la caja de herramientas de procesamiento utilizando esta configuración:

enter image description here

Devolverá una nueva capa de puntos que almacena los atributos unidos tanto de la capa de la cuadrícula como de la capa devuelta por el código anterior.

A estas alturas, deberías tener todos los elementos para unir de nuevo tus puntos al shapefile de líneas (como todavía no está claro cómo quieres hacerlo, sólo puedo sugerirte que utilices de nuevo el Unir atributos por ubicación y estableciendo un valor mayor que 0 para el algoritmo Precision parámetro).

1 votos

Como ya tenía las capas cargadas simplemente seguí el tutorial en el enlace de la respuesta anterior, sin embargo creo que esta es una respuesta válida también.

0 votos

@Nebulloyd Me alegro de que hayas encontrado una solución. El fragmento de código hace casi el mismo trabajo del Unir atributos por ubicación algoritmo.

2voto

firefly-orange Puntos 26

Es necesario realizar una "unión espacial" para transferir los atributos de los puntos a cada celda de la cuadrícula y sumar los recuentos. Aquí es un enlace a un tutorial para hacer precisamente eso

0 votos

Seguir este tutorial fue un medio excelente y eficaz para conseguir el resultado que buscaba

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X