Данные определяют положение метки для нескольких масштабов в одном слое

9

Я ищу лучшее решение для маркировки для моих проектов. Это кажется трудным - но, может быть, я просто слепой?

Мои проекты: я создаю печатные велосипедные книги. Основной масштаб составляет 1: 75 КБ, есть городской масштаб 10 КБ и общий обзор 200 КБ. Поскольку мне нравится иметь «картографическое» качество размещения этикеток, я касаюсь каждой отдельной этикетки и перемещаю ее в лучшую позицию. Я должен сделать это для каждой отдельной шкалы, чтобы мои столбцы с метками для трех шкал выглядели так («шкала 1» обозначает 10k, «шкала 2» - 75k, а «шкала 3» - 200k):

введите описание изображения здесь

Но прежде чем я попытаюсь объяснить подробно, я строю этот простой Пример-Проект, где вы можете увидеть и протестировать мое (старое) решение для маркировки для 3 шкал: http://www.map-site.de/tmp/LabelingExample.zip

Ну, это работает, но:

  • Вам нужно маркировать столбцы для каждого масштаба
  • Вам нужен слой для каждого масштаба

Я ищу гораздо лучшее решение без дублирующих слоев и множества столбцов. Я рассчитываю на ваши творческие умы!

РЕДАКТИРОВАТЬ: я добавил эти две очень плотные карты в качестве примеров:

введите описание изображения здесь

Есть только одна возможная позиция для «Святого Павла Дом», и это не какой-то квадрант: введите описание изображения здесь

Каждый ярлык должен быть перемещен вручную. Некоторые из меток не в квадранте.

КАРТА
источник
Должны ли ярлыки соответствовать определенным критериям? Я не понимаю, что вы имеете в виду под «лучшей позицией».
Мгри
1
Под «лучшей позицией» я подразумеваю позицию согласно картографическим требованиям. Это более субъективно.
КАРТА
2
Я обнаружил, что в вашем примере используется шрифт «Noto Sans», которого у меня нет, и я полагаю, что так будет и с другими. Вы можете скачать шрифт здесь google.com/get/noto. После установки шрифтов необходимо перезапустить QGIS.
TJ Рокфеллер
Спасибо за добавление этой ссылки - это стандартный шрифт моей установки Mint.
КАРТА

Ответы:

6

Я должен сказать, что то, что вы запрашиваете, немного сложнее, потому что вы хотите, чтобы маркировка была видна как в небольшом масштабе, так и в большом масштабе (лучше всего подходит). Итак, идея здесь в том, как разместить точку, которая может быть видна в разных масштабах.

После нескольких испытаний я обнаружил, что вместо создания нескольких столбцов для каждого диапазона шкалы и размещения координат для x и y в фиксированных точках, вы можете создать только один столбец для приоритетных позиций для каждой точки для лучшего местоположения, как вы можете видеть ниже (I следуйте местам в вашем файле):

введите описание изображения здесь

Затем вы идете в Layer propoerties -> Labels -> Placement -> Offset from pointили Around pointоба в порядке, но я выбрал Offset from point.

  1. В QuadrantВыберите Data defined override -> Editи введите следующую формулу:

    введите описание изображения здесь

    CASE 
    WHEN  $scale >= 200000 THEN  "priority"  
    WHEN  $scale < 200000 and $scale >= 75000 THEN  "priority"   
    WHEN  $scale < 75000 and $scale >=10000 THEN  5
    WHEN  $scale < 10000 THEN 2 
    END
    

    Здесь "Priority"- расположение точек, определенных в имени поляPriority

  2. Вам нужно использовать смещение, чтобы сместить точки для лучшей видимости, и я использовал следующую формулу:

    CASE
    WHEN  $scale >= 200000 THEN '0.001,0'
    WHEN  $scale < 200000 and $scale >= 75000 THEN '0.001,0'
    WHEN  $scale < 75000 and $scale >=10000 THEN '0.0005,0'
    WHEN  $scale < 10000 THEN '0.0001,0'
    END
    

