OpenGastroMap/Installation/features.php
Jump to navigation
Jump to search
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
?>