Unir por atributo / spatialite com SQL / junção externa esquerda no QGIS

8

Eu tenho uma camada com polígonos (vamos chamá-lo de "madeiras") que é interceptada por "n" objetos de linha ("estradas"). Cada estrada tem um atributo único roadid.

Preciso adicionar TODOS os roadid's (não apenas os primeiros QGis encontrados) à camada de madeiras-polígonos que eles cruzam para uso posterior. De preferência, todos os roadid's devem estar em uma nova coluna de atributo dos "bosques", divididos por, por exemplo, ",".

Se houvesse apenas uma estrada em cada madeira, eu poderia usar a ferramenta "juntar atributo por posição" para obter as estradas nos polígonos. O atributo desejado é uma string exclusiva, portanto, não ajuda a somar / média / min / max os campos, e não há opção para vinculá-los como strings divididas por ",".

Edit: Não há solução sem a ajuda de plugins ou programas externos até agora (veja o comentário de Matthias Kuhn abaixo).

(QGIS 2.10.1-Pisa)

Papierwolf
fonte
Esclareça o que você precisa no final do processo. Um campo contendo vários valores separados ou apenas um valor? E se um único valor é necessário, que valor deve ser mantido quando você tem várias correspondências? (por exemplo: manter mais longa estrada, o mais sobreposição, menor id, etc ...)
MarHoff
Eu preciso de todos os valores, pergunta atualizada - obrigado pela dica.
Papierwolf 02/02
1
Este é tipicamente o tipo de tarefa que eu realizaria dentro do PostGIS usando um LEFT OUTTER JOIN ... se por acaso você usa o PostGis, posso fornecer uma resposta rápida, mas usar apenas o QGIS pode precisar de muito mais etapas.
MarHoff
1
Isso é algo que ainda não é possível com o QGIS. Em geral, isso é discutido sob o termo "funções agregadas" e estou confiante de que veremos isso em uma versão não muito distante no futuro. Enquanto isso, eu recomendaria usar uma solução de banco de dados (por exemplo, postgres) ou pode haver uma ferramenta em processamento que eu não conheço no momento.
Matthias Kuhn
2
Você pode cruzar a camada de polígono com a camada de polilinha. Dessa forma, você obtém os IDs de polígono e polilinha que se cruzam. Você pode escrever um script / plug-in Python para coletar IDs de polilinha para IDs de polígono, mas não é a melhor solução do ponto de vista relacional.
Zoltan

Respostas:

6

Use Spatialite Database!

É um banco de dados espacial leve, baseado em arquivo, suportado imediatamente pelo QGIS.

  1. Primeiro configure um banco de dados espacial, seguindo estas instruções

  2. Envie suas duas tabelas para esse banco de dados espacial usando o QGIS DB Manager

  3. Supondo que suas tabelas sejam chamadas "polígono" e "linha", execute o seguinte comando SQL na interface de consulta do gerenciador de banco de dados.

SELECT polygon.id,
polygon.lib, -- Place here any field releveant for you (they must also be in grouping clauses, see below)
group_concat(line.id,',') as list_id_line -- this function concatenate the id of every line that touch you polygon
FROM polygon LEFT OUTER JOIN line
ON Intersects(polygon.geom,line.geom) -- Spatial Dabatabase Rule !
GROUP BY polygon.id, polygon.lib -- theses are the grouping clauses
  1. Aproveitar!

Mais explicações e diversão lendo sobre as funções agregadas do SQLite aqui e as funções spatialite aqui

MarHoff
fonte
Obrigado MarHoff, isso parece promissor! Amanhã, examinarei mais detalhadamente sua solução e apresentarei sua merecida "resposta de aceitação" e voto positivo.
Papierwolf 4/16/16
Na verdade, verifique se funcionou antes;) Fiquei realmente impressionado com o potencial Spatialite como opção sem servidor. Porque eu trabalho no PostGis, você me deu uma boa ocasião para experimentá-lo!
MarHoff 04/02
Sua solução funciona muito bem. Obrigado novamente por fornecer as fontes e o script. Eles realmente ajudam um iniciante a entender como isso funciona. Tentarei atualizar a pergunta e as tags novamente para ajudar outras pessoas a encontrar essa pergunta e sua resposta.
Papierwolf
Você é bem vindo! E eu amo o novo título. IMHO também pode ser justo substituir a tag "expression" por "spatialite". Tchau;)
MarHoff 8/16
1
Aprenda com meus erros: lembre-se de que você deve verificar "Criar índice espacial" ao importar dados para o SpatiaLite (ou fazê-lo mais tarde clicando com o botão direito do mouse nas tabelas). Suas consultas SQL, incluindo operações geométricas, levarão séculos se você esquecer de fazê-lo.
Papierwolf