A etiquetagem automatizada é um problema muito difícil, mas a geometria dos recursos não é tão ruim.
Mesmo que você consiga que a veiculação funcione adequadamente na maior parte do tempo, é provável que haja exceções. Alguns deles você notará e poderá resolver. Outros que você não notará ao criar um mapa grande ou conjunto de peças, porque você não pode derramar cada centímetro do mapa em uma variedade de escalas. Quase sempre, você tem vontade de mover manualmente algumas etiquetas colocadas automaticamente, de uma perspectiva cartográfica.
Como sugeri no meu comentário, facilitaria o problema para o mecanismo de rotulagem. Nesse caso, eu faria isso definindo meus rios como uma visualização de tabela *, com as geometrias dos rios cortadas para respeitar os limites do lago. Dessa forma, não há características do rio dentro dos lagos a serem rotuladas, nem colisões de rótulos.
* Assumo o uso de um RDBMS aqui, como o PostgreSQL / PostGIS, por conveniência e a capacidade de atualizar apenas sua fonte de dados autorizada e fazer com que a visualização funcione sem a sua intervenção. Mas você também pode trabalhar antecipadamente com arquivos estáticos para recortar e excluir recursos, mas eu não recomendo isso se você planeja revisitar um mapa.
Exemplo:
Começando com dois shapefiles (podem ser tabelas de banco de dados) de rios e lagos, com rios cruzando lagos e causando problemas de rotulagem difíceis de resolver de maneira completa e confiável:
Traga-os para o Postgres, se necessário, com o shp2pgsql :
shp2pgsql -s 4326 /data/lake public.lakes | psql -d mydb
shp2pgsql -s 4326 /data/river public.rivers | psql -d mydb
Em seguida, defina uma visualização com 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;
Adicione a visualização ao seu layout:
Embora o problema no meu exemplo seja deliberadamente fabricado, os estilos nas duas camadas do rio (original e vista) são os mesmos e são colocados no topo do lago na ordem do desenho. Ao atualizar as geometrias de lagos ou rios, você não precisará fazer muito mais do que atualizar a renderização.