¿Conseguir que los puntos tocando una línea vuelvan a la capa de líneas usando QGIS?

12

Estoy usando QGIS 2.14.4-Essen. Tengo dos capas:

  • points.shp que contiene puntos con una columna AÑO
  • lines.shp que contiene líneas que conectan exactamente los puntos de points.shp

Me gustaría recuperar el atributo YEAR de points.shp a lines.shp. Cada línea es un solo segmento con un punto en cada extremo (vea la imagen a continuación). Lo que me gustaría obtener es AÑO desde el primer punto y AÑO desde el segundo punto nuevamente en cada atributo de línea.

Por ejemplo: la línea 1 toca un primer punto con AÑO = 2010 y un segundo punto con AÑO = 2011. Me gustaría recuperar algo como '2010-2011' en los atributos de la línea 1. El resultado debería verse así:

id  | points
----+-----------------
1   | 2010-2011
2   | 2011-2012
3   | 2012-2016

ingrese la descripción de la imagen aquí

¿Hay alguna manera de lograr esto usando QGIS?

wiltomap
fuente

Respuestas:

9

Aunque la respuesta de @radouxju es válida, la explicaré un poco más detallada.

  1. Debe asegurarse de que la entidad de polilínea esté dividida exactamente por encima de las ubicaciones de los puntos.
  2. Uso Join attribute by location. Elija la función de línea dividida en ubicaciones de puntos como capa de destino; en mi caso, la denomino "explotada".
  3. En la sección de resumen, seleccione "Tomar resumen de la función de intersección". Aquí, en lugar de ejecutar la herramienta dos veces; uno para Min y otro para Max, puede ejecutarlo una vez y elegir Min y Max.

ingrese la descripción de la imagen aquí

  1. El archivo de salida tendrá el siguiente atributo:

ingrese la descripción de la imagen aquí

  1. Agregue un nuevo campo de tipo cadena con un nombre "Año" al nuevo archivo de forma del paso 4.
  2. Use la calculadora de campo y vaya a actualizar el campo existente. Seleccione "Año" y escriba la siguiente expresión:

    to_string ("MINYEAR2") + '-' + to_string ("MAXYEAR2")

  3. El atributo de salida final se verá así:

ingrese la descripción de la imagen aquí

  1. El resultado final será así:

ingrese la descripción de la imagen aquí


Aquí está la salida después de probar sus datos:

ingrese la descripción de la imagen aquí

La tabla de la izquierda son los datos de puntos después de crear un nuevo campo de tipo entero, y la tabla de la derecha es después de unir la línea con los datos de puntos utilizando el paso 2 mencionado anteriormente. Luego usé los pasos 5-6 para crear los datos finales.

Actualizar

Traté de convertir el campo AÑO de cadena a entero usando la expresión to_int () y funcionó. Por lo tanto, no necesita hacerlo manualmente. Sin embargo, el tipo de campo debe ser de tipo Integerno Integer64. Asegúrese de que la longitud del campo sea de hasta 9. Si elige una longitud de campo de 10, se convertirá a Interger64, y no funcionará Interger64. Luego puede seguir el proceso desde el paso 2-6

Aquí está el resultado final después de usar la expresión to_int ():

ingrese la descripción de la imagen aquí

En la tabla de atributos anterior a la izquierda, el AÑO es de tipo cadena y el AÑO2 es de tipo entero convertido mediante la expresión to_int (). Puede ver en la tabla de atributos a la derecha después de seguir los pasos 2-6, obtuve MINYEAR2 y MAXYEAR2, luego los convertí en cadenas nuevamente para concatenar todo en el campo AÑO.

