Страница 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