source: subversion/sites/other/places/index.php @ 6985

Last change on this file since 6985 was 1448, checked in by ojw, 13 years ago

Allow a whole 90 seconds to download 80n's sunbury map

File size: 12.4 KB
Line 
1<?php 
2/***************************************************************************
3* Copyright 2006, Oliver White
4*
5* This program is free software; you can redistribute it and/or
6* modify it under the terms of the GNU General Public License
7* as published by the Free Software Foundation; either version 2
8* of the License, or (at your option) any later version.
9*
10* This program is distributed in the hope that it will be useful,
11* but WITHOUT ANY WARRANTY; without even the implied warranty of
12* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13* GNU General Public License for more details.
14*
15* You should have received a copy of the GNU General Public License
16* along with this program; if not, write to the Free Software
17* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
18************************************************************************
19*/
20include("../Connect/connect.inc");
21include("osmpassword.inc");
22
23  /* API calls - these mustn't have any headers */
24  switch($_REQUEST["action"]){
25    case "random":
26      RandomOSM(0);
27      break;
28    case "text_list":
29      header("Content-type:text/plain");
30      ListPlaces("",1);
31      exit;
32      break;
33  }
34 
35  include($DOCUMENT_ROOT . "/Templates/templates.php"); 
36  document_header("OpenStreetMap - Places", "styles.css"); 
37  document_navbar();
38
39  if(rand(0,10) == 1)
40    UpdateOSM();
41  ActionList("home|search|list|admin|stats");
42 
43  switch($_REQUEST["action"]){
44    case "places":
45      ImportPlaces($_REQUEST["lat"], $_REQUEST["long"]);
46      break;
47    case "list":
48      ListPlaces();
49      break;
50    case "update_osm":
51     UpdateOSM();
52      break;
53    case "import_places":
54      PlacesForm();
55      break;
56    case "random_update":
57      RandomUpdate();
58      break;
59    case "stats":
60      ShowStats();
61      break;
62    case "download";
63      DownloadData($_REQUEST["id"]); 
64      break;
65    case "phpinfo";
66      phpInfo(); 
67      break;
68    case "rendered_by":
69      ListRenderedBy($_REQUEST["user"]);
70      break;
71    case "search":
72      SearchForm($_REQUEST["q"]);
73      break;
74    case "admin":
75      print "<h2>Admin actions</h2>\n<p>Any of these functions can be run by normal visitors</p>\n";
76      ActionList("update_osm|import_places|random_update");
77      break;
78    default:
79      $NoAction = 1;
80  }
81 
82  if(array_key_exists("id", $_REQUEST)){
83    ShowPlace($_REQUEST["id"]);
84  }
85  else if(array_key_exists("q", $_REQUEST)){
86    SearchForm($_REQUEST["q"]);
87    ListPlaces($_REQUEST["q"]);
88  }
89  else if($NoAction)
90  {
91    MapOf(45,20,30,60, 400, 200);
92    SearchForm();
93  }
94 
95function ActionList($Actions){
96 print "<ul class=\"actions\">";
97  foreach(explode("|",$Actions) as $Action){
98    printf("<li><a href=\"./?action=%s\">%s</a></li>\n", $Action, $Action);
99  }
100  print "</ul>";
101}
102function ListRenderedBy($Username){
103  $SQL = sprintf("select * from places2 where `renderer`='%s' order by id;",
104    mysql_escape_string($Username));
105  $Result = mysql_query($SQL);
106  if(mysql_num_rows($Result) < 1){
107    print "<p>No such user</p>\n";
108    return;
109  }
110 
111  printf("<h2>%d places rendered by %s</h2>",
112    mysql_num_rows($Result),
113    htmlentities($Username));
114   
115  print "<ul>";
116  while($Data = mysql_fetch_assoc($Result)){
117    printf("<li><a href=\"?id=%d\">%s</a></li>\n",
118      $Data["id"],
119      htmlentities($Data["name"]));
120  }   
121  print "</ul>";
122}
123
124function ShowStats(){
125  PeopleStats();
126  PlaceStats();
127}
128
129function PlaceStats(){
130  print "<h2>Places</h2>\n";
131  print "<ul>";
132  printf("<li>%d locations</li>\n", CountWhere("1"));
133  printf("<li>%d with data</li>\n", CountWhere("osm_size > 0"));
134  printf("<li>%d with images</li>\n", CountWhere("img_exists != 0"));
135 
136  print "</ul>\n";
137}
138function CountWhere($Query){
139  $SQL = "SELECT * FROM places2 WHERE $Query;";
140  $Result = mysql_query($SQL);
141  return(mysql_num_rows($Result));
142
143}
144function PeopleStats(){
145  $SQL = "SELECT renderer, count(*) as count FROM places2 GROUP BY renderer ORDER BY count DESC;";
146  $Result = mysql_query($SQL);
147 
148  print "<h2>People rendering maps</h2>\n";
149  print "<ul>";
150  while($Data = mysql_fetch_assoc($Result)){
151    if($Data["renderer"]){
152   
153      $Link = sprintf("?action=rendered_by&amp;user=%s", urlencode($Data["renderer"]));
154     
155      printf("<li><b>%s</b> rendered <a href=\"%s\">%d maps</a></li>", 
156        htmlentities($Data["renderer"]), 
157        $Link,
158        $Data["count"]);
159      }
160  }
161  print "</ul>\n";
162}
163
164function SearchForm($Text=""){
165  print "<form action=\"./\" method=\"get\"><p>Search for ";
166  printf("<input type=\"text\" name=\"q\" value=\"%s\">", htmlentities($Text));
167  print "<input type=\"submit\" value=\"Search\">";
168  print "</p></form>";
169}
170function MapOf($Lat, $Long, $DLat, $DLong,$Width, $Height, $Label="Untitled")
171{
172  $Query = sprintf("Lat=%f&Long=%f&dLat=%d&dLong=%f&width=%d&height=%d",
173    $Lat, $Long, $DLat, $DLong, $Width, $Height);
174   
175  $Image = "map.php?$Query";
176  printf("<p><img src=\"%s\" width=\"%d\" height=\"%d\" border=\"1\" alt=\"%s\"></p>\n",
177    $Image,
178    $Width,
179    $Height,
180    htmlentities($Label));
181}
182
183function RandomOSM($Stopped){
184  $Version = 2;
185  header("Content-type: text/plain");
186 
187  if($Stopped){
188    printf("%d|-1||",$Version);
189    exit;
190    }
191 
192  $SQL = "select * from `places2` where `osm_size` >0 and `img_exists` = 0 order by rand( ) limit 1;";
193  $Result = mysql_query($SQL);
194  if(mysql_num_rows($Result) == 0){
195    printf("%d|-1||",$Version);
196    exit;
197    }
198  $Data = mysql_fetch_assoc($Result);
199  $ID = $Data["id"];
200
201  printf("%d|%d|%d|%s%s",
202    $Version,
203    $ID, 
204    500, // width
205    ThisDir(),
206    OsmFilename($ID));
207  exit;
208
209}
210function ThisDir(){
211  return("http://almien.co.uk/OSM/Places/");
212}
213function UpdateOSM(){
214  print "<p>Updating data...done</p>\n";
215  $SQL = sprintf("select * from places2 order by name;");
216  $Result = mysql_query($SQL);
217  while($Data = mysql_fetch_assoc($Result)){
218    $ID = $Data["id"];
219    $Filename = OsmFilename($ID);
220    if(file_exists($Filename)){
221      $Date = filemtime($Filename);
222      $Size = filesize($Filename) / 1024;
223      $Age = (time() - $Date) / 86400;
224      $SQL = sprintf("update places2 set `osm_date`=%d, `osm_size`=%1.2f where `id`=%d;",
225        $Date / 86400,
226        $Size,
227        $ID);
228     mysql_query($SQL);
229    }
230   
231    $ImageExists = file_exists(ImgFilename($ID));
232    $SQL = sprintf("update places2 set `img_exists`=%d where `id`=%d;",
233      $ImageExists,
234      $ID);
235    mysql_query($SQL);
236  }
237}
238
239function DataLink($ID){
240  $Filename = OsmFilename($ID);
241  if(!file_exists($Filename))
242    return("Data not yet copied from OSM");
243   
244  $Size = filesize($Filename);
245 
246  return(sprintf("<a href=\"%s\">XML data</a> (%1.0fK)",
247    htmlentities($Filename),
248    $Size / 1024));
249}
250function OsmFilename($ID){
251  return(sprintf("Data/%d.osm.gz", $ID));
252}
253
254function ImgFilename($ID){
255  return(sprintf("Maps/%d.png", $ID));
256}
257
258function DownloadData($ID){
259  list($Lat, $Long) = LatLong($ID);
260  $Filename = sprintf("Data/%d.osm", $ID);
261  printf("<p>Downloading place #%d at %f, %f</p>", $ID, $Lat, $Long);
262  set_time_limit(90);
263  ini_set('default_socket_timeout', 90);
264  DownloadMap($Lat, $Long, 0.05, $Filename);
265  system("gzip $Filename");
266 
267  printf("<p>Done, %d bytes</p>", filesize("$Filename.gz"));
268}
269function RandomUpdate(){
270  $SQL = "select * from `places2` where `osm_size` =0 order by rand( ) limit 1;";
271  $Result = mysql_query($SQL);
272  $Data = mysql_fetch_assoc($Result);
273  printf("<p>Downloading OSM data for %s</p>", htmlentities($Data["name"]));
274  DownloadData($Data["id"]);
275  UpdateOSM();
276}
277function LatLong($ID){
278  $SQL = sprintf("select * from places2 where id=%d;", $ID);
279  $Result = mysql_query($SQL);
280  $Data = mysql_fetch_assoc($Result);
281  return(array($Data["lat"], $Data["lon"]));
282}
283
284function DownloadMap($Lat, $Long, $Size, $Filename){
285  $Credentials = osmPassword();
286  $URL = sprintf("http://%s@www.openstreetmap.org/api/0.3/map?bbox=%f,%f,%f,%f",
287    osmPassword(),
288    $Long - $Size,
289    $Lat - $Size,
290    $Long + $Size,
291    $Lat + $Size);
292  $fpIn = fopen($URL, "r");
293  if(!$fpIn){
294    printf("<p>Couldn't download (%f,%f,%f)</p>", $Lat, $Long, $Size);
295    return;
296    }
297  $fpOut = fopen($Filename, "w");
298  if(!$fpOut){
299    printf("<p>Couldn't save to %s</p>", htmlentities($Filename));
300    return;
301  }
302  while($Data = fgets($fpIn, 1000)){
303    fputs($fpOut, $Data);
304  }
305  fclose($fpIn);
306  fclose($fpOut);
307}
308
309function ShowPlace($ID){
310  $SQL = sprintf("select * from places2 where id=%d;", $ID);
311  $Result = mysql_query($SQL);
312  $Data = mysql_fetch_assoc($Result);
313   
314  printf("<h2><a href=\"./?id=%d\">%s</a></h2>\n", $Data["id"], htmlentities($Data["name"]));
315 
316  printf("<p><img src=\"%s\"></p>\n", ImgFilename($ID));
317 
318  print "<ul>";
319  printf("<li>Position %f, %f</li>\n", 
320    $Data["lat"],
321    $Data["lon"]);
322  printf("<li>type = %s</li>\n", htmlentities($Data["type"]));
323  printf("<li>%s</li>\n", DataLink($ID));
324  if($Data["renderer"])
325    printf("<li>Rendered by %s</li>\n", htmlentities($Data["renderer"]));
326  printf("<li>Link to <a href=\"%s\">OSM API</a></li>\n", ApiLink($Data["lat"], $Data["lon"], 0.05));
327  print "</ul>";
328 
329  print "<form action=\"./\" method=\"post\">";
330  print "<input type=\"hidden\" name=\"action\" value=\"download\">";   
331  printf("<input type=\"hidden\" name=\"id\" value=\"%d\">", $Data["id"]); 
332  printf("<input type=\"submit\" value=\"Download latest data for %s\">", htmlentities($Data["name"]));
333  print "</form>";
334 
335}
336function ApiLink($Lat, $Long, $Size){ 
337  $URL = sprintf("http://www.openstreetmap.org/api/0.3/map?bbox=%f,%f,%f,%f",
338    $Long - $Size,
339    $Lat - $Size,
340    $Long + $Size,
341    $Lat + $Size);
342  return($URL);
343}
344function ListPlaces($Search = "", $BasicText = 0){
345  $SQL = sprintf("select * from places2 order by name;");
346  $Result = mysql_query($SQL);
347 
348  if(0)
349    printf( "Searching for %s</p>", htmlentities($Search));
350 
351  if(!$BasicText)
352    print "<ul>";
353   
354  while($Data = mysql_fetch_assoc($Result)){
355    if(SearchMatches($Search, $Data["name"])){
356      if(!$BasicText){
357        printf("<li><a href=\"./?id=%d\">%s</a>%s%s</li>\n", 
358            $Data["id"], 
359            htmlentities($Data["name"]),
360            $Data["osm_size"] > 0 ? " - data available" : "",
361            $Data["img_exists"] ? " - rendered" : "");
362       }
363       else{
364        printf("%d: %s (%s %s)\n", 
365            $Data["id"], 
366            htmlentities($Data["name"]),
367            $Data["osm_size"] > 0 ? "DATA" : "NODATA",
368            $Data["img_exists"] ? "IMG" : "NOIMG");
369       }
370    }
371  }
372  if(!$BasicText)
373    print "</ul>";
374}
375
376function SearchMatches($Search, $Data){
377  if($Search == "")
378    return(1);
379  if(strpos(strtolower($Data), strtolower($Search)) !== false)
380    return(1);
381  return(0);
382}
383function PlacesForm(){
384  print "<p><form action=\"./\" method=\"post\">";
385  print "Lat: <input type=\"text\" name=\"lat\">";
386  print "Long: <input type=\"text\" name=\"long\">";
387  print "<input type=\"hidden\" name=\"action\" value=\"places\">";
388  print "<input type=\"submit\" value=\"get places from gagravarr\">";
389  print "</form></p>\n";
390}
391
392function ImportPlaces($Lat, $Long){
393  $URL = PlacesURL($Lat, $Long);
394  $Data = GetURL($URL);
395  print "<ul>";
396  ProcessPlaces($Data);
397  print "</ul>";
398}
399
400function ProcessPlaces($Data){
401  preg_match_all("/<place(.*?)>(.*?)<\/place>/", $Data, $Places, PREG_SET_ORDER);
402  $Count = 0;
403  foreach($Places as $Place){
404
405    preg_match_all("/(\w+)=\'(.*?)\'/", $Place[1], $FieldXML, PREG_SET_ORDER);
406    $Fields = array();
407    $Fields["name"] = $Place[2];
408    foreach($FieldXML as $Field){
409      $Fields[$Field[1]] = $Field[2];
410    }
411
412  AddPlaceToDb(
413    $Fields["name"], 
414    $Fields["type"],
415    $Fields["latitude"], 
416    $Fields["longitude"]);
417
418  } 
419  printf("<p><b>%d places</b></p>\n", $Count);
420}
421
422function AddPlaceToDb($Name, $Type, $Lat, $Long){
423  $SQL = sprintf("select * from places2 where `name`='%s';", 
424    mysql_escape_string($Name));
425  $Result = mysql_query($SQL);
426  if(mysql_num_rows($Result) > 0)
427    {
428    return;
429    }
430   
431  $SQL = sprintf("insert into places2 (`lat`,`lon`,`name`,`type`) values (%f,%f,'%s','%s');", 
432    $Lat, 
433    $Long, 
434    mysql_escape_string($Name),
435    mysql_escape_string($Type));
436  $Result = mysql_query($SQL);
437  printf("<li>Added %s</li\n", htmlentities($Name));
438}
439function GetURL($URL){
440  $fp = fopen($URL, "r");
441  $Data = "";
442  while($X = fgets($fp, 4096)){
443    $Data .= $X;
444  }
445  fclose($fp);
446  return($Data);
447}
448
449function PlacesURL($Lat, $Long){
450  return(sprintf("http://gagravarr.org/cgi-bin/where_am_i.py?lat=%f&long=%f&dist=500000&places=on&format=xml&node_type=&node_value=",
451$Lat, $Long));
452}
453 document_footer(); ?>
Note: See TracBrowser for help on using the repository browser.