source: subversion/sites/other/tilesAtHome/MapOf/index.php @ 3117

Last change on this file since 3117 was 3041, checked in by ojw, 13 years ago

Proper interface to the MapOf? function

File size: 5.2 KB
Line 
1<?php
2#-----------------------------------------------------------------------------
3# Creates a map image, by tiling together slippy map images
4# Oliver White
5# GNU GPL version 2 or later
6#-----------------------------------------------------------------------------
7
8include("../lib/tilenames.inc");
9
10if(!tryMap(
11  $_GET["lat"], 
12  $_GET["long"], 
13  $_GET["z"],
14  $_GET["w"], 
15  $_GET["h"],
16  $_GET["format"])){
17  CreateForm($_GET);
18  }
19
20#-----------------------------------------------------------------------------
21# Validate a set of inputs. if ok, then output map to browser, otherwise return 0
22#-----------------------------------------------------------------------------
23function tryMap($Lat, $Long, $Zoom, $Width, $Height, $Format){
24  if($Lat < -90 || $Lat > 90)
25    return(0);
26  if($Long < -180 || $Long > 180)
27    return(0);
28  if($Zoom < 4 || $Zoom > 17)
29    return(0);
30  if($Width < 40 || $Width > 2000)
31    return(0);
32  if($Height < 40 || $Height > 2000)
33    return(0);
34  doMap($Lat, $Long, $Zoom, $Width, $Height, $Format);
35  return(1);
36}
37#-----------------------------------------------------------------------------
38# Create a map, output it to browser
39#-----------------------------------------------------------------------------
40function doMap($Lat, $Long, $Zoom, $Width, $Height, $Format){
41  $Tilesize = 256;
42  $GridSize = 10;
43 
44  $Image = imagecreatetruecolor($Width, $Height);
45  $BG = imagecolorallocate($Image, 255, 255, 255);
46  imagefilledrectangle($Image, 0,0,$Width, $Height, $BG);
47 
48  list($X,$Y) = XY($Lat, $Long, $Zoom);
49
50  $XC = floor($X);
51  $YC = floor($Y);
52 
53  $XA = ($X - $XC) * $Tilesize;
54  $YA = ($Y - $YC) * $Tilesize;
55 
56  for($xi = -$GridSize; $xi <= $GridSize; $xi++){
57    for($yi = -$GridSize; $yi <= $GridSize; $yi++){
58      $Filename = TileName($X + $xi, $Y + $yi, $Zoom);
59
60      if(file_exists($Filename)){
61        $ToX = (floor($Width/2) - $XA + $xi * $Tilesize);
62        $ToY = (floor($Height/2) - $YA + $yi * $Tilesize);
63 
64        if($ToX > -$Tilesize && $ToX < $Width
65          && $ToY > -$Tilesize && $ToY < $Height){
66          $Part = imagecreatefrompng($Filename);
67          imagecopy($Image, $Part, 
68            $ToX,
69            $ToY, 
70            0, 0, 
71            $Tilesize, $Tilesize);
72          }
73        }
74    }
75  }
76
77  if($Format == "jpeg"){
78    header("Content-type: image/JPEG");
79    imagejpeg($Image);
80  }
81  else{
82    header("Content-type: image/PNG");
83    imagepng($Image);
84  }
85}
86
87#-----------------------------------------------------------------------------
88# Location of map tiles
89#-----------------------------------------------------------------------------
90function tileURLB($X,$Y,$Z){
91  return(sprintf("http://dev.openstreetmap.org/~ojw/Tiles/tile.php/%d/%d/%d.png", $Z, $X, $Y));
92}
93#-----------------------------------------------------------------------------
94# Slippy map coordinate functions: should probably use a library
95#-----------------------------------------------------------------------------
96function XY($Lat, $Long, $Zoom){
97  $PortionY = Lat2Y($Lat);
98  $PortionX = Long2X($Long);
99  $Size = pow(2,$Zoom);
100  $X = $PortionX * $Size;
101  $Y = $PortionY * $Size;
102  return(array($X,$Y));
103}
104
105function Long2X($Long){
106  return(($Long + 180) / 360);
107}
108function Lat2Y($Lat){
109  $LimitY = 3.14159265358979;
110  $Y = ProjectF($Lat);
111 
112  $PY = ($LimitY - $Y) / (2 * $LimitY);
113  return($PY);
114}
115function ProjectF($Lat){
116  $Lat = deg2rad($Lat);
117  $Y = log(tan($Lat) + (1/cos($Lat)));
118  return($Y);
119}
120
121#-----------------------------------------------------------------------------
122# HTML form that lets you enter map parameters
123#-----------------------------------------------------------------------------
124function CreateForm($ParamArray){
125  print "<table cellpadding=\"6\" cellspacing=\"0\">";
126  print "<form action=\"./\" method=\"GET\">\n";
127 
128  print TableRow("Map centre lat/long", 
129    FormNumericInput("lat", "%1.8f") . FormNumericInput("long", "%1.8f"));
130 
131  print TableRow("Zoom", DropdownInput("z", range(7, 17)));
132 
133  print TableRow("Image size, pixels",
134    FormNumericInput("w", "%d") . " x " . FormNumericInput("h", "%d"));
135   
136  print TableRow("Output", DropdownInput("format", array("jpeg", "png")));
137 
138  print TableRow("&nbsp;", "<input type=\"submit\" value=\"OK\">");
139 
140  print "</form></table>\n";
141}
142
143#-----------------------------------------------------------------------------
144# Create a row containing two items: a and b
145#-----------------------------------------------------------------------------
146function TableRow($A, $B){
147 return("<tr><td>$A</td><td>$B</td></tr>\n");
148}
149#-----------------------------------------------------------------------------
150# HTML select field, with a list of options
151#-----------------------------------------------------------------------------
152function DropdownInput($Name, $Options){
153  $Html = "<select name=\"$Name\">\n";
154  foreach($Options as $Option){
155    $Html .= "<option value=\"$Option\">$Option</option>\n";
156  }
157  $Html .= "</select>\n";
158  return($Html);
159}
160#-----------------------------------------------------------------------------
161# HTML input field
162#-----------------------------------------------------------------------------
163function FormNumericInput($Name, $Format){
164  return(sprintf("<input type=\"text\" name=\"%s\">", $Name));
165}
166?>
Note: See TracBrowser for help on using the repository browser.