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

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

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

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

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

Vladimir_R
Активный участник
Сообщения: 141
Зарегистрирован: 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
Активный участник
Сообщения: 141
Зарегистрирован: 14 апр 2010, 14:11
Репутация: 44
Откуда: Екатеринбург

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

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

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

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

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 писал(а):Можно написать функцию для калькулятора полей, например такую:
sequenceShow

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

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
Участник
Сообщения: 72
Зарегистрирован: 02 мар 2016, 20:29
Репутация: 9

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

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

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

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

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

$rownum+399

Ответить

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

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

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