Assembler les tuiles générées

Bonjour,

Ce sujet fait suite à fond de carte pour un démonstrateur.

J’ai pu générer des tuiles pour la France pour différents niveaux de zoom.

Je voudrais développer une application qui me permette de naviguer comme sur openstreetmap et dans une fenêtre :

  • pouvoir bouger la zone avec le touchpad
  • pouvoir zoomer et dézoomer avec la molette de la souris

Je me pose plusieurs questions :

  • étant donné une fenêtre, si je zoome, cela commencera par agrandir les
    tuiles jusqu’à un moment où les tuiles de ce niveau de zoom sont
    remplacées par celles du niveau de zoom supérieur et inversement si je
    dézoome

    quel est le critère pour passer d’un niveau de zoom à l’autre ?

  • comment passer exactement de la position dans la fenêtre (un pixel) à la
    position géographique en latitude/longitude ?

    c’est peut-être plus simple de considérer ce problème déjà juste pour une
    tuile. Selon le système de projection, je crois me souvenir qu’il y a une
    subtilité, les distances dans le sens de la longitude varie suivant la latitude
    où se place : 1cm sur la carte représente une plus grande distance à
    mesure que l’on se rapproche de l’équateur.

Est-ce qu’il existe un tutoriel sur ces questions ?

En vous remerciant pour votre attention

Bien cordialement

OpenLayers et Leaflet font le boulot. Sinon pour la complète (génération comprise) il y a Switch2OSM.

Bonjour,

Merci pour votre réponse.

Le problème que je vois, c’est que je dois intégrer cela dans un programme en lua. Or OpenLayers et Leaflet sont en javascript.

En lua, j’ai trouvé ceci sur le wiki d’openstreetmap, ce qui donne la tuile en fonction des coordonnées lat/lon et du zoom.

Mais ça ne suffit pas pour passer des coordonnées images (pixel) aux coordonnées lat/lon.

Donc la question actuelle c’est:

passer des coordonnées images (pixel) aux coordonnées lat/lon

En projection mercator:

  • la longitude est proportionnelle au X (facile)
  • la latitude est proportionnelle à la tangente du sinus hyperbolique du Y.

L’exemple de code est destiné à un calcul par numéro de tuile, mais peut s’adapter pour un calcul au pixel.

Voici le code utilisé par leaflet: Leaflet/Projection.SphericalMercator.js at master · Leaflet/Leaflet · GitHub

Bonjour cquest !

Merci pour ta réponse.

Cette page et celle-ci m’ont aidé à comprendre.

Si j’ai une fenêtre de largeur w et de hauteur h (valeurs entières). L’origine de la fenêtre est le coin en haut à gauche.

L’abscisse x (valeur entière) d’un pixel va de 0 à w - 1 (le plus à droite) et son ordonnée y (valeur entière), de 0 à h - 1 (le plus bas).

Si j’ai un point en coordonnées WGS84 (lon, lat) en radians. Le pixel (x, y) auquel correspond ce point est donné par les formules de la projection de Mercator (en supposant la terre parfaitement sphérique) :
x = w * (lon + pi) / (2 * pi)
y = [ h - w / pi * log [ atan (pi / 4 + lat / 2) ] ] / 2

Si on prend une image carrée (h = w), la latitude correspondant à y = 0 est 85.0511°N, celle pour y = h à 85.0511°S

Les formules précédentes donnent des flottants, on obtient le pixel en prenant la partie entière.

Pour obtenir la tuile dans laquelle se trouve la position (lon, lat). C’est la même chose, sauf qu’on considère que chaque pixel de la fenêtre est une tuile. Donc w = h = 2^zoom

Ce que je ne comprends pas bien encore, c’est comment cela s’articule-t-il avec une fenêtre sur un écran qui est souvent partielle [lon0, lon1] x [lat0, lat1] et dépend de la résolution de l’écran.
En effet, inverser ces formules, c’est partir d’une position sur la fenêtre qui est donnée de base en pixels d’écrans.

EDIT

Admettons que les tuiles soient représentées dans leur propre résolution, 1pixel de la tuile correspond à 1 pixel de l’écran. Dans ce cas, si je pointe avec la souris sur la fenêtre, celle-ci me renvoie les coordonnées x’ et y’ en pixels dans la fenêtre, coordonnées relative au point (0,0) en haut à gauche de celle-ci. Mais en réalité, le point (0,0) correspond à (lon0, lat0). Comme il y a correspondance entre les pixels des tuiles et ceux de l’écran, je peux inverser les formules avec (x0 + x’, y0 + y’) où (x0, y0) correspond à (lon0, lat0) et, w = h = 256 * 2^zoom (la résolution des tuiles est 256x256 je crois)

Si par contre je zoome la carte, les tuiles sont artificiellement agrandies et un pixel de l’écran ne correspond plus à un pixel de la tuile. Si par exemple, je fais un zoom x2 mais sans changer de niveau de zoom, alors un pixel de chaque tuile est représenté par 4 pixels de l’écran et je dois donc diviser x’ et y’ par 2 pour retrouver la même valeur (lon, lat), en supposant que je pointe au même endroit sur l’écran.

Cordialement

Bonjour,

Si vous voyez des erreurs dans mon précédent message, n’hésitez pas à m’en faire part.

Disons plutôt que dans ce cas tu dois aller chercher 4 nouvelles tuiles pour une ancienne. Je n’ai pas regardé de près les formules mais elles semblent correctes. Une formule dans un tableur avec un hyperlien permet de le vérifier assez facilement.

projection de Mercator (en supposant la terre parfaitement sphérique)

Non, ceci est la projection web Mercator, la EPSG:3857. Mercator n’a pas fait cette approximation, la projection de Mercator c’est la EPSG:3395. Pas de soucis pour la simplification mais autant appeler un chat un chat.