source: subversion/applications/utils/osm-error/error.php @ 18795

Last change on this file since 18795 was 18795, checked in by avantman42, 10 years ago

Licence change to GPL
Waypoints have descriptions
Only enable download button if area is small enough for OSM API

File size: 9.7 KB
Line 
1<?php
2/*
3Code to get co-ordinates from map taken from http://maposmatic.org/ and
4copyright (c) 2009 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
5Other code copyright (c) Russ Phillips <russ AT phillipsuk DOT org>
6
7This file is part of OSM Error.
8
9OSM Error is free software: you can redistribute it and/or modify
10it under the terms of the GNU General Public License as
11published by the Free Software Foundation, either version 3 of the
12License, or (at your option) any later version.
13
14This program is distributed in the hope that it will be useful,
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
20along with this program.  If not, see <http://www.gnu.org/licenses/>.
21*/
22
23require ("inc_config.php");
24
25// Co-ordinates
26$left = (float) $_GET ['lon_upper_left'];
27$bottom = (float) $_GET ['lat_bottom_right'];
28$right = (float) $_GET ['lon_bottom_right'];
29$top = (float) $_GET ['lat_upper_left'];
30
31// Checkbox values
32$ref = (bool) $_GET ['ref'];
33$name = (bool) $_GET ['name'];
34$hours = (bool) $_GET ['hours'];
35$source = (bool) $_GET ['source'];
36$fixme = (bool) $_GET ['fixme'];
37$naptan = (bool) $_GET ['naptan'];
38$road = (bool) $_GET ['road'];
39$pbref = (bool) $_GET ['pbref'];
40
41// Store co-ordinates & checkbox values in cookies
42$iExpireTime = time()+60*60*24*90;
43setcookie ("left", $left, $iExpireTime);
44setcookie ("bottom", $bottom, $iExpireTime);
45setcookie ("right", $right, $iExpireTime);
46setcookie ("top", $top, $iExpireTime);
47
48setcookie ("ref", $ref, $iExpireTime);
49setcookie ("name", $name, $iExpireTime);
50setcookie ("hours", $hours, $iExpireTime);
51setcookie ("source", $source, $iExpireTime);
52setcookie ("fixme", $fixme, $iExpireTime);
53setcookie ("naptan", $naptan, $iExpireTime);
54setcookie ("road", $road, $iExpireTime);
55setcookie ("pbref", $pbref, $iExpireTime);
56
57// Get OSM data
58$xml = simplexml_load_file ($osm_api_base . "?bbox=$left,$bottom,$right,$top");
59if ($xml === False)
60        die ("There was a problem getting data from OSM. Go back and try a smaller area.");
61
62// Write header to download XML
63header("Content-Type: application/gpx+xml");
64header("Content-Disposition: attachment; filename=osm_error.gpx;");
65
66// Initialise $iCount
67$iCount = 1;
68
69/*
70 * Get the lat/lon for a way
71 * $way: way to get lat/lon for
72 * &$lat: returned latitude
73 * &$lon: returned longitude
74*/
75function GetWayLatLon ($way, &$fWayLat, &$fWayLon) {
76        global $xml;
77
78        // Get lat/lon of first node
79        $nodeid = $way->nd [0]["ref"];
80        // Loop through nodes in XML
81        foreach ($xml->node as $node) {
82                // If node is part of the way, get lat & lon
83                if ((int) $node ["id"] == $nodeid) {
84                        $fWayLat += (float) $node ["lat"];
85                        $fWayLon += (float) $node ["lon"];
86                        // Found node - return from function
87                        return;
88                }
89        }
90}
91
92/*
93 * Check a node or way has a given tag
94 * $node: the node or way to be checked
95 * $checkfor: the key to check for
96 * Returns true if the key exists, false if not
97*/
98function TagCheck ($node, $checkfor) {
99        foreach ($node->tag as $tag)
100                if ($tag ["k"] == $checkfor)
101                        return True;
102        return False;
103}
104
105/*
106 * Check a node or way does *not* have a tag.
107 * If tag does exist, writes a waypoint
108 * $node: node/way to be checked
109 * $tag: tag in $node to be checked for
110 * $k/$v: define type of node to check (eg $k == "source", $v == "extrapolation")
111 * Either $k or $v can be a wildcard (*)
112 * $waynode - "way" or "node" to indicate whether $node is a way or a node
113*/
114function NoTagCheck ($node, $tag, $k, $v, $waynode) {
115        global $iCount;
116
117        if (($tag ["k"] == $k && $tag ["v"] == $v) ||
118                        ($tag ["k"] == $k && $v == "*") ||
119                        ($k == "*" && $tag ["v"] == $v)) {
120                if ($waynode == "way") {
121                        $fWayLat = 0;
122                        $fWayLon = 0;
123                        GetWayLatLon ($node, $fWayLat, $fWayLon);
124                        $sOut = "<wpt lat='$fWayLat' lon='$fWayLon'>\n";
125                }
126                else
127                        $sOut = "<wpt lat='" . $node ["lat"] . "' lon='" . $node ["lon"] . "'>\n";
128                $sErrText =  $iCount++ . " $k - " . $tag ["v"];
129                $sOut .= "<name>$sErrText</name>\n";
130                $sOut .= "<desc>$sErrText</desc>\n";
131                $sOut .= "</wpt>\n";
132                echo $sOut;
133        }
134}
135
136/*
137 * Check a node has a tag.
138 * If tag does not exist, writes a waypoint
139 * $node: node to be checked
140 * $tag: tag in $node to be checked
141 * $k/$v: define type of node to check (eg $k == "shop", $v == "supermarket")
142 * Either $k or $v can be a wildcard (*)
143 * $checkfor: tag to check for existence of (eg "opening_hours")
144*/
145function NodeCheck ($node, $tag, $k, $v, $checkfor) {
146        global $iCount;
147
148        if (($tag ["k"] == $k && $tag ["v"] == $v) ||
149                        ($tag ["k"] == $k && $v == "*") ||
150                        ($k == "*" && $tag ["v"] == $v))
151                if (TagCheck ($node, $checkfor) === False) {
152                        $sOut = "<wpt lat='" . $node ["lat"] . "' lon='" . $node ["lon"] . "'>\n";
153                        if ($v == "*")
154                                $sErrText = $iCount++ . " $k - $checkfor";
155                        else
156                                $sErrText = $iCount++ . " $v - $checkfor";
157                        $sOut .= "<name>$sErrText</name>\n";
158                        $sOut .= "<desc>$sErrText</desc>\n";
159                        $sOut .= "</wpt>\n";
160                        echo $sOut;
161                }
162}
163
164/*
165 * Check a way has a tag.
166 * If tag does not exist, writes a waypoint
167 * $node: node to be checked
168 * $tag: tag in $way to be checked
169 * $k/$v: define type of way to check (eg $k == "highway", $v == "residential")
170 * Either $k or $v can be a wildcard (*)
171 * $checkfor: tag to check for existence of (eg "name")
172*/
173function WayCheck ($way, $tag, $k, $v, $checkfor) {
174        global $iCount;
175
176        if (($tag ["k"] == $k && $tag ["v"] == $v) ||
177                        ($tag ["k"] == $k && $v == "*") ||
178                        ($k == "*" && $tag ["v"] == $v))
179                if (TagCheck ($way, $checkfor) === False) {
180                        $lat = 0;
181                        $lon = 0;
182                        GetWayLatLon ($way, $lat, $lon);
183                        $sOut = "<wpt lat='$lat' lon='$lon'>\n";
184                        if ($v == "*")
185                                $sErrText = $iCount++ . " $k - $checkfor";
186                        else
187                                $sErrText = $iCount++ . " $v - $checkfor";
188                        $sOut .= "<name>$sErrText</name>\n";
189                        $sOut .= "<desc>$sErrText</desc>\n";
190                        $sOut .= "</wpt>\n";
191                        echo $sOut;
192                }
193}
194
195//Write file header
196echo "<?xml version='1.0' encoding='UTF-8'?>\n";
197echo <<<END
198<gpx
199  version="1.0"
200  creator="OSM-Error - http://www.mappage.org/osmerror/"
201  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
202  xmlns="http://www.topografix.com/GPX/1/0"
203  xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
204END;
205echo "\n";
206
207// Check nodes
208foreach ($xml->node as $node) {
209        if ($DEBUG)
210                file_put_contents ($LOG_FILE, "Checking node {$node ["id"]}\n", FILE_APPEND);
211        foreach ($node->tag as $tag) {
212                // Post box reference
213                if ($pbref === True)
214                        TagCheck ($node, $tag, "amenity", "post_box", "ref");
215
216                // Name
217                if ($name === True) {
218                        NodeCheck ($node, $tag, "*", "cafe", "name");
219                        NodeCheck ($node, $tag, "*", "restaurant", "name");
220                        NodeCheck ($node, $tag, "*", "pub", "name");
221
222                        NodeCheck ($node, $tag, "*", "school", "name");
223                        NodeCheck ($node, $tag, "*", "college", "name");
224                        NodeCheck ($node, $tag, "*", "library", "name");
225                        NodeCheck ($node, $tag, "*", "university", "name");
226
227                        NodeCheck ($node, $tag, "shop", "*", "name");
228                        NodeCheck ($node, $tag, "*", "post_office", "name");
229                        NodeCheck ($node, $tag, "amenity", "cinema", "name");
230                }
231
232                // Opening hours
233                if ($hours === True) {
234                        NodeCheck ($node, $tag, "*", "cafe", "opening_hours");
235                        NodeCheck ($node, $tag, "shop", "*", "opening_hours");
236                        NodeCheck ($node, $tag, "*", "post_office", "opening_hours");
237                        NodeCheck ($node, $tag, "*", "fast_food", "opening_hours");
238                        NodeCheck ($node, $tag, "*", "pharmacy", "opening_hours");
239                        NodeCheck ($node, $tag, "*", "restaurant", "opening_hours");
240                        NodeCheck ($node, $tag, "*", "library", "opening_hours");
241                }
242
243                // Source
244                if ($source === True) {
245                        NoTagCheck ($node, $tag, "source", "extrapolation");
246                        NoTagCheck ($node, $tag, "source", "NPE");
247                        NoTagCheck ($node, $tag, "source", "historical");
248                }
249
250                // FIXME tags
251                if ($fixme === True)
252                        NoTagCheck ($node, $tag, "FIXME", "*");
253
254                // NAPTAN import
255                if ($naptan === True)
256                        NoTagCheck ($node, $tag, "naptan:verified", "no");
257        }
258}
259
260// Check ways
261foreach ($xml->way as $way) {
262        if ($DEBUG)
263                file_put_contents ($LOG_FILE, "Checking way {$way ["id"]}\n", FILE_APPEND);
264        foreach ($way->tag as $tag) {
265
266                // Ref
267                if ($ref === True) {
268                        WayCheck ($way, $tag, "highway", "motorway", "ref");
269                        WayCheck ($way, $tag, "highway", "trunk", "ref");
270                        WayCheck ($way, $tag, "highway", "primary", "ref");
271                        WayCheck ($way, $tag, "highway", "secondary", "ref");
272                }
273
274                // Name
275                if ($name === True) {
276                        WayCheck ($way, $tag, "highway", "residential", "name");
277
278                        WayCheck ($way, $tag, "*", "cafe", "name");
279                        WayCheck ($way, $tag, "*", "restaurant", "name");
280                        WayCheck ($way, $tag, "*", "pub", "name");
281
282                        WayCheck ($way, $tag, "*", "school", "name");
283                        WayCheck ($way, $tag, "*", "college", "name");
284                        WayCheck ($way, $tag, "*", "library", "name");
285                        WayCheck ($way, $tag, "*", "university", "name");
286
287                        WayCheck ($way, $tag, "shop", "*", "name");
288                        WayCheck ($way, $tag, "*", "post_office", "name");
289                        WayCheck ($way, $tag, "amenity", "cinema", "name");
290                }
291
292                // Opening hours
293                if ($hours === True) {
294                        WayCheck ($way, $tag, "*", "cafe", "opening_hours");
295                        WayCheck ($way, $tag, "shop", "*", "opening_hours");
296                        WayCheck ($way, $tag, "*", "post_office", "opening_hours");
297                        WayCheck ($way, $tag, "*", "fast_food", "opening_hours");
298                        WayCheck ($way, $tag, "*", "pharmacy", "opening_hours");
299                        WayCheck ($way, $tag, "*", "restaurant", "opening_hours");
300                        WayCheck ($way, $tag, "*", "library", "opening_hours");
301                }
302
303                // Source
304                if ($source === True) {
305                        NoTagCheck ($way, $tag, "source", "extrapolation");
306                        NoTagCheck ($way, $tag, "source", "NPE");
307                        NoTagCheck ($way, $tag, "source", "historical");
308                }
309
310                // FIXME etc
311                if ($fixme === True)
312                        NoTagCheck ($way, $tag, "FIXME", "*");
313
314                // Unknown road classification
315                if ($road === True)
316                        NoTagCheck ($way, $tag, "highway", "road");
317        }
318}
319
320echo "</gpx>\n";
321?>
Note: See TracBrowser for help on using the repository browser.