Я создаю вымышленную карту, и поэтому мне нужно создать много точек, линий и, конечно, многоугольников. Позже я экспортирую свои данные как геойсон. Но перед этим я должен пойти и дать каждому элементу уникальный идентификатор.
Мне не нужна особая сортировка, как самый большой полигон получает наименьший идентификатор или около того. Я просто нужно все многоугольники с к ID в конце концов, не делать это вручную , как я должен делать.
Было бы здорово, если бы кто-то знал, как это сделать.
Ответы:
Использование калькулятора поля - это путь:
ID не был указан в
Некоторые удостоверения личности уже даны в
источник
Аллилуйя! Или Эврика. Или что угодно. Это можно сделать. С шейп-файлом.
maximum("FID") + 1
.Сняв флажок Редактируемый , вы не сможете ввести другое значение или удалить то, что там есть. Обратите внимание, что если есть значения без идентификатора, эти значения не будут обновляться. В какой-то момент я поэкспериментирую с проверкой Применить значение по умолчанию при обновлении и пересмотрю формулу, чтобы проверить нулевое значение или значение NULL, чтобы обновлять только те записи, когда они редактируются, а не любые записи со значением больше 1. (Ранее в этом после этого обсуждалось, как обновить поле FID с уникальными значениями, что вам нужно будет сделать, если вы добавили поле после того, как в шейп-файле уже были элементы.)
Обратите внимание, что это сохраняется с текущим файлом карты, а не с шейп-файлом, поэтому добавление этого шейп-файла несколько раз потребует от вас скопировать эту часть стиля слоя во вновь добавленный слой. Для этого щелкните правой кнопкой мыши слой, выберите « Стили»> «Копировать стиль»> «Поля» и щелкните правой кнопкой мыши другой слой, выберите « Стили»> «Вставить стиль»> «Все категории стилей» (или перейдите к « Полям» ). Вы также можете скопировать эту часть стиля в любой другой слой на основе шейп-файла, но поле ID должно иметь то же имя, что и слой, с которого вы копируете.
источник
Я хотел бы добавить к сообщению Винаяна и кратко упомянуть функцию rownum , поскольку она очень похожа, а в некоторых случаях может быть немного более удобной.
id возвращает идентификатор функции , что означает, что он всегда начинается с нуля .
rownum возвращает номер строки , что означает, что он начинается с единицы .
Итак, в основном, если вы хотите, чтобы автоинкремент начинался с 0, перейдите к $ id , а если вы хотите, чтобы он начинался с 1, тогда перейдите к $ rownum .
источник
Эта тема возникла здесь: создание шейп-файла с автоматическим приращением первичного ключа в QGIS
Мои предложения будут:
1) Базы данных SQLITE / SpatialLite поддерживают автоинкремент для поля, установленного в INTEGER PRIMARY KEY:
Каждый раз, когда вы редактируете / создаете полигоны, вы можете заполнять их атрибуты, и SQLITE будет давать ему уникальное добавочное значение в поле, для которого вы установили тип INTEGER PRIMARY KEY.
Когда вы будете готовы к экспорту в GEOJSON, все готово для использования ваших уникальных идентификаторов.
2) При использовании шейп-файлов создайте поле OBJECTID типа INTEGER и используйте выражение калькулятора полей, чтобы заполнять это поле каждый раз, когда вы редактируете / создаете полигоны и должны экспортировать их. Вы потеряете оригинальный идентификатор, который когда-то был у многоугольника, но это единственный способ добиться этого с помощью .SHP. (Мне нужно будет найти выражение поля калькулятора).
PostGIS - это еще один источник данных, который вы, возможно, захотите исследовать, хотя в большей степени, чем SQLITE, вы можете найти ценность в такой системе по мере продвижения вперед ...
источник
Старый пост, но для тех, кто ищет быстрое решение, я должен был создать поле с $ ID + 1, и оно будет автоматически генерироваться, начиная с 1!
источник
Обновление для QGIS 3
Я знаю, что опаздываю к этому, но всегда рад дать какие-либо обновления:
В QGIS 3 теперь есть встроенный инструмент, который можно использовать для выполнения этой точной работы, и он называется «Добавить автоинкрементное поле».
Нет необходимости использовать выражение в калькуляторе полей или выполнять какое-либо кодирование, но, тем не менее, все это все еще очень полезно и полезно знать.
источник
Самый простой способ сделать это, возможно, с помощью скрипта на Python или, возможно, с помощью калькулятора поля. Извините, у меня его нет, может быть, у кого-то еще. В то же время, я бы искал для него скрипт на Python. Я много видел об этом для ArcGIS, но я уверен, что есть кое-что для QGIS.
источник
Если вам не нужно что-то по-человечески усваиваемое, теперь есть простое решение: в поле свойств выберите «Генератор UUID» и оставьте все пустым.
Это автоматически создаст UUID в поле. Не так дружелюбно, как простое число (согласно $ id или $ rownum), но генерирует UUID с самого начала, поэтому никаких последовательных шагов.
источник
Я хотел бы добавить, что это не работает, когда вы используете слои базы данных postgreSQL. $ ID и $ rownum все возвращают 0. PostgreSQL 9.6 QGIS 2.18.12
источник
эти решения больше не работали для меня в QGIS 2.01 Dufour. Ввод
$id
нового или существующего поля с именем 'id' в поле ввода выражения дал мне ошибку "Выражение недопустимо"То, что сработало, было набрать функцию
$rownum
и нажать «ОК»источник
Вы можете просто удалить первый столбец (id) и создать новый «Как виртуальное поле»
источник