Автоматическая маркировка - действительно сложная проблема, но геометрия объектов не так уж и плоха.
Даже если вы в большинстве случаев можете заставить работать должным образом, возможны исключения. Некоторые из них вы заметите и, возможно, сможете решить. Другие вы не заметите, когда создаете большую карту или набор плиток, потому что вы не можете пролить каждый дюйм вашей карты в различных масштабах. Почти всегда у вас будет желание переместить некоторые автоматически размещенные метки вручную с картографической точки зрения.
Как я предложил в своем комментарии, я бы облегчил задачу для механизма маркировки. В этом случае я бы сделал это, определив мои реки как табличное представление *, с геометрией реки, обрезанной с учетом границ озера. Таким образом, в озерах нет речных объектов, которые будут помечены, и нет столкновений.
* Я предполагаю использование здесь СУБД, такой как PostgreSQL / PostGIS, для удобства и возможности обновлять только ваш авторитетный источник данных и получать представление самостоятельно без вашего вмешательства. Но вы также можете заранее поработать со статическими файлами, чтобы обрезать и удалить объекты, но я не рекомендую это делать, если вы когда-нибудь планируете вернуться к карте.
Пример:
Начиная с двух шейп-файлов (может быть таблиц базы данных) рек и озер, когда реки пересекают озера и вызывают проблемы с маркировкой, которые трудно решить полностью и уверенно:
Добавьте их в Postgres, если вам нужно с shp2pgsql :
shp2pgsql -s 4326 /data/lake public.lakes | psql -d mydb
shp2pgsql -s 4326 /data/river public.rivers | psql -d mydb
Затем определите представление с помощью 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;
Добавьте вид к вашему макету:
Хотя проблема в моем примере специально сфабрикована, стили в двух слоях реки (исходный и вид) одинаковы, и они расположены на вершине озера в порядке рисования. Когда вы обновляете геометрию озер или рек, вам не нужно будет делать гораздо больше, чем обновлять рендеринг.