< OpenGastroMap < Installation
OpenGastroMap/Installation/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 ?>
This article is issued from Openstreetmap. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.