45 votos

¿Existe una manera de auto_incrementar la columna ID en QGIS?

Estoy creando un mapa ficticio y por eso necesito crear muchos puntos, líneas y seguramente polígonos. Más tarde exporto mis datos como geojson. Pero antes de eso siempre tengo que ir a dar a cada elemento un ID único.

No necesito una ordenación especial, como que el polígono más grande reciba el ID más pequeño o algo así. Simplemente Necesito todo polígonos con un ID al final, sin haciendo it manualmente como tengo que hacer ahora.

Sería genial si alguien sabe cómo hacerlo.

0 votos

¿Utilizas shapefiles? ¿Los ID tienen que ser los mismos después de cada exportación, o podría rellenar el campo ID después de cada sesión de edición?

0 votos

¿Cómo estás creando los polígonos desde un script, digitalizando en el escritorio de QGIS, o copiando desde un shapefile, etc.?

0 votos

Bueno, yo creo una forma en QGIS, guardar como Geojson y está bien. Lo siento, tal vez tengo su pregunta de una manera equivocada?

55voto

kjo Puntos 197

De manera informal, $\{0,1,2,3,\ldots\}\subseteq\mathbb{N}$ proviene de los axiomas primero y segundo.

Por supuesto, habría que definir qué $\{0,1,2,3,\ldots\}$ es. Tal vez escribirlo $\{0,S(0),S(S(0)),S(S(S(0))),\ldots\}$ lo hace más claro. Entonces se puede tomar un miembro particular de este conjunto y utilizar los axiomas primero y segundo para demostrar que está en $\mathbb{N}$ .

1 votos

Sí, impresionante. Super fácil y funcionando correctamente. Gracias. Por cierto: ¿tal vez usted sabe cómo hacer que también en algunos ya existentes ID? Si hago esto me sale -2 -3 y así sucesivamente

0 votos

He encontrado una solución y la he añadido a tu post. Gracias de nuevo.

23voto

fAcE Puntos 21

¡Aleluya! O Eureka. O lo que sea. Esto se puede hacer. Con un shapefile.

  1. Si no existe ya, añada un campo que contenga el identificador de la característica, por ejemplo "FID", de tipo Número entero (entero) .
  2. Abrir Propiedades de las capas (haga clic con el botón derecho en la capa y elija Propiedades... o haga doble clic en la capa), haga clic en el botón Formulario de atributos y en la pestaña General desmarque Editable y bajo Valores por defecto en el campo Valor por defecto tipo maximum("FID") + 1 .

Desmarcando Editable no se puede introducir otro valor ni borrar lo que hay. Tenga en cuenta que si hay valores sin ID, estos valores no se actualizarán. En algún momento experimentaré con la comprobación de Aplicar el valor por defecto en la actualización y revisando mi fórmula para comprobar si hay un valor cero o NULL para actualizar sólo esos registros cuando se editan, no cualquier registro con un valor mayor que 1. (Anteriormente en este post se discutió cómo actualizar el campo FID con valores únicos, lo que tendrá que hacer si agregó el campo después de que ya había características en el shapefile).

Tenga en cuenta que esto se guarda con el archivo de mapa actual, no con el shapefile, por lo que añadir ese shapefile varias veces requerirá que se copie esa parte del estilo de la capa a la nueva capa añadida. Para ello, haga clic con el botón derecho del ratón en la capa y elija Estilos > Copiar estilo > Campos y haga clic con el botón derecho del ratón en otra capa, elija Estilos > Estilo Pegar > Todas las categorías de estilo (o seguir Campos ). También puede copiar esa parte del estilo a cualquier otra capa basada en un shapefile, pero el campo ID debe tener el mismo nombre que la capa de la que está copiando.

Layer properties

1 votos

Tenga en cuenta que para que esto funcione, tiene que crear al menos una característica y escribir su FID y luego cambiar la forma del atributo Valor por defecto. De lo contrario, terminará con un FID NULO.

7 votos

