Compare linhas semelhantes e atualize camadas

16

Aqui existem duas camadas com a representação das ruas e a idéia é: Queremos atualizar a camada mais recente (com a linha vermelha) com alguns dos dados armazenados na outra (a azul claro), mas essas camadas são semelhante na posição geográfica que pode ser muito próxima e um pouco mais distante, dependendo do local no mapa e apenas um atributo corresponde nos casos em que uma linha é a mesma na outra (codlog x codlog5).

Camadas Qgis.

Por exemplo: No meio da imagem, há um quadrado em ambas as camadas, mas como faço para reconhecer no azul que o azul é igual ao verde e atualizar a camada recente?

Como eu posso fazer isso? Existe algum plugin ou ferramenta que ajude com isso?

Jhonatan Oliveira
fonte
Deseja atualizar a camada vermelha com atributos da camada azul ou com recursos adicionais da camada azul?
dmh126
Os atributos Situação: A camada vermelha contém as colunas (a, b, c, d) e a azul as colunas (d, e, f). Quero adicionar na camada vermelha as colunas (e, f) da outra camada e seus resultados correspondentes.
Jhonatan Oliveira
Há alguma documentação aqui para um plugin de confllation. Não tenho certeza se o desenvolvimento foi concluído.
Barbarossa
1
você já tentou o Jump?
Radouxju 16/07/2015
Mas a coluna "d" da linha blu e o "d" da linha vermelha são um ID comum exclusivo? O que eles contêm?
1674 Sergio

Respostas:

6

Essa é uma ótima pergunta, eu tive que fazer algo semelhante recentemente, mas com um conjunto de dados muito menor, então pude usar uma interseção simples com algumas verificações extras de qualidade visual e tudo bem.

Mas aqui está uma idéia para isso, embora eu não tenha código, e é meio que um processo pesado. Definitivamente teste primeiro com uma amostra do conjunto de dados completo. Você provavelmente pode ter algum código útil por aqui. (O recuo ficou um pouco estranho abaixo.):

  1. pegue o bom conjunto de geometrias (onde você deseja que os atributos terminem) e crie um buffer *

  2. itere através de cada um dos recursos do buffer:

    2a calcular a orientação geral do recurso (max_y - min_y / max_x - min_x ou algo parecido)

    2b. faça uma consulta de seleção por localização na outra camada usando esse único recurso

    1. você terá mais de um recurso que corresponde à consulta selecionar por local, para percorrer esses recursos selecionados e calcular a orientação de cada um

    2. obtenha os atributos de qualquer recurso que tenha uma orientação mais próxima da do recurso de buffer.

* Eu começaria com uma distância muito pequena (uma unidade de mapa ou algo assim) e depois executaria esse processo com distâncias crescentes, tomando cuidado para não substituir nenhum atributo que você já tenha transferido.

** Na verdade, você provavelmente poderia deixar de criar os recursos do buffer e apenas fazer a consulta de seleção por local com uma distância de buffer. Eu não estou muito familiarizado com o QGIS, mas tenho certeza que você seria capaz de fazer isso.

Não há como isso funcione perfeitamente para todos os seus recursos, mas é um começo e tudo se resume ao desenvolvimento de uma boa estratégia de QA / QC para verificar e concluir a transferência.

EDIT Pensando nisso mais, aqui está um exemplo básico que interromperia completamente o sistema se você estivesse iniciando com uma distância muito pequena do buffer e escolhendo o recurso com a melhor orientação correspondente, conforme recomendado:

insira a descrição da imagem aqui

Os atributos da linha vermelha incorreta seriam utilizados. Para evitar isso, convém criar algum tipo de tolerância e usar apenas os atributos do recurso se sua orientação (quando comparada à orientação do recurso azul original) se enquadrar nessa tolerância.

EDIT 2 Opa, são esses polígonos? Acho que assumi que eram linhas em um fundo cinza. Se eles são polígonos, eu realmente não sei se esse conceito de orientação é bom. Mas você pode selecionar todos os recursos que se cruzam e descobrir qual tem mais sobreposição (execute uma ferramenta do tipo União e use o polígono com a maior área ...).

mr.adam
fonte
Essa lógica é sólida. Eu usei uma abordagem semelhante no C # / ArcObjects para copiar atributos de um conjunto de dados impreciso com atributos para um conjunto de dados preciso sem atributos ... 95% correto. A verificação / fixação manual era necessária em áreas apertadas, mas certamente era mais rápida do que fazer tudo manualmente.
22715 Michael Stimson
2

Se você deseja adicionar alguns atributos da camada vermelha à camada azul e um atributo é comum nas duas camadas, você deve usar a opção Adicionar junção de vetor .

Eu escrevi sobre isso aqui .

  1. Clique com o botão direito do mouse na camada shapefile vermelha no Layer Layer e escolha Properties .
  2. Em seguida, vá para a guia Junções .
  3. Pressione o botão + , ele criará uma nova associação.
  4. A camada de junção é a sua camada shapefile vermelha. Campo de junção é um campo com os valores comuns em ambos. Campo de destino é o seu campo ao qual você deseja ingressar na camada azul.
  5. Depois disso, você receberá um novo atributo na sua tabela shapefiles.

É isso aí.

Aqui você tem um exemplo com capturas de tela.

dmh126
fonte
1

Eu prefiro a resposta do @ dmh126, pois o método dele permite que a camada red_line seja atualizada com bastante facilidade.

Apenas para adicionar uma alternativa, você pode usar a ferramenta de tabela Associar atributos na caixa de ferramentas de processamento e selecionar suas camadas com o campo comum. Observe que este método cria um novo shapefile em vez de atualizar um existente:

Tabela de atributos de junção

Joseph
fonte
0

Se você tiver algum ID exclusivo em ambas as camadas, que possa ser usado para associar facilmente valores à nova camada da antiga, é fácil. Mas isso não parece ser o caso.

Caso contrário, é um problema bastante difícil. Gostaria de saber por que o comentário do usuário30184, sugerindo o uso do OpenJUMP e do plugin http://www.vividsolutions.com/products.asp?catg=spaapp&code=roadmatcher, não foi postado como resposta, porque parece completamente legítimo para mim nesse caso.

Caso contrário, não acho que você possa fazer isso sem alguma codificação. Com o QGIS, você pode usar formas bem torneadas e, ao combinar buffer e interseção, deve poder fazer uma verificação automática significativa.

Uma abordagem poderia ser comparar um buffer razoavelmente grande de linhas vermelhas com linhas azuis e obter atributos correspondentes e proporções de quanto ele corresponde. No pseudo-có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)
Miro
fonte