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

Last change on this file since 21405 was 21405, checked in by avantman42, 9 years ago

Fix for bug found by Nick Allen - postboxes without ref were not found

File size: 16.3 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) 2009-2010 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// Waypoint name length
42$namelen = (int) $_GET ['namelen'];
43
44// Store values in cookies
45$iExpireTime = time ()+60*60*24*365;
46setcookie ("left", $left, $iExpireTime);
47setcookie ("bottom", $bottom, $iExpireTime);
48setcookie ("right", $right, $iExpireTime);
49setcookie ("top", $top, $iExpireTime);
50
51setcookie ("ref", $ref, $iExpireTime);
52setcookie ("name", $name, $iExpireTime);
53setcookie ("hours", $hours, $iExpireTime);
54setcookie ("source", $source, $iExpireTime);
55setcookie ("fixme", $fixme, $iExpireTime);
56setcookie ("naptan", $naptan, $iExpireTime);
57setcookie ("road", $road, $iExpireTime);
58setcookie ("pbref", $pbref, $iExpireTime);
59
60setcookie ("namelen", $namelen, $iExpireTime);
61
62// Get OSM data
63$xml = simplexml_load_file ($osm_api_base . "?bbox=$left,$bottom,$right,$top");
64if ($xml === False)
65        die ("There was a problem getting data from OSM. Go back and try a smaller area.");
66
67// Write header to download XML
68header("Content-Type: application/gpx+xml");
69header("Content-Disposition: attachment; filename=osm_error.gpx;");
70
71// Initialise $iCount
72$iCount = 1;
73
74/*
75 * Get the lat/lon for a way
76 * $way: way to get lat/lon for
77 * &$lat: returned latitude
78 * &$lon: returned longitude
79*/
80function GetWayLatLon ($way, &$fWayLat, &$fWayLon) {
81        global $xml;
82        // Get lat/lon of first node
83        $nodeid = $way->nd [0]["ref"];
84
85        // Loop through nodes in XML
86        foreach ($xml->node as $node) {
87                // If node is first part of the way, get lat & lon
88                if ((int) $node ["id"] == $nodeid) {
89                        $fWayLat = (float) $node ["lat"];
90                        $fWayLon = (float) $node ["lon"];
91                        // Found node - return from function
92                        return;
93                }
94        }
95}
96
97/*
98 * Check a node or way has a given tag
99 * $node: the node or way to be checked
100 * $checkfor: the key to check for
101 * Returns true if the key exists, false if not
102*/
103function TagCheck ($node, $checkfor) {
104        foreach ($node->tag as $tag)
105                if (strtolower ($tag ["k"]) == strtolower ($checkfor))
106                        return True;
107        return False;
108}
109
110/*
111 * Check a node or way does *not* have a tag.
112 * If tag does exist, writes a waypoint
113 * $node: node/way to be checked
114 * $tag: tag in $node to be checked for
115 * $k/$v: define type of node to check (eg $k == "source", $v == "extrapolation")
116 * Either $k or $v can be a wildcard (*)
117 * $waynode - "way" or "node" to indicate whether $node is a way or a node
118*/
119function NoTagCheck ($node, $tag, $k, $v, $waynode, $name, $shortname) {
120        global $iCount, $DEBUG, $LOG_FILE;
121        //Make check case-insensitive
122        $k = strtolower ($k);
123        $v = strtolower ($v);
124        $tagk = strtolower ($tag ["k"]);
125        $tagv = strtolower ($tag ["v"]);
126
127        if (($tagk == $k && $tagv == $v) ||
128                        ($tagk == $k && $v == "*") ||
129                        ($k == "*" && $tagv == $v)) {
130                if ($waynode == "way") {
131                        $fWayLat = 0;
132                        $fWayLon = 0;
133                        GetWayLatLon ($node, $fWayLat, $fWayLon);
134                        $sOut = "<wpt lat='$fWayLat' lon='$fWayLon'>\n";
135                }
136                else
137                        $sOut = "<wpt lat='" . $node ["lat"] . "' lon='" . $node ["lon"] . "'>\n";
138                $sErrText =  "$k - " . $tag ["v"];
139                if ($namelen == 6)
140                        $sOut .= "<name>$shortname" . $iCount++ . "</name>\n";
141                elseif ($namelen == 14)
142                        $sOut .= "<name>$name" . $iCount++ . "</name>\n";
143                else
144                        $sOut .= "<name>$sErrText (" . $iCount++ . ")</name>\n";
145                $sOut .= "<desc>$sErrText</desc>\n";
146                $sOut .= "</wpt>\n";
147                echo $sOut;
148                if ($DEBUG)
149                        file_put_contents ($LOG_FILE, "\t$sErrText\n\tLat/Lon: {$node ['lat']}, {$node ['lon']}\n", FILE_APPEND);
150        }
151}
152
153/*
154 * Check a node has a source=OS_OpenData tag
155 * If tag exists, writes a waypoint
156 * $node: node to be checked
157 * $tag: tag in $node to be checked
158*/
159function NodeCheckOS ($node, $tag) {
160        global $iCount, $DEBUG, $LOG_FILE;
161        //Make check case-insensitive
162        $tagk = strtolower ($tag ["k"]);
163        $tagv = strtolower ($tag ["v"]);
164
165        if ($tagk == "source" && substr ($tagv, 0, 11) == "os_opendata") {
166                $sOut = "<wpt lat='" . $node ["lat"] . "' lon='" . $node ["lon"] . "'>\n";
167                if ($namelen == 6)
168                        $sOut .= "<name>SrcOS" . $iCount++ . "</name>\n";
169                elseif ($namelen == 14)
170                        $sOut .= "<name>Source OS " . $iCount++ . "</name>\n";
171                else
172                        $sOut .= "<name>Source OS (" . $iCount++ . ")</name>\n";
173                $sOut .= "<desc>Sourced from OS data ({$tag ['v']})</desc>\n";
174                $sOut .= "</wpt>\n";
175                echo $sOut;
176                if ($DEBUG)
177                        file_put_contents ($LOG_FILE, "\t$sErrText\n\tLat/Lon: {$node ['lat']}, {$node ['lon']}\n", FILE_APPEND);
178        }
179}
180
181/*
182 * Check a way has a source=OS_OpenData tag
183 * If tag exists, writes a waypoint
184 * $way: way to be checked
185 * $tag: tag in $way to be checked
186*/
187function WayCheckOS ($way, $tag) {
188        global $iCount, $DEBUG, $LOG_FILE;
189        //Make check case-insensitive
190        $tagk = strtolower ($tag ["k"]);
191        $tagv = strtolower ($tag ["v"]);
192
193        if ($tagk == "source" && substr ($tagv, 0, 11) == "os_opendata") {
194                $lat = 0;
195                $lon = 0;
196                GetWayLatLon ($way, $lat, $lon);
197                $sOut = "<wpt lat='$lat' lon='$lon'>\n";
198                if ($namelen == 6)
199                        $sOut .= "<name>SrcOS" . $iCount++ . "</name>\n";
200                elseif ($namelen == 14)
201                        $sOut .= "<name>Source OS " . $iCount++ . "</name>\n";
202                else
203                        $sOut .= "<name>Source OS (" . $iCount++ . ")</name>\n";
204                $sOut .= "<desc>Sourced from OS data ({$tag ['v']})</desc>\n";
205                $sOut .= "</wpt>\n";
206                echo $sOut;
207                if ($DEBUG)
208                        file_put_contents ($LOG_FILE, "\t$sErrText\n\tLat/Lon: {$node ['lat']}, {$node ['lon']}\n", FILE_APPEND);
209        }
210}
211
212/* **************************************************************** */
213/*
214 * Check a node has "fixme" in the description
215 * If it exists, write a waypoint
216 * $node: node to be checked
217 * $tag: tag in $node to be checked
218*/
219function NodeFixmeDescription ($node, $tag) {
220        global $iCount, $DEBUG, $LOG_FILE;
221        //Make check case-insensitive
222        $tagk = strtolower ($tag ["k"]);
223        $tagv = strtolower ($tag ["v"]);
224
225        if ($tagk == "description" && strstr ($tagv, "fixme") !== False) {
226                $sOut = "<wpt lat='" . $node ["lat"] . "' lon='" . $node ["lon"] . "'>\n";
227                if ($namelen == 6)
228                        $sOut .= "<name>FIXME" . $iCount++ . "</name>\n";
229                elseif ($namelen == 14)
230                        $sOut .= "<name>FIXME " . $iCount++ . "</name>\n";
231                else
232                        $sOut .= "<name>FIXME (" . $iCount++ . ")</name>\n";
233                $sOut .= "<desc>Fixme in description - {$tag ['v']}</desc>\n";
234                $sOut .= "</wpt>\n";
235                echo $sOut;
236                if ($DEBUG)
237                        file_put_contents ($LOG_FILE, "\t$sErrText\n\tLat/Lon: {$node ['lat']}, {$node ['lon']}\n", FILE_APPEND);
238        }
239}
240
241/*
242 * Check a way has "fixme" in the description
243 * If it exists, write a waypoint
244 * $way: way to be checked
245 * $tag: tag in $way to be checked
246*/
247function WayFixmeDescription ($way, $tag) {
248        global $iCount, $DEBUG, $LOG_FILE;
249        //Make check case-insensitive
250        $tagk = strtolower ($tag ["k"]);
251        $tagv = strtolower ($tag ["v"]);
252
253        if ($tagk == "description" && strstr ($tagv, "fixme") !== False) {
254                $lat = 0;
255                $lon = 0;
256                GetWayLatLon ($way, $lat, $lon);
257                $sOut = "<wpt lat='$lat' lon='$lon'>\n";
258                if ($namelen == 6)
259                        $sOut .= "<name>FIXME" . $iCount++ . "</name>\n";
260                elseif ($namelen == 14)
261                        $sOut .= "<name>FIXME " . $iCount++ . "</name>\n";
262                else
263                        $sOut .= "<name>FIXME (" . $iCount++ . ")</name>\n";
264                $sOut .= "<desc>Fixme in description - {$tag ['v']}</desc>\n";
265                $sOut .= "</wpt>\n";
266                echo $sOut;
267                if ($DEBUG)
268                        file_put_contents ($LOG_FILE, "\t$sErrText\n\tLat/Lon: {$node ['lat']}, {$node ['lon']}\n", FILE_APPEND);
269        }
270}
271/* **************************************************************** */
272
273/*
274 * Check a node has a tag.
275 * If tag does not exist, writes a waypoint
276 * $node: node to be checked
277 * $tag: tag in $node to be checked
278 * $k/$v: define type of node to check (eg $k == "shop", $v == "supermarket")
279 * Either $k or $v can be a wildcard (*)
280 * $checkfor: tag to check for existence of (eg "opening_hours")
281*/
282function NodeCheck ($node, $tag, $k, $v, $checkfor, $name, $shortname) {
283        global $iCount, $DEBUG, $LOG_FILE;
284        //Make check case-insensitive
285        $k = strtolower ($k);
286        $v = strtolower ($v);
287        $tagk = strtolower ($tag ["k"]);
288        $tagv = strtolower ($tag ["v"]);
289
290        if (($tagk == $k && $tagv == $v) ||
291                        ($tagk == $k && $v == "*") ||
292                        ($k == "*" && $tagv == $v))
293                if (TagCheck ($node, $checkfor) === False) {
294                        $sOut = "<wpt lat='" . $node ["lat"] . "' lon='" . $node ["lon"] . "'>\n";
295                        if ($v == "*")
296                                $sErrText = "$k - $checkfor";
297                        else
298                                $sErrText = "$v - $checkfor";
299                if ($namelen == 6)
300                        $sOut .= "<name>$shortname" . $iCount++ . "</name>\n";
301                elseif ($namelen == 14)
302                        $sOut .= "<name>$name" . $iCount++ . "</name>\n";
303                else
304                        $sOut .= "<name>$sErrText (" . $iCount++ . ")</name>\n";
305                $sOut .= "<desc>$sErrText</desc>\n";
306                $sOut .= "</wpt>\n";
307                echo $sOut;
308                if ($DEBUG)
309                        file_put_contents ($LOG_FILE, "\t$sErrText\n\tLat/Lon: {$node ['lat']}, {$node ['lon']}\n", FILE_APPEND);
310                }
311}
312
313/*
314 * Check a way has a tag.
315 * If tag does not exist, writes a waypoint
316 * $node: node to be checked
317 * $tag: tag in $way to be checked
318 * $k/$v: define type of way to check (eg $k == "highway", $v == "residential")
319 * Either $k or $v can be a wildcard (*)
320 * $checkfor: tag to check for existence of (eg "name")
321*/
322function WayCheck ($way, $tag, $k, $v, $checkfor, $name, $shortname) {
323        global $iCount, $DEBUG, $LOG_FILE;
324        //Make check case-insensitive
325        $k = strtolower ($k);
326        $v = strtolower ($v);
327        $tagk = strtolower ($tag ["k"]);
328        $tagv = strtolower ($tag ["v"]);
329
330        if (($tagk == $k && $tagv == $v) ||
331                        ($tagk == $k && $v == "*") ||
332                        ($k == "*" && $tagv == $v))
333                if (TagCheck ($way, $checkfor) === False) {
334                        $lat = 0;
335                        $lon = 0;
336                        GetWayLatLon ($way, $lat, $lon);
337                        $sOut = "<wpt lat='$lat' lon='$lon'>\n";
338                        if ($v == "*")
339                                $sErrText = "$k - $checkfor";
340                        else
341                                $sErrText = "$v - $checkfor";
342                if ($namelen == 6)
343                        $sOut .= "<name>$shortname" . $iCount++ . "</name>\n";
344                elseif ($namelen == 14)
345                        $sOut .= "<name>$name" . $iCount++ . "</name>\n";
346                else
347                        $sOut .= "<name>$sErrText (" . $iCount++ . ")</name>\n";
348                $sOut .= "<desc>$sErrText</desc>\n";
349                $sOut .= "</wpt>\n";
350                echo $sOut;
351                if ($DEBUG)
352                        file_put_contents ($LOG_FILE, "\t$sErrText\n\tLat/Lon: {$node ['lat']}, {$node ['lon']}\n", FILE_APPEND);
353                }
354}
355
356//Write file header
357echo "<?xml version='1.0' encoding='UTF-8'?>\n";
358echo <<<END
359<gpx
360  version="1.0"
361  creator="OSM-Error - http://www.mappage.org/osmerror/"
362  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
363  xmlns="http://www.topografix.com/GPX/1/0"
364  xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
365END;
366echo "\n";
367
368// Check nodes
369foreach ($xml->node as $node) {
370        if ($DEBUG)
371                file_put_contents ($LOG_FILE, "Checking node {$node ["id"]}\n", FILE_APPEND);
372        foreach ($node->tag as $tag) {
373                // Post box reference
374                if ($pbref === True)
375                        NodeCheck ($node, $tag, "amenity", "post_box", "ref", "Postbox ref", "pb ref");
376
377                // Name
378                if ($name === True) {
379                        NodeCheck ($node, $tag, "*", "cafe", "name", "Cafe name ", "Name");
380                        NodeCheck ($node, $tag, "*", "restaurant", "name", "Restnt name", "Name");
381                        NodeCheck ($node, $tag, "*", "pub", "name", "Pub name ", "Name");
382
383                        NodeCheck ($node, $tag, "*", "school", "name", "School name", "Name");
384                        NodeCheck ($node, $tag, "*", "college", "name", "Coll name ", "Name");
385                        NodeCheck ($node, $tag, "*", "library", "name", "Liby name ", "Name");
386                        NodeCheck ($node, $tag, "*", "university", "name", "Uni name ", "Name");
387
388                        NodeCheck ($node, $tag, "shop", "*", "name", "Shop name ", "Name");
389                        NodeCheck ($node, $tag, "*", "post_office", "name", "POffice nme", "Name");
390                        NodeCheck ($node, $tag, "amenity", "cinema", "name", "Cinema name", "Name");
391                }
392
393                // Opening hours
394                if ($hours === True) {
395                        NodeCheck ($node, $tag, "*", "cafe", "opening_hours", "Open hours ", "OHours");
396                        NodeCheck ($node, $tag, "shop", "*", "opening_hours", "Open hours ", "OHours");
397                        NodeCheck ($node, $tag, "*", "post_office", "opening_hours", "Open hours ", "OHours");
398                        NodeCheck ($node, $tag, "*", "fast_food", "opening_hours", "Open hours ", "OHours");
399                        NodeCheck ($node, $tag, "*", "pharmacy", "opening_hours", "Open hours ", "OHours");
400                        NodeCheck ($node, $tag, "*", "restaurant", "opening_hours", "Open hours ", "OHours");
401                        NodeCheck ($node, $tag, "*", "library", "opening_hours", "Open hours ", "OHours");
402                }
403
404                // Source
405                if ($source === True) {
406                        NoTagCheck ($node, $tag, "source", "extrapolation", "node", "Src extrap", "Source");
407                        NoTagCheck ($node, $tag, "source", "NPE", "node", "Src NPE ", "SrcNPE");
408                        NoTagCheck ($node, $tag, "source", "historical", "node", "Src Hist ", "SrcHis");
409                        NodeCheckOS ($node, $tag);
410                }
411
412                // FIXME tags
413                if ($fixme === True)
414                        NoTagCheck ($node, $tag, "FIXME", "*", "node", "Fixme ", "Fixme");
415
416                // NAPTAN import
417                if ($naptan === True)
418                        NoTagCheck ($node, $tag, "naptan:verified", "no", "node", "Naptan vrfy", "Naptan");
419        }
420}
421
422// Check ways
423foreach ($xml->way as $way) {
424        if ($DEBUG)
425                file_put_contents ($LOG_FILE, "Checking way {$way ["id"]}\n", FILE_APPEND);
426        foreach ($way->tag as $tag) {
427
428                // Ref
429                if ($ref === True) {
430                        WayCheck ($way, $tag, "highway", "motorway", "ref", "Motrway ref", "Ref");
431                        WayCheck ($way, $tag, "highway", "trunk", "ref", "Trunk ref", "Ref");
432                        WayCheck ($way, $tag, "highway", "primary", "ref", "Primry ref ", "Ref");
433                        WayCheck ($way, $tag, "highway", "secondary", "ref", "Secndry ref", "Ref");
434                }
435
436                // Name
437                if ($name === True) {
438                        WayCheck ($way, $tag, "highway", "residential", "name", "Resid name ", "Name");
439
440                        WayCheck ($way, $tag, "*", "cafe", "name", "Cafe name ", "Name");
441                        WayCheck ($way, $tag, "*", "restaurant", "name", "Restnt name", "Name");
442                        WayCheck ($way, $tag, "*", "pub", "name", "Pub name ", "Name");
443
444                        WayCheck ($way, $tag, "*", "school", "name", "School name", "Name");
445                        WayCheck ($way, $tag, "*", "college", "name", "Coll name ", "Name");
446                        WayCheck ($way, $tag, "*", "library", "name", "Liby name ", "Name");
447                        WayCheck ($way, $tag, "*", "university", "name", "Uni name ", "Name");
448
449                        WayCheck ($way, $tag, "shop", "*", "name", "Shop name ", "Name");
450                        WayCheck ($way, $tag, "*", "post_office", "name", "POffice nme", "Name");
451                        WayCheck ($way, $tag, "amenity", "cinema", "name", "Cinema name", "Name");
452                }
453
454                // Opening hours
455                if ($hours === True) {
456                        WayCheck ($way, $tag, "*", "cafe", "opening_hours", "Open hours ", "OHours");
457                        WayCheck ($way, $tag, "shop", "*", "opening_hours", "Open hours ", "OHours");
458                        WayCheck ($way, $tag, "*", "post_office", "opening_hours", "Open hours ", "OHours");
459                        WayCheck ($way, $tag, "*", "fast_food", "opening_hours", "Open hours ", "OHours");
460                        WayCheck ($way, $tag, "*", "pharmacy", "opening_hours", "Open hours ", "OHours");
461                        WayCheck ($way, $tag, "*", "restaurant", "opening_hours", "Open hours ", "OHours");
462                        WayCheck ($way, $tag, "*", "library", "opening_hours", "Open hours ", "OHours");
463                }
464
465                // Source
466                if ($source === True) {
467                        NoTagCheck ($way, $tag, "source", "extrapolation", "way", "Src extrap", "Source");
468                        NoTagCheck ($way, $tag, "source", "NPE", "way", "Src NPE ", "SrcNPE");
469                        NoTagCheck ($way, $tag, "source", "historical", "way", "Src Hist ", "SrcHis");
470                        NoTagCheck ($way, $tag, "source", "historical", "way", "Src Hist ", "SrcHis");
471                        WayCheckOS ($way, $tag);
472                }
473
474                // FIXME etc
475                if ($fixme === True)
476                        NoTagCheck ($way, $tag, "FIXME", "*", "way", "Fixme ", "Fixme");
477
478                // Unknown road classification
479                if ($road === True)
480                        NoTagCheck ($way, $tag, "highway", "road", "way", "Road type ", "Road");
481        }
482}
483
484echo "</gpx>\n";
485?>
Note: See TracBrowser for help on using the repository browser.