También puede evitar un FID nulo con la fórmula: if (maximum("id") is NULL, 1 ,maximum("id") + 1)

4 votos

Para evitar que el "id" de una característica se incremente tan pronto como se actualice esta fórmula debería funcionar como valor por defecto (con la casilla de verificación "Aplicar en la actualización" marcada). Razón: Las nuevas versiones de QGIS (aquí en la 3.14) no permiten desmarcar esa casilla cuando se utiliza un campo en la expresión (lo cual es bastante extraño): IF ("id" is NULL,maximum("id") + 1, "id")

12voto

mercator Puntos 16196

Me gustaría añadir al post de vinayan y mencionar brevemente la rownum ya que es muy similar y en algunos casos puede ser un poco más conveniente.

enter image description here

id devuelve el Identificación de características , lo que significa que siempre comienza en cero .
rownum devuelve el número de la fila , lo que significa que comienza en un .

enter image description here

Así que, básicamente, si quieres que el autoincremento comience en 0 ve por $id y si quieres que empiece en el 1, entonces elige $rownum .

0 votos

Probado y también es una buena solución. Pero con esta solución aquí si ya tienes algunos IDs y quieres mantenerlos la función rownum no es buena. Esa función siempre comienza con 1. La forma anterior es contar de manera más inteligente a pesar de que es más difícil de configurar. Así que gracias por la alternativa pero por ahora la función ID es mi solución preferida =)

8voto

AGW94 Puntos 51

Actualización para QGIS 3

Sé que llego bastante tarde a esto pero siempre es bueno dar cualquier actualización:

En QGIS 3 hay ahora una herramienta nativa que se puede utilizar para hacer este trabajo exacto y se llama "Añadir campo autoincremental"

No es necesario utilizar una expresión en la calculadora de campo ni hacer ningún tipo de codificación, pero sin embargo todo esto sigue siendo muy útil y bueno de conocer.

enter image description here

2 votos

Esto creará valores incrementados para las características existentes pero no para las nuevas. Utilice la respuesta bkepl para crear valores incrementados para las nuevas características.

4voto

mapBaker Puntos 5348

Este tema ha surgido aquí: Crear Shapefile con clave primaria auto incrementada en QGIS

Mis sugerencias serían:

1) Las bases de datos SQLITE / SpatialLite soportan el autoincremento en un campo establecido como INTEGER PRIMARY KEY:

En un INSERT, si la columna ROWID o INTEGER PRIMARY KEY no se explícitamente un valor, entonces se llenará automáticamente con un entero no utilizado, normalmente el que sea mayor que el mayor ROWID actualmente en uso. Esto es así independientemente de que se utilice o no la palabra clave AUTOINCREMENTO se utilice o no la palabra clave AUTOINCREMENTO.

Cada vez que edites/crees polígonos, puedes rellenar sus atributos, y SQLITE le dará un valor único incremental en el campo que hayas configurado de tipo INTEGER PRIMARY KEY.

Cuando esté listo para exportar a GEOJSON, estará todo listo con sus IDs ÚNICOS.

2) Si utiliza Shapefiles, cree un campo OBJECTID de tipo INTEGER y utilice una expresión de calculadora de campos para rellenar ese campo cada vez que edite/crea polígonos y necesite exportarlos. Perderá el ID original que tenía un polígono, pero esta es la única manera de conseguirlo usando .SHP. (Tendré que encontrar la expresión de la calculadora de campo).

PostGIS es otra fuente de datos que podría explorar, aunque es más pesado que SQLITE, podría encontrar valor en un sistema de este tipo a medida que avanza...

0 votos

Gracias por la explicación. Pero no creo que sea una buena solución en lugar de una opción de auto_incremento directamente en la herramienta. Ya tengo muchos formatos de datos y no quiero otra herramienta más. Quizás debería escribir un addon para eso cuando tenga algo de tiempo...

0 votos

Quizá sea más fácil abandonar el .SHP. Quién sabe a qué nuevas aventuras le llevará...

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X