Estou trabalhando de maneira a criar projetos hidrológicos usando o QGIS e uma planilha do Excel que possuo. Para fazer isso, quero extrair algumas informações das linhas, incluídas em uma camada vetorial, que representa uma seção de tubo.
As informações que eu preciso extrair são:
- Número de identidade
- comprimento
- Coordenadas X, Y inicial e final
Eu encontrei uma maneira de capturar esse campo usando o "$ length" e outro algoritmo para as coordenadas X e Y, mas para isso eu preciso abrir a tabela Attributes, coloque as expressões em cada coluna de atributo e clique em para atualizar os campos.
Existe uma maneira de quando eu desenho uma linha esses campos são preenchidos automaticamente? Ou seja, eu desenho / edito uma linha (iniciar a edição ou nó final) e quando abro a tabela de atributos, os campos de comprimento e as coordenadas X, Y são preenchidos e atualizados.
fonte
Respostas:
Se você precisar apenas desses campos dentro do QGIS , poderá usar campos virtuais. Isso permite o uso de uma expressão (como
$length
) que depende de outros valores ou da geometria.Abra a calculadora do campo, adicione um novo campo com o tamanho do nome, marque a caixa de seleção "Campo virtual" e digite
$length
como expressão (ou qualquer outra coisa para os outros campos).No entanto, eles não serão salvos no arquivo do Excel.
Se você deseja manter um arquivo do Excel sincronizado com um arquivo shp para geometria e incluir campos derivados no arquivo do Excel, existe um plugin chamado ShpSync que conhece esse conceito e atualiza os campos automaticamente quando os recursos são alterados, adicionados ou excluídos.
fonte
Pergunta interessante! Não conheço outra maneira de conseguir o que deseja, mas usando o PyQGIS.
Leia o código abaixo. Tem alguns textos em que:
'lines'
,'length'
,'startX'
,'startY'
,'endX'
,'endY'
. Você pode ajustar esses nomes no script para que ele funcione nos seus dados. O primeiro é o nome da camada, enquanto o restante corresponde aos nomes dos campos. Presumo que sua camada de linha tenha esses campos (afinal, você deseja que os valores sejam escritos lá).Depois de ajustar o nome da camada e os nomes dos campos que você deseja atualizar automaticamente, copie e cole o script no console do QGIS Python.
Se tudo correr bem, você poderá ver que os valores do campo são atualizados automaticamente em dois cenários: 1) Quando novos recursos são adicionados e 2) Quando as geometrias são modificadas.
É assim que funciona:
Se você tiver algum problema ao executar o script, adicione um comentário abaixo desta resposta.
Pode ser útil que você já tenha essa funcionalidade disponível ao abrir seu projeto QGIS. Se for esse o caso, diga-me, eu poderia postar instruções para fazer isso.
EDITAR:
Para que essa funcionalidade esteja disponível sempre que você abrir o seu projeto QGIS (ou seja, um
.qgs
arquivo que contém, entre outros, sua camada de linha), siga estas etapas:Vá para
QGIS->Project->Project Properties->Macros
, marque aPython macros
opção e substitua o código inteiro por este (ajuste os valores indicando seus nomes de camada e campo):Certifique-se de habilitar as macros no seu projeto, desta forma:
Settings->Options->General->Enable macros: Always
.Salve seu projeto QGIS.
Agora, toda vez que você abrir o
.qgs
arquivo que acabou de salvar, os atributos da camada de linha serão atualizados automaticamente quando você adicionar um novo recurso ou modificar uma geometria (ou seja, não será mais necessário copiar nada no QGIS Python Console).2ª EDIÇÃO:
Acabei de publicar um plugin chamado AutoFields para ajudar as pessoas a resolver esse tipo de problema. Eu até fiz um vídeo mostrando como resolver seu problema, você pode assistir em:
https://vimeo.com/germap/autofields-geometric-properties
Documentação do AutoFields: http://geotux.tuxfamily.org/index.php/en/geo-blogs/item/333-autofields-plugin-for-qgis
fonte
myLayer = QgsMapLayerRegistry.instance().mapLayersByName( 'Tramo' )[0]
Se você estiver realmente interessado no meu futuro plug-in, envie-me as sugestões que tiver. Você pode entrar em contato comigo no GeoTux .Para o QGIS 3, vá para
Layers Properties
=>Attributes Form
=> escolha seu campo com valores geométricos (por exemploarea
) = = digite$area
naDefaults value
caixa e marqueApply default value on update
. Isso também poderia ser útil:$perimeter
,$y
,$x
,$id
fonte
Eu colocaria os dados em um banco de dados (PostGIS) e extrairia os dados para o QGIS com uma visão (provavelmente materializada).
fonte