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

Last change on this file since 7904 was 7904, checked in by ojw, 12 years ago

First version of the GPX slippy map

File size: 2.2 KB
Line 
1<?php
2function degrees($rad){return($rad * 57.2957795);}
3function radians($deg){return($deg / 57.2957795);}
4
5function numTiles($z)
6{
7  return(pow(2.0,$z));
8}
9
10function tileValid($x,$y,$z)
11{
12  if($x < 0 or $y < 0 or $z < 0)
13    return(0);
14  $n = numTiles($z);
15  if($x >= $n or $y >= $n)
16    return(0);
17  return(1);
18}
19
20function sec($x)
21{
22  return(1.0/cos($x));
23}
24function latlon2relativeXY($lat,$lon)
25{
26  $x = ($lon + 180.0) / 360.0;
27  $y = (1.0 - log(tan(radians($lat)) + sec(radians($lat))) / M_PI) / 2.0;
28  return(array($x,$y));
29}
30function latlon2xy($lat,$lon,$z)
31{
32  $n = numTiles($z);
33  list($x,$y) = latlon2relativeXY($lat,$lon);
34  return(array($n*$x, $n*$y));
35  }
36 
37function tileXY($lat, $lon, $z)
38{
39  list($x,$y) = latlon2xy($lat,$lon,$z);
40  return(array(floor($x),floor($y)));
41}
42function xy2latlon($x,$y,$z)
43{
44  $n = numTiles($z);
45  $relY = $y / $n;
46  $lat = mercatorToLat(M_PI * (1.0 - 2.0 * $relY));
47  $lon = -180.0 + 360.0 * $x / $n;
48  return(array($lat,$lon));
49}
50function mercatorToLat($mercatorY)
51{
52  $val = degrees(atan(sinh($mercatorY)));
53  return($val);
54}
55function latEdges($y,$z)
56{
57  $n = numTiles($z);
58  $unit = 1.0 / $n;
59  $relY1 = $y * $unit;
60  $relY2 = $relY1 + $unit;
61  $lat1 = mercatorToLat(M_PI * (1.0 - 2.0 * $relY1));
62  $lat2 = mercatorToLat(M_PI * (1.0 - 2.0 * $relY2));
63  return(array($lat1,$lat2));
64}
65function lonEdges($x,$z)
66{
67  $n = numTiles($z);
68  $unit = 360.0 / $n;
69  $lon1 = -180.0 + $x * $unit;
70  $lon2 = $lon1 + $unit;
71  return(array($lon1,$lon2));
72  }
73function tileEdges($x,$y,$z)
74{
75  list($lat1,$lat2) = latEdges($y,$z);
76  list($lon1,$lon2) = lonEdges($x,$z);
77  return(array($lat2, $lon1, $lat1, $lon2)); # S,W,N,E
78}
79
80
81
82
83function proj_init($tx,$ty,$tz, $w, $h)
84{
85  $Proj = array('tx'=>$tx,'ty'=>$ty,'tz'=>$tz);
86 
87  list(
88    $Proj['S'],
89    $Proj['W'],
90    $Proj['N'],
91    $Proj['E']) = tileEdges($tx,$ty,$tz); // S,W,N,E
92  $Proj['dLat'] = $Proj['N'] - $Proj['S'];
93  $Proj['dLon'] = $Proj['E'] - $Proj['W'];
94  $Proj['dx'] = $w;
95  $Proj['dy'] = $h;
96  //print_r($Proj);
97  return($Proj);
98  }
99 
100function project($Proj, $lat,$lon)
101{
102  $pLat = ($lat - $Proj['S']) / $Proj['dLat'];
103  $pLon = ($lon - $Proj['W']) / $Proj['dLon'];
104  $x = $Proj['dx'] * $pLon;
105  $y = $Proj['dy'] * (1 - $pLat);
106  return(array($x,$y));
107}
108
109
110?>
Note: See TracBrowser for help on using the repository browser.