Выражение для сложной подписи

Вопросы по свободной ГИС QGIS. Сообщения об ошибках, предложения по улучшению, локализация.
Ответить
Аватара пользователя
chet2
Активный участник
Сообщения: 104
Зарегистрирован: 08 дек 2016, 09:46
Репутация: 6

Выражение для сложной подписи

Сообщение chet2 » 23 янв 2021, 13:42

Здравствуйте.
Есть таблица:
Спойлер
Изображение
Задача состоит в том, чтобы подписать объекты подписями, состоящими из двух “ярусов”.
Первый ярус – название объекта (поле objectname).
Второй ярус – описание (поле descript). Но если поле descript содержит восклицательный знак, то тогда его не нужно отрисовывать и в подписи должно остаться только название объекта.

Я составил выражение для подписи:

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

"objectname" + '\n' + CASE WHEN "descript" NOT LIKE '%!%' THEN "descript" END
Выражение работает, но не так как я ожидал. Если поле descript содержит восклицательный знак, то подпись не отрисовывается вовсе. А мне нужно, чтобы в этом случае отрисовывалось только название объекта.
Спойлер
Изображение
Помогите пожалуйста разобраться как решить вопрос.
Прилагаю архив с shape-файлом.
Вложения
objects.zip
(1.19 КБ) 151 скачивание

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2229
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1501
Откуда: Казань

Re: Выражение для сложной подписи

Сообщение Игорь Белов » 23 янв 2021, 15:33

Добавьте к условию альтернативу ELSE:

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

"objectname" + '\n' + CASE WHEN "descript" NOT LIKE '%!%' THEN "descript" ELSE '' END
Замечу, что для условий с бинарным выбором существует более простая функция if():

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

"objectname" + '\n' + if( "descript" NOT LIKE '%!%' , "descript" , '' )
The purpose of computing is insight, not numbers

Аватара пользователя
chet2
Активный участник
Сообщения: 104
Зарегистрирован: 08 дек 2016, 09:46
Репутация: 6

Re: Выражение для сложной подписи

Сообщение chet2 » 24 янв 2021, 09:47

Игорь Белов, спасибо вам большое за помощь!
Это ровно то чего я хотел и о чем спрашивал.

То что образуются пустые строки это абсолютно логично, ведь '\n' никуда не девается.
Спойлер
Изображение
Я подумал, что будет хорошо '\n' тоже как-нибудь завернуть в условие, чтобы не образовывалось пустых строк.
Если знаете как так сделать, расскажите пожалуйста.

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2229
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1501
Откуда: Казань

Re: Выражение для сложной подписи

Сообщение Игорь Белов » 24 янв 2021, 14:21

chet2 писал(а):
24 янв 2021, 09:47
Я подумал, что будет хорошо '\n' тоже как-нибудь завернуть в условие, чтобы не образовывалось пустых строк.
Если знаете как так сделать, расскажите пожалуйста.
Так:

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

"objectname" + if( "descript" NOT LIKE '%!%' , '\n' + "descript" , '' )
The purpose of computing is insight, not numbers

Аватара пользователя
chet2
Активный участник
Сообщения: 104
Зарегистрирован: 08 дек 2016, 09:46
Репутация: 6

Re: Выражение для сложной подписи

Сообщение chet2 » 24 янв 2021, 15:27

Игорь Белов, спасибо!
Последний вопрос.
Если нужно показывать objectname в рамках диапазона масштабов, а все остальные значения – всегда, то наверное единственный вариант это применение “Rule-based Labeling”?
Спойлер
Изображение
В этом случае подписи из поля objectname всегда отрисовываются немного отдельно от подписей значений.
Просто вдруг есть способ оставить objectname “в стеке” с подписями значений.

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2229
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1501
Откуда: Казань

Re: Выражение для сложной подписи

Сообщение Игорь Белов » 24 янв 2021, 19:22

Можно же для одного диапазона масштабов выводить "objectname" в комбинации с прочими полями, а для других диапазонов только комбинацию полей.
The purpose of computing is insight, not numbers

Аватара пользователя
chet2
Активный участник
Сообщения: 104
Зарегистрирован: 08 дек 2016, 09:46
Репутация: 6

Re: Выражение для сложной подписи

Сообщение chet2 » 25 янв 2021, 08:30

Игорь Белов, точно!
Спасибо вам большое, вы мне очень помогли.

Аватара пользователя
chet2
Активный участник
Сообщения: 104
Зарегистрирован: 08 дек 2016, 09:46
Репутация: 6

Re: Выражение для сложной подписи

Сообщение chet2 » 26 фев 2021, 09:40

Решил выводить два поля таблицы (descript2 и descript3) в одну сроку.
Для этого модифицировал выражение следующим образом:

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

if( "descript" NOT LIKE '%!%' , '\n' + "descript" , '' ) + if( "descript2" NOT LIKE '%!%' , '\n' + "descript2" , '' ) + if( "descript3" NOT LIKE '%!%' , ' ' + "descript3" , '' )
По сути я просто заменил переход на новую строку на пробел.

Рядовым (желанным) случаем является следующая ситуация:
Спойлер
Изображение
descript2 и descript3 – это отдельная последняя строка.
Все как надо.

Но в частных случаях происходит нежелательный эффект:
Спойлер
Изображение
Спойлер
Изображение
Значения descript2 и descript3 могут быть в паре или может присутствовать только одно из них, но ни descript2, ни descript3 не должны залезать на “чужие” (другие) строки.

Я не вижу сейчас возможности предусмотреть вариант при котором не будет происходить этого нежелательного эффекта.
Но если кто-то знает как решить этот вопрос – буду очень рад подсказке.

freeExec
Гуру
Сообщения: 1195
Зарегистрирован: 23 апр 2011, 10:32
Репутация: 205
Откуда: Ульяновск

Re: Выражение для сложной подписи

Сообщение freeExec » 26 фев 2021, 11:18

Так у вас же условие такое, если Описание3 без !, то просто его добавить без новой строки.

Аватара пользователя
chet2
Активный участник
Сообщения: 104
Зарегистрирован: 08 дек 2016, 09:46
Репутация: 6

Re: Выражение для сложной подписи

Сообщение chet2 » 26 фев 2021, 12:10

freeExec, в том-то и дело.
Выражение отрабатывает ровно так как и должно.
Просто я ищу вариант как нивелировать нежелательные эффекты для частных случаев.

Ответить

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

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

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