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

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

Check for OS-derived data now checks for *any* OS_OpenData source tag

File size: 14.4 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// 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 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/* ****************************************************************** */
155
156/*
157 * Check a node has a source=OS_OpenData tag
158 * If tag exists, writes a waypoint
159 * $node: node to be checked
160 * $tag: tag in $node to be checked
161*/
162function NodeCheckOS ($node, $tag) {
163        global $iCount, $DEBUG, $LOG_FILE;
164        //Make check case-insensitive
165        $tagk = strtolower ($tag ["k"]);
166        $tagv = strtolower ($tag ["v"]);
167
168        if ($tagk == "source" && substr ($tagv, 0, 11) == "os_opendata") {
169                $sOut = "<wpt lat='" . $node ["lat"] . "' lon='" . $node ["lon"] . "'>\n";
170                if ($namelen == 6)
171                        $sOut .= "<name>SrcOS" . $iCount++ . "</name>\n";
172                elseif ($namelen == 14)
173                        $sOut .= "<name>Source OS " . $iCount++ . "</name>\n";
174                else {
175                        $sOut .= "<name>Source OS (" . $iCount++ . ")</name>\n";
176                        $sOut .= "<desc>Sourced from OS data</desc>\n";
177                        $sOut .= "</wpt>\n";
178                        echo $sOut;
179                        if ($DEBUG)
180                                file_put_contents ($LOG_FILE, "\t$sErrText\n\tLat/Lon: {$node ['lat']}, {$node ['lon']}\n", FILE_APPEND);
181                }
182        }
183}
184
185/*
186 * Check a way has a source=OS_OpenData tag
187 * If tag exists, writes a waypoint
188 * $way: way to be checked
189 * $tag: tag in $way to be checked
190*/
191function WayCheckOS ($way, $tag) {
192        global $iCount, $DEBUG, $LOG_FILE;
193        //Make check case-insensitive
194        $tagk = strtolower ($tag ["k"]);
195        $tagv = strtolower ($tag ["v"]);
196
197        if ($tagk == "source" && substr ($tagv, 0, 11) == "os_opendata") {
198                $lat = 0;
199                $lon = 0;
200                GetWayLatLon ($way, $lat, $lon);
201                $sOut = "<wpt lat='$lat' lon='$lon'>\n";
202                if ($namelen == 6)
203                        $sOut .= "<name>SrcOS" . $iCount++ . "</name>\n";
204                elseif ($namelen == 14)
205                        $sOut .= "<name>Source OS " . $iCount++ . "</name>\n";
206                else {
207                        $sOut .= "<name>Source OS (" . $iCount++ . ")</name>\n";
208                        $sOut .= "<desc>Sourced from OS data</desc>\n";
209                        $sOut .= "</wpt>\n";
210                        echo $sOut;
211                        if ($DEBUG)
212                                file_put_contents ($LOG_FILE, "\t$sErrText\n\tLat/Lon: {$node ['lat']}, {$node ['lon']}\n", FILE_APPEND);
213                }
214        }
215}
216/* ****************************************************************** */
217
218/*
219 * Check a node has a tag.
220 * If tag does not exist, writes a waypoint
221 * $node: node to be checked
222 * $tag: tag in $node to be checked
223 * $k/$v: define type of node to check (eg $k == "shop", $v == "supermarket")
224 * Either $k or $v can be a wildcard (*)
225 * $checkfor: tag to check for existence of (eg "opening_hours")
226*/
227function NodeCheck ($node, $tag, $k, $v, $checkfor, $name, $shortname) {
228        global $iCount, $DEBUG, $LOG_FILE;
229        //Make check case-insensitive
230        $k = strtolower ($k);
231        $v = strtolower ($v);
232        $tagk = strtolower ($tag ["k"]);
233        $tagv = strtolower ($tag ["v"]);
234
235        if (($tagk == $k && $tagv == $v) ||
236                        ($tagk == $k && $v == "*") ||
237                        ($k == "*" && $tagv == $v))
238                if (TagCheck ($node, $checkfor) === False) {
239                        $sOut = "<wpt lat='" . $node ["lat"] . "' lon='" . $node ["lon"] . "'>\n";
240                        if ($v == "*")
241                                $sErrText = "$k - $checkfor";
242                        else
243                                $sErrText = "$v - $checkfor";
244                if ($namelen == 6)
245                        $sOut .= "<name>$shortname" . $iCount++ . "</name>\n";
246                elseif ($namelen == 14)
247                        $sOut .= "<name>$name" . $iCount++ . "</name>\n";
248                else
249                        $sOut .= "<name>$sErrText (" . $iCount++ . ")</name>\n";
250                        $sOut .= "<desc>$sErrText</desc>\n";
251                        $sOut .= "</wpt>\n";
252                        echo $sOut;
253                        if ($DEBUG)
254                                file_put_contents ($LOG_FILE, "\t$sErrText\n\tLat/Lon: {$node ['lat']}, {$node ['lon']}\n", FILE_APPEND);
255                }
256}
257
258/*
259 * Check a way has a tag.
260 * If tag does not exist, writes a waypoint
261 * $node: node to be checked
262 * $tag: tag in $way to be checked
263 * $k/$v: define type of way to check (eg $k == "highway", $v == "residential")
264 * Either $k or $v can be a wildcard (*)
265 * $checkfor: tag to check for existence of (eg "name")
266*/
267function WayCheck ($way, $tag, $k, $v, $checkfor, $name, $shortname) {
268        global $iCount, $DEBUG, $LOG_FILE;
269        //Make check case-insensitive
270        $k = strtolower ($k);
271        $v = strtolower ($v);
272        $tagk = strtolower ($tag ["k"]);
273        $tagv = strtolower ($tag ["v"]);
274
275        if (($tagk == $k && $tagv == $v) ||
276                        ($tagk == $k && $v == "*") ||
277                        ($k == "*" && $tagv == $v))
278                if (TagCheck ($way, $checkfor) === False) {
279                        $lat = 0;
280                        $lon = 0;
281                        GetWayLatLon ($way, $lat, $lon);
282                        $sOut = "<wpt lat='$lat' lon='$lon'>\n";
283                        if ($v == "*")
284                                $sErrText = "$k - $checkfor";
285                        else
286                                $sErrText = "$v - $checkfor";
287                if ($namelen == 6)
288                        $sOut .= "<name>$shortname" . $iCount++ . "</name>\n";
289                elseif ($namelen == 14)
290                        $sOut .= "<name>$name" . $iCount++ . "</name>\n";
291                else
292                        $sOut .= "<name>$sErrText (" . $iCount++ . ")</name>\n";
293                        $sOut .= "<desc>$sErrText</desc>\n";
294                        $sOut .= "</wpt>\n";
295                        echo $sOut;
296                        if ($DEBUG)
297                                file_put_contents ($LOG_FILE, "\t$sErrText\n\tLat/Lon: {$node ['lat']}, {$node ['lon']}\n", FILE_APPEND);
298                }
299}
300
301//Write file header
302echo "<?xml version='1.0' encoding='UTF-8'?>\n";
303echo <<<END
304<gpx
305  version="1.0"
306  creator="OSM-Error - http://www.mappage.org/osmerror/"
307  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
308  xmlns="http://www.topografix.com/GPX/1/0"
309  xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
310END;
311echo "\n";
312
313// Check nodes
314foreach ($xml->node as $node) {
315        if ($DEBUG)
316                file_put_contents ($LOG_FILE, "Checking node {$node ["id"]}\n", FILE_APPEND);
317        foreach ($node->tag as $tag) {
318                // Post box reference
319                if ($pbref === True)
320                        TagCheck ($node, $tag, "amenity", "post_box", "ref", "Postbox ref", "pb ref");
321
322                // Name
323                if ($name === True) {
324                        NodeCheck ($node, $tag, "*", "cafe", "name", "Cafe name ", "Name");
325                        NodeCheck ($node, $tag, "*", "restaurant", "name", "Restnt name", "Name");
326                        NodeCheck ($node, $tag, "*", "pub", "name", "Pub name ", "Name");
327
328                        NodeCheck ($node, $tag, "*", "school", "name", "School name", "Name");
329                        NodeCheck ($node, $tag, "*", "college", "name", "Coll name ", "Name");
330                        NodeCheck ($node, $tag, "*", "library", "name", "Liby name ", "Name");
331                        NodeCheck ($node, $tag, "*", "university", "name", "Uni name ", "Name");
332
333                        NodeCheck ($node, $tag, "shop", "*", "name", "Shop name ", "Name");
334                        NodeCheck ($node, $tag, "*", "post_office", "name", "POffice nme", "Name");
335                        NodeCheck ($node, $tag, "amenity", "cinema", "name", "Cinema name", "Name");
336                }
337
338                // Opening hours
339                if ($hours === True) {
340                        NodeCheck ($node, $tag, "*", "cafe", "opening_hours", "Open hours ", "OHours");
341                        NodeCheck ($node, $tag, "shop", "*", "opening_hours", "Open hours ", "OHours");
342                        NodeCheck ($node, $tag, "*", "post_office", "opening_hours", "Open hours ", "OHours");
343                        NodeCheck ($node, $tag, "*", "fast_food", "opening_hours", "Open hours ", "OHours");
344                        NodeCheck ($node, $tag, "*", "pharmacy", "opening_hours", "Open hours ", "OHours");
345                        NodeCheck ($node, $tag, "*", "restaurant", "opening_hours", "Open hours ", "OHours");
346                        NodeCheck ($node, $tag, "*", "library", "opening_hours", "Open hours ", "OHours");
347                }
348
349                // Source
350                if ($source === True) {
351                        NoTagCheck ($node, $tag, "source", "extrapolation", "node", "Src extrap", "Source");
352                        NoTagCheck ($node, $tag, "source", "NPE", "node", "Src NPE ", "SrcNPE");
353                        NoTagCheck ($node, $tag, "source", "historical", "node", "Src Hist ", "SrcHis");
354                        NodeCheckOS ($way, $tag);
355                }
356
357                // FIXME tags
358                if ($fixme === True)
359                        NoTagCheck ($node, $tag, "FIXME", "*", "node", "Fixme ", "Fixme");
360
361                // NAPTAN import
362                if ($naptan === True)
363                        NoTagCheck ($node, $tag, "naptan:verified", "no", "node", "Naptan vrfy", "Naptan");
364        }
365}
366
367// Check ways
368foreach ($xml->way as $way) {
369        if ($DEBUG)
370                file_put_contents ($LOG_FILE, "Checking way {$way ["id"]}\n", FILE_APPEND);
371        foreach ($way->tag as $tag) {
372
373                // Ref
374                if ($ref === True) {
375                        WayCheck ($way, $tag, "highway", "motorway", "ref", "Motrway ref", "Ref");
376                        WayCheck ($way, $tag, "highway", "trunk", "ref", "Trunk ref", "Ref");
377                        WayCheck ($way, $tag, "highway", "primary", "ref", "Primry ref ", "Ref");
378                        WayCheck ($way, $tag, "highway", "secondary", "ref", "Secndry ref", "Ref");
379                }
380
381                // Name
382                if ($name === True) {
383                        WayCheck ($way, $tag, "highway", "residential", "name", "Resid name ", "Name");
384
385                        WayCheck ($way, $tag, "*", "cafe", "name", "Cafe name ", "Name");
386                        WayCheck ($way, $tag, "*", "restaurant", "name", "Restnt name", "Name");
387                        WayCheck ($way, $tag, "*", "pub", "name", "Pub name ", "Name");
388
389                        WayCheck ($way, $tag, "*", "school", "name", "School name", "Name");
390                        WayCheck ($way, $tag, "*", "college", "name", "Coll name ", "Name");
391                        WayCheck ($way, $tag, "*", "library", "name", "Liby name ", "Name");
392                        WayCheck ($way, $tag, "*", "university", "name", "Uni name ", "Name");
393
394                        WayCheck ($way, $tag, "shop", "*", "name", "Shop name ", "Name");
395                        WayCheck ($way, $tag, "*", "post_office", "name", "POffice nme", "Name");
396                        WayCheck ($way, $tag, "amenity", "cinema", "name", "Cinema name", "Name");
397                }
398
399                // Opening hours
400                if ($hours === True) {
401                        WayCheck ($way, $tag, "*", "cafe", "opening_hours", "Open hours ", "OHours");
402                        WayCheck ($way, $tag, "shop", "*", "opening_hours", "Open hours ", "OHours");
403                        WayCheck ($way, $tag, "*", "post_office", "opening_hours", "Open hours ", "OHours");
404                        WayCheck ($way, $tag, "*", "fast_food", "opening_hours", "Open hours ", "OHours");
405                        WayCheck ($way, $tag, "*", "pharmacy", "opening_hours", "Open hours ", "OHours");
406                        WayCheck ($way, $tag, "*", "restaurant", "opening_hours", "Open hours ", "OHours");
407                        WayCheck ($way, $tag, "*", "library", "opening_hours", "Open hours ", "OHours");
408                }
409
410                // Source
411                if ($source === True) {
412                        NoTagCheck ($way, $tag, "source", "extrapolation", "way", "Src extrap", "Source");
413                        NoTagCheck ($way, $tag, "source", "NPE", "way", "Src NPE ", "SrcNPE");
414                        NoTagCheck ($way, $tag, "source", "historical", "way", "Src Hist ", "SrcHis");
415                        NoTagCheck ($way, $tag, "source", "historical", "way", "Src Hist ", "SrcHis");
416                        WayCheckOS ($way, $tag);
417                }
418
419                // FIXME etc
420                if ($fixme === True)
421                        NoTagCheck ($way, $tag, "FIXME", "*", "way", "Fixme ", "Fixme");
422
423                // Unknown road classification
424                if ($road === True)
425                        NoTagCheck ($way, $tag, "highway", "road", "way", "Road type ", "Road");
426        }
427}
428
429echo "</gpx>\n";
430?>
Note: See TracBrowser for help on using the repository browser.