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ź 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:
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.