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

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

opengeodb2osm: put in relations, now data can be loaded in JOSM, but charset is wrong

File size: 5.0 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.1";
7
8use DBI;
9my $progname="opengeodb2osm";
10my %osmOGDB;
11$uselat=0;
12$minlat=53;
13$maxlat=54;
14$minlon=9;
15$maxlon=11;
16
17$mysqldb="opengeodb";
18$mysqluser="root"; 
19
20$mysqlpw="";
21
22print "<?xml version='1.0' encoding='iso-8859-1'?>
23<osm version='0.5' generator='$progname'>\n";
24if (-f "opengeodb2osmSettings.pm") {
25    require opengeodb2osmSettings;
26}
27
28$osmOGDB{"400100000"}="opengeodb:is_in";
29$osmOGDB{"400200000"}="opengeodb:layer";
30$osmOGDB{"400300000"}="opengeodb:Typ";
31$osmOGDB{"500300000"}="opengeodb:postal_codes";
32$osmOGDB{"500600000"}="opengeodb:Amtlicher-Gemeindeschl";
33$osmOGDB{"500100002"}="opengeodb:sortName";
34$osmOGDB{"500500000"}="opengeodb:CarCode";
35$osmOGDB{"500400000"}="opengeodb:TelephoneCode";
36$osmOGDB{"500100000"}="name";
37
38
39
40my $dbh = DBI->connect( 'dbi:mysql:'.$mysqldb, $mysqluser, $mysqlpw) ||
41     die "Kann keine Verbindung zum MySQL-Server aufbauen: $DBI::errstr\n";
42
43# Befehl fuer Ausfuehrung vorbereiten. Referenz auf Statement
44# Handle Objekt wird zurueckgeliefert
45my $where="";
46if ($uselat==1) {
47        $where="where lat>=$minlat and lat<=$maxlat and lon>=$minlon and lon<=$maxlon";
48}
49my $sth = $dbh->prepare( 'SELECT loc_id,lon,lat,valid_since,date_type_since,valid_until,date_type_until FROM geodb_coordinates '.$where ) ||
50     die "Kann Statement nicht vorbereiten: $DBI::errstr\n";
51
52my $sthText = $dbh->prepare('select text_type,text_val from geodb_textdata where loc_id=?');
53my $sthLoc = $dbh->prepare('select loc_type from geodb_locations where loc_id=?');
54my $sthPop = $dbh->prepare('select int_val from geodb_intdata where loc_id=? and int_type=600700000');
55
56my $sthParts = $dbh->prepare('select loc_id from geodb_textdata where text_type=400100000 and text_val=?');
57
58# Vorbereitetes Statement (Abfrage) ausfuehren
59$sth->execute ||
60     die "Kann Abfrage nicht ausfuehren: $DBI::errstr\n";
61
62$nodeid=-1;
63while ( my @ergebnis = $sth->fetchrow_array() ){
64    my $locid=$ergebnis[0];
65    $locIdHash{$locid}=$nodeid;
66    $nodeid--;
67}
68
69
70# Vorbereitetes Statement (Abfrage) ausfuehren
71$sth->execute ||
72     die "Kann Abfrage nicht ausfuehren: $DBI::errstr\n";
73
74
75while ( my @ergebnis = $sth->fetchrow_array() ){
76   # Im Array @ergebnis steht nun ein Datensatz
77    my $locid=$ergebnis[0];
78    print '<node id="'.$locIdHash{$locid}.'" visible="true" lat="' . $ergebnis[2] ."\" lon=\"". $ergebnis[1]."\" >\n";
79   
80    $tag=' <tag k="openGeoDB:loc_id" v="'.$locid.'" />'."\n";
81    $sthText->execute($locid);
82    $sthLoc->execute($locid);
83    $sthPop->execute($locid);
84
85    my %textval;
86    while ( my @texterg = $sthText->fetchrow_array() ){
87        my $key=$texterg[0];
88        if (defined $textval{"$texterg[0]"}) {
89            $textval{$texterg[0]}.=",".$texterg[1];
90        } else {
91            $textval{$texterg[0]}=$texterg[1];
92        }
93
94    }
95    for my $key ( keys %textval ) {
96        my $value = $textval{$key};
97        if (defined($osmOGDB{$key})) {
98            $tag.=' <tag k="'.$osmOGDB{$key}.'" v="'.$value.'" />'."\n";
99        } else {
100            $tag.=' <tag k="opengeodb:'.$key.'" v="'.$value.'" />'."\n";
101        }
102    }
103    my $population="";
104    while ( my @poperg = $sthPop->fetchrow_array() ){
105        $population=$poperg[0];
106    }
107    if ($population ne "") {
108        $tag.=' <tag k="population" v="'.$population.'" />'."\n";
109    }
110    my $place="";
111    while ( my @locerg = $sthLoc->fetchrow_array() ){
112        my $id=$locerg[0];
113        if ($id == 100100000) {
114            $place="continent";
115        } elsif ($id == 100200000) {
116            $place="country";
117        } elsif ($id == 100300000) {
118            $place="state";
119        } elsif ($id == 100400000) {
120            $place="county";
121        } elsif ($id == 100500000) {
122            $place="region";
123        } elsif ($id == 100600000) {
124            $place="opengeodb:political_structure";
125        } elsif ($id == 100700000) {
126            $place="opengeodb:locality";
127        } elsif ($id == 100800000) {
128            $place="opengeodb:postalCodeArea";
129        }
130       
131    }
132    if ($place =~ /^opengeodb:/) {
133        my $typ=$textval{400300000};
134        if (!defined($typ)) {
135        } elsif ($typ=~/Stadtteil/) {
136            $place="suburb";
137        } elsif ($typ=~/stadt/i) {
138            if ($population>100000) {
139                $place="city";
140            } else {
141                $place="town";
142            }
143        } elsif ($typ=~/gemeinde/) {
144            $place="village";
145        } elsif ($population eq "") {
146            # do nothing
147        } elsif ($population>100000) {
148            $place="city";
149        } elsif ($population>10000) {
150            $place="town";
151        } elsif ($population<30) {
152            $place="hamlet";
153        }
154    }
155    if ($place ne "") {
156        $tag.=' <tag k="place" v="'.$place.'" />'."\n";
157    }
158    $tag.=' <tag k="created_by" v="'.$progname.$version.'" />'."\n";
159 
160    print "$tag</node>\n";
161
162    $found=0;
163    $sthParts->execute($locid);
164    while ( my @partserg = $sthParts->fetchrow_array() ){
165        if (defined($locIdHash{$partserg[0]})) {
166            if ($found==0) {
167                $nodeid--;
168                print "<relation id=\"".$nodeid."\" visible='true'>\n";
169                $found++;
170                print $tag;
171                print " <member type='node' ref=\"$locIdHash{$locid}\" role='this' />\n";
172            }
173            print " <member type='node' ref=\"$locIdHash{$partserg[0]}\" role='child' />\n";
174        }
175    }
176    if ($found>0) {
177        print "</relation>\n";
178    }
179}
180
181# Datenbank-Verbindung beenden
182$dbh->disconnect;
183print "</osm>\n";
Note: See TracBrowser for help on using the repository browser.