source: subversion/applications/utils/sv-stat/RelationToPoly.pl @ 32010

Last change on this file since 32010 was 15334, checked in by tabacha, 10 years ago

Relation in ein Polygon verwandeln

  • Property svn:executable set to *
File size: 4.0 KB
Line 
1#!/usr/bin/perl -w
2use LWP::Simple;
3use XML::Parser;
4
5my $id=$ARGV[0];
6
7warn ("id:$id");
8my $url="http://api.openstreetmap.org/api/0.6/relation/$id/full";
9warn ("url:$url");
10my %nlat;
11my %nlon;
12my $wayid;
13my @unsortedways;
14my @sortedways;
15my $name="";
16
17sub aAnfang
18{
19    ($wert_des_zeigers,$starttag,%hash) = @_;
20
21    if ($starttag eq "node") {
22        my $nid=$hash{"id"};
23        $nlat{$nid}=$hash{"lat"};
24        $nlon{$nid}=$hash{"lon"};
25    } elsif ($starttag eq "way") {
26        $wayid=$hash{"id"};
27        @{$wnodes{$wayid}}=();
28    } elsif ($starttag eq "nd") {
29        $ref=$hash{"ref"};
30#       print "push $wayid,$ref\n";
31        push @{$wnodes{$wayid}},$ref;
32    } elsif ($starttag eq "relation") {
33        $rid=$hash{"id"};
34#       print "relation $rid";
35    } elsif ($starttag eq "member") {
36        my $ref=$hash{"ref"};
37        if ($hash{"type"} eq "way") {
38            if ($rid==$id) {
39                push  @unsortedways,$ref;
40            }
41        }
42    } elsif ($starttag eq "tag") {
43        if (defined($rid)) {
44            if (($rid==$id) and  ($hash{"k"} eq "name")) {
45                $name=$hash{"v"};
46            }
47        }
48    }
49}
50sub aEnde
51{
52     ($wert_des_zeigers,$endtag) = @_;
53     if ($endtag eq "realtion") {
54         $rid=undef;
55     }
56}
57sub aInhalt
58{
59}
60
61sub printWay
62{
63    my $id=shift;
64    my $direction=shift;
65    my $printfirst=shift;
66    my $rstr="";
67    my $i=0;
68    foreach my $node (@{$wnodes{$id}}) {
69        my $str="";
70        if ((($i==0) and ($direction==0)) or (($i==$#{$id}) and ($direction==1))) {
71            if ($printfirst) {
72                $str=sprintf("   %E   %E\n",$nlon{$node},$nlat{$node});
73            }
74            $printfirst=0;
75            $i++;
76        } else {
77            $str=sprintf("   %E   %E\n",$nlon{$node},$nlat{$node});
78        }
79        if ($direction==0) {
80            $rstr.=$str;
81        } else {
82            $rstr=$str.$rstr;
83        }
84    }
85    print $rstr;
86}
87
88############################ MAIN ####
89
90warn("get");
91$content = get($url);
92warn("get done");
93die "Could get $url" unless defined $content;
94
95#$content = `cat full`;
96
97
98my $azeiger = new XML::Parser ();
99
100$azeiger->setHandlers (Start => \&aAnfang,End => \&aEnde );
101warn("parse");
102$azeiger->parse($content);
103warn("parse done");
104my $firstway=(pop @unsortedways);
105#print "way:$firstway\n";
106my $firstnode=${$wnodes{$firstway}}[0];
107my $lastnode=${$wnodes{$firstway}}[-1];
108#print "f,l:$firstnode,$lastnode\n";
109push @sortedways, $firstway;
110$dire{$firstway}=0;
111
112$name=~s/,(.*)$//;
113$name=~s/\s*$//;
114$name=~s/^\s*//;
115
116my $polyid=1;
117
118my $condition=0;
119if ($#unsortedways >=0) {
120    $condition=1;
121}
122
123while ($condition==1) {
124    my $found=-1;
125    my $i=0;
126    my $direction=0;
127    $condition=0;
128    foreach my $way (@unsortedways) {
129        if ($way>=0) {
130            $condition=1;
131            warn("way:$way $i");
132            if ($lastnode==${$wnodes{$way}}[0]) {
133                $found=$i;
134            } elsif ($lastnode==${$wnodes{$way}}[-1]) {
135                $found=$i;
136                $direction=1;
137            }
138        }
139        $i++;
140
141    }
142    if ($condition) {
143        if (($found==-1) and ($firstnode == $lastnode)) {
144            warn("First==Last");
145            print "$name\n$polyid\n";
146            $polyid++;
147            my $printfirst=1;
148            foreach my $way (@sortedways) {
149                my $i=0;
150                my $rstr="";
151                &printWay($way,$dire{$way},$printfirst);
152                $printfirst==0;
153            }
154            print "END\n";
155            @sortedways=();
156            my $firstway=0;
157            my $i=0;
158            foreach my $way (@unsortedways) {
159                if ($way>=0) {
160                    if ($firstway==0) {
161                        $firstway=$way;
162                        $found=$i;
163                    }
164                }
165                $i++;
166            }
167
168            $unsortedways[$found]=-1;
169#print "way:$firstway\n";
170            my $firstnode=${$wnodes{$firstway}}[0];
171            my $lastnode=${$wnodes{$firstway}}[-1];
172            push @sortedways,$firstway;
173            $dire{$firstway}=0;
174           
175        } else {
176            ($found!=-1) or die("No Way found for node $lastnode ");
177           
178            my $way=$unsortedways[$found];
179            warn("found $found $way\n");
180            $unsortedways[$found]=-1;
181            push @sortedways,$way;
182       
183            if ($direction==0) {
184                $lastnode=${$wnodes{$way}}[-1];
185            } else {
186                $lastnode=${$wnodes{$way}}[0];
187            }
188            $dire{$way}=$direction;
189       
190
191            # Finde einen Way der zum letzen past
192        }
193        warn("while $condition");
194    }
195}
196
197($firstnode == $lastnode ) or die ("gap between node $firstnode and $lastnode");
198print "$name\n$polyid\n";
199$polyid++;
200my $printfirst=1;
201foreach my $way (@sortedways) {
202    &printWay($way,$dire{$way},$printfirst);
203    $printfirst=0;
204
205}
206
207print "END\nEND\n";
Note: See TracBrowser for help on using the repository browser.