source: subversion/applications/utils/relationbuilder/fetcher.pl @ 5664

Last change on this file since 5664 was 5664, checked in by hakan, 13 years ago

Create a hierarchy of place types

File size: 4.4 KB
Line 
1#! /usr/bin/perl -w
2
3use strict;
4
5use LWP::UserAgent;
6use LWP::Debug qw (+);
7use XML::Parser;
8
9use open "utf8";
10
11
12#
13#
14#
15my $URLBASE="http://www.informationfreeway.org/api/0.5";
16
17my $last_id = -1;
18my $place_name = "unknown";
19my $place_type = "unknown";
20my $node_line = "";
21my @tags = ();
22
23
24#
25#
26#
27sub fetch_place_nodes
28{
29    my ($datafile, $min_lat, $max_lat, $min_lon, $max_lon) = @_;
30
31    my $URL=$URLBASE . "/node[place=*][bbox=$min_lon,$min_lat,$max_lon,$max_lat]";
32
33    print $URL . "\n";
34
35    # Primitive caching... Just so I can continue working without network access...
36    if (! -r $datafile)
37    {
38        my $ua = LWP::UserAgent->new(keep_alive=>1);
39        $ua->env_proxy();
40        $ua->agent("relationbuilder/0.1");
41       
42        my $request = HTTP::Request->new(GET => $URL);
43        my $response = $ua->request($request);
44
45        if ($response->is_success)
46        {
47            open OUT, "> $datafile";
48            print OUT $response->content . "\n";
49            close (OUT);
50
51            print $response->status_line . "\n";
52        }
53        else
54        {
55            print $response->status_line . "\n";
56        }
57    }
58}
59
60
61#
62#
63#
64sub create_is_in_hierarchy
65{
66    my ($datafile) = @_;
67   
68    my $parser = new XML::Parser (Handlers =>
69                                    {
70                                        Start => \&is_in_start_handler,
71                                        End   => \&is_in_end_handler
72                                    }
73                                  );
74
75    $parser->parsefile($datafile); # , ProtocolEncoding => 'UTF-16');
76}
77
78sub is_in_start_handler
79{
80    my $expat = shift;
81    my $tag = shift;
82
83    if ($tag eq "node")
84    {
85        for my $i ( 0 ... $#_)
86        {
87            # print STDERR " ----- $i : '" . $_[$i] . "' -----\n";
88           
89            my $key = $_[$i];
90
91            if (($i % 2) == 0)
92            {
93                $node_line .= " " . $key . "=";
94
95                if ($key eq "id")
96                {
97                    $last_id = $_[$i + 1];
98                }
99            }
100            else           
101            {
102                $node_line .= "'" . $key . "'";
103            }           
104        }
105    }
106    elsif ($tag eq "tag")
107    {
108        my $key = $_[1];
109        my $val = $_[3];
110       
111        # print STDERR " --- key = '" . $key . "', val = '" . $val . "'\n";
112        if ($key eq "place")
113        {
114            $place_type = $val;
115        }
116        elsif ($key eq "name")
117        {
118            $place_name = $val;
119        }
120       
121        push (@tags, "    <tag k='" . $key . "' v='" . $val . "'/>");
122    }
123    else
124    {
125        print STDERR "START - @{$expat->{Context}} \\\\ '$tag' - (@_)\n";
126    }
127}
128
129sub is_in_end_handler
130{
131    my $expat = shift;
132    my $tag = shift;
133
134    if ($tag eq "node")
135    {
136        utf8::downgrade($place_type);
137        utf8::downgrade($place_name, 1);
138
139        chomp($place_type);
140
141        mkdir ("data", "0755");
142        mkdir ("data/" . $place_type, "0755");
143        my $filename = "data/" . $place_type . "/place-" . $place_type . "-" . $place_name . "-" . $last_id . ".osm";
144        # my $filename = "data/" . "place-" . $place_type . "-" . $place_name . "-" . $last_id . ".osm";
145
146        open OUT, "> $filename" || die ("Can't open $filename to write: $!\n");
147        binmode(OUT, ":utf8");
148        print OUT "<?xml version='1.0' encoding='UTF-8'?>\n";
149        print OUT "<osm version='0.5' generator='relationbuilder'>\n";
150        print OUT "  <node " . $node_line . ">\n";
151       
152        foreach my $line (@tags)
153        {
154            print OUT $line . "\n";
155        }
156       
157        # print OUT "    <tag k='is_in' v='Asia, Turkey' />\n";
158        # print OUT "    <tag k='place' v='cityX' />\n";
159        # print OUT "    <tag k='name' v='Erzurum' />\n";
160        print OUT "  </node>\n";
161        print OUT "</osm>\n";
162
163        close (OUT);
164
165        $last_id = -1;
166        $node_line = "";
167
168        $place_name = "unknown";
169        $place_type = "unknown";
170
171        @tags = ();
172    }
173    elsif ($tag eq "tag")
174    {
175    }
176    else
177    {
178        print STDERR "END - @{$expat->{Context}} // $tag\n";
179    }
180}
181
182# Turkey
183fetch_place_nodes("turkey-places.xml", "35.8", "42.5", "26.0", "45.0");
184create_is_in_hierarchy("turkey-places.xml");
185
186# Cyprus
Note: See TracBrowser for help on using the repository browser.