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

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

opengeodb2osm: added a first utility to import opengeodb data to OSM (not ready
yet, only for testing)

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