Zdefiniowane dane położenie etykiety dla więcej niż jednej skali na jednej warstwie

10

Szukam lepszego rozwiązania do etykietowania dla moich projektów. Wydaje się to trudne - ale może jestem po prostu ślepy?

Moje projekty: buduję drukowane książki rowerowe. Skala główna wynosi 1: 75k, a skala miasta wynosi 10k, a skala przeglądowa 200k. Ponieważ lubię „kartograficzną” jakość umieszczania etykiet, dotykam każdej etykiety i przesuwam ją do najlepszej pozycji. Muszę to zrobić dla każdej skali, aby moje kolumny do oznaczania 3 skal wyglądały tak („skala 1” oznacza 10k „skala 2” dla 75k i „skala 3” dla 200k):

wprowadź opis zdjęcia tutaj

Ale zanim spróbuję szczegółowo wyjaśnić, buduję ten prosty przykładowy projekt, w którym można zobaczyć i przetestować moje (stare) rozwiązanie do etykietowania dla 3 skal: http://www.map-site.de/tmp/LabelingExample.zip

Cóż, działa, ale:

  • Potrzebujesz kolumn etykiet dla każdej skali
  • Potrzebujesz warstwy dla każdej skali

Szukam znacznie lepszego rozwiązania bez zduplikowanych warstw i ton kolumn. Liczę na wasze kreatywne umysły!

EDYCJA: Dodałem tę dwie bardzo gęstą mapę jako przykłady:

wprowadź opis zdjęcia tutaj

Jest tylko jedna możliwa pozycja dla „St. Paulus Dom” i nie jest to żaden kwadrant: wprowadź opis zdjęcia tutaj

Każda etykieta musi zostać przesunięta ręcznie. Niektóre etykiety nie są w kwadrancie.

MAPA
źródło
Czy etykiety muszą spełniać określone kryteria? Nie rozumiem, co masz na myśli, mówiąc o „najlepszej pozycji”.
mgri
1
Przez „najlepszą pozycję” rozumiem pozycję zgodną z zastrzeżeniami kartograficznymi. To jest bardziej subiektywne.
MAP
2
Odkryłem, że w twoim przykładzie użyto czcionki „Noto Sans”, której nie mam, i domyślam się, że tak też będzie w przypadku innych. Czcionkę możesz pobrać tutaj google.com/get/noto Po zainstalowaniu czcionek musisz ponownie uruchomić QGIS.
TJ Rockefeller
Dzięki za dodanie tego linku - to standardowa czcionka mojej instalacji Mint.
MAP

Odpowiedzi:

7

Muszę powiedzieć, że to, o co prosisz, jest trochę skomplikowane, ponieważ chcesz, aby etykiety były widoczne zarówno na małą skalę, jak i na dużą skalę (najlepsze dopasowanie). Chodzi o to, aby umieścić punkt, który będzie widoczny w różnych skalach.

Po kilku testach odkryłem, że zamiast tworzyć kilka kolumn dla każdego zakresu skali i umieszczać współrzędne dla xiy w stałych punktach, możesz utworzyć tylko jedną kolumnę dla pozycji priorytetowych dla każdego punktu dla najlepszej lokalizacji, jak widać poniżej (I śledził lokalizacje w twoim pliku):

wprowadź opis zdjęcia tutaj

Następnie przejdź do Layer propoerties -> Labels -> Placement -> Offset from pointlub Around pointoba są w porządku, ale ja wybrałem Offset from point.

  1. W QuadrantWybierz Data defined override -> Editi wprowadź następującą formułę:

    wprowadź opis zdjęcia tutaj

    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
    

    Tutaj "Priority"znajduje się lokalizacja punktów zdefiniowanych w nazwie polaPriority

  2. Musisz użyć przesunięcia, aby przesunąć punkty dla lepszej widoczności, a ja użyłem następującej formuły:

    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
    

Oto wynik w różnych skalach:

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Aby zobaczyć, co reprezentuje każdy numer [0–8] w której lokalizacji, spójrz na następujący obraz:

wprowadź opis zdjęcia tutaj

Możesz kontrolować pozycję etykiet, dodając wartość odpowiadającą każdej pozycji. Niestety nie można tego zrobić za pomocą metody „kliknij i przenieś”. Musisz to zrobić w tabeli atrybutów.

