OpenGastroMap/Installation/features.php
(Redirected from OpenGastroMap/install/features.php)
To use this file, please do not copy the contents of this page directly, but take the Wiki source instead. Otherwise, HTML codes are not provided correctly.
<?php
/*
Map layers for OpenStreetMap 'smoking' tag, online editing of tags
Copyright (C) 2010 Stephan Knauss, stephankn@toolserver.org
several changes: Markus Weber
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
parameter f
m - return no smoking tag
n - return nonsmoking
p - return isolated
s - return smoking
x - return all symbols for n, p, s
c - return cuisine
w - return wheelchair
i - return internet access
a - return details
parameter t (for f==m,n,p,s,x)
g - "getraenkegepraegte Gaststaetten", i.e. only: bar, pub, nightclub
s - "speisegepraegte Gaststaetten", i.e. only: restaurant, cafe, fast_food, food_court
*/
//header('Content-Type: text/plain; charset=utf-8');
$bbox= $_GET['bbox'];
if (!isset($bbox)) {
echo "not defined bbox\n";
// we should exit here, but for test purposes we need t go on
$bbox='10.5, 49.0, 11.5, 50.0';
}
$box=explode(',', $bbox);
$bounds= pg_escape_string($box[0].' '.$box[1].','.$box[2].' '.$box[3]);
$fpar= 'a';
if(isset($_GET['f'])) {
$fpar= $_GET['f'];
if(!in_array($fpar,array('n','s','m','p','x','c','w','i','a'))) $fpar= 'a';
}
$tpar= $_GET['t'];
$resolution= 0;
if(isset($_GET['resolution']) && is_numeric($_GET['resolution']))
$resolution= $_GET['resolution'];
if($resolution>156543.0339 || $resolution<0.5971642833709717)
$resolution= 0;
$zoom= 0;
if(isset($_GET['zoom']) && is_numeric($_GET['zoom']))
$zoom= $_GET['zoom'];
if($zoom>18 || $zoom<0)
$zoom = 0;
$cluster= '';
if($resolution>0) { // enable clustering if needed
if($zoom>=17 || in_array($fpar,array('c','w','i','a'))) {
// no clustering on Z17 and Z18, no clustering for detail layers at all
// $cluster= ', st_astext(way) as cluster';
// $cluster= ", st_astext(st_makepoint(round(st_x(way)/1)*1,round(st_y(way)/1)*1)) as cluster";
$cluster= ", st_astext(st_makepoint(round(st_x(way)),round(st_y(way)))) as cluster";
}
else {
// calculate clustering value. resolution is per pixel, so multiply by size of icon, take overlap factor into account
$clvalue= 32*$resolution*0.9;
$cluster= ", st_astext(st_makepoint(round(st_x(way)/$clvalue)*$clvalue,round(st_y(way)/$clvalue)*$clvalue)) as cluster";
}
}
if($tpar=='g')
$amenityQuery= "(amenity in ('bar','pub','nightclub') and disused is null)";
else if($tpar=='s')
$amenityQuery= "(amenity in ('restaurant','cafe','fast_food','food_court') and disused is null)";
else
$amenityQuery= "(amenity in ('bar','pub','restaurant','cafe','fast_food','food_court','nightclub') and disused is null)";
// concerning database(s), please note:
// we may have several data bases which are being used alternately every other day;
// that makes it possible to build-up one database content by using osm2pgsql
// while serving requests using the other data base at the same time;
// so we will access the database gis0 at even days and gis1 at odd;
// first, calculate which day we have - even or odd;
// assume that, starting at 16:00 UT, we want the next day's database
// because at this time the generation process for the new data
// should have been completed;
$dbnum= time() + 28800; // 8*3600 means: at 16:00 UT
$dbnum= $dbnum / 86400 % 2;
// connect to the appropriate database
//$dbconn= pg_pconnect('dbname=gis'.' user=gisuser');
$dbconn= pg_connect('dbname=gis'.$dbnum.' user=gisuser');
if (!$dbconn) { // could not connect to this day's database
// try to connect to the other day's data base
$dbconn= pg_connect('dbname=gis'.(1-$dbnum).' user=gisuser');
if (!$dbconn) { // could not connect to the other day's database
// try to connect to a commonly usable database as a fallback strategy
$dbconn= pg_connect('dbname=gis user=gisuser');
if (!$dbconn) { // could not connect either
echo "Error connecting. Please report to @TODO .\n";
exit;
}
}
}
// create header for output
if($fpar=='a')
echo "lon\tlat\tosmid\tosmtype\tname\tamenity\tsmoking\tsmoking_hours\tsmoking_outside\tcuisine\tcuisine_icon\twheelchair\tinternet_access\twebsite\ticonSize\ticonOffset\ticon\n";
else
echo "lon\tlat\ticonSize\ticonOffset\ticon\n";
if($fpar=='x')
$farray= array('n','p','s');
else if($fpar=='m')
$farray= array('m');
else
$farray= array($fpar);
// main loop, integrating each layer in case of $fpar=='x'
foreach($farray as $ftype) {
// Generate Filter
$column= "";
switch($ftype) {
case m: // missing attributes
$filter= "($amenityQuery AND smoking is null AND \"smoking:outside\" is null)"; break;
case n: // non-smoking
$filter= "(smoking='no' AND $amenityQuery)"; break;
case s: // smoking
$filter= "(smoking is not null AND $amenityQuery AND smoking<>'no' AND smoking<>'isolated')";
break;
case p: // isolated
$filter= "(smoking='isolated' AND $amenityQuery )"; break;
case c: // cuisine
$filter= "($amenityQuery)";
$column= "cuisine";
break;
case w:
$filter= "(wheelchair is not null AND $amenityQuery)";
$column= "wheelchair";
break;
case i:
$filter= "(internet_access is not null AND $amenityQuery)";
$column= "internet_access";
break;
case a: // return details
default:
$filter= "($amenityQuery)";
}
// query strategy: first try to reduce data utilizing indexes where available. Validated with ANALYZE EXPLAIN
// RESULT IS REQUIRED AS POINT, OSM_ID, NAME, OSMTYPE, COUNT !!!
if($ftype=='a') {
$query= 'SELECT st_astext(st_centroid(st_collect(way))) as point, min(osm_id) as osm_id, min(name) as name, min(osmtype) as osmtype, count(*), min(amenity) as amenity, min(smoking) as smoking, min(smoking_hours) as smoking_hours, min("smoking:outside") as smoking_outside, min(cuisine) as cuisine, min(wheelchair) as wheelchair, min(internet_access) as internet_access, min(website) as website'.$cluster.' FROM (';
$query.= ' SELECT way, osm_id, name, amenity, \'n\' as osmtype, smoking, smoking_hours, "smoking:outside", cuisine, wheelchair, internet_access, website FROM planet_osm_point ';
$query.= " WHERE (way && SetSRID('BOX3D($bounds)'::box3d,900913)) AND $filter";
$query.= ' UNION ALL';
$query.= ' SELECT st_centroid(way) AS way, osm_id, name, amenity, \'w\' as osmtype, smoking, smoking_hours, "smoking:outside", cuisine, wheelchair, internet_access, website FROM planet_osm_polygon ';
$query.= " WHERE (way && SetSRID('BOX3D($bounds)'::box3d,900913)) AND $filter";
$query.= ') AS t GROUP by cluster LIMIT 500;';
// $query .= ') AS t LIMIT 500;';
}
else {
$query= 'SELECT point, osm_id, name';
if($column!="") $query.= ', '.$column;
$query.= ', count FROM ( SELECT st_astext(st_centroid(st_collect(way))) AS point, min(osm_id) AS osm_id, min(name) AS name';
if($column!="") $query.= ', min('.$column.') AS '.$column;
$query.= ', count(*)'.$cluster.', min(way) as pos FROM (';
$query.= ' SELECT st_centroid(way) AS way, osm_id, name';
if($column!="") $query.= ', '.$column;
$query.= ' FROM planet_osm_polygon ';
$query.= " WHERE (way && SetSRID('BOX3D($bounds)'::box3d,900913)) AND $filter ";
$query.= ' UNION ALL';
$query.= ' SELECT way, osm_id, name';
if($column!="") $query.= ', '.$column;
$query.= ' FROM planet_osm_point ';
$query.= " WHERE (way && SetSRID('BOX3D($bounds)'::box3d,900913)) AND $filter ";
$query.= ' ) AS t GROUP BY cluster ';
$query.= ") AS t2 WHERE pos && SetSRID('BOX3D($bounds)'::box3d,900913) LIMIT 500;";
}
// echo "$query\n";
$result= pg_query($dbconn,$query);
if(!$result) {
echo "An error occurred:".pg_last_error()."\n";
echo $query;
exit;
}
// output the data for every marker
while($row= pg_fetch_array($result)) { // for every marker
$coords= str_replace("POINT(", '', $row['point']);
$coords= str_replace(')', '', $coords);
$coords= str_replace(' ', "\t", $coords);
$osmtype= $row['osmtype'];
// values greater 1 indicate clustering, use different icons for these.
if($row['count'] > 1) $osmtype= 'c'; //artificial type for cluster
switch ($ftype) {
case m:
if($osmtype=='c') echo "$coords\t16,16\t-8,-8\tcb.png\n";
else echo "$coords\t16,16\t-8,-8\tb.png\n";
break;
case n: // color 21
if($osmtype=='c') echo "$coords\t32,32\t-16,-20\tcg.png\n";
else echo "$coords\t32,32\t-16,-20\tg.png\n";
break;
case s: // color 108
if($osmtype=='c') echo "$coords\t32,32\t-16,-20\tcr.png\n";
else echo "$coords\t32,32\t-16,-20\tr.png\n";
break;
case p:
if($osmtype=='c') echo "$coords\t32,32\t-16,-20\tcy.png\n";
else echo "$coords\t32,32\t-16,-20\ty.png\n";
break;
case w:
$icon= htmlentities($row['wheelchair']);
if(in_array($icon,array("yes","no","limited"))) {
$icon= "whe_".$icon.".png";
echo "$coords\t24,24\t-12,-15\t$icon\n";
}
break;
case i:
$icon= htmlentities($row['internet_access']);
if(in_array($icon,array("terminal","wlan"))) {
$icon= "int_".$icon.".png";
echo "$coords\t24,24\t-12,-15\t$icon\n";
}
break;
case c:
case a:
default:
$cuisine = htmlentities(mb_strtolower($row['cuisine']));
$cuisine= strtok($cuisine,";, /");
$ic= 2; // regular icon for known cuisines
switch($cuisine) { // translate cuisine into German
case 'afghan': $cui= 'afghanische Küche'; break;
case 'african': $cui= 'afrikanische Küche'; break;
case 'american': $cui= 'US-amerikanische Küche'; break;
case 'argentinian': $cui= 'argentinische Küche'; break;
case 'asian': $cui= 'asiatische Küche'; break;
case 'australian': $cui= 'australische Küche'; break;
case 'austrian': $cui= 'österreichische Küche'; break;
case 'bavarian': $cui= 'bayerische Küche'; break;
case 'bohemian': $cui= 'böhmische Küche'; break;
case 'bratwurst': $cui= 'Küche: Bratwürste'; break;
case 'burger': $cui= 'Küche: Burger'; break;
case 'croatian': $cui= 'kroatische Küche'; break;
case 'czech': $cui= 'tschechische Küche'; break;
case 'chinese': $cui= 'chinesische Küche'; break;
case 'danish': $cui= 'dänische Küche'; break;
case 'fish': $cui= 'Küche: Fisch'; break;
case 'frankonian': $cui= 'fränkische Küche'; break;
case 'french': $cui= 'französische Küche'; break;
case 'german': $cui= 'deutsche Küche'; break;
case 'greek': $cui= 'griechische Küche'; break;
case 'ice_cream': $cui= 'Küche: Speiseeis'; break;
case 'indian': $cui= 'indische Küche'; break;
case 'international': $cui= 'internationale Küche'; break;
case 'irish': $cui= 'irische Küche'; break;
case 'italian': $cui= 'italienische Küche'; break;
case 'japanese': $cui= 'japanische Küche'; break;
case 'kebab': $cui= 'Küche: Döner'; break;
case 'korean': $cui= 'koreanische Küche'; break;
case 'lebanese': $cui= 'libanesische Küche'; break;
case 'mediterranean': $cui= 'mediterrane Küche'; break;
case 'mexican': $cui= 'mexikanische Küche'; break;
case 'noodles': $cui= 'Küche: Nudeln'; break;
case 'pizza': $cui= 'Küche: Pizza'; break;
case 'regional': $cui= 'regionale Küche'; break;
case 'russian': $cui= 'russische Küche'; break;
case 'shisha': $cui= 'Shisha-Bar'; break;
case 'south_african': $cui= 'südafrikanische Küche'; break;
case 'spanish': $cui= 'spanische Küche'; break;
case 'steak': $cui= 'Küche: Steaks'; break;
case 'sandwich': $cui= 'Küche: Sandwiches'; break;
case 'steak_house': $cui= 'Steak-Haus'; break;
case 'sushi': $cui= 'Küche: Sushi'; break;
case 'thai': $cui= 'thailändische Küche'; break;
case 'turkish': $cui= 'türkische Küche'; break;
case 'vietnamese': $cui= 'vietnamesische Küche'; break;
default:
if($cuisine=='') {
$cui= '_';
$ic= 0; // icon for undefined cuisines
}
else {
$cui= 'Küche (engl.): '.$cuisine;
$ic= 1; // icon for defined cuisines we do not recognize
}
}
if($ic==0) $cuisine_icon= "cui_undefined.png";
else if($ic==1) $cuisine_icon= "cui_unknown.png";
else $cuisine_icon= "cui_".$cuisine.".png";
if($ftype=="c") {
echo "$coords\t24,24\t-12,-15\t$cuisine_icon\n";
break;
}
$name = htmlspecialchars($row['name']);
$amenity = htmlentities(mb_strtolower($row['amenity']));
$smoking = htmlentities(mb_strtolower($row['smoking']));
$smoking_hours = htmlentities(mb_strtolower($row['smoking_hours']));
if($smoking_hours=='') $smoking_hours= '_';
$smoking_outside = htmlentities(mb_strtolower($row['smoking_outside']));
if($smoking_outside=='') $smoking_outside= '_';
$wheelchair= htmlentities($row['wheelchair']);
$internet_access= htmlentities($row['internet_access']);
$website= htmlspecialchars($row['website']);
if($website=='') $website= '_';
echo "$coords\t$row[1]\t$osmtype\t$name\t$amenity\t$smoking\t$smoking_hours\t$smoking_outside\t$cui\t$cuisine_icon\t$wheelchair\t$internet_access\t$website\t24,24\t-12,-15\tu.png\n";
}
} // end for every marker
} // end of main loop
?>