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 similares en la posición geográfica, que pueden estar muy cerca y un poco más distantes según el lugar en el mapa y solo un atributo coincide en los casos en que una línea es la misma en la otra (codlog x codlog5).

Por ejemplo: en el centro 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 actualiza la capa reciente?

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

    
pregunta Jhonatan Oliveira 01.07.2015 - 21:05

4 respuestas

5

Esta es una excelente pregunta, tuve que hacer algo similar recientemente pero con un conjunto de datos mucho más pequeño, así que pude usar una intersección simple con un 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 debajo):

  1. tome el conjunto de geometrías correctas (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. Calcule 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 usando esta única función

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

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

* Comenzaría con una distancia muy pequeña (una unidad de mapa o algo) 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ías renunciar a hacer las funciones 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ías hacerlo.

No hay forma de que esto funcione perfectamente para todas sus funciones, pero es un comienzo, y luego se reduce al desarrollo de una buena estrategia de QA / QC para verificar y completar la transferencia.

EDIT Pensando más en esto, este es un ejemplo básico que rompería completamente el sistema si comenzaras con una distancia de búfer muy pequeña y eligieras la función con la mejor orientación adaptada, como te recomendé:

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

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

    
respondido por el mr.adam 16.07.2015 - 22:00
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 una combinación de vectores .

He escrito sobre eso aquí .

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

Eso es todo.

Aquí tiene un ejemplo con capturas de pantalla.

    
respondido por el dmh126 15.07.2015 - 23:20
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 shapefile en lugar de actualizar uno existente:

    
respondido por el Joseph 16.07.2015 - 11:50
0

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

Si no, es un problema bastante difícil. Me pregunto por qué el comentario del usuario 30184 que sugiere utilizar OpenJUMP y el complemento enlace no se publicó en lugar de responde porque me suena completamente legítimo en este caso.

De lo contrario, no creo que puedas hacer esto sin un poco 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 iguales. 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)
    
respondido por el Miro 22.07.2015 - 19:32

Lea otras preguntas en las etiquetas