¿Hay alguna forma de auto_increment para la columna ID en QGIS

22

Estoy creando un mapa ficticio, por lo que necesito crear muchos puntos, líneas y polígonos seguros. Más tarde exporto mis datos como geojson. Pero antes de eso siempre tengo que ir y darle a cada elemento una identificación única.

No necesito una clasificación especial, ya que el polígono más grande obtiene la identificación más pequeña más o menos. Yo sólo necesito todos los polígonos con un ID al final, sin hacer que manualmente como si tuviera que hacer ahora.

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

kwoxer
fuente
¿Estás usando shapefiles? ¿Los ID tienen que ser los mismos después de cada exportación, o podría completar el campo ID después de cada sesión de edición?
DPSEspacial
¿Cómo está creando los polígonos a partir de un script, digitalizando en el escritorio QGIS, o copiando desde un shapefile, etc.?
landocalrissian
Bueno, creo una forma en QGIS, Guardar como Geojson y está bien. Lo siento, tal vez recibí tu pregunta de manera incorrecta.
kwoxer

Respuestas:

26

Usar la calculadora de campo es el camino a seguir:

No se proporcionó identificación en

  1. Digitalice todas las funciones sin ingresar ningún ID.
  2. Antes de exportar, actualice Ids únicos con la expresión '$ Id' usando la calculadora de campo.

Ninguna identificación dada

Algunas identificaciones ya están dadas en

  1. Si ya tiene ID, puede usar '- $ Id'. Asegúrese de seleccionar nuevas características, lo que significa que son 'NULL' en la fila de identificación. Simplemente haga eso ordenando la columna.
  2. Ahora siga los pasos de las imágenes:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

vinayan
fuente
Si, impresionante. Súper fácil y funciona correctamente. Gracias hombre. Por cierto: ¿tal vez sabes cómo hacerlo también en algunas ID existentes? Si hago esto consigo -2 -3 y así sucesivamente
kwoxer
Encontré una solución y la agregué a tu publicación. Gracias de nuevo.
kwoxer
6

¡Aleluya! O a Eureka. O lo que sea. Esto puede hacerse. Con un archivo de forma.

  1. Si aún no hay uno, agregue un campo para contener la identificación de la función, por ejemplo, "FID", de tipo Número entero (entero) .
  2. Abra Propiedades de capa (haga clic con el botón derecho en la capa y elija Propiedades ... o haga doble clic en la capa), haga clic en la pestaña Formulario de atributos , luego en General desmarque Editable y en Valores predeterminados en el campo Tipo de valor predeterminadomaximum("FID") + 1 .

Al desmarcar Editable , no puede ingresar otro valor o eliminar lo que está allí. Tenga en cuenta que si hay valores sin ID, estos valores no se actualizarán. En algún momento experimentaré marcando Aplicar valor predeterminado en la actualización y revisaré mi fórmula para verificar si hay un valor cero o NULO para actualizar solo esos registros cuando se editan, no cualquier registro con un valor mayor que 1. (Anteriormente en este después se discutió cómo actualizar el campo FID con valores únicos, lo que deberá hacer si agregó el campo después de que ya había características en el archivo de forma).

Tenga en cuenta que esto se guarda con el archivo de mapa actual, no con el archivo de forma, por lo que agregar ese archivo de forma varias veces requerirá que copie esa parte del estilo de capa en la capa recién agregada. Para hacer esto, haga clic derecho en la capa, elija Estilos> Copiar estilo> Campos , y haga clic derecho en otra capa, elija Estilos> Pegar estilo> Todas las categorías de estilo (o continúe a Campos ). También puede copiar esa parte del estilo en cualquier otra capa basada en un archivo de forma, pero el campo ID debe tener el mismo nombre que la capa desde la que está copiando.

Propiedades de la capa

bkepl
fuente
Tenga en cuenta que para que esto funcione, debe crear al menos una característica y escribir su FID y luego cambiar el valor predeterminado del formulario de atributo. De lo contrario, terminará con un FID NULO.
Techie_Gus
5

Me gustaría agregar a la publicación de vinayan y mencionar brevemente la función rownum , ya que es muy similar y en algunos casos podría ser un poco más conveniente.

ingrese la descripción de la imagen aquí

