Автоматическая нумерация
-
- Интересующийся
- Сообщения: 19
- Зарегистрирован: 23 мар 2016, 09:38
- Репутация: 2
Автоматическая нумерация
Здравствуйте, прошу помощи со следующей проблемой. У меня имеются несколько тысяч объектов и я пронумеровал их всех по порядку с использованием команды $rownum в поле. Но мне нужно добавить к ним ещё объекты и нужно чтобы нумерация продолжалась от последнего номера объекта. То есть если последний был 100 объект, то следующий добавленный 101, и т.д.Есть ли возможность чтобы qgis автоматически сам проставлял нумерацию всех этих объектов? И можно ли сделать чтобы он просто с 0 начал сам нумировал каждый объект?
-
- Активный участник
- Сообщения: 145
- Зарегистрирован: 14 апр 2010, 14:11
- Репутация: 44
- Откуда: Екатеринбург
Re: Автоматическая нумерация
Добрый день!
Сам QGis не умеет контролировать такие вещи, поэтому это нужно делать на уровне формата хранения данных.
Храните данные в БД (Postgres или SQLite), назначайте sequence для нужного поля и новые записи будут получать соответствующие значение.
Сам QGis не умеет контролировать такие вещи, поэтому это нужно делать на уровне формата хранения данных.
Храните данные в БД (Postgres или SQLite), назначайте sequence для нужного поля и новые записи будут получать соответствующие значение.
-
- Интересующийся
- Сообщения: 19
- Зарегистрирован: 23 мар 2016, 09:38
- Репутация: 2
Re: Автоматическая нумерация
А есть способ, чтобы если добавил несколько объектов, забил в поле команду и он пересчитал их все, но порядок объектов существующий до пересчёта не изменился?Vladimir_R писал(а):Добрый день!
Сам QGis не умеет контролировать такие вещи, поэтому это нужно делать на уровне формата хранения данных.
Храните данные в БД (Postgres или SQLite), назначайте sequence для нужного поля и новые записи будут получать соответствующие значение.
Например у меня есть 100 объектов, я создал поле и добавил туда команду $id и он их пронумеровал в соответствии с идентификатором, но когда добавляешь новые объекты, то старые он оставляет с таким же номером, а новым даёт какие то -300 и т.п. С чем связано неправильная нумерация новых объектов? если это исправить, то будет работать как надо... в теории..
-
- Активный участник
- Сообщения: 145
- Зарегистрирован: 14 апр 2010, 14:11
- Репутация: 44
- Откуда: Екатеринбург
Re: Автоматическая нумерация
Можно написать функцию для калькулятора полей, например такую:
И вызывать ее для вновь созданных объектов:
Особенности: предполагается, что поле ID имеет тип int, в функции указывается название поля как строковая переменная.
Спойлер
Код: Выделить всё
from qgis.core import *
from qgis.gui import *
from qgis.utils import iface
@qgsfunction(args='auto', group='Custom')
def sequence(value, feature, parent):
res = 0
layer = iface.activeLayer()
idx = layer.fieldNameIndex(value)
data = []
for f in layer.getFeatures():
if(type(f.attributes()[idx]) is int):
data.append(f.attributes()[idx])
if(data):
res = max(data)
return res + 1
Код: Выделить всё
sequence('id')
-
- Интересующийся
- Сообщения: 19
- Зарегистрирован: 23 мар 2016, 09:38
- Репутация: 2
Re: Автоматическая нумерация
Попробовал предложенным вами методом и он выдаёт ошибку:Vladimir_R писал(а):Можно написать функцию для калькулятора полей, например такую:И вызывать ее для вновь созданных объектов:Спойлер
Код: Выделить всё
from qgis.core import * from qgis.gui import * from qgis.utils import iface @qgsfunction(args='auto', group='Custom') def sequence(value, feature, parent): res = 0 layer = iface.activeLayer() idx = layer.fieldNameIndex(value) data = [] for f in layer.getFeatures(): if(type(f.attributes()[idx]) is int): data.append(f.attributes()[idx]) if(data): res = max(data) return res + 1
Особенности: предполагается, что поле ID имеет тип int, в функции указывается название поля как строковая переменная.Код: Выделить всё
sequence('id')
Ошибка разбора:
syntax error, unexpected COLUMN_REF, expecting $end
Ошибка выполнения:
Ошибка обработки. Не найден корневой элемент.
Похоже я делаю что-то не так. Можете объяснить по подробней?
Поле Id у меня имеет тип int, а второе поле я назвал "nomer".
До этого использовал функцию CASE WHEN "nomer" > 0 THEN nomer ELSE $rownum END
но он тогда нумеровал в продолжении порядка, который у поля id, т.е. в середине поля появились новые объекты и он назвал их 12,13,14, а есть объекты с номером 1,2,3 и т.д. и 20, 21,22 и т.д. Но это не то. Не могу найти как бы заставить его брать последний номер из id.
-
- Новоприбывший
- Сообщения: 1
- Зарегистрирован: 30 сен 2017, 19:47
- Репутация: 0
- Откуда: Киев
Re: Автоматическая нумерация
Jensenaems, можно уточнение? Как Вам удалось выполнить автоматическую нумерацию в QGIS с помощью калькулятора полей и функций $rownum и $id. Можно тут поподробнее.
- Crackfox
- Активный участник
- Сообщения: 131
- Зарегистрирован: 02 мар 2016, 20:29
- Репутация: 17
- Ваше звание: разрядник
- Откуда: Москва
- Контактная информация:
Re: Автоматическая нумерация
$rownum автоматически нумерует с единицы.Евгений Киевский писал(а): ↑09 окт 2017, 19:34Как Вам удалось выполнить автоматическую нумерацию в QGIS с помощью калькулятора полей и функций $rownum и $id. Можно тут поподробнее.
Хотим нумеровать с 400-ого id:
Код: Выделить всё
$rownum+399
-
- Новоприбывший
- Сообщения: 1
- Зарегистрирован: 18 окт 2018, 16:15
- Репутация: 0
- Откуда: Иваново
Re: Автоматическая нумерация
Здравствуйте, дабы не плодить темы напишу сюда, тк вопрос в чем-то схожий.
Также имеется большое количество полигонов, которые нужно пронумеровать по порядку относительно сортировки по площади.
Пробовал проставить нумерацию с помощью @row_number, но номера ставятся рандомно.
Также имеется большое количество полигонов, которые нужно пронумеровать по порядку относительно сортировки по площади.
Пробовал проставить нумерацию с помощью @row_number, но номера ставятся рандомно.
- Yevgeniy Podol'skiy
- Интересующийся
- Сообщения: 17
- Зарегистрирован: 31 июл 2022, 10:14
- Репутация: 0
- Откуда: none
Re: Автоматическая нумерация
Добрый день.
Пишу по вопросу автоматической нумерации отрезков линий.
Например есть 5 точек (1, 2, 3, 4, 5). Между ними проходят отрезки линий в виде стрелки.
Вопрос: как с помощью калькулятора полей автоматически пронумеровать эти отрезки линий на основе номеров точек, чтобы в каждое поле вписывались номера точек в таком виде: 1-2; 2-3; 3-4; 4-5
Пишу по вопросу автоматической нумерации отрезков линий.
Например есть 5 точек (1, 2, 3, 4, 5). Между ними проходят отрезки линий в виде стрелки.
Вопрос: как с помощью калькулятора полей автоматически пронумеровать эти отрезки линий на основе номеров точек, чтобы в каждое поле вписывались номера точек в таком виде: 1-2; 2-3; 3-4; 4-5
-
- Завсегдатай
- Сообщения: 420
- Зарегистрирован: 24 мар 2022, 05:54
- Репутация: 162
- Ваше звание: хм, сам не знал
- Откуда: Томск
Re: Автоматическая нумерация
Ну например,
array_to_string( overlay_nearest( 'point_514e17a9_a63f_4a4e_b471_e8632744061a', expression:= "num_o", limit:= -1, max_distance:= 0.0005))
вернет для отрезка массив результатов '3,4'. Этот массив немного доработайте вторым шагом, что бы '3 - 4' .
В выражении:
- 'point_51..' : слой точек, подставить свой
- expression:= "num_o" : поле с номерами точек, могут быть и текстом (как 3А/1), подставте свое имя поля точечного слоя;
- limit:= -1 : сколько в результат, -1 значит все пересеченные
- max_distance:= 0.0005 : чувствительность поиска, здесь тестировал все в WGS (градусы), если у вас метрические проекции, можно ввести в метрах (например 5)
array_to_string( overlay_nearest( 'point_514e17a9_a63f_4a4e_b471_e8632744061a', expression:= "num_o", limit:= -1, max_distance:= 0.0005))
вернет для отрезка массив результатов '3,4'. Этот массив немного доработайте вторым шагом, что бы '3 - 4' .
В выражении:
- 'point_51..' : слой точек, подставить свой
- expression:= "num_o" : поле с номерами точек, могут быть и текстом (как 3А/1), подставте свое имя поля точечного слоя;
- limit:= -1 : сколько в результат, -1 значит все пересеченные
- max_distance:= 0.0005 : чувствительность поиска, здесь тестировал все в WGS (градусы), если у вас метрические проекции, можно ввести в метрах (например 5)
Последний раз редактировалось AlexRomantsov 03 мар 2025, 11:02, всего редактировалось 1 раз.
-
- Завсегдатай
- Сообщения: 420
- Зарегистрирован: 24 мар 2022, 05:54
- Репутация: 162
- Ваше звание: хм, сам не знал
- Откуда: Томск
Re: Автоматическая нумерация
Вот так более полно, сортируем номера пересеченных точек, преобразуем в текстовый вид, заменяем запятую на пробел-тире-пробел, получим '3 - 4'
replace(
array_to_string(
array_sort( overlay_nearest( 'point_514e17a9_a63f_4a4e_b471_e8632744061a', expression:= "num_o", limit:= -1, max_distance:= 0.0005))
)
, ',' ,' - ')
replace(
array_to_string(
array_sort( overlay_nearest( 'point_514e17a9_a63f_4a4e_b471_e8632744061a', expression:= "num_o", limit:= -1, max_distance:= 0.0005))
)
, ',' ,' - ')
Последний раз редактировалось AlexRomantsov 03 мар 2025, 11:02, всего редактировалось 1 раз.
-
- Завсегдатай
- Сообщения: 420
- Зарегистрирован: 24 мар 2022, 05:54
- Репутация: 162
- Ваше звание: хм, сам не знал
- Откуда: Томск
Re: Автоматическая нумерация
это же выражение можно подставить в свойствах слоя Линии, формы полей, встать на заранее созданное текстовое поле для номеров точек, вставить это выражение в "По умолчанию" (и галочку "При изменении").
Тогда при создании (рисовании) отрезка линии по точкам, в атрибуты линии сразу подставится номера точек в виде '2-3'
Также, можно не сохранять это в виде атрибута линии, а просто подписать найденные запросом '3 - 4' на карте. Для этого, Свойства слоя линий, Надписи, Обычные подписи, вставить выражение в Значение. Любое изменение номера точки приведет к изменению подписи линии.
Тогда при создании (рисовании) отрезка линии по точкам, в атрибуты линии сразу подставится номера точек в виде '2-3'
Также, можно не сохранять это в виде атрибута линии, а просто подписать найденные запросом '3 - 4' на карте. Для этого, Свойства слоя линий, Надписи, Обычные подписи, вставить выражение в Значение. Любое изменение номера точки приведет к изменению подписи линии.
- Yevgeniy Podol'skiy
- Интересующийся
- Сообщения: 17
- Зарегистрирован: 31 июл 2022, 10:14
- Репутация: 0
- Откуда: none
Re: Автоматическая нумерация
Огромная Вам благодарность за помощь.AlexRomantsov писал(а): ↑03 мар 2025, 07:41 это же выражение можно подставить в свойствах слоя Линии, формы полей, встать на заранее созданное текстовое поле для номеров точек, вставить это выражение в "По умолчанию" (и галочку "При изменении").
Тогда при создании (рисовании) отрезка линии по точкам, в атрибуты линии сразу подставится номера точек в виде '2-3'
Также, можно не сохранять это в виде атрибута линии, а просто подписать найденные запросом '3 - 4' на карте. Для этого, Свойства слоя линий, Надписи, Обычные подписи, вставить выражение в Значение. Любое изменение номера точки приведет к изменению подписи линии.
Еще небольшой вопрос: а можно ли с помощью калькулятора полей QGIS автоматически построить отрезки линий по точкам? Например: выделяю несколько точек, открываю калькулятор полей для линий, ввожу функцию и нажимаю "ок". И отрезки линий все автоматом прорисовались по всем точкам.
-
- Завсегдатай
- Сообщения: 420
- Зарегистрирован: 24 мар 2022, 05:54
- Репутация: 162
- Ваше звание: хм, сам не знал
- Откуда: Томск
Re: Автоматическая нумерация
А почему бы более традиционные способы не попробовать? Анализ - Вектор создание - Точки в контур, например? Открыли таблицу точек, выделили нужные 80 (и/или выделили на карте), вызвали Точки в контур (галочка - Только выделенные), получили полилинию. Потом Анализ - Вектор геометрия - Разбить линии на отрезки.
Либо свои Модели/Сценарии создавать, с кнопкой, если нужно годами сотни тысяч точек обрабатывать
Либо свои Модели/Сценарии создавать, с кнопкой, если нужно годами сотни тысяч точек обрабатывать
- Yevgeniy Podol'skiy
- Интересующийся
- Сообщения: 17
- Зарегистрирован: 31 июл 2022, 10:14
- Репутация: 0
- Откуда: none
Re: Автоматическая нумерация
Попробовал это способ (стандартными средствами QGIS) и могу сказать, что он достаточно хороший, но он создает дополнительные слои, а мне нужно в одном существующем слое автоматически проставить отрезки линий на основе номеров опор.AlexRomantsov писал(а): ↑06 мар 2025, 05:09 А почему бы более традиционные способы не попробовать? Анализ - Вектор создание - Точки в контур, например? Открыли таблицу точек, выделили нужные 80 (и/или выделили на карте), вызвали Точки в контур (галочка - Только выделенные), получили полилинию. Потом Анализ - Вектор геометрия - Разбить линии на отрезки.
Либо свои Модели/Сценарии создавать, с кнопкой, если нужно годами сотни тысяч точек обрабатывать
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость