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

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

opengeodb: Create relations from data with no lat and lon info

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