Aktualizacja:

Na podstawie twojego wymogu, że 9 pozycji kwadrantu nie wystarczy, znalazłem, jeśli wybierzesz Cartographyzamiast Offset from pointi wybierzesz priorytet, tak jak na poniższym obrazku, będziesz miał 12 pozycji priorytetowych zamiast 9. Musisz utworzyć pole Texttypu, a następnie wpisz tylko odpowiedni skrót dla najlepszej pozycji „TL”, „TSL”, „T” ... itd. Możesz także wprowadzić odległość, aby etykieta nie zakryła punktu.

wprowadź opis zdjęcia tutaj

ahmadhanb
źródło
Takie podejście do tej pory nie próbowałem. Czy widzisz jakiś sposób, aby umieścić etykietę w kwadrancie za pomocą funkcji „kliknij i przesuń”?
MAP
Niestety nie można tego zrobić metodą „kliknij i przenieś”. Musisz to zrobić w tabeli atrybutów. Ale dodanie 1 kolumny jest lepsze niż 6 kolumn dla każdego poziomu skali x, y. Zaktualizowałem swoją odpowiedź.
ahmadhanb
1
W ostatnich dniach również próbowałem podać rozwiązanie, ale poddałem się, ponieważ uważałem, że problem jest zbyt subiektywny, aby zaoferować bardziej ogólne rozwiązanie. Zamiast tego rozwiązanie @ahmadhanb wydaje się na tyle kreatywne , by to zrobić (chociaż go nie przetestowałem). +1 dla mnie.
mgri
Zgadzam się z Tobą. Tutaj subiektywność jest wysoka. Jest to głównie osobista opinia na temat tego, jak można ocenić lokalizacje etykiet, czy są odpowiednie, czy nie.
ahmadhanb
1
Nie używaj narzędzia identyfikacji do edytowania lokalizacji priorytetowych, lepiej jest użyć narzędzia wyboru. Otwórz tabelę atrybutów i wybierz tylko pokazywanie wybranych punktów. Rozpocznij sesję edycji, zaktualizuj lokalizację i zapisz zmiany. Lokalizacja priorytetu zostanie zaktualizowana bezpośrednio, jeśli dodano już wyrażenie w zastąpieniu Zdefiniowane dane.
ahmadhanb
3

Możesz pozbyć się wielu warstw za pomocą wyrażeń.

Z tego, co mogłem zobaczyć w twoim przykładzie, główną różnicą między warstwami są Data defined Coordinate X Ydefinicje wskazujące na różne wartości x, y skali.

Możesz to zrobić na pojedynczej warstwie, wybierając listy rozwijane obok X i Y i wybierając edytuj ..., co wywoła konstruktora ciągów wyrażeń.

Do X możesz użyć czegoś takiego

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

A dla Y możesz użyć czegoś takiego

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

Powinno to używać wartości skali 1x, y, jeśli skala mapy jest mniejsza lub równa 1: 10 000 i skali 2 x, y, jeśli skala mapy jest mniejsza lub równa 1: 75 000 i skali 3 x, y dla czegokolwiek powyżej tego .

Jeśli musisz ręcznie ustawić pozycję dla każdej skali, nie widzę, jak możesz odejść od skali # -x i skali # -y dla każdego zdefiniowanego poziomu.

TJ Rockefeller
źródło
Mam wysokie przeznaczenie etykiet o różnej wadze. Muszę umieścić je ręcznie, ponieważ żaden automatyzm nie jest w stanie tego zrobić w „prawdziwy” sposób kartograficzny. Mapy będą drukowane i aktualizowane co roku, więc etykiety muszą być nieco statyczne. pl.wikipedia.org/wiki/Cartographic_labeling#Placement
MAP
@MAP OK, więc wiesz, że musisz ręcznie pozycjonować elementy, po prostu chcesz mniej warstw i kolumn.
TJ Rockefeller
1
Pomaga to w wyświetlaniu etykiet 3 skal za pomocą tylko jednej warstwy. Ale QGIS nie jest w stanie „zapisać” współrzędnych poprzez wyrażenie. Więc jeśli użyję wyrażenia skali, jak wspomniałeś, nie będę już mógł przenosić etykiet.
MAP