L'étiquetage automatisé est un problème très difficile, mais la géométrie des entités n'est pas si mauvaise.
Même si le placement peut fonctionner correctement la plupart du temps, il y aura probablement des exceptions. Vous en remarquerez certaines et vous pourrez peut-être les résoudre. D'autres que vous ne remarquerez pas lorsque vous créez une grande carte ou un ensemble de tuiles, car vous ne pouvez pas verser chaque centimètre de votre carte à différentes échelles. Presque toujours, vous aurez envie de déplacer manuellement certaines étiquettes placées automatiquement, d'un point de vue cartographique.
Comme je l'ai suggéré dans mon commentaire, je faciliterais le problème pour le moteur d'étiquetage. Dans ce cas, je le ferais en définissant mes rivières comme une vue de table *, avec des géométries de rivière coupées pour respecter les limites du lac. De cette façon, il n'y a pas d'entités fluviales à l'intérieur des lacs à étiqueter et pas de collisions d'étiquettes.
* Je suppose que l'utilisation d'un SGBDR ici, comme PostgreSQL / PostGIS, pour plus de commodité et la possibilité de mettre à jour uniquement votre source de données faisant autorité et de faire fonctionner la vue elle-même sans votre intervention. Mais vous pouvez également travailler à l'avance avec des fichiers statiques pour découper et supprimer des entités, mais je ne le recommande pas si vous prévoyez de revoir une carte.
Exemple:
En commençant par deux fichiers de formes (qui pourraient être des tableaux de bases de données) de rivières et de lacs, les rivières intersectant les lacs et causant des problèmes d'étiquetage difficiles à résoudre complètement et en toute confiance:
Apportez-les dans Postgres si vous en avez besoin avec shp2pgsql :
shp2pgsql -s 4326 /data/lake public.lakes | psql -d mydb
shp2pgsql -s 4326 /data/river public.rivers | psql -d mydb
Définissez ensuite une vue avec 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;
Ajoutez la vue à votre mise en page:
Bien que le problème dans mon exemple soit délibérément fabriqué, les styles des deux couches de la rivière (original et vue) sont les mêmes, et ils sont placés au-dessus du lac dans l'ordre de dessin. Lorsque vous mettez à jour les géométries des lacs ou des rivières, vous n'aurez pas besoin de faire beaucoup plus que d'actualiser le rendu.