id devuelve la ID de función , lo que significa que siempre comienza en cero .
rownum devuelve el número de la fila , lo que significa que comienza en uno .

ingrese la descripción de la imagen aquí

Entonces, básicamente, si desea que el incremento automático comience en 0, vaya por $ id , y si desea que comience en 1, vaya por $ rownum .

BritishSteel
fuente
Probado y también una buena solución de hecho. Pero con esta solución aquí, si ya tiene algunas ID y desea conservarlas, la función rownum no es buena. Esa función siempre comienza con 1. El camino anterior es mucho más inteligente, aunque 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 =)
kwoxer
4

Este tema ha aparecido aquí: Crear Shapefile con clave primaria de incremento automático en QGIS

Mis sugerencias serían:

1) Las bases de datos SQLITE / SpatialLite admiten el incremento automático en un campo establecido en INTEGER PRIMARY KEY:

En un INSERT, si la columna ROWID o INTEGER PRIMARY KEY no recibe explícitamente un valor, se rellenará automáticamente con un entero no utilizado, generalmente el más grande que el ROWID más grande actualmente en uso. Esto es cierto independientemente de si se utiliza o no la palabra clave AUTOINCREMENT.

Cada vez que edita / crea polígonos, puede completar sus atributos, y SQLITE le dará un valor único incremental en el campo que ha establecido en el tipo INTEGER PRIMARY KEY.

Cuando esté listo para exportar a GEOJSON, estará listo con su ID ÚNICA.

2) Si usa Shapefiles, cree un campo OBJECTID de tipo INTEGER y use una expresión de calculadora de campo para llenar ese campo cada vez que edite / cree polígonos y necesite exportarlos. Perderá la identificación original que tenía un polígono, pero esta es la única forma de lograr esto usando .SHP. (Tendré que encontrar la expresión de la calculadora de campo).

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

DPSSpacial
fuente
Gracias por la explicación. Pero no creo que sea una buena solución en lugar de una opción auto_increment directamente en la herramienta. Ya tengo tantos formatos de datos y no quiero otra herramienta más. Tal vez debería escribir un complemento para eso cuando tenga algo de tiempo ...
kwoxer
¡Sería más fácil abandonar el .SHP! Quién sabe a qué nuevas empresas se enfrentará ...
DPSSpatial
2

La publicación anterior, pero para cualquiera que buscara una solución rápida, la mía era crear un campo con $ ID + 1 y se generará automáticamente comenzando con 1.

Blipple
fuente
2

Actualización para QGIS 3

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

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

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

ingrese la descripción de la imagen aquí

AWGIS
fuente
1

La forma más fácil de hacer esto sería probablemente con un script de Python o tal vez sea posible con la calculadora de campo. Lo siento, no tengo uno para ti, tal vez alguien más lo tenga. Mientras tanto, buscaría un script de Python para ello. He visto mucho sobre esto para ArcGIS, pero estoy seguro de que hay algo para QGIS.

Tangnar
fuente
Bueno, lo mejor sería si realmente no hay nada, una solicitud de función. No quiero un script de Python adicional a QGIS también si podría ser una solución de un solo clic. Pero gracias.
kwoxer
1

Si no necesita algo que se pueda digerir humanamente, ahora hay una solución fácil: en las propiedades de campo, seleccione "Generador UUID" y deje todo en blanco.

Esto creará automáticamente un UUID en el campo. No es tan fácil como un número simple (según $ id o $ rownum), pero genera el UUID desde el principio, por lo que no hay pasos sucesivos.ingrese la descripción de la imagen aquí

Horizen
fuente
0

Me gustaría agregar que esto no parece funcionar cuando está utilizando capas de base de datos postgreSQL. $ ID y $ rownum devuelven 0. PostgreSQL 9.6 QGIS 2.18.12

Tyler Veinot
fuente
0

Estas soluciones ya no me funcionaron en QGIS 2.01 Dufour. Escribir $iden un campo nuevo o existente llamado 'id' en el campo de entrada de expresión me dio un error "La expresión no es válida"

Lo que funcionó fue escribir la función $rownumy luego hacer clic en "Aceptar"

ingrese la descripción de la imagen aquí

toms
fuente
0

simplemente puede eliminar el primer colmn (id) y crear uno nuevo "Como campo virtual" ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Rtronic
fuente