Fr:Osmarender bug
From OpenStreetMap
Ce que l'on nomme le bug d'Osmarender fait référence au fait que lorsque Osmarender dessine la carte d'une zone, il n'effectue une projection que sur le point central de la zone, le reste n'étant qu'une interpolation linéaire, pas une vraie projection.
Pour le dire autrement, au lieu de faire la projection d'une sphère, on travaille sur un objet ressemblant à une sphère avec des faces applaties de 4096x4096. L'avantage de cette méthode, c'est que les lignes droites projetées (comme les routes) sont vraiment droites alors qu'avec une vrai projection, elles forment une courbe. Par contre, la ligne droite a une cassure qui apparaît à la limite entre deux tuiles lorsque l'on passe d'une projection à une autre.
Erreur
Évidemment, ceci implique que si vous placez un point sur une carte, ses coordonnées de longitude et de latitude ne sont pas correct. Cependant, l'erreur n'est pas très importante. Si vous regardez les calculs d'interpolation linéaire, vous trouvez la formule suivante:
Erreur ≤ ((x1−x0)2)/8 max | f″(x) |
f(x) est la fonction transformant les degrés en coordonnées de mercator. f(x) = arctan(sinh(x)) (voir la projection de Mercator). Comme l'interpolation d'Osmarender fonctionne sur un écart de π/4096 et que la dérivée seconde est au maximum de 0.5, cela donne une erreur maximume de 3.63e−8 degrées, ou encore 1.5 mètres de la surface de la terre. Cette erreur se trouvera sur une latitude de ±51 degrées (approximativement la latitude de Londres ou Bruxelles).
Zoom de niveaux inférieurs
Si vous regardez la formule, vous pouvez voir que si vous vous déplacez vers les niveaux de zoom inférieurs, l'erreur augmentera proportionnellement au carré. (NDT: à traduire, moi pas compris: This error doesn't occur if you stich the tile together ). Ainsi, l'erreur aux niveaux de zoom inférieurs est:
| Zoom | Erreur (distance) | Echelle (tuiles de 256px) | Erreur en pixels |
|---|---|---|---|
| 11 | 6m | 76m/px | 1/12px |
| 10 | 24m | 153m/px | 1/6px |
| 8 | 384m | 610m/px | 1/2px |
| 6 | 6144m | 2441m/px | 3px |
| 4 | 98304m | 9765m/px | 10px |
La quantité de pixels semble minime, mais ce sont les meilleurs cas. Si vous faites votre projection au niveau de zoom 8 et que vous dessinez les tuiles au niveau de zoom 12, l'erreur est amplifiée, dans ce cas à 16*1/2 = 8 pixels. Mais si vous utilisez le zoom 4 comme base pour ensuite projeter les tuiles au zoom 8, cela finira par faire 16*10 = 160 pixels !
Solution possible
Le problème peut être résolu en faisant la projection en dehors d'Osmarender. Quelqu'un pourrait décider de traduire le fichier OSM avec les latitudes et longitudes en un autre fichier avec des valeurs x et y déjà projetées (ou en donnant un positionnement relatif nord/sud, est/ouest si vous préférez). Cette solution aurait les avantages suivants:
- Pas d'erreur de projection
- Temps de calcul plus rapide parce que XSLT n'est pas très bon en math
- Encore plus rapide dans le contexte de tiles@home parce que la projection serait faite une seule fois par jeu de tuiles, et non pas à chaque niveau de zoom, et les tuilles pourraient être coupées depuis une seule grande carte (à la façon de tilesPipe@home)
- changement facile vers d'autres projections si nécessaire
Un désavantage de cette solution est probablement le fait qu'Osmarender serait incapable de tracer une grille des latitudes/longitudes ou d'afficher une échelle en mètres ou miles parce qu'il ne saurait rien des limites de zone géographique qu'il est en train de dessiner.
User:Frederik Ramm a réalisé un prototype de script faisant la projection séparément et a modifié Osmarender pour qu'il fonctionne avec les données ainsi générées. Cela semble marcher, mais il faut encore le modifier et le peaufiner avant de relancer tilesPipe@home.

