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

22

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

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

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

kwoxer
источник
Вы используете шейп-файлы? Должны ли идентификаторы быть одинаковыми после каждого экспорта, или вы могли бы заполнять поле идентификатора после каждого сеанса редактирования?
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 должно иметь то же имя, что и слой, с которого вы копируете.

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

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

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

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

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

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

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

BritishSteel
источник
Пробовал, а также действительно хорошее решение. Но с этим решением, если у вас уже есть некоторые идентификаторы и вы хотите сохранить их, функция 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, вы можете найти ценность в такой системе по мере продвижения вперед ...

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

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

Blipple
источник
2

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

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

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

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

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

AWGIS
источник
1

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

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

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

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

Horizen
источник
0

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

Тайлер Вейно
источник
0

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

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

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

томы
источник
0

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

Rtronic
источник