Fr:Slippy map tilenames

From OpenStreetMap

Jump to: navigation, search

Cet article décrit les conventions de nommage utilisées dans l'application Slippy Map.

Contents

Niveaux de zoom

0 1 pavé couvre l'ensemble du monde
1 2 × 2 pavés
2 4 × 4 pavés
n 2n × 2n pavés
17 Zoom maximum pour Osmarender
18 Zoome maximum pour Mapnik

X et Y

  • X va de 0 (le coin gauche est à 180 °W) jusqu'à 2zoom -1 (le coin droit est à 180 °E)
  • Y va de 0 (le coin supérieur est à 85.0511 °N) jusqu'à 2zoom -1 (le coin inférieur est à 85.0511 °S) dans une projection Mercator

Pour ceux que ça intéresse, le chiffre 85.0511 est le résultat de arctan(sinh(pi)). En utilisant cette limite, la carte dans son ensemble devient un (très large) carré. Voir aussi le bug d'Osmarender.

Projection

  • Le système de projection utilisé est celui de Mercator.
  • Les valeurs x sont la division de l'équateur en n unités égales
  • Les angles ±85.0511° de la projection sont les limites de la carte sur l'axe Y
  • Les valeurs y sont la division de l'axe Y de la carte en n unités égales (partant de 0 jusqu'en haut)

Pour ceux qui aiment le pseudo-code:

xtile = (lon+180)/360
ytile = log(tan(lat) + sec(lat))

En Perl:

use Math::Trig;
sub getTileNumber {
 my ($lat,$lon,$z) = @_;
 my $xtile = int( ($lon+180)/360 *2**$z ) ;
 my $ytile = int( (1 - log(tan($lat*pi/180) + sec($lat*pi/180))/pi)/2 *2**$z ) ;
 return(($xtile, $ytile));
}

En Actionscript 1:

function long2tile(lon) { return (Math.floor((lon+180)/360*Math.pow(2,_root.scale))); }
function lat2tile(lat)  { return (Math.floor((1-Math.log(Math.tan(lat*Math.PI/180) + 1/Math.cos(lat*Math.PI/180))/Math.PI)/2 *Math.pow(2,_root.scale))); }

En Java:

public class slippytest {
public static void main(String[] args) {
  int zoom = 10;
  double lat = 47.968056d;
  double lon = 7.909167d;
  System.out.println("http://tile.openstreetmap.org/" + getTileNumber(lat, lon, zoom) + ".png");
}
public static String getTileNumber(final double lat, final double lon, final int zoom) {
  int xtile = (int)Math.floor( (lon + 180) / 360 * (1<<zoom) ) ;
  int ytile = (int)Math.floor( (1 - Math.log(Math.tan(lat * Math.PI / 180) + 1 / Math.cos(lat * Math.PI / 180)) / Math.PI) / 2 * (1<<zoom) ) ;
   return("" + zoom + "/" + xtile + "/" + ytile);
  }
}

En VB.NET:

Private Function CalcTileXY(ByVal lat As Single, ByVal lon As Single, ByVal zoom As Long) As Point
   CalcTileXY.X  = CLng(Math.Floor((lon + 180) / 360 * 2 ^ zoom))
   CalcTileXY.Y = CLng(Math.Floor((1 - Math.Log(Math.Tan(lat * Math.PI / 180) + 1 / Math.Cos(lat * Math.PI / 180)) / Math.PI) / 2 * 2 ^ zoom))
End Function

Une implémentation en Python

Et la conversion dans l'autre sens, en Perl:

sub Project {
 my ($X,$Y, $Zoom) = @_;
 my $Unit = 1 / (2 ** $Zoom);
 my $relY1 = $Y * $Unit;
 my $relY2 = $relY1 + $Unit;
 my $LimitY = ProjectF(85.0511);
 my $RangeY = 2 * $LimitY;
 $relY1 = $LimitY - $RangeY * $relY1;
 $relY2 = $LimitY - $RangeY * $relY2;
 my $Lat1 = ProjectMercToLat($relY1);
 my $Lat2 = ProjectMercToLat($relY2);
 $Unit = 360 / (2 ** $Zoom);
 my $Long1 = -180 + $X * $Unit;
 return(($Lat2, $Long1, $Lat1, $Long1 + $Unit)); # S,W,N,E
}
sub ProjectMercToLat($){
 my $MercY = shift();
 return( 180/pi* atan(sinh($MercY)));
}
sub ProjectF
{
 my $Lat = shift;
 $Lat = deg2rad($Lat);
 my $Y = log(tan($Lat) + (1/cos($Lat)));
 return($Y);
}

La conversion dans l'autre sens, en Actionscript 1:

function tile2long(t) {
 return (t/Math.pow(2,_root.scale)*360-180);
}
function tile2lat(t) {
 var n=Math.PI-2*Math.PI*t/Math.pow(2,_root.scale);
 return (180/Math.PI*Math.atan(0.5*(Math.exp(n)-Math.exp(-n))));
}


Pavés

  • Les pavés sont des fichiers PNG de 256 × 256 pixels
  • Chaque niveau de zoom est un répertoire, chaque colonne est un sous-répertoire, et chaque pavé dans cette colonne est un fichier
  • Le format du nom de fichier (url) est /zoom/x/y.png

La carte glissante compte sur ce schéma d'URL, ainsi tous les URLs du serveur de pavés sont identiques. Par exemple:

Pavé de Fr:Mapnik depuis le serveur 'tile' : http://tile.openstreetmap.org/8/127/85.png
Pavé de Osmarender/Tiles@Home sur le serveur 'dev': http://tah.openstreetmap.org/Tiles/tile.php/8/127/85.png
pavé Maplint : http://tah.openstreetmap.org/Tiles/maplint.php/8/127/85.png
proxy de User:Firefishy : http://osm-tah-cache.firefishy.com/~ojw/Tiles/tile.php/8/127/85.png

Pavés de zoom inférieur

Si vous regardez le pavé x,y et que vous voulez passer aux pavés de zooms inférieurs, les sous-pavés sont (dans le système de coordonnés du niveau de zoom suivant):

2x, 2y 2x + 1, 2y
2x, 2y + 1 2x + 1, 2y + 1

De la même manière, reculer d'un niveau de zoom se fait en divisant par deux x et y (du niveau de zoom précédent).

Outils

References

Personal tools
recent changes