Unikasz funkcji etykietowania, jeśli nakładają się one na inną warstwę w QGIS?

16

Jak w QGIS 2.12.2 mogę skonfigurować etykietowanie warstw, aby uniknąć umieszczania etykiet tam, gdzie już istnieją elementy z innej warstwy?

Na przykład, jeśli mam warstwę polilinii strumienia / rzeki , która zawiera „ linie środkowe” jeziora, i umieszczam nad nią warstwę wielokąta „jeziornego” w kolejności rysowania, nie chcę, aby warstwa rzeki umieszczała etykietę wewnątrz jeziora . Zamiast tego wolałbym, aby rzeka była oznakowana poza jeziorem (w razie potrzeby). W ten sposób mogę umieszczać etykiety z warstwy jezior i nie wpadam na kolizje etykiet.

Oto przykład, w którym (celowo umieściłem linie na wierzchu w celach wizualnych), mam nadzieję, że nie uda mi się znaleźć żadnych etykiet linii środkowej rzeki wewnątrz wielokąta jeziora: Linie są etykietowane wewnątrz wielokąta

RyanKDalton
źródło
4
W jaki sposób twoje dane są przechowywane i podawane? Pracując z PostGIS pokusiłbym się, by zdefiniować moje rzeki z widokiem, w którym odcinki rzek przecinających jeziora są całkowicie wycięte. Dobre zautomatyzowane etykietowanie to trudny problem, mniej geometrii.
alphabetasoup
To były pliki kształtów, ale pomysł przejścia na PostGIS i zarządzania problemami z danymi w locie jest naprawdę dobry. Sugerowałbym przeniesienie komentarza do odpowiedzi, ponieważ mógłbym przedstawić całkiem uzasadniony argument, że jest to dobre rozwiązanie.
RyanKDalton

Odpowiedzi:

9

Automatyczne etykietowanie jest naprawdę trudnym problemem, ale geometria elementów nie jest taka zła.

Nawet jeśli staż zapewni ci odpowiednią pracę przez większość czasu, prawdopodobnie będą wyjątki. Niektóre z nich zauważysz i być może uda ci się je rozwiązać. Inne, których nie zauważysz podczas tworzenia dużej mapy lub zestawu kafelków, ponieważ nie możesz przelać każdego calu mapy w różnych skalach. Prawie zawsze będziesz miał ochotę ręcznie przenieść niektóre automatycznie umieszczone etykiety, z perspektywy kartograficznej.

Jak zasugerowałem w moim komentarzu, ułatwiłbym problem silnikowi etykietowania. W tym przypadku zrobiłbym to, definiując moje rzeki jako widok tabeli *, z geometriami rzek przyciętymi w celu przestrzegania granic jezior. W ten sposób w jeziorach nie ma cech rzek do oznakowania, ani kolizji etykiet.

* Zakładam, że tutaj używam RDBMS, takiego jak PostgreSQL / PostGIS, dla wygody i możliwości aktualizacji tylko wiarygodnego źródła danych, a widok działa bez interwencji użytkownika. Ale możesz też trochę popracować z plikami statycznymi, aby przycinać i usuwać obiekty, ale nie polecam tego, jeśli kiedykolwiek planujesz odwiedzić mapę.

Przykład:

Począwszy od dwóch plików kształtów (mogą to być tabele bazy danych) rzek i jezior, z rzekami przecinającymi jeziora i powodującymi problemy z etykietowaniem, które trudno rozwiązać całkowicie i pewnie:

wprowadź opis zdjęcia tutaj

Wprowadź je do Postgres, jeśli potrzebujesz z shp2pgsql :

shp2pgsql -s 4326 /data/lake public.lakes | psql -d mydb

shp2pgsql -s 4326 /data/river public.rivers | psql -d mydb

Następnie zdefiniuj widok za pomocą ST_Difference :

CREATE OR REPLACE VIEW rivers_clipped AS
SELECT r.id, ST_Difference(r.geom, l.geom) AS geom, r.name
FROM public.rivers AS r, public.lakes AS l;

Dodaj widok do swojego układu:

wprowadź opis zdjęcia tutaj

Chociaż problem w moim przykładzie jest celowo sfabrykowany, style w dwóch warstwach rzeki (oryginał i widok) są takie same i są umieszczane nad jeziorem w kolejności rysowania. Po zaktualizowaniu geometrii jezior lub rzek nie musisz robić nic więcej niż odświeżać rendering.

wprowadź opis zdjęcia tutaj

zupa alfabetyczna
źródło
2
Chociaż nie pracowałem bezpośrednio z warstwą DB, to rozwiązanie było dla mnie najbardziej sensowne, ponieważ nie wymagało edycji geometrii początkowych źródeł danych (innych niż ładowanie ich do DB). Jest to świetny przykład myślenia poza ramkami plików kształtu i ograniczeń aplikacji oraz znalezienia kreatywnego rozwiązania problemu przez połączenie logiki aplikacji i DB.
RyanKDalton,
13

W QGIS> = 2.12 można ustawić warstwę wielokąta „jeziornego” jako przeszkodę na etykiecie. Odbywa się to poprzez właściwości warstwy warstwy „jeziornej” w sekcji „Etykiety”. Zmień pole kombi u góry z „ Brak etykiet ” na „ Odradzaj innym etykietom zakrywanie obiektów na tej warstwie ”.

