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 ?>