Compara líneas similares y actualiza capas

16

Aquí hay dos capas con la representación de las calles y la idea es: Queremos actualizar la capa más reciente (con la línea roja) con algunos de los datos almacenados en la otra (el azul claro), pero estas capas son similar en la posición geográfica que puede estar muy cerca y un poco más distante dependiendo del lugar en el mapa y solo un atributo coincide en caso de que una línea sea la misma en el otro (codlog x codlog5).

Qgis capas.

Por ejemplo: en el medio de la imagen, hay un cuadrado en ambas capas, pero ¿cómo hago en el mapa para reconocer que el azul es el mismo que el verde y actualizar la capa reciente?

¿Cómo puedo hacerlo? ¿Hay algún complemento o herramienta que ayude con eso?

Jhonatan Oliveira
fuente
¿Desea actualizar la capa roja con atributos de la capa azul o con características adicionales de la capa azul?
dmh126
Los atributos Situación: la capa roja contiene las columnas (a, b, c, d) y la azul las columnas (d, e, f). Quiero agregar en la capa roja las columnas (e, f) de la otra capa y sus resultados que coincidan.
Jhonatan Oliveira
Hay algún tipo de documentación aquí para un plugin de fusión. No estoy seguro si el desarrollo se ha completado.
Barbarroja
1
¿Has probado Jump?
radouxju
¿Pero la columna "d" de la línea azul y la "d" de la roja son una identificación común única? Lo que contienen?
Sergio

Respuestas:

6

Esta es una gran pregunta, tuve que hacer algo similar recientemente pero con un conjunto de datos mucho más pequeño, por lo que pude usar una intersección simple con un poco de control de calidad visual adicional y estuvo bien.

Pero aquí hay una idea para esto, aunque no tengo código, y es un proceso bastante pesado. Definitivamente pruebe primero con una muestra del conjunto de datos completo. Probablemente puedas encontrar algún código útil por aquí. (La sangría se puso un poco rara a continuación):

  1. tome el buen conjunto de geometría (donde desea que terminen los atributos) y cree un búfer *

  2. iterar a través de cada una de las características del búfer:

    2a. calcular la orientación general de la función (max_y - min_y / max_x - min_x o algo así)

    2b. realice una consulta de selección por ubicación en la otra capa utilizando esta característica única

    1. tendrá más de una función que coincida con la consulta de selección por ubicación, de modo que repita estas funciones seleccionadas y calcule la orientación de cada una

    2. obtener los atributos de cualquier característica que tenga una orientación más cercana a la de la característica de búfer.

* Comenzaría con una distancia muy pequeña (una unidad de mapa o algo así) y luego ejecutaría este proceso con distancias crecientes, teniendo cuidado de no sobrescribir ningún atributo que ya haya transferido.

** En realidad, probablemente podría renunciar a hacer las características del búfer, y simplemente hacer la consulta de selección por ubicación con una distancia del búfer. No estoy muy familiarizado con QGIS, pero estoy seguro de que podrá hacerlo.

No hay forma de que esto funcione perfectamente para todas sus funciones, pero es un comienzo, y luego se reduce a desarrollar una buena estrategia de control de calidad / control de calidad para verificar y completar la transferencia.

EDITAR Pensando más en esto, aquí hay un ejemplo básico que rompería completamente el sistema si comenzara con una distancia de búfer muy pequeña y eligiera la función con la mejor orientación coincidente, como recomendé:

ingrese la descripción de la imagen aquí

Se tomarían los atributos de la línea roja incorrecta. Para evitar esto, es posible que desee crear algún tipo de tolerancia, y solo tome los atributos de la característica si su orientación (en comparación con la orientación de la característica azul original) cae dentro de esa tolerancia.

EDITAR 2 Vaya, ¿son estos polígonos? Supongo que supuse que eran líneas sobre un fondo gris. Si son polígonos, realmente no sé si este concepto de orientación es bueno. Pero puede seleccionar todas las entidades que se cruzan y descubrir cuál tiene la mayor superposición (ejecute una herramienta de tipo Unión y luego use el polígono con el área más grande ...).

Sr. Adam
fuente
Esa lógica es sólida. He usado un enfoque similar en C # / ArcObjects para copiar atributos de un conjunto de datos inexacto con atributos a un conjunto de datos exacto sin atributos ... 95% correcto. La verificación / fijación manual era necesaria en áreas estrechas, pero ciertamente era más rápido que hacerlo todo manualmente.
Michael Stimson
2

Si desea agregar algunos atributos de la capa roja a la capa azul y un atributo es común en ambas capas, debe usar Agregar unión de vectores .

He escrito sobre eso aquí .

  1. Haga clic derecho en su capa roja de shapefile en el Panel de capas y elija Propiedades .
  2. Luego vaya a la pestaña Uniones .
  3. Presione el botón + , creará una nueva unión.
  4. Unir capa es su capa roja de shapefile. Unir campo es un campo con los valores comunes en ambos. El campo de destino es su campo al que desea unirse desde la capa azul.
  5. Después de eso, obtendrá un nuevo atributo en su tabla de shapefiles.

Eso es.

Aquí tienes un ejemplo con capturas de pantalla.

dmh126
fuente
1

Prefiero la respuesta de @ dmh126 ya que su método permite que su capa red_line se actualice con bastante facilidad.

Solo para agregar una alternativa, puede usar la herramienta Unir tabla de atributos de la Caja de herramientas de procesamiento y seleccionar sus capas con el campo común. Tenga en cuenta que este método crea un nuevo archivo de forma en lugar de actualizar uno existente:

Unir tabla de atributos

José
fuente
0

Si tiene alguna ID única en ambas capas que puede usar para unir fácilmente los valores a la nueva capa de la anterior, es pan comido. Pero este no parece ser ese caso.

Si no, es un problema bastante difícil. Me pregunto por qué el comentario del usuario 30184 sugiriendo usar OpenJUMP y el complemento http://www.vividsolutions.com/products.asp?catg=spaapp&code=roadmatcher no se publicó como respuesta porque me parece completamente legítimo en este caso.

De lo contrario, no creo que puedas hacer esto sin algo de codificación. Con QGIS puede usar bien y, al combinar el almacenamiento en búfer y la intersección, debería poder realizar una comprobación automática significativa.

Un enfoque podría ser comparar un búfer razonablemente grande de líneas rojas con líneas azules y obtener atributos y proporciones coincidentes. En pseudocódigo:

for r_line in red_lines:
  r_line_buf = r_line.buffer()
  intersecting_b_lines = []
  for b_line in blue_lines:
    if r_line_buf.intersects(b_line):
      intersect_length = calculateIntersectionLength(r_line_buf,b_line)
      b_line_values = getAttributes(b_line)
      intersecting_b_lines.append((b_line_values,intersect_length))
  b_line_best_fit = findLongestLineWithinIntersected(intersecting_b_lines)
  r_line_length = r_line.length
  b_vs_r_line_ratio = compareLength(r_line_length,b_line_best_fit)
  saveToNewColumns(r_line, b_line_best_fit.Atribute1, b_line_best_fit.Atribute2..., b_vs_r_line_ratio)
Miró
fuente