ndawson
źródło
1
Dzięki. Szukałem czegoś takiego i wcześniej nie zauważyłem tej rozwijanej opcji. Powiedziałbym jednak, że był to tylko umiarkowanie udany. 1) To tylko „w pewnym sensie” zniechęciło etykiety z warstwy rzeki (nadal pojawiają się w jeziorze, ale mniej), i 2) teraz nie mam etykiet z nazwą jeziora :( Próbowałem również ustawić etykiety rzeki> Przeszkody „Odradzaj etykietom zakrywanie funkcji” (brak sukcesu) i ustawienie wagi niskiej i wysokiej (brak sukcesu) oraz ustawienie Umieszczenie> Priorytet = niski i wysoki (brak sukcesu).
RyanKDalton
Ach, może źle zrozumiałem. Jeśli masz etykiety na warstwie jeziora, upewnij się, że pole wyboru „Odradzaj etykietom zakrywanie funkcji” jest zaznaczone pod kartą renderowania. Aby uzyskać pożądane wyniki, może być konieczne użycie suwaka „waga” i innych opcji w tej grupie.
ndawson
1
Nie, zdecydowanie byłeś na dobrej drodze. Bawiłem się ciężarami (duża waga na wielokątach jeziora + ”minimalizuję umieszczanie etykiet nad wnętrzem funkcji, mała waga na rzekach) i zbliżyłem się, ale tak naprawdę nigdy nie dotarłem do punktu, w którym etykiety rzeki nie były na jeziorze. wydaje się być związany z liniami, które są zarówno wewnątrz, jak i na zewnątrz wielokąta
RyanKDalton
4
dlaczego nie usuwasz (ani nie dzielisz) tych wierszy, jeśli chodzi o etykietowanie? W każdym razie nie są one przydatne na twojej mapie.
radouxju,
4

Uważam, że etykietowanie jest ogólnie dość trudne, przynajmniej w celu wygenerowania etykiet, które zadowolą zmysły mojego kartografa. Chociaż funkcja automatycznego etykietowania działa dobrze przez 80% czasu, zdarzają się przypadki takie jak problem z etykietowaniem rzeki / jeziora, w którym nie generuje ładnego etykietowania. Automatyczne etykietowanie jest często powiązane z geometrią elementu, np. Ile części jest w linii, tak aby na początku wszystkie części były etykietowane. Oczywiście QGIS ma środki zapobiegające wielokrotnemu etykietowaniu, które zależy również od skali bieżącego widoku mapy.

W każdym razie moja wskazówka nie jest szybkim rozwiązaniem. Często tworzę specjalną warstwę tylko do etykietowania, aby łatwiej kontrolować moje etykiety. I często geometria elementów do reprezentacji kartograficznej może kolidować z dobrą geometrią do etykietowania. Proponuję więc stworzyć nową warstwę, w której strumienie nie przecinają jezior, aby można było całkowicie obejść problem. Posiadanie dodatkowej warstwy etykietowania może również pomóc w zapobieganiu problemom, w których kierunek etykietowania nie jest zgodny z zamierzonym, ponieważ jest związany z tym, jak utworzono geometrię.

Cóż, obawiam się, że moja wskazówka nie jest tym, czego się spodziewałeś, ale mam nadzieję, że moje alternatywne podejście pomoże ci jakoś.

Szczery
źródło
Podkreślasz, że mógłbym utworzyć nowy zestaw danych (co byłoby łatwe w tym przypadku ... po prostu wymazać elementy linii pod wielokątami), podwojenie zestawów danych nie wydaje się zbyt atrakcyjne ani możliwe do zarządzania, chyba że użyjesz wspomniana metoda oparta na bazie danych, taka jak @Richard Law.
RyanKDalton
Rozumiem twój punkt widzenia i rozumiem twoje wahanie, aby dwukrotnie utworzyć podobny zestaw danych. Z mojego doświadczenia wynika, że ​​warstwa etykiety często różni się bardziej niż oryginalna warstwa danych. Na przykład, aby pozostać przy swoim przykładzie rzeki, możesz chcieć zmienić geometrię rzeki, aby połączyć lub podzielić części elementu w celu stworzenia ładniejszego etykietowania, które będzie powtarzane z większą częstotliwością. Przynajmniej tak często bywa w przypadku, gdy mam do czynienia z drogami OSM, które czasami są dość arbitralnie zorganizowane.
Frank
3

dostępna jest wtyczka o nazwie „ Maska ”, której można używać do filtrowania etykiet opartych na wielokątach.

Jak wspomniano w moim poprzednim komentarzu, byłoby jednak znacznie łatwiej, gdybyś mógł rozdzielić swoje linie na przecięciu z jeziorami (zobacz inne metody tutaj ). Następnie możesz zdefiniować etykietę o zerowym rozmiarze dla segmentów znajdujących się w obrębie jezior („Warstwa”> „Etykietowanie”> „Ustawienia danych zdefiniowanych”> „Rozmiar”, a następnie wybierz kolumnę, w której przechowujesz rozmiar etykiety). Podział zachowuje większość właściwości sieci rzecznej i jest odwracalny po rozpuszczeniu, dzięki czemu możesz kontynuować pracę z pojedynczą warstwą (w razie potrzeby zapisz całkowitą długość w określonej tabeli atrybutów).

radouxju
źródło
Dzięki, wtyczka brzmi obiecująco, więc spróbuję.
RyanKDalton