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

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

opengeodb: Some suggestions given on talk-de mailinglist

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