Есть ли способ авто_инкремента для столбца идентификатора в QGIS


22

Я создаю вымышленную карту, и поэтому мне нужно создать много точек, линий и, конечно, многоугольников. Позже я экспортирую свои данные как геойсон. Но перед этим я должен пойти и дать каждому элементу уникальный идентификатор.

Мне не нужна особая сортировка, как самый большой полигон получает наименьший идентификатор или около того. Я просто нужно все многоугольники с к ID в конце концов, не делать это вручную , как я должен делать.

Было бы здорово, если бы кто-то знал, как это сделать.


Вы используете шейп-файлы? Должны ли идентификаторы быть одинаковыми после каждого экспорта, или вы могли бы заполнять поле идентификатора после каждого сеанса редактирования?
— DPSSpatial

Как вы создаете полигоны из скрипта, оцифровываете на рабочем столе QGIS или копируете из шейп-файла и т. Д.?
— Landocalrissian

Ну, я создаю форму в QGIS, Сохранить как Geojson, и это нормально. Извините, возможно, я неправильно поняла ваш вопрос?
— Kwoxer

Ответы:


26

Использование калькулятора поля - это путь:

ID не был указан в

  1. Оцифруйте все функции без ввода идентификатора.
  2. Перед экспортом обновите уникальные идентификаторы с помощью выражения $ Id с помощью калькулятора полей.

ID не указан

Некоторые удостоверения личности уже даны в

  1. Если у вас уже есть ID, вы можете использовать '- $ Id'. Убедитесь, что вы просто выбрали новые функции, что означает, что они имеют значение NULL в строке идентификатора. Просто сделайте это, заказав колонку.
  2. Теперь сделайте шаги из картинок:

введите описание изображения здесь введите описание изображения здесь


Да, классно Супер просто и работает правильно. Спасибо чувак. Кстати: может быть, вы знаете, как сделать это на уже существующих идентификаторах? Если я делаю это, я получаю -2 -3 и так далее
— kwoxer

Нашел решение и добавил его в свой пост. Еще раз спасибо.
— Kwoxer

6

Аллилуйя! Или Эврика. Или что угодно. Это можно сделать. С шейп-файлом.

  1. Если его еще нет, добавьте поле, содержащее идентификатор функции, скажем «FID», типа « Целое число» (целое число) .
  2. Откройте Свойства слоя (щелкните правой кнопкой мыши по слою и выберите « Свойства ...» или дважды щелкните по слою), щелкните вкладку « Форма атрибутов », затем в разделе « Общие» снимите флажок « Редактируемые» и «По умолчанию» в поле « Тип значения по умолчанию » maximum("FID") + 1.

Сняв флажок Редактируемый , вы не сможете ввести другое значение или удалить то, что там есть. Обратите внимание, что если есть значения без идентификатора, эти значения не будут обновляться. В какой-то момент я поэкспериментирую с проверкой Применить значение по умолчанию при обновлении и пересмотрю формулу, чтобы проверить нулевое значение или значение NULL, чтобы обновлять только те записи, когда они редактируются, а не любые записи со значением больше 1. (Ранее в этом после этого обсуждалось, как обновить поле FID с уникальными значениями, что вам нужно будет сделать, если вы добавили поле после того, как в шейп-файле уже были элементы.)

Обратите внимание, что это сохраняется с текущим файлом карты, а не с шейп-файлом, поэтому добавление этого шейп-файла несколько раз потребует от вас скопировать эту часть стиля слоя во вновь добавленный слой. Для этого щелкните правой кнопкой мыши слой, выберите « Стили»> «Копировать стиль»> «Поля» и щелкните правой кнопкой мыши другой слой, выберите « Стили»> «Вставить стиль»> «Все категории стилей» (или перейдите к « Полям» ). Вы также можете скопировать эту часть стиля в любой другой слой на основе шейп-файла, но поле ID должно иметь то же имя, что и слой, с которого вы копируете.

Свойства слоя


Обратите внимание, что для этого вам нужно как минимум создать один объект и ввести его FID, а затем изменить форму атрибута Значение по умолчанию. В противном случае вы получите NULL FID.
— Techie_Gus

5

Я хотел бы добавить к сообщению Винаяна и кратко упомянуть функцию rownum , поскольку она очень похожа, а в некоторых случаях может быть немного более удобной.

введите описание изображения здесь

id возвращает идентификатор функции , что означает, что он всегда начинается с нуля .
rownum возвращает номер строки , что означает, что он начинается с единицы .

введите описание изображения здесь

Итак, в основном, если вы хотите, чтобы автоинкремент начинался с 0, перейдите к $ id , а если вы хотите, чтобы он начинался с 1, тогда перейдите к $ rownum .


Пробовал, а также действительно хорошее решение. Но с этим решением, если у вас уже есть некоторые идентификаторы и вы хотите сохранить их, функция rownum не годится. Эта функция всегда начинается с 1. Путь выше - намного разумнее, хотя его сложнее настроить. Так что спасибо за альтернативу, но на данный момент функция ID является моим предпочтительным решением =)
— kwoxer

4

Эта тема возникла здесь: создание шейп-файла с автоматическим приращением первичного ключа в QGIS

Мои предложения будут:

1) Базы данных SQLITE / SpatialLite поддерживают автоинкремент для поля, установленного в INTEGER PRIMARY KEY:

В INSERT, если столбцу ROWID или INTEGER PRIMARY KEY явно не дано значение, он будет автоматически заполнен неиспользуемым целым числом, обычно на единицу больше, чем самый большой ROWID, используемый в настоящее время. Это верно независимо от того, используется ли ключевое слово AUTOINCREMENT.

Каждый раз, когда вы редактируете / создаете полигоны, вы можете заполнять их атрибуты, и SQLITE будет давать ему уникальное добавочное значение в поле, для которого вы установили тип INTEGER PRIMARY KEY.

Когда вы будете готовы к экспорту в GEOJSON, все готово для использования ваших уникальных идентификаторов.

2) При использовании шейп-файлов создайте поле OBJECTID типа INTEGER и используйте выражение калькулятора полей, чтобы заполнять это поле каждый раз, когда вы редактируете / создаете полигоны и должны экспортировать их. Вы потеряете оригинальный идентификатор, который когда-то был у многоугольника, но это единственный способ добиться этого с помощью .SHP. (Мне нужно будет найти выражение поля калькулятора).

PostGIS - это еще один источник данных, который вы, возможно, захотите исследовать, хотя в большей степени, чем SQLITE, вы можете найти ценность в такой системе по мере продвижения вперед ...


Спасибо за объяснение. Но я не думаю, что это будет хорошим решением вместо опции auto_increment прямо в инструменте. У меня уже есть так много форматов данных, и я не хочу использовать еще один инструмент. Может быть, я должен написать дополнение для этого, когда у меня есть время ...
— kwoxer

Может быть проще отказаться от .SHP! Кто знает, на какие новые проекты он вас возьмет ...
— DPSSpatial,

2

Старый пост, но для тех, кто ищет быстрое решение, я должен был создать поле с $ ID + 1, и оно будет автоматически генерироваться, начиная с 1!


2

Обновление для QGIS 3

Я знаю, что опаздываю к этому, но всегда рад дать какие-либо обновления:

В QGIS 3 теперь есть встроенный инструмент, который можно использовать для выполнения этой точной работы, и он называется «Добавить автоинкрементное поле».

Нет необходимости использовать выражение в калькуляторе полей или выполнять какое-либо кодирование, но, тем не менее, все это все еще очень полезно и полезно знать.

введите описание изображения здесь


1

Самый простой способ сделать это, возможно, с помощью скрипта на Python или, возможно, с помощью калькулятора поля. Извините, у меня его нет, может быть, у кого-то еще. В то же время, я бы искал для него скрипт на Python. Я много видел об этом для ArcGIS, но я уверен, что есть кое-что для QGIS.


Что ж, лучше всего было бы, если бы на самом деле ничего не было, запрос функции. Я не хочу, чтобы Python-скрипт был дополнительным к QGIS, даже если это может быть решение в один клик. Но спасибо.
— Kwoxer

1

Если вам не нужно что-то по-человечески усваиваемое, теперь есть простое решение: в поле свойств выберите «Генератор UUID» и оставьте все пустым.

Это автоматически создаст UUID в поле. Не так дружелюбно, как простое число (согласно $ id или $ rownum), но генерирует UUID с самого начала, поэтому никаких последовательных шагов.введите описание изображения здесь


0

Я хотел бы добавить, что это не работает, когда вы используете слои базы данных postgreSQL. $ ID и $ rownum все возвращают 0. PostgreSQL 9.6 QGIS 2.18.12


0

эти решения больше не работали для меня в QGIS 2.01 Dufour. Ввод $idнового или существующего поля с именем 'id' в поле ввода выражения дал мне ошибку "Выражение недопустимо"

То, что сработало, было набрать функцию $rownumи нажать «ОК»

введите описание изображения здесь


0

Вы можете просто удалить первый столбец (id) и создать новый «Как виртуальное поле» введите описание изображения здесь введите описание изображения здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.