FR:Osmarender bug

From OpenStreetMap Wiki
Jump to navigation Jump to search

Ce que l'on nomme l'anomlie 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 facettes pseudo-trapézoïdales (dont les bords inférieurs et supérieurs correspondent à un parallèle géographique et les côtés obliques correspondent à des méridiens géographiques), rectifiées linéairement en carrés de 4096x4096 pixels. L'avantage de cette méthode, c'est que les lignes droites projetées (comme les routes) sont vraiment droites alors qu'avec une vraie projection, elles forment une courbe. En revanche, cette ligne droite a une cassure qui apparaît à la limite entre deux tuiles lorsque l'on passe d'une projection (à un niveau de zoom donné) à une autre (à un autre niveau de zoom) puisque la surface du sphéroïde de référence est alors divisée en plus (ou moins) de facettes.

Concrètement, Osmarender ne calcule correctement que les projections sur le parallèle passant par le point central de la zone. Les longitudes sont correctement représentées étant donné la construction de la projection de Mercator qui suit une règle linéaire, mais toutes les autres latitudes hors de celles passant par les points centraux des zones sont décalées verticalement dans l'image, car leur projection ne devrait pas suivre une progression proportionnelle à la latitude.

Erreur

Évidemment, ceci implique que si vous placez un point sur une carte, ses coordonnées de longitude et de latitude ne sont pas correctes. 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 au niveau de zoom 12 (2048 bandes de latitude) fonctionne sur un écart de ±π/4096 radians (soit ~±0°02′38,2″ entre une latitude interpolée et une latitude projetée), et que la dérivée seconde est au maximum de 0,5, cela donne une erreur maximale d'interpolation de 3,63 · 10−8 degrées de latitude, 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 des projections uniquement au niveau de zoom 8 (128 bandes de latitude, maximum 1/2 pixels d'erreur) et que vous interpolez pour dessiner les tuiles au niveau de zoom 12 (2048 bandes, soit 16 fois plus), l'erreur est amplifiée, dans ce cas à 16×1/2 = 8 pixels. Mais si vous utilisez le zoom 4 comme base de projection (8 bandes, maximum 10 pixels d'erreur) pour ensuite interpoler les tuiles au zoom 8 (128 bandes), cela finira par faire 16×10 = 160 pixels d'écart !

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.