1 votos

Unión espacial también basada en atributos usando QGIS

Tengo dos conjuntos de datos:

  • puntos con una marca de tiempo
  • polígonos que representan vecindarios

Necesito calcular cuántos puntos hay en cada polígono de vecindario, basado en un rango de tiempo. En otras palabras, cuántos puntos hay en la zona A entre las 9 am y las 10 am y luego cuántos hay entre las 10 am y las 11 am.

Actualmente, estoy separando los puntos en capas separadas - una capa para las 9 am a las 10 am y luego hago una unión espacial. Luego otra capa para las 10 am - 11 am y otra unión. Esto es excepcionalmente tedioso e insuficiente para realizar este mismo análisis a lo largo de una semana, por ejemplo.

¿Alguna sugerencia?

1voto

Val P Puntos 451

Puedes utilizar la Calculadora de Campos para contar el número de puntos que están contenidos en cada polígono y que cumplen un filtro. Esto no resolverá la necesidad de repetir la operación para cada rango de tiempo pero evita crear nuevas capas para cada grupo.

Con la expresión

aggregate(
layer:='point',
aggregate:='count',
expression:=$id,
filter:=contains(geometry(), $geometry)
and "time" > '09:00:00' and "time" <'10:00:00')

el sistema contará todos los puntos dentro de cada polígono que tengan un periodo de tiempo comprendido entre las 09:00 y las 10:00.

Puedes utilizar esta expresión en la etiqueta del polígono para visualizar el número de puntos o, si necesitas guardar esta información en un nuevo campo, úsala en la Calculadora de Campos para crear un nuevo campo para cada rango de tiempo cambiando simplemente la opción de tiempo en la expresión.

introducir descripción de la imagen aquí

1voto

Este es un trabajo para una Capa Virtual (Layer|Add Layer|Add/Edit Virtual Layer) porque te da las habilidades de agrupación de SQL.

Sin conocer los nombres de tu capa y columnas el formato general de SQL será:

SELECT polygon_layer.zone,
       strftime('%Y-%m-%dT%H:00:00.000', point_layer.timestamp) as 'hora',
       COUNT(point_layer.geometry) as 'conteo',
       polygon_layer.geometry
FROM polygon_layer, point_layer
WHERE ST_Contains(polygon_layer.geometry, point_layer.geometry)
GROUP BY polygon_layer.zone, strftime('%Y-%m-%dT%H:00:00.000', point_layer.timestamp), polygon_layer.geometry

Solamente sustituye los nombres correctos de las tablas para polygon_layer y point_layer y los nombres correctos de las columnas para polygon_layer.zone y point_layer.timestamp.

La función strftime formatea el tiempo como una cadena con ceros para los minutos y segundos - esencialmente redondeando los tiempos hacia abajo a la hora más cercana para poder ser utilizados para la agrupación.

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