source: subversion/applications/share/map-icons/tools/create_geoinfo-db.pl @ 14505

Last change on this file since 14505 was 14165, checked in by joerg, 11 years ago

be less verbose by default

  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 11.2 KB
Line 
1#!/usr/bin/perl
2# Create SQLite Database file used by GpsDrive
3# Fill it with:
4#   - POI Sources predefined in this script
5#   - POI Types as defined in icons.xml
6#   TODO: - Field Types for additional POI Information (poi_extra)
7
8########################################################################################
9
10my $default_lang  = 'en';
11my $default_licence = 'Creative Commons Attribution-ShareAlike 2.0';
12
13########################################################################################
14
15# Get version number from version-control system, as integer
16my $version = '$Revision: 1824 $';
17$Version =~ s/\$Revision:\s*(\d+)\s*\$/$1/;
18 
19my $VERSION ="create_geoinfo-db.pl (c) Guenther Meyer
20Version 0.3-$Version";
21
22# History:
23#
24# v0.3 Included OSM-Matching into poi_type table
25# v0.2 Added Table for OpenStreetMap-Matching
26# v0.1 Initial Release
27
28use strict;
29use warnings;
30
31use DBI;
32use File::Copy;
33use XML::Twig;
34use Getopt::Long;
35
36my $lang;
37my $icon_file;
38my $db_file;
39my $dbh;
40my $VERBOSE=0;
41
42
43########################################################################################
44# Execute SQL statement
45#
46sub db_exec($){
47    my $statement = shift;
48
49    my $sth = $dbh->prepare($statement);
50    unless ( $sth->execute() ) {
51        warn "Error in query '$statement'\n";
52        $sth->errstr;
53        return 0;
54    }
55    return 1;
56}
57
58
59########################################################################################
60# Creata db file and tables
61#
62sub create_dbfile(){
63    my $create_statement;
64    my $sth;
65
66    move("$db_file","$db_file.old");
67
68    $create_statement="CREATE DATABASE geoinfo;";
69    $dbh = DBI->connect("dbi:SQLite:dbname=$db_file",'','');
70    $dbh->{unicode} = 1;
71
72    # ------- POI_TYPE
73    db_exec('CREATE TABLE poi_type (
74                poi_type       VARCHAR(160)  PRIMARY KEY,
75                scale_min      INTEGER       NOT NULL default \'1\',
76                scale_max      INTEGER       NOT NULL default \'50000\',
77                title          VARCHAR(160)  NULL default \'\',
78                description    VARCHAR(160)  NULL default \'\',
79                proximity      INTEGER       default \'25\',
80                editable       INTEGER       default \'1\',
81                osm_condition  VARCHAR(160)  NULL default \'\',
82                osm_cond_2nd   VARCHAR(160)  NULL default \'\',
83                osm_cond_3rd   VARCHAR(160)  NULL default \'\');') or die;
84
85     # ------- SOURCE
86    db_exec('CREATE TABLE source (
87                source_id      INTEGER      PRIMARY KEY,
88                name           VARCHAR(80)  NOT NULL default \'\',
89                comment        VARCHAR(160) NOT NULL default \'\',
90                last_update    DATE         NOT NULL default \'0000-00-00\',
91                url            VARCHAR(160) NOT NULL default \'\',
92                licence        VARCHAR(160) NOT NULL default \'\');') or die;
93}
94
95
96########################################################################################
97# Fill poi_type table
98#
99sub fill_default_poi_types {
100    my $i=1;
101    my $used_icons ={};
102
103    my $unused_icon ={};
104    my $existing_icon ={};
105
106    die "no Icon File found" unless -s $icon_file;
107
108    our $title = ''; our $title_en = '';
109    our $description = ''; our $description_en = '';
110
111    # parse icon file
112    #
113    my $twig= new XML::Twig
114    (
115       TwigHandlers => { rule        => \&sub_poi,
116                         title       => \&sub_title,
117                         description => \&sub_desc }
118    );
119    $twig->parsefile( "$icon_file");
120    my $rules= $twig->root;
121
122    $twig->purge;
123
124    sub sub_poi
125    {
126      my ($twig, $poi_elm) = @_;
127      use Data::Dumper;
128      my $key=$poi_elm->att('k');
129      if ( ! $key ) {
130          warn "missing k= for ".$poi_elm->sprint."\n";
131          #warn "parent:".$poi_elm->parent->sprint;
132          #warn Data::Dumper->new([$poi_elm], ['poi_elm'])->Maxdepth(2)->Indent(2)->Dump;
133      } elsif ( 'poi' eq "$key" )
134      {
135        my $osm_1st = '';
136        my $osm_2nd = '';
137        my $osm_3rd = '';
138        my $name = $poi_elm->att('v');
139        my $scale_min = $poi_elm->first_child('scale_min')->text;
140        my $scale_max = $poi_elm->first_child('scale_max')->text;
141        if ($poi_elm->children_count('condition'))
142        {
143          $osm_1st = $poi_elm->first_child('condition')->att('k').'='
144                     .$poi_elm->first_child('condition')->att('v');
145        }
146        if ($poi_elm->children_count('condition_2nd'))
147        {
148          $osm_2nd = $poi_elm->first_child('condition_2nd')->att('k').'='
149                     .$poi_elm->first_child('condition_2nd')->att('v');
150        }
151        if ($poi_elm->children_count('condition_3rd'))
152        {
153          $osm_3rd = $poi_elm->first_child('condition_3rd')->att('k').'='
154                    .$poi_elm->first_child('condition_3rd')->att('v');
155        }
156        $title = $title_en unless ($title);
157        $description = $description_en unless ($description);
158
159        # replace ' by something else, because otherwise the sql statement will fail
160        $title =~ s/'/''/g;
161        $description =~ s/'/''/g;
162        $osm_1st =~ s/'/''/g;
163        $osm_2nd =~ s/'/''/g;
164        $osm_3rd =~ s/'/''/g;
165
166        if ( $VERBOSE) {
167            print "Adding POI: $name\n";
168            print "            $title - $description\n";
169        }
170
171        db_exec(
172          "INSERT INTO `poi_type` ".
173          "(poi_type, scale_min, scale_max, title, description, editable, osm_condition, osm_cond_2nd, osm_cond_3rd ) ".
174          "VALUES ('$name','$scale_min','$scale_max','$title','$description','1','$osm_1st','$osm_2nd','$osm_3rd');") 
175            or die;
176      }
177      elsif ( 'dynamic' eq $key )
178      {
179        my $name = $poi_elm->att('v');
180        my $scale_min = $poi_elm->first_child('scale_min')->text;
181        my $scale_max = $poi_elm->first_child('scale_max')->text;
182        $title = $title_en unless ($title);
183        $description = $description_en unless ($description);
184
185        # replace ' by something else, because otherwise the sql statement wil fail
186        $description =~ s/'/'/g;
187
188        if ( $VERBOSE )  {
189            print "Adding dynamic point: $name\n";
190            print "                      $title - $description\n";
191        }
192
193        db_exec(
194          "INSERT INTO `poi_type` ".
195          "(poi_type, scale_min, scale_max, title, description, editable) ".
196          "VALUES ('$name','$scale_min','$scale_max','$title','$description','0');") 
197            or die;
198      }
199      $title = ''; $title_en = '';
200      $description = ''; $description_en = '';
201    }
202
203    sub sub_title
204    {
205      my ($twig, $title_elm) = @_;
206      if ($title_elm->att('lang') eq 'en')
207        { $title_en = $title_elm->text; }
208      elsif ($title_elm->att('lang') eq $lang)
209        { $title = $title_elm->text; }
210    }
211
212    sub sub_desc
213    {
214      my ($twig, $desc_elm) = @_;
215      if ($desc_elm->att('lang') eq 'en')
216        { $description_en = $desc_elm->text; }
217      elsif ($desc_elm->att('lang') eq $lang)
218        { $description = $desc_elm->text; }
219    }
220}
221
222
223########################################################################################
224# Fill source table
225#
226sub fill_default_sources() {   # Just some Default Sources
227
228    my @sources = (
229      { source_id   => '1',
230        name        => 'unknown',
231        comment     => 'Unknown source or source not defined', 
232        last_update => '2008-03-01',
233        url         => 'http://www.gpsdrive.de/',
234        licence     => 'unknown'
235      },
236      { source_id   => '2',
237        name        => 'way.txt',
238        comment     => 'Data imported from way.txt', 
239        last_update => '2008-03-01',
240        url         => 'http://www.gpsdrive.de/',
241        licence     => 'unknown'
242      },
243      { source_id   => '3',
244        name        => 'user',
245        comment     => 'Data entered by the GpsDrive-User',
246        last_update => '2008-03-01',
247        url         => 'http://www.gpsdrive.cc/',
248        licence     => $default_licence
249      },
250      { source_id   => '4',
251        name        => 'OpenStreetMap.org',
252        comment     => 'General Data imported from the OpenStreetMap Project', 
253        last_update => '2007-01-03',
254        url         => 'http://www.openstreetmap.org/',
255        licence     => 'Creative Commons Attribution-ShareAlike 2.0'
256      },
257      { source_id   => '5',
258        name        => 'groundspeak',
259        comment     => 'Geocache data from Groundspeak', 
260        last_update => '2007-01-30',
261        url         => 'http://www.groundspeak.com/',
262        licence     => 'unknown'
263      },
264      { source_id   => '6',
265        name        => 'opencaching',
266        comment     => 'Geocache data from Opencaching', 
267        last_update => '2007-09-30',
268        url         => 'http://www.opencaching.de/',
269        licence     => 'unknown'
270      },
271      { source_id   => '7',
272        name        => 'friendsd',
273        comment     => 'Position received from friendsd server', 
274        last_update => '2007-09-30',
275        url         => 'http://friendsd.gpsdrive.de/',
276        licence     => 'none'
277      },
278      { source_id   => '8',
279        name        => 'fon',
280        comment     => 'Access point data from FON', 
281        last_update => '2007-09-30',
282        url         => 'http://www.fon.com/',
283        licence     => 'unknown'
284      },
285      { source_id   => '9',
286        name        => 'kismet',
287        comment     => 'Access point data found by Kismet', 
288        last_update => '2008-03-01',
289        url         => 'http://www.kismetwireless.net/',
290        licence     => 'unknown'
291      },
292      { source_id   => '10',
293        name        => 'postgis',
294        comment     => 'Data read from a local mapnik/postgis database', 
295        last_update => '2008-03-11',
296        url         => 'http://www.openstreetmap.org/',
297        licence     => 'Creative Commons Attribution-ShareAlike 2.0'
298      },
299      { source_id   => '11',
300        name        => 'ais',
301        comment     => 'Position received from an AIS receiver', 
302        last_update => '2009-02-26',
303        url         => '',
304        licence     => 'none'
305      },
306    );
307
308    foreach (@sources) {
309        print "Adding Source: $$_{'name'} - $$_{'url'}\n"
310            if $VERBOSE;
311        db_exec(
312            "INSERT INTO `source` ".
313            "(source_id, name, comment, last_update, url, licence) ".
314            "VALUES ($$_{'source_id'},'$$_{'name'}','$$_{'comment'}',".
315            "'$$_{'last_update'}','$$_{'url'}','$$_{'licence'}');") or die;
316    }
317
318}
319
320
321########################################################################################
322#
323#                     Main
324#
325########################################################################################
326
327# Set defaults and get options from command line
328Getopt::Long::Configure('no_ignore_case');
329GetOptions (
330             'lang=s'             => \$lang,
331             'source=s'           => \$icon_file,
332             'verbose'            => \$VERBOSE,
333           ) || die("Unknown Option!!!!!!!\n");
334
335$lang = $lang || $default_lang;
336
337if ($lang eq 'en')
338  { $db_file = "./geoinfo.db"; }
339else
340  { $db_file = "./geoinfo.$lang.db"; }
341
342print "$VERSION\n";
343
344create_dbfile();
345fill_default_sources();
346fill_default_poi_types();
347
348
349__END__
350
351=head1 NAME
352
353B<create_geoinfo-db.pl>
354
355=head1 DESCRIPTION
356
357B<create_geoinfo-db.pl> is creating the geoinfo.db from the icons and icons.xml File
358
359Create SQLite Database file used by GpsDrive
360Fill it with:
361   - POI Sources predefined in this script
362   - POI Types as defined in icons.xml
363
364=head1 SYNOPSIS
365
366B<Common usages:>
367
368  create_geoinfo-db.pl --lang=en
369
370=head1 OPTIONS
371
372=over 8
373
374=item B<-lang>
375
376select the language to use
377
378=item B<-source>
379
380select the icons.xml file to use
381
382=back
383
384
385=head1 AUTHOR
386
387Written by Guenther Meyer <d.s.e@sordidmusic.com>
388
389=head1 COPYRIGHT
390
391This is free software.  You may redistribute copies of it under the terms of the GNU General Pub-
392lic  License <http://www.gnu.org/licenses/gpl.html>.  There is NO WARRANTY, to the extent permit-
393ted by law.
394
395=head1 SEE ALSO
396
397gpsdrive(1)
398
399
400=cut
401
Note: See TracBrowser for help on using the repository browser.