source: subversion/sites/other/trapi/fetchz.pl @ 31161

Last change on this file since 31161 was 20486, checked in by deelkar, 10 years ago

fix old api 0.5 references

File size: 7.8 KB
Line 
1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6use constant VERBOSE => 0;
7
8use trapi;
9
10chdir TRAPIDIR or die "Could not chdir TRAPIDIR: $!";
11
12ptdbinit("<");
13
14my ($ptn, $n, $w);
15my (%pw, %pn, %pr, %tiles);
16
17my ($bbs, $bbw, $bbn, $bbe);
18
19print "Content-Type: text/xml; charset=utf8\n\n";
20
21$_ = $ARGV[0];
22if (/map\?bbox\=(-?\d+(?:\.\d*)?)\,(-?\d+(?:\.\d*)?)\,(-?\d+(?:\.\d*)?)\,(-?\d+(?:\.\d*)?)$/) {
23# print "WSEN: $1, $2, $3, $4\n";
24    my ($west,$south) = getTileNumber($2,$1,14);
25    my ($east,$north) = getTileNumber($4,$3,14);
26# print "WSEN: $west, $south, $east, $north\n";
27    my ($x, $y);
28    for($y=$north; $y <= $south; $y++) {
29        for($x=$west; $x <= $east; $x++) {
30            $tiles{etoptn($x,$y)} = 1;
31        }
32    }
33    ($bbs, $bbw, undef, undef) = Project($west, $south, 14);
34    (undef, undef, $bbn, $bbe) = Project($east, $north, 14);
35} elsif (/map\?tile\=(\d+)\,(\d+)\,(\d+)$/) {
36    my ($z,$x,$y) = ($1, $2, $3);
37    if ($z >= MAXZOOM) {
38        my $zdiff = $z - MAXZOOM;
39        $x >>= $zdiff;
40        $y >>= $zdiff;
41        $tiles{etoptn($x, $y)} = 1;
42        ($bbs, $bbw, $bbn, $bbe) = Project($x, $y, MAXZOOM);
43    } else {
44        ($bbs, $bbw, $bbn, $bbe) = Project($x, $y, $z);
45        my $zdiff = MAXZOOM - $z;
46        $x <<= $zdiff;
47        $y <<= $zdiff;
48        my $n = (1<< $zdiff) - 1;
49        foreach my $xx (0 .. $n) {
50            foreach my $yy (0 .. $n) {
51                $tiles{etoptn($x+$xx,$y+$yy)} = 1;
52            }
53        }
54    }
55   
56} elsif (/node\/(\d+)$/) {
57    my $node = $1;
58    $ptn = nodeptn($node);
59    $pn{$ptn} = {$node => 1};
60} elsif (/way\/(\d+)$/) {
61    my $way = $1;
62    $ptn = wayptn($way);
63    $pw{$ptn} = {$way => 1};
64} elsif (/relation\/(\d+)$/) {
65    my $rel = $1;
66    $ptn = relationptn($rel);
67    $pr{$ptn} = {$rel => 1};
68} else {
69    die "Unknown request $_";
70}
71
72print "<?xml version='1.0' encoding='UTF-8'?>\n";
73print "<osm version=\"0.6\" generator=\"Trapi 0.3\">\n";
74if ($bbs) {
75    print "<bound box=\"$bbs,$bbw,$bbn,$bbe\" origin=\"http://www.openstreetmap.org/api/0.6\"/>\n";
76}
77
78foreach $ptn (keys %tiles) {
79    my $nd = openptn($ptn, "data");
80    my $wf = openptn($ptn, "ways");
81    my $rf = openptn($ptn, "relations");
82   
83# first we go through the ways, looking for ones stored remotely or with nodes
84# not in the tile
85    seek $wf, 0, 0;
86    while (my ($tw, $off) = readway($wf)) {
87        last unless (defined $tw);
88        next unless($tw);
89        if ($off == 0) {
90            # way stored remotly
91            $w = wayptn($tw);
92# print "Remote way $tw\n";
93            unless (exists $tiles{$w}) {
94                $pw{$w} //= {};
95                $pw{$w}->{$tw} = 1;
96            }
97        } else {
98            seek $nd, $off, 0;
99            my @nodes = readwaynodes($nd);
100            foreach my $tn (@nodes) {
101                $n = nodeptn($tn);
102                unless (exists $tiles{$n}) {
103                    # node stored remotly
104                    $pn{$n} //= {}; 
105                    $pn{$n}->{$tn} = 1;
106                }
107            }
108        }
109    }
110    seek $rf, 0, 0;
111    while (my ($tr, $off) = readrel($rf)) {
112        last unless (defined $tr);
113        next unless($tr);
114        if ($off == 0) {
115            my $r = relationptn($tr);
116            unless (exists $tiles{$r}) {
117                $pr{$r} //= {};
118                $pr{$r}->{$tr} = 1;
119            }
120        }
121    }
122}
123
124# now we go through the remote ways, looking for nodes not in the tile
125foreach my $tp (keys %pw) {
126    my $pwf = openptn($tp, "ways");
127    my $pd = openptn($tp, "data");
128    seek $pwf, 0, 0;
129    while (my ($tw, $off) = readway($pwf)) {
130        last unless (defined $tw);
131        next unless($tw);
132        if (exists $pw{$tp}->{$tw}) {
133            print "reading way data from $off\n" if (VERBOSE > 99);
134            seek $pd, $off, 0;
135            my @nodes = readwaynodes($pd);
136            foreach my $tn (@nodes) {
137                $n = nodeptn($tn);
138                unless (exists $tiles{$n}) {
139                    # node stored remotly
140                    $pn{$n} //= {};
141                    $pn{$n}->{$tn} = 1;
142                }
143            }
144        }
145    }
146}
147
148# print nodes in the tile
149foreach $ptn (keys %tiles) {
150    my $nf = openptn($ptn, "nodes");
151    my $nd = openptn($ptn, "data");
152   
153    my ($z, $x, $y) = fromptn($ptn);
154    print "<-- nodes from z$z $x $y >\n";
155    seek $nf, 0, 0;
156    while (my ($tn, $lat, $lon, $off) = readnode($nf)) {
157        last unless (defined $tn);
158        next unless($tn);
159        $lat /= 10000000;
160        $lon /= 10000000;
161        print "<node id=\"$tn\" lat=\"$lat\" lon=\"$lon\" ";
162        if ($off == 0) {
163            print "/>\n";
164        } else {
165            print ">\n";
166            seek $nd, $off, 0;
167            my @tv = readtags($nd, NODE);
168            while (my $key = shift @tv) {
169                my $val = shift @tv;
170                print "  <tag k=\"$key\" v=\"$val\"/>\n";
171            }
172            print "</node>\n";
173        }
174    }
175}
176
177# print the nodes used by ways
178
179foreach my $tp (keys %pn) {
180    my ($tz, $tx, $ty) = fromptn($tp);
181    print "<-- some nodes from z$tz $tx $ty >\n";
182    my $pnf = openptn($tp, "nodes");
183    my $pd = openptn($tp, "data");
184    seek $pnf, 0, 0;
185    while(my ($tn, $lat, $lon, $off) = readnode($pnf)) {
186        last unless (defined $tn);
187        next unless($tn);
188        if (exists $pn{$tp}->{$tn}) {
189            $lat /= 10000000;
190            $lon /= 10000000;
191            print "<node id=\"$tn\" lat=\"$lat\" lon=\"$lon\" ";
192            if ($off == 0) {
193                print "/>\n";
194            } else {
195                print ">\n";
196                seek $pd, $off, 0;
197                my @tv = readtags($pd, NODE);
198                while (my $key = shift @tv) {
199                    my $val = shift @tv;
200                    print "  <tag k=\"$key\" v=\"$val\"/>\n";
201                }
202                print "</node>\n";
203            }
204        }
205    }
206}
207
208# print ways
209foreach $ptn (keys %tiles) {
210    my $nd = openptn($ptn, "data");
211    my $wf = openptn($ptn, "ways");
212   
213    my ($z, $x, $y) = fromptn($ptn);
214    print "<-- ways from z$z $x $y >\n";
215    seek $wf, 0, 0;
216    while(my ($tw, $off) = readway($wf)) {
217        last unless (defined $tw);
218        next unless ($tw && $off);
219        print "<way id=\"$tw\">\n";
220        seek $nd, $off, 0;
221        my @nodes = readwaynodes($nd);
222        foreach my $tn (@nodes) {
223            print "  <nd ref=\"$tn\"/>\n";
224        }
225        my @tv = readtags($nd, WAY);
226        while (my $key = shift @tv) {
227            my $val = shift @tv;
228            print "  <tag k=\"$key\" v=\"$val\"/>\n";
229        }
230        print "</way>\n";
231    }
232}
233
234foreach my $tp (keys %pw) {
235    my ($tz, $tx, $ty) = fromptn($tp);
236    print "<-- some ways from z$tz $tx $ty >\n";
237    my $pwf = openptn($tp, "ways");
238    my $pd = openptn($tp, "data");
239    seek $pwf, 0, 0;
240    while (my   ($tw, $off) = readway($pwf)) {
241        last unless (defined $tw);
242        next unless($tw && $off);
243        if (exists $pw{$tp}->{$tw}) {
244            print "reading way data from $off\n" if (VERBOSE > 99);
245            print "<way id=\"$tw\">\n";
246            seek $pd, $off, 0;
247            my @nodes = readwaynodes($pd);
248            foreach my $tn (@nodes) {
249                print "  <nd ref=\"$tn\"/>\n";
250            }
251            my @tv = readtags($pd, WAY);
252            while (my $key = shift @tv) {
253                my $val = shift @tv;
254                print "  <tag k=\"$key\" v=\"$val\"/>\n";
255            }
256            print "</way>\n";
257        }
258    }
259}
260
261# print relations
262
263foreach $ptn (keys %tiles) {
264    my $nd = openptn($ptn, "data");
265    my $rf = openptn($ptn, "relations");
266   
267    my ($z, $x, $y) = fromptn($ptn);
268    print "<-- relations from z$z $x $y>\n";
269    seek $rf, 0, 0;
270    while (my ($tr, $off) = readrel($rf)) {
271        last unless (defined $tr);
272        next unless ($tr && $off);
273        print "<relation id=\"$tr\">\n";
274        seek $nd, $off, 0;
275        my @members = readmemb($nd);
276        foreach my $m (@members) {
277            my ($type, $mid, $role) = @$m;
278            print "  <member type=\"".(MEMBERTYPE)[$type].
279                "\" ref=\"$mid\" role=\"$role\"/>\n";
280        }
281        my @tv = readtags($nd, RELATION);
282        while (my $key = shift @tv) {
283            my $val = shift @tv;
284            print "  <tag k=\"$key\" v=\"$val\"/>\n";
285        }
286        print "</relation>\n";
287    }
288}
289
290foreach my $tp (keys %pr) {
291    my ($tz, $tx, $ty) = fromptn($tp);
292    print "<-- some relations from z$tz $tx $ty >\n";
293    my $prf = openptn($tp, "relations");
294    my $pd = openptn($tp, "data");
295    seek $prf, 0, 0;
296    while (my ($tr, $off) = readrel($prf)) {
297        last unless (defined $tr);
298        next unless($tr && $off);
299        if (exists $pr{$tp}->{$tr}) {
300            print "<relation id=\"$tr\">\n";
301            seek $pd, $off, 0;
302            my @members = readmemb($pd);
303            foreach my $m (@members) {
304                my ($type, $mid, $role) = @$m;
305                print "  <member type=\"".(MEMBERTYPE)[$type].
306                    "\" ref=\"$mid\" role=\"$role\"/>\n";
307            }
308            my @tv = readtags($pd, RELATION);
309            while (my $key = shift @tv) {
310                my $val = shift @tv;
311                print "  <tag k=\"$key\" v=\"$val\"/>\n";
312            }
313            print "</relation>\n";
314        }
315    }
316}
317
318print "</osm>\n";
Note: See TracBrowser for help on using the repository browser.