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.


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


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


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 .


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 ...


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!


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


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.


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


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


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


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

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.