Я пытаюсь создать карту для распечатки, и размер моих полигонов сильно варьируется. Поскольку это будет справочная карта, мне нужно пометить каждый полигон, но некоторые имена не будут вписываться в полигон. В этих случаях я хотел бы использовать вместо этого идентификатор функции, а затем таблицу атрибутов связать идентификатор с именем.
То, что я хотел бы сделать, это иметь какое-то выражение, которое я могу использовать, чтобы выбрать, какую метку использовать на карте и какие строки включить в таблицу атрибутов. Нечто подобное isLabelled
могло бы учитывать масштаб карты, длину надписи, размер шрифта и т. Д.
qgis
labeling
print-composer
qgis-custom-function
Ян Тертон
источник
источник
Ответы:
Вот несколько приблизительный (но, надеюсь, эффективный) способ сделать это.
Сначала немного математики. Нам нужно выяснить, сколько символов с определенным размером шрифта может содержать функция. Вот что нужно знать / предположения:
Чтобы определить, как долго элемент находится на экране / распечатке, мы можем использовать его самое длинное измерение (длину или высоту или просто длину, если ваши надписи только горизонтальные) / масштаб * 100 (чтобы перейти от М к СМ)
Тогда мы можем увидеть, подойдет ли наш лейбл.
Вы можете сделать все это в движке выражений, но пользовательское выражение Python будет более эффективным. Вот учебник о том, как его создать.
Мое собственное выражение:
Затем просто используйте это выражение в метке:
Вам, конечно, нужно будет подключить любой атрибут, который вы на самом деле используете, и изменить размер шрифта с 8 на тот, который вы используете. Кроме того, поскольку шрифты сильно различаются, вам, возможно, придется немного подправить его, чтобы он выглядел правильно.
Вы также можете использовать это выражение для таких вещей, как изменение цвета в зависимости от того, подходит метка или нет.
Чтобы использовать это выражение вне холста карты (т.е. в метке композитора или в таблице атрибутов), нам нужен способ программно получить масштаб данного элемента карты. Я разместил код для выполнения этого в другом ответе здесь . Метод там дает нам выражение getScale ('имя композитора', 'имя_карты'), чтобы включить его в наше выражение:
источник
Дублируйте слой, один без символов, и установите различные уровни масштабирования / настройки препятствий для меток для каждого.
источник
У меня была похожая ситуация с обязательством маркировать каждую дорогу в слое дороги. Мое решение состояло в том, чтобы создать холст большего размера, экспортировать в PDF, а затем распечатать PDF-файл до требуемого размера.
Например, готовый продукт должен был быть A3. На холсте на А3 я не смог уместить все надписи. Поэтому я сделал холст A2, и это позволило увидеть все этикетки. Создайте PDF карту размера А2 и распечатайте ее как A3.
источник