Recuperando atributos de tocar em uma linha de volta à camada de linhas usando o QGIS?


12

Estou usando o QGIS 2.14.4-Essen. Eu tenho duas camadas:

  • points.shp que contém pontos com uma coluna YEAR
  • lines.shp que contém linhas que conectam exatamente os pontos de points.shp

Gostaria de obter o atributo YEAR de points.shp de volta a lines.shp. Cada linha é um único segmento com um ponto em cada extremidade (veja a figura abaixo). O que eu gostaria de obter é YEAR do primeiro ponto e YEAR do segundo ponto de volta nos atributos de cada linha.

Por exemplo: a linha 1 está tocando um primeiro ponto com YEAR = 2010 e um segundo ponto com YEAR = 2011. Gostaria de voltar algo como '2010-2011' nos atributos da linha 1. O resultado deve ficar assim:

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

insira a descrição da imagem aqui

Existe uma maneira de conseguir isso usando o QGIS?

Respostas:


9

Embora a resposta @radouxju seja válida, vou explicar um pouco mais detalhadamente.

  1. Você precisa garantir que o recurso de polilinha esteja dividido exatamente acima dos locais dos pontos.
  2. Use Join attribute by location. Escolha o recurso de linha dividida nos locais dos pontos como camada de destino - no meu caso, eu o chamo de "explodido".
  3. Na seção de resumo, selecione "Resumir o recurso de interseção". Aqui, em vez de executar a ferramenta duas vezes; um para Min e outro para Max, você pode executá-lo uma vez e escolher Min e Max.

insira a descrição da imagem aqui

  1. O arquivo de saída terá o seguinte atributo:

insira a descrição da imagem aqui

  1. Adicione um novo campo do tipo string com o nome "Year" ao novo shapefile da etapa 4.
  2. Use a calculadora de campo e vá para atualizar o campo existente. Selecione "Ano" e escreva a seguinte expressão:

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

  3. O atributo de saída final terá a seguinte aparência:

insira a descrição da imagem aqui

  1. A saída final será assim:

insira a descrição da imagem aqui


Aqui está a saída após testar seus dados:

insira a descrição da imagem aqui

A tabela à esquerda é os dados do ponto após a criação de um novo campo do tipo número inteiro e a tabela à direita após a junção da linha aos dados do ponto usando a etapa 2 mencionada acima. Depois, usei as etapas 5 a 6 para criar os dados finais.

Atualizar

Tentei converter o campo YEAR de string para inteiro usando a expressão to_int () e funcionou. Então você não precisa fazer isso manualmente. No entanto, o tipo de campo deve ser do tipo Integernão Integer64. Verifique se o comprimento do campo é de até 9. Se você escolher um tamanho de campo de 10, ele será convertido em Interger64e não funcionará Interger64. Depois, você pode seguir o processo da etapa 2-6

Aqui está a saída final após o uso da expressão to_int ():

insira a descrição da imagem aqui

Na tabela de atributos acima, à esquerda, o YEAR é do tipo string e o YEAR2 é do tipo inteiro convertido usando a expressão to_int (). Você pode ver na tabela de atributos à direita, depois de seguir as etapas 2 a 6, obtive MINYEAR2 e MAXYEAR2 e depois converti em string novamente para concatenar tudo junto no campo YEAR.


Muito obrigado! Foi exatamente o que fiz várias vezes. Eu acho que os recursos da polilinha são divididos exatamente acima da localização dos pontos, porque eu criei as linhas a partir das camadas de pontos usando o plug-in Points2One. Você pode tentar com este subconjunto de dados: drive.google.com/file/d/0B7ZWEFkkfYgheG92Q29sa0I3LW8/view ? Obrigado novamente!
wiltomap 2/09/16

O campo YEAR na tabela de atributos é do tipo string. Você precisa adicionar um novo campo do tipo número inteiro e inserir os anos manualmente. Depois de criar o campo do tipo inteiro e salvar as edições, remova o campo da string antiga. Em seguida, siga o processo detalhado acima.
ahmadhanb 02/09

Tentei converter o campo YEAR de string para inteiro usando a expressão to_int (), mas também não funcionou. Quando entrei nos anos manualmente, funcionou como esperado.
ahmadhanb 02/09

Clara explicação @ahmadhanb
Shiko

Obrigado @ahmadhanb! O fato é que os dados que compartilhei acima são um subconjunto. Eu tenho vários milhares de linhas e pontos, então inserir anos manualmente será bastante trabalhoso! Isso é um inseto?
wiltomap 2/09/16

5

Ao juntar pontos de junção à linha, você terá vários relacionamentos. Com "associar atributo por local", você poderá solicitar um determinado método de resumo. No seu caso, faça isso duas vezes: uma com o mínimo e outra com o máximo. Depois disso, você pode concatenar os dois campos em um novo campo e terminar com o que precisa.

insira a descrição da imagem aqui

Na calculadora de campo:

tostring(minYEAR) + '-' + tostring(maxYEAR)

Este método retorna uma coluna adicional denominada COUNTe contendo valor 2para cada linha. As opções Min e Max retornam essas informações. Eu selecionei a camada de linhas como camada de destino e a camada de pontos como camada de junção, estou certo?
Wiltomap 31/08/16

o seu ano é numérico ou de texto?
Radouxju 1/09/16

O YEARcampo é inteiro. Tentei criar uma nova coluna com to_string("YEAR")mas o resultado é exatamente o mesmo ...
wiltomap

Fiz um teste rápido para ter certeza (QGIS 2.8.3) e funcionou. Se sua contagem for 2, significa que você tem 2 pontos para cada segmento, o que está correto. Mas comigo eu tenho os valores de atributo MINYEAR MAXYEAR no novo vetor de linha criado pela junção espacial. Não entendo por que não funciona no seu caso. Você poderia tentar com outro arquivo?
Radouxju 02/09

4

Supondo que a topologia seja perfeita, crie um campo 'WKT' com a expressão

geom_to_wkt( $geometry) 

na sua camada de pontos, você pode usar a expressão:

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'))

na calculadora de campo da camada de tubulação, criando uma sequência de texto.

  • attribute (feature, attribute_name) Retorna o valor de um atributo especificado de um recurso, aqui, o ano do recurso de ponto
    obtido.
  • get_feature (camada, atributo, valor) retorna o primeiro recurso de uma camada que corresponde a um determinado valor de atributo. Aqui, verificamos se conseguimos encontrar um ponto com as mesmas coordenadas (no formato WKT) que
    as dos vértices inicial e final da sua linha.
  • start_point (geometry) retorna o primeiro nó de uma geometria. Aqui o primeiro vértice da sua linha.
  • end_point (geometry) retorna o último nó de uma geometria. Aqui o último vértice da sua linha.
  • geom_to_wkt (geometry) retorna a representação de texto conhecido (WKT) da geometria. insira a descrição da imagem aqui

Você pode até atualizá-lo para:

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 apenas um ano se dois pontos com o mesmo ano estiverem conectados (obtendo 200X em vez de 200X-200X).

A principal vantagem desse método é que, se seus dados forem alterados em seus pontos, você poderá atualizá-los muito rapidamente com apenas uma calculadora de campo.
Você pode até adicionar essa regra como um Autofield para quando criar novas linhas.
Felicidades,

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.