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

Last change on this file since 29342 was 5665, checked in by hakan, 12 years ago

Keep track of is_in as well

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