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

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

Optimisations:

  • store bounding box in the binary files
  • check bounding box before drawing
  • store as int not float (cache file sizes halved for 2% worse

performance)

  • precalculate mercator coordinates before storing binary data

Improvements:

  • proper mercator projection, so that route is in large place even on

very low-zoom tiles

  • benchmarking add-on (add &benchmark=1 when viewing a tile)
File size: 2.4 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 relativeTileEdges($x,$y,$z)
25{
26  $n = numTiles($z);
27  $portion = 1.0 / $n;
28 
29  $x1 = $x * $portion;
30  $y1 = $y * $portion; 
31
32  return(array($x1,$y1,$x1+$portion,$y1+$portion, $portion, $portion));
33}
34
35function latlon2relativeXY($lat,$lon)
36{
37  $x = ($lon + 180.0) / 360.0;
38  $y = (1.0 - log(tan(radians($lat)) + sec(radians($lat))) / M_PI) / 2.0;
39  return(array($x,$y));
40}
41function latlon2xy($lat,$lon,$z)
42{
43  $n = numTiles($z);
44  list($x,$y) = latlon2relativeXY($lat,$lon);
45  return(array($n*$x, $n*$y));
46  }
47 
48function tileXY($lat, $lon, $z)
49{
50  list($x,$y) = latlon2xy($lat,$lon,$z);
51  return(array(floor($x),floor($y)));
52}
53function xy2latlon($x,$y,$z)
54{
55  $n = numTiles($z);
56  $relY = $y / $n;
57  $lat = mercatorToLat(M_PI * (1.0 - 2.0 * $relY));
58  $lon = -180.0 + 360.0 * $x / $n;
59  return(array($lat,$lon));
60}
61function mercatorToLat($mercatorY)
62{
63  $val = degrees(atan(sinh($mercatorY)));
64  return($val);
65}
66function latEdges($y,$z)
67{
68  $n = numTiles($z);
69  $unit = 1.0 / $n;
70  $relY1 = $y * $unit;
71  $relY2 = $relY1 + $unit;
72  $lat1 = mercatorToLat(M_PI * (1.0 - 2.0 * $relY1));
73  $lat2 = mercatorToLat(M_PI * (1.0 - 2.0 * $relY2));
74  return(array($lat1,$lat2));
75}
76function lonEdges($x,$z)
77{
78  $n = numTiles($z);
79  $unit = 360.0 / $n;
80  $lon1 = -180.0 + $x * $unit;
81  $lon2 = $lon1 + $unit;
82  return(array($lon1,$lon2));
83  }
84function tileEdges($x,$y,$z)
85{
86  list($lat1,$lat2) = latEdges($y,$z);
87  list($lon1,$lon2) = lonEdges($x,$z);
88  return(array($lat2, $lon1, $lat1, $lon2)); # S,W,N,E
89}
90
91
92
93
94function proj_init($tx,$ty,$tz, $w, $h)
95{
96  $Proj = array('tx'=>$tx,'ty'=>$ty,'tz'=>$tz);
97 
98  list(
99    $Proj['S'],
100    $Proj['W'],
101    $Proj['N'],
102    $Proj['E']) = tileEdges($tx,$ty,$tz); // S,W,N,E
103  $Proj['dLat'] = $Proj['N'] - $Proj['S'];
104  $Proj['dLon'] = $Proj['E'] - $Proj['W'];
105  $Proj['dx'] = $w;
106  $Proj['dy'] = $h;
107  //print_r($Proj);
108  return($Proj);
109  }
110 
111function project($Proj, $lat,$lon)
112{
113  $pLat = ($lat - $Proj['S']) / $Proj['dLat'];
114  $pLon = ($lon - $Proj['W']) / $Proj['dLon'];
115  $x = $Proj['dx'] * $pLon;
116  $y = $Proj['dy'] * (1 - $pLat);
117  return(array($x,$y));
118}
119
120
121?>
Note: See TracBrowser for help on using the repository browser.