Fr:Slippy map tilenames
From OpenStreetMap
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
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
- http://www.econym.demon.co.uk/googlemaps/reference.htm
- http://cfis.savagexi.com/articles/2006/05/03/google-maps-deconstructed
- "Google Map" projection, see Spatialreference.org [1]