Вот вывод в разных масштабах:

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Чтобы увидеть, что представляет каждое число [0-8], в каком месте, пожалуйста, посмотрите на следующее изображение:

введите описание изображения здесь

Вы можете контролировать положение меток, добавляя значение, соответствующее каждой позиции. Но, к сожалению, вы не можете сделать это методом «нажми и двигай». Вы должны сделать это в таблице атрибутов.

Обновить:

Исходя из вашего требования, что 9 квадрантных позиций недостаточно, я обнаружил, что если вы выберете Cartographyвместо Offset from pointи выберите приоритет, как на рисунке ниже, у вас будет 12 приоритетных позиций вместо 9. Вам нужно создать поле Textтипа, затем ставьте только ту аббревиатуру, которую вы хотите для лучшей позиции 'TL', 'TSL', 'T' ... и т. д. Кроме того, вы можете ввести расстояние, чтобы метка не закрывала точку.

введите описание изображения здесь

ahmadhanb
источник
Такого подхода я не пробовал до сих пор. Видите ли вы, как разместить метку в квадранте «щелкни и двигай»?
MAP
К сожалению, вы не можете сделать это методом «нажми и двигай». Вы должны сделать это в таблице атрибутов. Но добавление 1 столбца лучше, чем 6 столбцов для каждого уровня шкалы x, y. Я обновил свой ответ.
Ахмадханб
1
В последние дни я также пытался дать решение, но я сдался, потому что я думал, что проблема была слишком субъективной, чтобы предложить более общее решение. Вместо этого решение @ahmadhanb кажется достаточно креативным для этого (хотя я его не тестировал). +1 для меня.
МГРИТЕ
Я с тобой согласен. Субъективность здесь высока. Это в основном личное мнение о том, как вы можете судить о расположении этикеток, если они подходят или нет.
Ахмадханб
1
Не используйте инструмент идентификации для редактирования приоритетных мест, лучше использовать инструмент выбора. Откройте таблицу атрибутов и выберите только показать выбранные точки. Запустите сеанс редактирования, обновите местоположение и сохраните изменения. Расположение приоритета будет обновлено напрямую, если вы уже добавили выражение в переопределенные данные.
Ахмадханб
2

Вы можете избавиться от нескольких слоев, используя выражения.

Из того, что я мог видеть в вашем примере, основное различие между слоями - это Data defined Coordinate X Yопределения, указывающие на различные значения масштаба x, y.

Вы можете сделать это в одном слое, выбрав раскрывающиеся списки рядом с X и Y и выбрав edit ..., который вызовет построитель строки выражения.

Для X вы можете использовать что-то вроде

if(@map_scale <=10000, "scale1-x", if(@map_scale <=75000, "scale2-x", "scale3-x"))

И для Y вы можете использовать что-то вроде

if(@map_scale <=10000,  "scale1-y" , if(@map_scale <=75000, "scale2-y", "scale3-y"))

При этом следует использовать значения scale1 x, y, если масштаб карты меньше или равен 1: 10000, и масштаб 2 x, y, если масштаб карты меньше или равен 1: 75 000, и масштаб 3 x, y для всего, что выше ,

Если вам нужно вручную позиционировать для каждого масштаба, я не вижу, как вы можете отойти от столбцов scale # -x и scale # -y для каждого определенного вами уровня.

Ти Джей Рокфеллер
источник
У меня высокая судьба этикеток с разным весом. Я должен разместить их вручную, поскольку никакой автоматизм не может сделать это «настоящим» картографическим способом. И карты будут печататься и обновляться каждый год, поэтому маркировка должна быть несколько статичной. en.wikipedia.org/wiki/Cartographic_labeling#Placement
MAP
@MAP ОК, так что вы знаете, что вам нужно вручную позиционировать элементы, вам просто нужно меньше слоев и столбцов.
TJ Рокфеллер
Это помогает для отображения меток 3 шкал только с одним слоем. Но QGIS не может «записывать» координаты через выражение. Поэтому, если я использую масштабное выражение, как вы упомянули, я больше не могу перемещать метки.
MAP