Дані, визначені положення мітки для більш ніж однієї шкали в одному шарі


10

Я шукаю кращого рішення для маркування своїх проектів. Це здається важким - але, може, я просто сліпий?

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

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

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

Ну, це працює, але:

  • Вам потрібні стовпчики для маркування для кожної шкали
  • Вам потрібен шар для кожного масштабу

Я шукаю значно кращого рішення без повторюваних шарів і тонн стовпців. Я розраховую на ваш творчий розум!

EDIT: Я додав цю дві дуже щільні карти як приклади:

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

Є лише одна можлива позиція для "Святого Павла Дому", і це не будь-який квадрант: введіть тут опис зображення

Кожна мітка повинна бути переміщена вручну. Деякі етикетки не входять у квадрант.


Чи потрібні етикетки для виконання певних критеріїв? Я не розумію, що ви маєте на увазі під "найкращою позицією".
mgri

1
Під "найкращою позицією" я маю на увазі позицію згідно з картографічними твердженнями. Це більш суб’єктивно.
КАРТА

2
Я виявив, що у вашому прикладі використовується шрифт "Noto Sans", якого у мене немає, і я здогадуюсь, що так буде і для інших. Ви можете завантажити шрифт тут google.com/get/noto Після встановлення шрифтів потрібно перезапустити QGIS.
TJ Rockefeller

Дякуємо, що додали це посилання - це стандартний шрифт моєї установки Mint.
КАРТА

Відповіді:


7

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

Після кількох тестувань я виявив, що замість створення декількох стовпців для кожного діапазону масштабу та розміщення координат для 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" ... тощо. Крім того, ви можете ввести відстань, щоб уникнути того, щоб мітка закривала точку.

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


Ось такий підхід я до цього часу не намагався. Чи бачите ви будь-який спосіб розмістити мітку у квадранті за допомогою клацання та переміщення?
КАРТА

На жаль, ви не можете зробити це підходом "натискання та переміщення". Це потрібно зробити в таблиці атрибутів. Але додавання 1 стовпця краще, ніж 6 стовпців для кожного рівня шкали x, y. Я оновив свою відповідь.
ахмадханб

1
Останніми днями я також намагався дати рішення, але я відмовився, бо вважав, що проблема є занадто суб'єктивною, щоб запропонувати більш загальне рішення. Натомість рішення @ahmadhanb здається достатньо креативним для його виконання (хоча я його не перевіряв). +1 для мене.
mgri

Я погоджуюсь з тобою. Суб’єктивність тут висока. Це головним чином особиста думка про те, як можна судити про розташування етикеток, якщо вони підходять чи ні.
ахмадханб

1
Не використовуйте інструмент ідентифікації для редагування пріоритетних місць, краще скористатися інструментом select. Відкрийте таблицю атрибутів і виберіть лише для відображення вибраних точок. Почніть сеанс редагування та оновіть місцеположення та збережіть зміни. Місце пріоритетного значення буде оновлено безпосередньо, якщо ви вже додали вираз у розділі "Дані, визначені".
ахмадханб

3

Ви можете позбутися від декількох шарів, використовуючи вирази.

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

Ви можете досягти цього в одному шарі, вибравши спадні місця біля значень X та Y та вибравши редагувати ..., що виведе конструктор рядків виразів.

Для 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"))

Для цього слід використовувати шкалу1 x, y, якщо масштаб карти менше або дорівнює 1: 10000 та масштаб 2 x, y, якщо масштаб карти менше або дорівнює 1: 75 000, а масштаб 3 x, y для чогось вище, ніж .

Якщо вам доведеться вручну розміщувати для кожної шкали, я не бачу, як можна відійти від стовпців # -x та масштабу # -y для кожного визначеного рівня.


У мене висока доля етикеток з різною вагою. Я маю розміщувати їх вручну, оскільки жоден автоматизм не може це зробити "справжнім" картографічним способом. І карти будуть надруковані та оновлюватися щороку, тому маркування має бути дещо статичним. en.wikipedia.org/wiki/Cartographic_labeling#Placement
MAP

@MAP ОК, тож ви знаєте, що вам потрібно вручну розміщувати елементи, просто потрібно менше шарів і стовпців.
TJ Rockefeller

1
Це допомагає відображати мітки 3-х шкал лише одним шаром. Але QGIS не в змозі "записати" координати через вираз. Тож якщо я використовую вираз масштабу, як ви згадали, я більше не можу переміщувати мітки.
КАРТА
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.