Автоматическая нумерация

Вопросы по свободной ГИС QGIS. Сообщения об ошибках, предложения по улучшению, локализация.
Jensenaems
Интересующийся
Сообщения: 19
Зарегистрирован: 23 мар 2016, 09:38
Репутация: 2

Автоматическая нумерация

Сообщение Jensenaems » 13 апр 2016, 10:30

Здравствуйте, прошу помощи со следующей проблемой. У меня имеются несколько тысяч объектов и я пронумеровал их всех по порядку с использованием команды $rownum в поле. Но мне нужно добавить к ним ещё объекты и нужно чтобы нумерация продолжалась от последнего номера объекта. То есть если последний был 100 объект, то следующий добавленный 101, и т.д.Есть ли возможность чтобы qgis автоматически сам проставлял нумерацию всех этих объектов? И можно ли сделать чтобы он просто с 0 начал сам нумировал каждый объект?

Vladimir_R
Активный участник
Сообщения: 145
Зарегистрирован: 14 апр 2010, 14:11
Репутация: 44
Откуда: Екатеринбург

Re: Автоматическая нумерация

Сообщение Vladimir_R » 13 апр 2016, 11:28

Добрый день!

Сам QGis не умеет контролировать такие вещи, поэтому это нужно делать на уровне формата хранения данных.
Храните данные в БД (Postgres или SQLite), назначайте sequence для нужного поля и новые записи будут получать соответствующие значение.

Jensenaems
Интересующийся
Сообщения: 19
Зарегистрирован: 23 мар 2016, 09:38
Репутация: 2

Re: Автоматическая нумерация

Сообщение Jensenaems » 13 апр 2016, 12:51

Vladimir_R писал(а):Добрый день!

Сам QGis не умеет контролировать такие вещи, поэтому это нужно делать на уровне формата хранения данных.
Храните данные в БД (Postgres или SQLite), назначайте sequence для нужного поля и новые записи будут получать соответствующие значение.
А есть способ, чтобы если добавил несколько объектов, забил в поле команду и он пересчитал их все, но порядок объектов существующий до пересчёта не изменился?
Например у меня есть 100 объектов, я создал поле и добавил туда команду $id и он их пронумеровал в соответствии с идентификатором, но когда добавляешь новые объекты, то старые он оставляет с таким же номером, а новым даёт какие то -300 и т.п. С чем связано неправильная нумерация новых объектов? если это исправить, то будет работать как надо... в теории..

Vladimir_R
Активный участник
Сообщения: 145
Зарегистрирован: 14 апр 2010, 14:11
Репутация: 44
Откуда: Екатеринбург

Re: Автоматическая нумерация

Сообщение Vladimir_R » 13 апр 2016, 15:29

Можно написать функцию для калькулятора полей, например такую:
Спойлер

Код: Выделить всё

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')
Особенности: предполагается, что поле ID имеет тип int, в функции указывается название поля как строковая переменная.

Jensenaems
Интересующийся
Сообщения: 19
Зарегистрирован: 23 мар 2016, 09:38
Репутация: 2

Re: Автоматическая нумерация

Сообщение Jensenaems » 15 апр 2016, 14:47

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
И вызывать ее для вновь созданных объектов:

Код: Выделить всё

sequence('id')
Особенности: предполагается, что поле ID имеет тип int, в функции указывается название поля как строковая переменная.
Попробовал предложенным вами методом и он выдаёт ошибку:
Ошибка разбора:
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: Автоматическая нумерация

Сообщение Евгений Киевский » 09 окт 2017, 19:34

Jensenaems, можно уточнение? Как Вам удалось выполнить автоматическую нумерацию в QGIS с помощью калькулятора полей и функций $rownum и $id. Можно тут поподробнее.

Аватара пользователя
Crackfox
Активный участник
Сообщения: 131
Зарегистрирован: 02 мар 2016, 20:29
Репутация: 17
Ваше звание: разрядник
Откуда: Москва
Контактная информация:

Re: Автоматическая нумерация

Сообщение Crackfox » 15 июн 2018, 17:22

Евгений Киевский писал(а):
09 окт 2017, 19:34
Как Вам удалось выполнить автоматическую нумерацию в QGIS с помощью калькулятора полей и функций $rownum и $id. Можно тут поподробнее.
$rownum автоматически нумерует с единицы.

Хотим нумеровать с 400-ого id:

Код: Выделить всё

$rownum+399

Yurko16
Новоприбывший
Сообщения: 1
Зарегистрирован: 18 окт 2018, 16:15
Репутация: 0
Откуда: Иваново

Re: Автоматическая нумерация

Сообщение Yurko16 » 18 окт 2018, 16:27

Здравствуйте, дабы не плодить темы напишу сюда, тк вопрос в чем-то схожий.
Также имеется большое количество полигонов, которые нужно пронумеровать по порядку относительно сортировки по площади.
Пробовал проставить нумерацию с помощью @row_number, но номера ставятся рандомно.

Аватара пользователя
Yevgeniy Podol'skiy
Интересующийся
Сообщения: 17
Зарегистрирован: 31 июл 2022, 10:14
Репутация: 0
Откуда: none

Re: Автоматическая нумерация

Сообщение Yevgeniy Podol'skiy » 01 мар 2025, 19:34

