Existe uma maneira de incremento automático para a coluna ID no QGIS

22

Estou criando um mapa fictício e, portanto, preciso criar muitos pontos, linhas e com certeza polígonos. Posteriormente, exporto meus dados como geojson. Mas antes disso eu sempre tenho que atribuir um ID único a cada elemento.

Não preciso de uma classificação especial, pois o polígono maior recebe a menor identificação. Eu só preciso de todos os polígonos com um ID no final, sem fazê- lo manualmente, como devo fazer agora.

Seria ótimo se alguém sabe como fazer isso.

kwoxer
fonte
Você está usando shapefiles? Os IDs precisam ser os mesmos após cada exportação ou você pode preencher o campo ID após cada sessão de edição?
usar o seguinte comando
Como você está criando os polígonos a partir de um script, digitalizando na área de trabalho QGIS ou copiando de um shapefile etc.?
Lando Calrissian
Bem, eu crio uma forma no QGIS, Save as Geojson e está tudo bem. Desculpe, talvez eu tenha entendido sua pergunta de maneira errada?
Kwoxer

Respostas:

26

O uso da calculadora de campo é o caminho a seguir:

Nenhum ID foi fornecido em

  1. Digitalize todos os recursos sem inserir nenhum ID.
  2. Antes da exportação, atualize os IDs exclusivos com a expressão '$ Id' usando a calculadora do campo.

Nenhum ID fornecido

Alguns IDs já são fornecidos em

  1. Se você já possui ID, pode usar '- $ Id'. Certifique-se de selecionar novos Recursos, o que significa que são 'NULL' na linha de identificação. Simplesmente faça isso ordenando a coluna.
  2. Agora siga as etapas das imagens:

insira a descrição da imagem aqui insira a descrição da imagem aqui

vinayan
fonte
Sim, fantástico. Super fácil e funcionando corretamente. Obrigado cara. Btw: talvez você saiba como fazer isso em alguns IDs já existentes? Se eu fizer isso eu recebo -2 -3 e assim por diante
kwoxer
Encontrei uma solução e a adicionei ao seu post. Obrigado novamente.
Kwoxer
6

Aleluia! Ou Eureka. Como queiras. Isto pode ser feito. Com um shapefile.

  1. Se ainda não houver, adicione um campo para conter o ID do recurso, por exemplo, "FID", do tipo Número inteiro (inteiro) .
  2. Abra Propriedades da camada (clique com o botão direito do mouse na camada e escolha Propriedades ... ou clique duas vezes na camada), clique na guia Formulário de atributos e , em Geral, desmarque Geral editável e Padrões no campo Tipo de valor padrãomaximum("FID") + 1 .

Ao desmarcar Editável , você não pode inserir outro valor ou excluir o que está lá. Observe que, se houver valores sem um ID, esses valores não serão atualizados. Em algum momento, experimentarei verificar Aplicar valor padrão na atualização e revisar minha fórmula para verificar se há um valor zero ou NULL para atualizar apenas esses registros quando forem editados, e não nenhum registro com um valor maior que 1. (Anteriormente Depois, discutimos como atualizar o campo FID com valores exclusivos, o que você precisará fazer se tiver adicionado o campo depois que já houver recursos no shapefile.

Observe que isso é salvo com o arquivo de mapa atual, não com o shapefile, portanto, adicionar esse shapefile várias vezes exigirá que você copie essa parte do estilo da camada para a nova camada adicionada. Para fazer isso, clique com o botão direito do mouse na camada, escolha Estilos> Copiar estilo> Campos e clique com o botão direito do mouse em outra camada, escolha Estilos> Colar estilo> Todas as categorias de estilo (ou continue com Campos ). Você também pode copiar essa parte do estilo para qualquer outra camada com base em um shapefile, mas o campo ID deve ter o mesmo nome da camada da qual você está copiando.

Propriedades da camada

bkepl
fonte
Observe que, para que isso funcione, é necessário pelo menos criar um recurso e digitar seu FID e alterar o atributo Valor padrão. Caso contrário, você acaba com um NULL FID.
Techie_Gus 10/10
5

Gostaria de acrescentar ao post de Vinayan e mencionar brevemente a função rownum , pois é muito semelhante e, em alguns casos, pode ser um pouco mais conveniente.

insira a descrição da imagem aqui

id retorna o ID do recurso , o que significa que ele sempre começa em zero .
rownum retorna o número da linha , o que significa que começa em uma .

insira a descrição da imagem aqui

Então, basicamente, se você deseja que o incremento automático comece em 0, vá para $ id e se você deseja que comece em 1, vá para $ rownum .

BritishSteel
fonte
Tentei e também uma boa solução de fato. Mas com esta solução aqui, se você já possui alguns IDs e deseja mantê-los, a função rownum não é boa. Essa função sempre começa com 1. O caminho acima é muito mais inteligente, embora seja mais difícil de configurar. Então, obrigado pela alternativa mas para agora a função de ID é a minha solução preferida =)
kwoxer
4

