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

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

die if unknown option; no longer a default ixons.xml-file;Error output if key not founddefault is less verbose

  • 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        print "Adding dynamic point: $name\n";
189        print "                      $title - $description\n";
190
191        db_exec(
192          "INSERT INTO `poi_type` ".
193          "(poi_type, scale_min, scale_max, title, description, editable) ".
194          "VALUES ('$name','$scale_min','$scale_max','$title','$description','0');") 
195            or die;
196      }
197      $title = ''; $title_en = '';
198      $description = ''; $description_en = '';
199    }
200
201    sub sub_title
202    {
203      my ($twig, $title_elm) = @_;
204      if ($title_elm->att('lang') eq 'en')
205        { $title_en = $title_elm->text; }
206      elsif ($title_elm->att('lang') eq $lang)
207        { $title = $title_elm->text; }
208    }
209
210    sub sub_desc
211    {
212      my ($twig, $desc_elm) = @_;
213      if ($desc_elm->att('lang') eq 'en')
214        { $description_en = $desc_elm->text; }
215      elsif ($desc_elm->att('lang') eq $lang)
216        { $description = $desc_elm->text; }
217    }
218}
219
220
221########################################################################################
222# Fill source table
223#
224sub fill_default_sources() {   # Just some Default Sources
225
226    my @sources = (
227      { source_id   => '1',
228        name        => 'unknown',
229        comment     => 'Unknown source or source not defined', 
230        last_update => '2008-03-01',
231        url         => 'http://www.gpsdrive.de/',
232        licence     => 'unknown'
233      },
234      { source_id   => '2',
235        name        => 'way.txt',
236        comment     => 'Data imported from way.txt', 
237        last_update => '2008-03-01',
238        url         => 'http://www.gpsdrive.de/',
239        licence     => 'unknown'
240      },
241      { source_id   => '3',
242        name        => 'user',
243        comment     => 'Data entered by the GpsDrive-User',
244        last_update => '2008-03-01',
245        url         => 'http://www.gpsdrive.cc/',
246        licence     => $default_licence
247      },
248      { source_id   => '4',
249        name        => 'OpenStreetMap.org',
250        comment     => 'General Data imported from the OpenStreetMap Project', 
251        last_update => '2007-01-03',
252        url         => 'http://www.openstreetmap.org/',
253        licence     => 'Creative Commons Attribution-ShareAlike 2.0'
254      },
255      { source_id   => '5',
256        name        => 'groundspeak',
257        comment     => 'Geocache data from Groundspeak', 
258        last_update => '2007-01-30',
259        url         => 'http://www.groundspeak.com/',
260        licence     => 'unknown'
261      },
262      { source_id   => '6',
263        name        => 'opencaching',
264        comment     => 'Geocache data from Opencaching', 
265        last_update => '2007-09-30',
266        url         => 'http://www.opencaching.de/',
267        licence     => 'unknown'
268      },
269      { source_id   => '7',
270        name        => 'friendsd',
271        comment     => 'Position received from friendsd server', 
272        last_update => '2007-09-30',
273        url         => 'http://friendsd.gpsdrive.de/',
274        licence     => 'none'
275      },
276      { source_id   => '8',
277        name        => 'fon',
278        comment     => 'Access point data from FON', 
279        last_update => '2007-09-30',
280        url         => 'http://www.fon.com/',
281        licence     => 'unknown'
282      },
283      { source_id   => '9',
284        name        => 'kismet',
285        comment     => 'Access point data found by Kismet', 
286        last_update => '2008-03-01',
287        url         => 'http://www.kismetwireless.net/',
288        licence     => 'unknown'
289      },
290      { source_id   => '10',
291        name        => 'postgis',
292        comment     => 'Data read from a local mapnik/postgis database', 
293        last_update => '2008-03-11',
294        url         => 'http://www.openstreetmap.org/',
295        licence     => 'Creative Commons Attribution-ShareAlike 2.0'
296      },
297      { source_id   => '11',
298        name        => 'ais',
299        comment     => 'Position received from an AIS receiver', 
300        last_update => '2009-02-26',
301        url         => '',
302        licence     => 'none'
303      },
304    );
305
306    foreach (@sources) {
307      print "Adding Source: $$_{'name'} - $$_{'url'}\n";
308      db_exec(
309        "INSERT INTO `source` ".
310          "(source_id, name, comment, last_update, url, licence) ".
311          "VALUES ($$_{'source_id'},'$$_{'name'}','$$_{'comment'}',".
312          "'$$_{'last_update'}','$$_{'url'}','$$_{'licence'}');") or die;
313    }
314
315}
316
317
318########################################################################################
319#
320#                     Main
321#
322########################################################################################
323
324# Set defaults and get options from command line
325Getopt::Long::Configure('no_ignore_case');
326GetOptions (
327             'lang=s'             => \$lang,
328             'source=s'           => \$icon_file,
329             'verbose'            => \$VERBOSE,
330           ) || die("Unknown Option!!!!!!!\n");
331
332$lang = $lang || $default_lang;
333
334if ($lang eq 'en')
335  { $db_file = "./geoinfo.db"; }
336else
337  { $db_file = "./geoinfo.$lang.db"; }
338
339print "$VERSION\n";
340
341create_dbfile();
342fill_default_sources();
343fill_default_poi_types();
344
345
346__END__
347
348=head1 NAME
349
350B<create_geoinfo-db.pl>
351
352=head1 DESCRIPTION
353
354B<create_geoinfo-db.pl> is creating the geoinfo.db from the icons and icons.xml File
355
356Create SQLite Database file used by GpsDrive
357Fill it with:
358   - POI Sources predefined in this script
359   - POI Types as defined in icons.xml
360
361=head1 SYNOPSIS
362
363B<Common usages:>
364
365  create_geoinfo-db.pl --lang=en
366
367=head1 OPTIONS
368
369=over 8
370
371=item B<-lang>
372
373select the language to use
374
375=item B<-source>
376
377select the icons.xml file to use
378
379=back
380
381
382=head1 AUTHOR
383
384Written by Guenther Meyer <d.s.e@sordidmusic.com>
385
386=head1 COPYRIGHT
387
388This is free software.  You may redistribute copies of it under the terms of the GNU General Pub-
389lic  License <http://www.gnu.org/licenses/gpl.html>.  There is NO WARRANTY, to the extent permit-
390ted by law.
391
392=head1 SEE ALSO
393
394gpsdrive(1)
395
396
397=cut
398
Note: See TracBrowser for help on using the repository browser.