Страница 1 из 1
Нумерация объектов по значению семантики
Добавлено: 22 апр 2019, 19:29
Dezmond
Добрый вечер коллеги! Примитивная задача, никак ответ на ум не приходит. Вообщем есть колонка в таблице, значения в которой имеют повторения. Как автоматически заполнить другую колонку цифрами по уникальности объектов?
Пример: все значения "Т" получат цифру 1, все значения "Ж" цифру 2 и тд...
Объединение по атрибутам с дальнейшей нумерацией не подходит, тк в таблице есть другие важные колонки с необходимой информацией.
UPDATE Вообщем решение такое:
Устанавливаем модуль Group States, который считает статистику по заданным полям. После чего эту статистику можно сохранить в csv. Потом обновляю ее row_number и по сцепке с исходным слоем добавляю нумерацию для уникальных объектов.
Re: Нумерация объектов по значению семантики
Добавлено: 22 апр 2019, 21:19
Dmitry Stasev
- Если нужны просто цифры
- Если буква одна
Может этого достаточно:
Простую пользовательскую функцию в калькулятор подсунуть
Код: Выделить всё
from qgis.core import *
from qgis.gui import *
@qgsfunction(args='auto', group='Custom')
def ord0(value1, feature, parent):
""" Add some text here for documenting the function """
return ord(value1[0])
Re: Нумерация объектов по значению семантики
Добавлено: 23 апр 2019, 10:08
Dezmond
1. да нужны просто цифры.
2. Буква не одна, в полной задаче, это сцепка из нескольких полей.
Re: Нумерация объектов по значению семантики
Добавлено: 23 апр 2019, 10:15
Dmitry Stasev
Dezmond писал(а): ↑23 апр 2019, 10:08
Буква не одна, в полной задаче, это сцепка из нескольких полей.
Если комбинации предопределены заранее, можно словарик сделать и из него брать ID по ключу
Re: Нумерация объектов по значению семантики
Добавлено: 23 апр 2019, 10:18
Dmitry Stasev
Код: Выделить всё
# -*- coding: utf-8 -*-
from qgis.core import *
from qgis.gui import *
@qgsfunction(args='auto', group='Custom')
def idd(value1, feature, parent):
""" Add some text here for documenting the function """
dct = {u'А':1,u'Бб':2,u'Ввв':3,u'ГД':4}
return dct.get(value1)
Re: Нумерация объектов по значению семантики
Добавлено: 23 апр 2019, 11:01
Dezmond
сейчас мой код выглядит так
Код: Выделить всё
case
when "код"='Т' then '1'
when "код"='Ж' then '2'
when "код"='МФ' then '3'
end
Обобщающая примерно так
Код: Выделить всё
case
when "код" = 'first group name' then '1'
when "код" = 'second group name' then '2'
when "код" = 'third group name' then '3'
end
но все равно в ней нет автоматизации....
Извините за глупый вопрос, Ваш код подходит для калькулятора полей? немного не пойму

Re: Нумерация объектов по значению семантики
Добавлено: 23 апр 2019, 11:09
trir
но все равно в ней нет автоматизации....
потому что надо использовать реляционые БД и SQL
Re: Нумерация объектов по значению семантики
Добавлено: 23 апр 2019, 11:13
Dezmond
сейчас все в postgres, но работаю я в qgis, тк это удобнее
Re: Нумерация объектов по значению семантики
Добавлено: 23 апр 2019, 11:14
trir
сейчас все в postgres
так просто сделай
представление - и внём подставь значения
Re: Нумерация объектов по значению семантики
Добавлено: 23 апр 2019, 13:35
Dmitry Stasev
Dmitry Stasev писал(а): ↑22 апр 2019, 21:19
пользовательскую функцию в калькулятор подсунуть
В Калькуляторе есть редактор функций, делаете свою, загружаете, потом используете в выражении
Re: Нумерация объектов по значению семантики
Добавлено: 23 апр 2019, 14:07
Dezmond
в шапке обновил, свое решение задачи. Для калькулятора полей, нужно все значения туда подсунуть, а их не мало.
Re: Нумерация объектов по значению семантики
Добавлено: 23 апр 2019, 14:11
trir
так это можно сразу в БД делать без лишних движений
Re: Нумерация объектов по значению семантики
Добавлено: 23 апр 2019, 15:19
Dezmond
trir писал(а): ↑23 апр 2019, 14:11
так это можно сразу в БД делать без лишних движений
Дело привычки наверное... Я до сих пор не настроил что бы к БД можно было с рабочей станции подключаться. Приходится физически за сервер садится.
Re: Нумерация объектов по значению семантики
Добавлено: 23 апр 2019, 15:58
Dmitry Stasev
trir писал(а): ↑23 апр 2019, 14:11
так это можно сразу в БД делать без лишних движений
Поддерживаю.
Или хотя бы виртуальный слой:
Код: Выделить всё
with cte as (
select a.rowid as myId, a.myName from myTable a group by a.myName
)
select b.*, cte.myId
from myTable b
join cte on cte.myName = b.myName