P
Le 6 juillet 2013 14:56, Christian Quest <cqu...@openstreetmap.fr> a écrit : > Le 6 juillet 2013 13:44, Yves Pratter <yves.prat...@laposte.net> a écrit : > > > > Mais pourquoi "North Rona", "Sule Skerry", "Sule Stack", "Sula Sgeir"… > > n'apparaissent-elles pas ? > > > > > > Je ne prend en compte que place=island sur les polygones > > > > C'est bien le cas de Chemin : North Rona (28220976) > > > > > > Elle est trop petit pour être sélectionnée. J'ai été obligé de mettre > une limite en superficie sinon des îles non maritimes étaient rendues > (comme celle à Avignon). > > Pas simple ! > > Un solution serait de chercher si des noms de villes se trouvent dans > les environs. Si c'est le cas, on élimine, sinon on garde... mais ça > va nettement alourdir les requêtes. Peut être plus simple: sélectionner les îles ou archipels en fonction de la surface de leur boundingbox et les traiter en catégories différentes. Mettre les grandes iles ou archipels puis les villes puis les autres noms d'îles. Ou alors carrément : sélectionner toutes les iles/archipels et toutes les villes applicables, et les trier ensemble en fonction de la taille de leur bounding box (taille de label incluse). Et commencer par afficher les labels des plus grands objets, et tracer les autres quand il y a de la place non déjà occupée pour leur label. Le problème est toujours d'éviter les collisions de labels. Souvent même s'il y a collision, on peut éventuellement déplacer un label déjà placé pour qu'il reste dans une place encore libre dans sa bounding box (plus grande), en évitant la collision avec le label à placer, sinon on peut chercher s'il y a moyen de déplacer le label du nouvel objet à placer dans un espace encore libre dans sa petite bounding box, et sinon ce label est éliminé. A étudier aussi la possibilté d'abréger un label à placer qui ne tiendrait pas, ou de voir si on peut lui insérer un saut de ligne (sur une espace ou après un trait d'union) pour voir s'il y a encore collision. Idéalament un bon algorithme devrait aussi pouvoir chercher une orientation du libellé lui permettant de tenir en entier dans la surface auquel il est associé. C'est délicat à faire par une requête SQL (qui ne diot servir qu'à sélectionner des listes d'objets candidats), mais plus facile si on peut intégrer des modues géométriques dans le code client. Tout cela n'est en fait pas un algorithme mais une heuristique adaptative (et qui concerne aussi le placement des icônes qu'on ne veut pas superposer à d'autres ou dont on veut qu'elle reste visibles et pas masquées par des libellés). Mapnik travaille actuellement en procédant uniquement par des listes d'objets classées en couches successives sur lesquelles on ne revient jamais ensuite, pourtant au lieu de tracer immédiatement l'objet, il pourrait rester dans une structure en attente conservant des infos sur les contraintes de placement acceptable (notamment sa surface de référence, ou un rectangle d'extension maximum autour d'un point de référence (cela permettrait ensuite de les déplacer après un placement provisoire ou de les réduire par abréviation. L'ennui c'est que plus on accumule d'objets dans une liste d'attente, plus la liste des surfaces occupées se complexifie et prend du temps CPU à tester pour les détections de collision avec les objets suivants. Malgré tout, on n'est pas obligé de tout mettre en attente, car il y a d'évidence des objets qui seront toujours derrière les autres : - les surfaces bleues des mers et rivières toujours derrière les surfaces de landuse ou natural=* et similaires, - eux-même toujours derrière tous les surfaces de bâtiments, - eux-mêmes toujours derrière les tracés linéaires (qu'on peut gérer par un ordre de priorité simple entre clôtures et similaires, puis routes et voies ferrées, puis frontières), puis les noms de rivières et petits libellés affichés discrètement le long des frontières (qu'il est acceptable de masquer partiellement si on peut les répéter plus loin à des distances de rendu raisonnables) - puis les icônes - puis seulement à la fin les autres libellés qui nécessitent un traitement spécial (mais qu'on peut éliminer malgré tout si le libellé tient le long des frontières où il est supposé être déjà présent, ce qui réduit la liste des libellés complexes à placer). Pour réduire la charge du serveur de rendu, il serait même souhaitable qu'il puisse s'épargner du travail en stockant les couches complètement séparables dans des fichiers de rendu en cache séparé (cela pourrait aussi permettre d'avoir dans l'affichage web des cases de sélection des couches qu'on veut voir, par exemple la sélection de la langue des libellés), même si en fin de compte une couche de rendu unique combiné est aussi fabriquée pour faire un fond de carte unique. Cela permettrait aussi de modifier des styles de rendu touchant seulement à une partie, sans avoir à tout replacer, avec des requêtes SQL plus rapides demandant moins de données et de traitements. Souvent le cache en couches séparées pourrait alors utiliser des métatuiles plus grandes en format vectoriel, permettant ce rendu final combiné d'une présélection de couches vectorielles à superposer dans une métatuile bitmap, le cache local pourrait devenir plus efficace car le rendu final d'une superposition de couches vectorielles précalculées séparément est peu gourmand en ressources I/O et CPU, ce qui devrait alors permettre de réduire la taille du cache côté serveur en format bitmap. Il devrait alors même être possible alors d'interroger le serveur de rendu en format vectoriel (il superposerait les couches vectorielles réduites sur une petite boundingbox de clipping, pour produire le SVG combiné transférant peu de données vers Internet, et pourrait le faire à la demande aussi selon les couches sélectionnées dans le client qui ne sait pas faire ce travail). Nombre de smartphones ou petites tablettes savent par exemple rendre des SVG pas trop gros en données rapidement; sur un rendu de 256x256 pixels, le nombre d'objets vectoriels qui y tiennent sera de toute façon limité. pour chaque niveau de zoom, mais il devient alors possible d'avoir des zooms intermédiaires où les libellés gardent leur taille mais s'écartent facilement ou se réorientent aussi selon la direction demandée pour observer la carte. Mais là ce n'est plus du Mapnik comme maintenant (même si Mapnik sait aussi générer du SVG, rapidement en plus sans avoir besoin d'accélérateur graphique, ce dont vos serveurs manquent souvent). On n'exploite pas assez les capacités locales de calcul et de rendu du client web, à l'heure où HTML5 devient de plus en plus omniprésent, alors que les frameworks javascript peuvent déjà demander et afficher des rendus vectoriels (même sans aller jusqu'à demander WebGL pour un rendu 3D, le rendu vectoriel 2D côté client en HTML5 forme déjà une base bien établie et c'est ce que font déjà les petites tablettes spécialisées vendues comme navigateur GPS pour automobile qui font tous du rendu vectoriel depuis longtemps, avec des processeurs pourtant simples et peu de mémoire de travail).
_______________________________________________ Talk-fr mailing list Talk-fr@openstreetmap.org http://lists.openstreetmap.org/listinfo/talk-fr