Добрый день.
Пишу по вопросу автоматической нумерации отрезков линий.
Например есть 5 точек (1, 2, 3, 4, 5). Между ними проходят отрезки линий в виде стрелки.
Вопрос: как с помощью калькулятора полей автоматически пронумеровать эти отрезки линий на основе номеров точек, чтобы в каждое поле вписывались номера точек в таком виде: 1-2; 2-3; 3-4; 4-5

AlexRomantsov
Завсегдатай
Сообщения: 420
Зарегистрирован: 24 мар 2022, 05:54
Репутация: 162
Ваше звание: хм, сам не знал
Откуда: Томск

Re: Автоматическая нумерация

Сообщение AlexRomantsov » 03 мар 2025, 06:25

Ну например,

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 раз.

AlexRomantsov
Завсегдатай
Сообщения: 420
Зарегистрирован: 24 мар 2022, 05:54
Репутация: 162
Ваше звание: хм, сам не знал
Откуда: Томск

Re: Автоматическая нумерация

Сообщение AlexRomantsov » 03 мар 2025, 07:03

Вот так более полно, сортируем номера пересеченных точек, преобразуем в текстовый вид, заменяем запятую на пробел-тире-пробел, получим '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))
)
, ',' ,' - ')
Последний раз редактировалось AlexRomantsov 03 мар 2025, 11:02, всего редактировалось 1 раз.

AlexRomantsov
Завсегдатай
Сообщения: 420
Зарегистрирован: 24 мар 2022, 05:54
Репутация: 162
Ваше звание: хм, сам не знал
Откуда: Томск

Re: Автоматическая нумерация

Сообщение AlexRomantsov » 03 мар 2025, 07:41

это же выражение можно подставить в свойствах слоя Линии, формы полей, встать на заранее созданное текстовое поле для номеров точек, вставить это выражение в "По умолчанию" (и галочку "При изменении").
Тогда при создании (рисовании) отрезка линии по точкам, в атрибуты линии сразу подставится номера точек в виде '2-3'
Также, можно не сохранять это в виде атрибута линии, а просто подписать найденные запросом '3 - 4' на карте. Для этого, Свойства слоя линий, Надписи, Обычные подписи, вставить выражение в Значение. Любое изменение номера точки приведет к изменению подписи линии.

Аватара пользователя
Yevgeniy Podol'skiy
Интересующийся
Сообщения: 17
Зарегистрирован: 31 июл 2022, 10:14
Репутация: 0
Откуда: none

Re: Автоматическая нумерация

Сообщение Yevgeniy Podol'skiy » 05 мар 2025, 15:58

AlexRomantsov писал(а):
03 мар 2025, 07:41
это же выражение можно подставить в свойствах слоя Линии, формы полей, встать на заранее созданное текстовое поле для номеров точек, вставить это выражение в "По умолчанию" (и галочку "При изменении").
Тогда при создании (рисовании) отрезка линии по точкам, в атрибуты линии сразу подставится номера точек в виде '2-3'
Также, можно не сохранять это в виде атрибута линии, а просто подписать найденные запросом '3 - 4' на карте. Для этого, Свойства слоя линий, Надписи, Обычные подписи, вставить выражение в Значение. Любое изменение номера точки приведет к изменению подписи линии.
Огромная Вам благодарность за помощь.
Еще небольшой вопрос: а можно ли с помощью калькулятора полей QGIS автоматически построить отрезки линий по точкам? Например: выделяю несколько точек, открываю калькулятор полей для линий, ввожу функцию и нажимаю "ок". И отрезки линий все автоматом прорисовались по всем точкам.

AlexRomantsov
Завсегдатай
Сообщения: 420
Зарегистрирован: 24 мар 2022, 05:54
Репутация: 162
Ваше звание: хм, сам не знал
Откуда: Томск

Re: Автоматическая нумерация

Сообщение AlexRomantsov » 06 мар 2025, 05:09

А почему бы более традиционные способы не попробовать? Анализ - Вектор создание - Точки в контур, например? Открыли таблицу точек, выделили нужные 80 (и/или выделили на карте), вызвали Точки в контур (галочка - Только выделенные), получили полилинию. Потом Анализ - Вектор геометрия - Разбить линии на отрезки.
Либо свои Модели/Сценарии создавать, с кнопкой, если нужно годами сотни тысяч точек обрабатывать

Аватара пользователя
Yevgeniy Podol'skiy
Интересующийся
Сообщения: 17
Зарегистрирован: 31 июл 2022, 10:14
Репутация: 0
Откуда: none

Re: Автоматическая нумерация

Сообщение Yevgeniy Podol'skiy » 06 мар 2025, 18:59

AlexRomantsov писал(а):
06 мар 2025, 05:09
А почему бы более традиционные способы не попробовать? Анализ - Вектор создание - Точки в контур, например? Открыли таблицу точек, выделили нужные 80 (и/или выделили на карте), вызвали Точки в контур (галочка - Только выделенные), получили полилинию. Потом Анализ - Вектор геометрия - Разбить линии на отрезки.
Либо свои Модели/Сценарии создавать, с кнопкой, если нужно годами сотни тысяч точек обрабатывать
Попробовал это способ (стандартными средствами QGIS) и могу сказать, что он достаточно хороший, но он создает дополнительные слои, а мне нужно в одном существующем слое автоматически проставить отрезки линий на основе номеров опор.

Ответить

Вернуться в «QGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя