Tengo 2 capas de datos de puntos. La capa de puntos A sirve para capturar características sobre el terreno y la capa de puntos B contiene datos de códigos postales. Lo que estoy tratando de lograr es que cuando se crea una característica de punto en la capa de punto A se actualiza automáticamente una columna en la capa de punto A con el código postal más cercano de la capa de punto B. ¿Alguien tiene alguna idea sobre cómo puedo lograr esto?
Respuestas
¿Demasiados anuncios?QGIS 3.0+
Tal vez pueda utilizar Default
en los widgets de capa, junto con la opción refFunciones plugin.
A continuación se muestra un ejemplo de una nueva capa, que tiene un soil
para copiar la información del suelo de meuse
capa de puntos.
Verás Valor por defecto se establece en geomnearest('meuse_point_32632', 'soil')
lo que significa que copia el soil
campo desde el punto más cercano del meuse_point_32632
capa.
A continuación, obtendrá el soil
Los datos se copian en su nueva capa mientras digitaliza para añadir puntos.
QGIS 2.18
Puede utilizar Campos automáticos junto con el plugin refFunciones plugin.
En la ventana Autocampos, seleccione Custom Expression
y establece geomnearest('other_point_layer', 'target_field')
.
Encontrará información detallada en AutoFields plygin sitio web.
Utilizando QGIS 3.x también puede probar a utilizar la siguiente expresión en el campo Valor por defecto sección del formulario de atributos que aparece en la respuesta de Kazuhito. Sustituir 'Point B'
con el nombre de su capa Punto B y "postcode"
con su campo de código postal del Punto B respectivamente.
Si desea que se actualice cada vez que edite los datos existentes de la capa Punto A, active también la opción "Aplicar valor por defecto al actualizar".
aggregate('Point B','concatenate',"postcode",
intersects(closest_point(aggregate('Point B','collect',$geometry),
geometry()),
$geometry))
Lo que hace es agregar valores de otra capa ( "postcode"
valores de la Point B
) y filtrarlos mediante una especie de unión de "vecino más próximo".
El filtro busca el punto más cercano en su capa Punto B (que se agrega mediante collect
), a su capa Punto A ( geometry()
ya que ahora estamos en la tierra de los agregados), y luego comprueba que que se cruza con la geometría del Punto B. Dicho de otro modo, "filtra las características más cercanas a tu geometría del Punto A" .
(Como ambas son capas puntuales, probablemente podrías utilizar within()
en lugar de intersects()
si quisieras).
Resultado:
Bono
Como nota al margen, en un principio interpreté erróneamente tu pregunta original como una pregunta de punto a polígono y llegué a una conclusión interesante: un enfoque similar funciona, pero es necesario amortiguar el polígono por la cantidad más pequeña o de vez en cuando obtendrás algunos puntos en el polígono. closest_point()
resultados disjuntos de la capa de polígonos. Creo que esto tiene que ver con la forma en QGIS representa las geometrías de puntos; hay un poco de redondeo implican.
aggregate('Polygon','concatenate',"name",
intersects(closest_point(aggregate('Polygon','collect',$geometry),
geometry()),
buffer($geometry,0.000000000001)))
Resultado (los puntos en rojo son los closest_point()
resultados estilizados mediante el generador de geometría):