source: subversion/applications/utils/opengeodb2osm/opengeodb2osm.pl @ 6146

Last change on this file since 6146 was 6146, checked in by tabacha, 12 years ago

opengeodb2osm: calculate a is_in tag

File size: 6.7 KB
Line 
1#!/usr/bin/perl -w
2#
3# Author: Sven Anders <sven@anders-hamburg.de>
4# License GPL 2.0
5#
6my $version="0.0.3";
7
8use utf8;
9use DBI;
10my $progname="opengeodb2osm";
11my %osmOGDB;
12$uselat=0;
13$minlat=53;
14$maxlat=54;
15$minlon=9;
16$maxlon=11;
17
18$mysqldb="opengeodb";
19$mysqluser="root"; 
20
21$mysqlpw="";
22
23print "<?xml version='1.0' encoding='UTF-8'?>
24<osm version='0.5' generator='$progname'>\n";
25if (-f "opengeodb2osmSettings.pm") {
26    require opengeodb2osmSettings;
27}
28
29$osmOGDB{"400100000"}="opengeodb:is_in";
30$osmOGDB{"400200000"}="opengeodb:layer";
31$osmOGDB{"400300000"}="opengeodb:typ";
32$osmOGDB{"500300000"}="opengeodb:postal_codes";
33$osmOGDB{"500600000"}="opengeodb:community_identification_number";
34$osmOGDB{"500100002"}="opengeodb:sort_name";
35$osmOGDB{"500500000"}="opengeodb:car_code";
36$osmOGDB{"500400000"}="opengeodb:telephone_area_code";
37$osmOGDB{"500100000"}="name";
38
39my %is_in;
40
41my $dbh = DBI->connect( 'dbi:mysql:'.$mysqldb, $mysqluser, $mysqlpw) ||
42     die "Kann keine Verbindung zum MySQL-Server aufbauen: $DBI::errstr\n";
43
44# Befehl fuer Ausfuehrung vorbereiten. Referenz auf Statement
45# Handle Objekt wird zurueckgeliefert
46my $where="";
47if ($uselat==1) {
48        $where="where lat>=$minlat and lat<=$maxlat and lon>=$minlon and lon<=$maxlon";
49}
50my $sth = $dbh->prepare( 'SELECT loc_id,lon,lat,valid_since,date_type_since,valid_until,date_type_until FROM geodb_coordinates '.$where ) ||
51     die "Kann Statement nicht vorbereiten: $DBI::errstr\n";
52
53my $sthText = $dbh->prepare('select text_type,text_val,text_locale,is_native_lang,is_default_name from geodb_textdata where loc_id=?');
54
55my $sthLoc = $dbh->prepare('select loc_type from geodb_locations where loc_id=?');
56my $sthPop = $dbh->prepare('select int_val from geodb_intdata where loc_id=? and int_type=600700000');
57
58my $sthParts = $dbh->prepare('select loc_id from geodb_textdata where text_type=400100000 and text_val=?');
59
60# Vorbereitetes Statement (Abfrage) ausfuehren
61$sth->execute ||
62     die "Kann Abfrage nicht ausfuehren: $DBI::errstr\n";
63
64$nodeid=-1;
65while ( my @ergebnis = $sth->fetchrow_array() ){
66    my $locid=$ergebnis[0];
67    $locIdHash{$locid}=$nodeid;
68    $nodeid--;
69}
70
71
72# Vorbereitetes Statement (Abfrage) ausfuehren
73$sth->execute ||
74     die "Kann Abfrage nicht ausfuehren: $DBI::errstr\n";
75
76
77while ( my @ergebnis = $sth->fetchrow_array() ){
78   # Im Array @ergebnis steht nun ein Datensatz
79    my $locid=$ergebnis[0];
80    print '<node id="'.$locIdHash{$locid}.'" visible="true" lat="' . $ergebnis[2] ."\" lon=\"". $ergebnis[1]."\" >\n";
81   
82    $tag=' <tag k="openGeoDB:loc_id" v="'.$locid.'" />'."\n";
83    $sthText->execute($locid);
84    $sthLoc->execute($locid);
85    $sthPop->execute($locid);
86
87    my %textval;
88    while ( my @texterg = $sthText->fetchrow_array() ){
89        my $key=$texterg[0];
90        my $value=$texterg[1];
91        utf8::encode($value);
92        $value=~s/&/&amp;/g;
93        $value=~s/\"/&quot;/g;
94        my $locale=$texterg[2];
95        my $nativelang=$texterg[3];
96        my $defaultname=$texterg[4];
97        if (defined($osmOGDB{$key})) {
98            $key=$osmOGDB{$key};
99        } else {
100            $key='opengeodb:'.$key;
101        }
102        if (defined($defaultname) and ($defaultname eq "0")) {
103            $key.=":".$locale;
104        }
105        if (defined $textval{"$key"}) {
106            $textval{$key}.=",".$value;
107        } else {
108            $textval{$key}=$value;
109        }
110
111    }
112    for my $key ( keys %textval ) {
113        my $value = $textval{$key};
114        $tag.=' <tag k="'.$key.'" v="'.$value.'" />'."\n";
115       
116    }
117    if (defined($textval{"opengeodb:is_in"})) {
118#       print "ISIN: ".$textval{"opengeodb:is_in"}."\n";
119        my $isinval="";
120        if (defined($is_in{$textval{"opengeodb:is_in"}})) {
121            $isinval=$is_in{$textval{"opengeodb:is_in"}};
122        } else {
123            my $bla=$textval{"opengeodb:is_in"};
124            my $ibla=$bla;
125            while ($bla > -1) {
126                $sthText->execute($bla);
127                $bla=-1;
128                while ( my @texterg= $sthText->fetchrow_array() ) {
129                    my $key=$texterg[0];
130                    my $value=$texterg[1];
131                    utf8::encode($value);
132                    my $locale=$texterg[2];
133                    my $nativelang=$texterg[3];
134                    my $defaultname=$texterg[4];
135                    if (defined($osmOGDB{$key})) {
136                        $key=$osmOGDB{$key};
137                    } else {
138                        $key='opengeodb:'.$key;
139                    }
140                    if (defined($defaultname) and ($defaultname eq "0")) {
141                        $key.=":".$locale;
142                    }
143                    if ($key eq "opengeodb:is_in") {
144                        $bla=$value;
145                    }
146                    if ($key eq "name") {
147                        if ($isinval ne "") {
148                            $isinval="$value,$isinval";
149                        } else {
150                            $isinval=$value;
151                        }
152                    }
153                }
154            }
155            $is_in{$ibla}=$isinval;
156        }
157        if (defined($isinval)) {
158            $tag.=' <tag k="is_in" v="'. $isinval.'" />'."\n";
159        } else {
160            die($locid);
161        }
162        if (defined($textval{'name'})) {
163            $is_in{$locid}=$isinval.",".$textval{'name'};
164        }
165
166   
167    } else {
168        if (defined($textval{'name'})) {
169            $is_in{$locid}=$textval{'name'};
170        }
171    }
172
173    my $population="";
174    while ( my @poperg = $sthPop->fetchrow_array() ){
175        $population=$poperg[0];
176    }
177    if ($population ne "") {
178        $tag.=' <tag k="population" v="'.$population.'" />'."\n";
179    }
180    my $place="";
181    # FIXME $place aus OSM holen
182    if ($place eq "") {
183        while ( my @locerg = $sthLoc->fetchrow_array() ){
184            my $id=$locerg[0];
185            if ($id == 100100000) {
186                $place="continent";
187            } elsif ($id == 100200000) {
188                $place="country";
189            } elsif ($id == 100300000) {
190                $place="state";
191            } elsif ($id == 100400000) {
192                $place="county";
193            } elsif ($id == 100500000) {
194                $place="region";
195            } elsif ($id == 100600000) {
196                $place="opengeodb:political_structure";
197            } elsif ($id == 100700000) {
198                $place="opengeodb:locality";
199            } elsif ($id == 100800000) {
200                $place="opengeodb:postalCodeArea";
201            }
202       
203        }
204    }
205    if ($place =~ /^opengeodb:/) {
206
207        my $typ=$textval{$osmOGDB{"400300000"}};
208        if (!defined($typ)) {
209        } elsif ($typ=~/Stadtteil/) {
210            $place="suburb";
211        } elsif ($typ=~/stadt/i) {
212            if ($population eq "") {
213                $place="town";
214            } elsif ($population>100000) {
215                $place="city";
216            } else {
217                $place="town";
218            }
219        } elsif ($typ=~/[Gg]emeinde/i) {
220            $place="village";
221        } elsif ($population eq "") {
222            # do nothing
223        } elsif ($population>100000) {
224            $place="city";
225        } elsif ($population>10000) {
226            $place="town";
227        } elsif ($population<30) {
228            $place="hamlet";
229        }
230    }
231    if ($place ne "") {
232        $tag.=' <tag k="place" v="'.$place.'" />'."\n";
233    }
234    $tag.=' <tag k="created_by" v="'.$progname.$version.'" />'."\n";
235 
236    print "$tag</node>\n";
237
238    $found=0;
239    $sthParts->execute($locid);
240    while ( my @partserg = $sthParts->fetchrow_array() ){
241        if (defined($locIdHash{$partserg[0]})) {
242            if ($found==0) {
243                $nodeid--;
244                print "<relation id=\"".$nodeid."\" visible='true'>\n";
245                $found++;
246                print $tag;
247                print " <member type='node' ref=\"$locIdHash{$locid}\" role='this' />\n";
248            }
249            print " <member type='node' ref=\"$locIdHash{$partserg[0]}\" role='child' />\n";
250        }
251    }
252    if ($found>0) {
253        print "</relation>\n";
254    }
255}
256
257# Datenbank-Verbindung beenden
258$dbh->disconnect;
259print "</osm>\n";
Note: See TracBrowser for help on using the repository browser.