source: subversion/applications/utils/export/poiexport/download.php @ 18311

Last change on this file since 18311 was 18311, checked in by milovanderlinden, 10 years ago

Initial import of the poiexport PHP application

File size: 7.1 KB
Line 
1<?php
2/**
3 * Download subset from an OpenStreetMap postGIS database (filled with osm2pgsql)
4 * as a device specific POI set
5 *
6 * Parameters
7 * output: The chosen output type, can be csv, ov2, gpx or kml
8 * k: openstreetmap key
9 * v: openstreetmap value
10 * filename: the filename to save as
11 */
12
13// CONSTANTS
14$dbname = "osm";
15$dbuser = "readonly";
16$dbpass = "secret";
17$dbport = 5432;
18$dbhost = "localhost";
19
20
21//Test if all parameters are set
22if (!isset($_GET["output"]) || !isset($_GET["k"]) || !isset($_GET["v"]) || !isset($_GET["filename"])) {
23    die("Not all parameters supplied");
24}
25
26//parse the parameters and pg_escape them to prevent SQL injection
27$output = pg_escape_string(utf8_encode($_GET['output']));
28$k = pg_escape_string(utf8_encode($_GET['k']));
29$v = pg_escape_string(utf8_encode($_GET['v']));
30$filename = pg_escape_string(utf8_encode($_GET['filename']));
31
32//Try to connect to the postgresql database
33$dbconn = pg_connect("host=" . $dbhost . " port=" . $dbport . " dbname=" . $dbname . " user=" . $dbuser . " password=" . $dbpass)
34    or die('Could not connect: ' . pg_last_error());
35
36// Query the planet_osm_point table (and the planet_osm_polygon table for centroids) for POI's
37$query = "SELECT name, lat, lon
38            FROM (
39                SELECT name,
40                    x(transform(way, 4326)) AS lon,
41                    y(transform(way, 4326)) AS lat
42                FROM planet_osm_point
43                WHERE $k='$v'
44                UNION
45                SELECT name,
46                    x(centroid(transform(way, 4326))) AS lon,
47                    y(centroid(transform(way, 4326))) AS lat
48                FROM planet_osm_polygon
49                WHERE $k='$v'
50            ) AS u1";
51
52$result = pg_query($query) or die('Query failed: ' . pg_last_error());
53
54
55//What type of device/output is selected?
56
57switch($output) {
58    case "csv":
59        asGarmin($result, $filename . ".csv");
60        break;
61    case "ov2":
62        asOv2($result, $filename . ".ov2");
63        break;
64    case "gpx":
65        asGpx($result, $filename . ".gpx");
66        break;
67    case "kml":
68        asKml($result, $filename . ".kml");
69        break;
70    default:
71        die("No valid output specified");
72}
73
74pg_free_result($result);
75pg_close($dbconn);
76
77
78
79/**
80 * Create a GARMIN specific csv file
81 * @param postgres query resource: $data
82 * @param string: $filename
83 */
84function asGarmin($data, $filename) {
85// Set headers
86    header("Pragma: public");
87    header("Expires: 0");
88    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
89    header("Cache-Control: public");
90    header("Content-Description: File Transfer");
91    header("Content-Disposition: attachment; filename=$filename");
92    header("Content-Type: text/plain");
93
94    // Loop through the query resultset
95    while ($line = pg_fetch_array($data, null, PGSQL_ASSOC)) {
96        echo $line["lon"] . ", " .
97            $line["lat"] . ", \"" .
98            utf8_decode($line["name"]) . "\"\n";
99    }
100}
101
102
103/**
104 * Create a tomtom ov2 file
105 * @param postgres query resource: $data
106 * @param string: $filename
107 */
108function asOv2($data, $filename) {
109// Set headers
110    header("Pragma: public");
111    header("Expires: 0");
112    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
113    header("Cache-Control: public");
114
115    header("Content-Description: File Transfer");
116    header("Content-Disposition: attachment; filename=$filename");
117    header("Content-Type: application/octet-stream"); // Content-Type: text/html
118    header("Content-Transfer-Encoding: binary");
119
120    while ($line = pg_fetch_array($data, null, PGSQL_ASSOC)) {
121        echo chr(0x02) .
122            pack("V",strlen($line["name"]) + 14) .
123            pack("V",round($line["lon"] * 100000)) .
124            pack("V",round($line["lat"] * 100000)) .
125            utf8_decode($line["name"]) .
126            chr(0x00);
127    }
128}
129
130/**
131 * Create a generic GPX file
132 * @param postgres query resource: $data
133 * @param string: $filename
134 */
135
136function asGpx($data, $filename) {
137// Set headers
138    header("Pragma: public");
139    header("Expires: 0");
140    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
141    header("Cache-Control: public");
142
143    header("Content-Description: File Transfer");
144    header("Content-Disposition: attachment; filename=$filename");
145    header("Content-Type: application/force-download"); // Content-Type: text/html
146    //header("Content-Transfer-Encoding: binary");
147
148    echo "<?xml version='1.0' encoding='UTF-8'?>\n" .
149        "<gpx version=\"1.1\" creator=\"OSM-NL POI export\" xmlns=\"http://www.topografix.com/GPX/1/1\"\n" .
150        "  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" .
151        "  xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd\">\n" .
152        "<metadata></metadata>\n";
153
154    while ($line = pg_fetch_array($data, null, PGSQL_ASSOC)) {
155        $name = normalize($line["name"]);
156        echo "<wpt lat=\"" . $line["lat"] . "\" lon=\"" . $line["lon"] . "\">\n" .
157            "  <name>" . $name . "</name>\n" .
158            "</wpt>\n";
159    }
160    echo "</gpx>";
161}
162
163/**
164 * Create a Google **MAPS** kml file (2D)
165 * @param postgres query resource: $data
166 * @param string: $filename
167 */
168function asKml($data, $filename) {
169// Set headers
170    header("Pragma: public");
171    header("Expires: 0");
172    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
173    header("Cache-Control: public");
174
175    header("Content-Description: File Transfer");
176    header("Content-Disposition: attachment; filename=$filename");
177    header("Content-Type: application/vnd.google-earth.kml+xml"); // Content-Type: text/html
178
179    echo "<?xml version='1.0' encoding='UTF-8'?>\n<kml xmlns='http://earth.google.com/kml/2.2'>\n";
180
181    while ($line = pg_fetch_array($data, null, PGSQL_ASSOC)) {
182        $name = normalize($line["name"]);
183        echo "<Placemark>\n\t<name>" . $name . "</name>\n" .
184            "\t<Point>\n\t\t<coordinates>" . $line["lon"] . ", " . $line["lat"] . "</coordinates>\n\t</Point>\n</Placemark>\n";
185    }
186    echo "</kml>";
187}
188
189function normalize ($string) {
190    $table = array(
191        'Å '=>'S', 'Å¡'=>'s', 'Đ'=>'Dj', 'Ä‘'=>'dj', 'Ž'=>'Z', 'ž'=>'z', 'ÄŒ'=>'C', 'č'=>'c', 'Ć'=>'C', 'ć'=>'c',
192        'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Ã…'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E',
193        'Ê'=>'E', 'Ë'=>'E', 'ÃŒ'=>'I', 'Í'=>'I', 'ÃŽ'=>'I', 'Ï'=>'I', 'Ñ'=>'N', 'Ã’'=>'O', 'Ó'=>'O', 'Ô'=>'O',
194        'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 'Ú'=>'U', 'Û'=>'U', 'Ãœ'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss',
195        'à '=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'Ã¥'=>'a', 'æ'=>'a', 'ç'=>'c', 'è'=>'e', 'é'=>'e',
196        'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o',
197        'ô'=>'o', 'õ'=>'o', 'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b',
198        'ÿ'=>'y', 'Å”'=>'R', 'Å•'=>'r', 'ü'=>'u', 'Ãœ'=>'U', '&'=>'and', '´'=>'\'', '<' => '' , '>' => ''
199    );
200   
201    return utf8_decode(strtr($string, $table));
202}
203?>
Note: See TracBrowser for help on using the repository browser.