source: subversion/applications/rendering/gpx_slippy_map/projection.php @ 28800

Last change on this file since 28800 was 7908, checked in by ojw, 11 years ago

remove code for interpolating positions onto a tile - not the job of
this module!

File size: 2.1 KB
Line 
1<?php
2#-------------------------------------------------------
3# Translates between lat/long and the slippy-map tile
4# numbering scheme
5#
6# http://wiki.openstreetmap.org/index.php/Slippy_map_tilenames
7#
8# Written by Oliver White, 2008
9# This file is public-domain
10#-------------------------------------------------------
11function degrees($rad){return($rad * 57.2957795);}
12function radians($deg){return($deg / 57.2957795);}
13
14function numTiles($z)
15{
16  return(pow(2.0,$z));
17}
18
19function tileValid($x,$y,$z)
20{
21  if($x < 0 or $y < 0 or $z < 0)
22    return(0);
23  $n = numTiles($z);
24  if($x >= $n or $y >= $n)
25    return(0);
26  return(1);
27}
28
29function sec($x)
30{
31  return(1.0/cos($x));
32}
33
34function relativeTileEdges($x,$y,$z)
35{
36  $n = numTiles($z);
37  $portion = 1.0 / $n;
38 
39  $x1 = $x * $portion;
40  $y1 = $y * $portion; 
41
42  return(array($x1,$y1,$x1+$portion,$y1+$portion, $portion, $portion));
43}
44
45function latlon2relativeXY($lat,$lon)
46{
47  $x = ($lon + 180.0) / 360.0;
48  $y = (1.0 - log(tan(radians($lat)) + sec(radians($lat))) / M_PI) / 2.0;
49  return(array($x,$y));
50}
51function latlon2xy($lat,$lon,$z)
52{
53  $n = numTiles($z);
54  list($x,$y) = latlon2relativeXY($lat,$lon);
55  return(array($n*$x, $n*$y));
56  }
57 
58function tileXY($lat, $lon, $z)
59{
60  list($x,$y) = latlon2xy($lat,$lon,$z);
61  return(array(floor($x),floor($y)));
62}
63function xy2latlon($x,$y,$z)
64{
65  $n = numTiles($z);
66  $relY = $y / $n;
67  $lat = mercatorToLat(M_PI * (1.0 - 2.0 * $relY));
68  $lon = -180.0 + 360.0 * $x / $n;
69  return(array($lat,$lon));
70}
71function mercatorToLat($mercatorY)
72{
73  $val = degrees(atan(sinh($mercatorY)));
74  return($val);
75}
76function latEdges($y,$z)
77{
78  $n = numTiles($z);
79  $unit = 1.0 / $n;
80  $relY1 = $y * $unit;
81  $relY2 = $relY1 + $unit;
82  $lat1 = mercatorToLat(M_PI * (1.0 - 2.0 * $relY1));
83  $lat2 = mercatorToLat(M_PI * (1.0 - 2.0 * $relY2));
84  return(array($lat1,$lat2));
85}
86function lonEdges($x,$z)
87{
88  $n = numTiles($z);
89  $unit = 360.0 / $n;
90  $lon1 = -180.0 + $x * $unit;
91  $lon2 = $lon1 + $unit;
92  return(array($lon1,$lon2));
93  }
94function tileEdges($x,$y,$z)
95{
96  list($lat1,$lat2) = latEdges($y,$z);
97  list($lon1,$lon2) = lonEdges($x,$z);
98  return(array($lat2, $lon1, $lat1, $lon2)); # S,W,N,E
99}
100
101?>
Note: See TracBrowser for help on using the repository browser.