Este tópico foi apresentado aqui: Criar Shapefile com chave primária de incremento automático no QGIS

Minhas sugestões seriam:

1) Os bancos de dados SQLITE / SpatialLite oferecem suporte ao incremento automático em um campo definido como INTEGER PRIMARY KEY:

Em um INSERT, se a coluna ROWID ou INTEGER PRIMARY KEY não receber explicitamente um valor, ela será preenchida automaticamente com um número inteiro não utilizado, geralmente o número maior que o maior ROWID atualmente em uso. Isso ocorre independentemente de a palavra-chave AUTOINCREMENT ser usada ou não.

Cada vez que você editar / criar polígonos, poderá preencher seus atributos, e o SQLITE fornecerá um valor único incremental no campo que você definiu para o tipo INTEGER PRIMARY KEY.

Quando você estiver pronto para exportar para GEOJSON, estará pronto com seus IDs ÚNICOS.

2) Se estiver usando Shapefiles, crie um campo OBJECTID do tipo INTEGER e use uma expressão de calculadora de campo para preencher esse campo toda vez que você editar / criar polígonos e precisar exportá-los. Você perderá o ID original que um polígono já teve, mas essa é a única maneira de conseguir isso usando .SHP. (Terei que encontrar a expressão da calculadora de campo).

O PostGIS é outra fonte de dados que você pode querer explorar, embora seja mais pesado do que o SQLITE, você pode encontrar valor nesse sistema à medida que avança ...

DPSSpatial
fonte
Obrigado por explicar. Mas não acho que seja uma boa solução, em vez de uma opção de auto_increment diretamente na ferramenta. Já tenho tantos formatos de dados e não quero mais nenhuma ferramenta. Talvez eu devesse escrever um addon para que quando eu tiver algum tempo ...
kwoxer
Pode ser mais fácil abandonar o .SHP! Quem sabe o que novos empreendimentos que irá levá-lo em ...
DPSSpatial
2

Post antigo, mas para quem procura uma solução rápida, a mina foi criar um campo com $ ID + 1 e ele irá gerar automaticamente começando com 1!

Blipple
fonte
2

Atualização para QGIS 3

Eu sei que estou muito atrasado para isso, mas sempre bom para atualizar:

No QGIS 3, agora existe uma ferramenta nativa que pode ser usada para fazer esse trabalho exato e é chamada "Adicionar campo autoincremental"

Não é necessário usar uma expressão na calculadora de campo ou fazer qualquer codificação, mas, mesmo assim, elas ainda são muito úteis e úteis.

insira a descrição da imagem aqui

AWGIS
fonte
1

A maneira mais fácil de fazer isso seria provavelmente com um script python ou talvez seja possível com a calculadora de campo. Desculpe, não tenho um para você, talvez alguém o tenha. Enquanto isso, eu procuraria por um script python para ele. Eu já vi muito sobre isso no ArcGIS, mas tenho certeza de que há algo lá para o QGIS.

Tangnar
fonte
Bem, o melhor seria se realmente não houvesse nada, uma solicitação de recurso. Também não quero um script python adicional ao QGIS, se for uma solução com um clique. Mas obrigada.
kwoxer
1

Se você não precisa de algo digerível humanamente, agora existe uma solução fácil: nos objetos de campo, selecione "UUID Generator" e deixe tudo em branco.

Isso criará automaticamente um UUID no campo. Não é tão amigável quanto um número simples (como $ id ou $ rownum), mas gera o UUID desde o início, portanto, não há etapas sucessivas.insira a descrição da imagem aqui

Horizen
fonte
0

Gostaria de acrescentar que isso não parece funcionar quando você está usando uma camada de banco de dados postgreSQL. $ ID e $ rownum retornam 0. PostgreSQL 9.6 QGIS 2.18.12

Tyler Veinot
fonte
0

essas soluções não funcionaram mais para mim no QGIS 2.01 Dufour. Digitar $idem um campo novo ou existente chamado 'id' no campo de entrada da expressão me deu um erro "Expressão inválida"

O que funcionou foi digitar a função $rownume clicar em "OK"

insira a descrição da imagem aqui

toms
fonte
0

você pode simplesmente excluir a primeira colmn (id) e criar uma nova "como campo virtual" insira a descrição da imagem aqui insira a descrição da imagem aqui

Rtronic
fonte