ahmadhanb
fuente
¡Muchas gracias! Eso es exactamente lo que hice varias veces. Supongo que las entidades de polilínea se dividen exactamente por encima de las ubicaciones de los puntos porque creé las líneas a partir de capas de puntos usando el complemento Points2One. ¿Puedes probar con este subconjunto de datos: drive.google.com/file/d/0B7ZWEFkkfYgheG92Q29sa0I3LW8/view ? ¡Gracias de nuevo!
wiltomap
El campo AÑO en la tabla de atributos es de tipo cadena. Debe agregar un nuevo campo de tipo entero e ingresar los años manualmente. Después de crear el campo de tipo entero y guardar las ediciones, elimine el campo de cadena anterior. Luego, siga el proceso detallado anterior.
ahmadhanb
Traté de convertir el campo AÑO de cadena a entero usando la expresión to_int (), pero tampoco funcionó. Cuando ingresé los años manualmente, funcionó como se esperaba.
ahmadhanb
Explicación clara @ahmadhanb
Shiko
Gracias @ahmadhanb! El hecho es que los datos que compartí anteriormente son un subconjunto. ¡Tengo varios miles de líneas y puntos, por lo que ingresar años manualmente será mucho trabajo! ¿Es esto un error?
wiltomap
5

Al unir puntos de unión a línea, tendrás una relación múltiple. Con "unir atributo por ubicación", podrá solicitar un método de resumen dado. En su caso, haga esto dos veces: una con el mínimo y otra con el máximo. Después de eso, puede concatenar los dos campos en un campo nuevo y terminará con lo que necesita.

ingrese la descripción de la imagen aquí

En calculadora de campo:

tostring(minYEAR) + '-' + tostring(maxYEAR)
radouxju
fuente
Este método devuelve una columna adicional denominada COUNTy que contiene el valor 2para cada línea. Las opciones Min y Max devuelven esta información. He seleccionado la capa de líneas como capa de destino y la capa de puntos como capa de unión, ¿estoy en lo cierto?
wiltomap
¿Es año el campo numérico o el texto?
radouxju
El YEARcampo es entero. Traté de crear una nueva columna con to_string("YEAR")pero el resultado es exactamente el mismo ...
wiltomap
Hice una prueba rápida para asegurarme (QGIS 2.8.3) y funcionó. Si su conteo es 2, significa que tiene 2 puntos para cada segmento, lo cual es correcto. Pero conmigo tengo los valores de atributo MINYEAR MAXYEAR en el nuevo vector de línea creado por la unión espacial. No entiendo por qué no funciona en su caso. ¿Podrías probar con otro archivo?
radouxju
4

Suponiendo que la topología es perfecta, crea un campo 'WKT' con la expresión

geom_to_wkt( $geometry) 

en su capa de puntos, podría usar la expresión:

min( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))||'-'|| max( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))

en la calculadora de campo de la capa de tubería, creando una cadena de texto.

  • atributo (característica, nombre_atributo) Devuelve el valor de un atributo especificado de una característica, aquí, el año de la característica de punto
    obtenida.
  • get_feature (capa, atributo, valor) devuelve la primera característica de una capa que coincide con un valor de atributo dado. Aquí verificamos si podemos encontrar un punto con las mismas coordenadas (en formato WKT) que las de
    los vértices inicial y final de su línea.
  • start_point (geometry) devuelve el primer nodo de una geometría. Aquí el primer vértice de tu línea.
  • end_point (geometry) devuelve el último nodo de una geometría. Aquí el último vértice de tu línea.
  • geom_to_wkt (geometry) devuelve la representación de texto conocido (WKT) de la geometría. ingrese la descripción de la imagen aquí

Incluso podría actualizarlo a:

CASE
WHEN attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year') = attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year')
THEN attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year')
ELSE min( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))||'-'|| max( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))
END

para mostrar solo un año si se conectan dos puntos con el mismo año (obteniendo 200X en lugar de 200X-200X).

La principal ventaja de este método es que si sus datos cambian en sus puntos, puede actualizarlos muy rápido con solo una calculadora de campo.
Incluso podría agregar esta regla como un Autofield para cuando cree nuevas líneas.
Salud,

Víctor
fuente