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

Last change on this file since 10858 was 7710, checked in by joerg, 12 years ago

map-icons/create_geoinfo-db.pl: set to executable

  • Property svn set to executable
File size: 9.7 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.1-$Version";
21
22use strict;
23use warnings;
24
25use DBI;
26use File::Copy;
27use XML::Twig;
28use Getopt::Long;
29use Pod::Usage;
30
31my $lang;
32my $db_file;
33my $dbh;
34my ($man,$help,$DEBUG,$VERBOSE)=(0,0,0,0);
35
36my $icons_xml= "./icons.xml";
37
38########################################################################################
39# Execute SQL statement
40#
41sub db_exec($){
42    my $statement = shift;
43
44    my $sth = $dbh->prepare($statement);
45    unless ( $sth->execute() ) {
46        warn "Error in query '$statement'\n";
47        $sth->errstr;
48        return 0;
49    }
50    return 1;
51}
52
53
54########################################################################################
55# Creata db file and tables
56#
57sub create_dbfile(){
58    my $create_statement;
59    my $sth;
60
61    move("$db_file","$db_file.old");
62
63    $create_statement="CREATE DATABASE geoinfo;";
64    $dbh = DBI->connect("dbi:SQLite:dbname=$db_file",'','');
65    $dbh->{unicode} = 1;
66
67    # ------- POI_TYPE
68    db_exec('CREATE TABLE poi_type (
69                poi_type       VARCHAR(160)  PRIMARY KEY,
70                scale_min      INTEGER       NOT NULL default \'1\',
71                scale_max      INTEGER       NOT NULL default \'50000\',
72                title          VARCHAR(160)  NULL default \'\',
73                description    VARCHAR(160)  NULL default \'\');') or die;
74
75     # ------- SOURCE
76    db_exec('CREATE TABLE source (
77                source_id      INTEGER      PRIMARY KEY,
78                name           VARCHAR(80)  NOT NULL default \'\',
79                comment        VARCHAR(160) NOT NULL default \'\',
80                last_update    DATE         NOT NULL default \'0000-00-00\',
81                url            VARCHAR(160) NOT NULL default \'\',
82                licence        VARCHAR(160) NOT NULL default \'\');') or die;
83 
84}
85
86
87########################################################################################
88# Fill poi_type table
89#
90sub fill_default_poi_types(;$) {
91    my $i=1;
92    my $used_icons ={};
93
94    my $unused_icon ={};
95    my $existing_icon ={};
96
97    my $icon_file=shift;
98    $icon_file = '../data/map-icons/icons.xml'          unless -s $icon_file;
99    $icon_file = '../share/map-icons/icons.xml'         unless -s $icon_file;
100    $icon_file = '/usr/local/share/icons/map-icons/icons.xml' unless -s $icon_file;
101    $icon_file = '/usr/local/share/map-icons/icons.xml' unless -s $icon_file;
102    $icon_file = '/usr/share/icons/map-icons/icons.xml' unless -s $icon_file;
103    $icon_file = '/usr/share/map-icons/icons.xml'       unless -s $icon_file;
104    $icon_file = '/opt/gpsdrive/icons.xml'              unless -s $icon_file;
105    die "no Icon File found" unless -s $icon_file;
106
107    print "Using Icons File '$icon_file'\n" if $DEBUG || $VERBOSE;
108
109    our $title = ''; our $title_en = '';
110    our $description = ''; our $description_en = '';
111
112    # parse icon file
113    #
114    my $twig= new XML::Twig
115    (
116       TwigHandlers => { rule        => \&sub_poi,
117                         title       => \&sub_title,
118                         description => \&sub_desc }
119    );
120    $twig->parsefile( "$icon_file");
121    my $rules= $twig->root;
122
123    $twig->purge;
124
125    sub sub_poi
126    {
127      my ($twig, $poi_elm) = @_;
128      if ($poi_elm->first_child('condition')->att('k') eq 'poi')
129      {
130        my $name = $poi_elm->first_child('condition')->att('v');
131        my $scale_min = $poi_elm->first_child('scale_min')->text;
132        my $scale_max = $poi_elm->first_child('scale_max')->text;
133        $title = $title_en unless ($title);
134        $description = $description_en unless ($description);
135
136        # replace ' by something else, because otherwise the sql statement wil fail
137        #$description =~ s/'/'/g;
138        $description =~ s/'/'/g;
139
140        print "Adding POI: $name\n" if $VERBOSE;
141        print "            $title - $description\n"  if $VERBOSE > 1;
142
143        db_exec(
144          "INSERT INTO `poi_type` ".
145          "(poi_type, scale_min, scale_max, title, description) ".
146          "VALUES ('$name','$scale_min','$scale_max','$title','$description');") 
147            or die "Insert of poi_type Failed ('$name','$scale_min','$scale_max','$title','$description')\n";
148      }
149      $title = ''; $title_en = '';
150      $description = ''; $description_en = '';
151    }
152
153    sub sub_title
154    {
155      my ($twig, $title_elm) = @_;
156      if ($title_elm->att('lang') eq 'en')
157        { $title_en = $title_elm->text; }
158      elsif ($title_elm->att('lang') eq $lang)
159        { $title = $title_elm->text; }
160    }
161
162    sub sub_desc
163    {
164      my ($twig, $desc_elm) = @_;
165      if ($desc_elm->att('lang') eq 'en')
166        { $description_en = $desc_elm->text; }
167      elsif ($desc_elm->att('lang') eq $lang)
168        { $description = $desc_elm->text; }
169    }
170}
171
172
173########################################################################################
174# Fill source table
175#
176sub fill_default_sources() {   # Just some Default Sources
177
178    my @sources = (
179      { source_id   => '1',
180        name        => 'unknown',
181        comment     => 'Unknown source or source not defined', 
182        last_update => '2008-03-01',
183        url         => 'http://www.gpsdrive.de/',
184        licence     => 'unknown'
185      },
186      { source_id   => '2',
187        name        => 'way.txt',
188        comment     => 'Data imported from way.txt', 
189        last_update => '2008-03-01',
190        url         => 'http://www.gpsdrive.de/',
191        licence     => 'unknown'
192      },
193      { source_id   => '3',
194        name        => 'user',
195        comment     => 'Data entered by the GpsDrive-User',
196        last_update => '2008-03-01',
197        url         => 'http://www.gpsdrive.cc/',
198        licence     => $default_licence
199      },
200      { source_id   => '4',
201        name        => 'OpenStreetMap.org',
202        comment     => 'General Data imported from the OpenStreetMap Project', 
203        last_update => '2007-01-03',
204        url         => 'http://www.openstreetmap.org/',
205        licence     => 'Creative Commons Attribution-ShareAlike 2.0'
206      },
207      { source_id   => '5',
208        name        => 'groundspeak',
209        comment     => 'Geocache data from Groundspeak', 
210        last_update => '2007-01-30',
211        url         => 'http://www.groundspeak.com/',
212        licence     => 'unknown'
213      },
214      { source_id   => '6',
215        name        => 'opencaching',
216        comment     => 'Geocache data from Opencaching', 
217        last_update => '2007-09-30',
218        url         => 'http://www.opencaching.de/',
219        licence     => 'unknown'
220      },
221     
222      { source_id   => '7',
223        name        => 'friendsd',
224        comment     => 'Position received from friendsd server', 
225        last_update => '2007-09-30',
226        url         => 'http://friendsd.gpsdrive.de/',
227        licence     => 'none'
228      },
229      { source_id   => '8',
230        name        => 'fon',
231        comment     => 'Access point data from FON', 
232        last_update => '2007-09-30',
233        url         => 'http://www.fon.com/',
234        licence     => 'unknown'
235      },
236      { source_id   => '9',
237        name        => 'kismet',
238        comment     => 'Access point data found by Kismet', 
239        last_update => '2008-03-01',
240        url         => 'http://www.kismetwireless.net/',
241        licence     => 'unknown'
242      },
243      { source_id   => '10',
244        name        => 'postgis',
245        comment     => 'Data read from a local mapnik/postgis database', 
246        last_update => '2008-03-11',
247        url         => 'http://www.openstreetmap.org/',
248        licence     => 'Creative Commons Attribution-ShareAlike 2.0'
249      },
250    );
251
252      print "Adding Sources:\n";
253    foreach (@sources) {
254      print "   Adding Source: $$_{'name'} - $$_{'url'}\n" if $VERBOSE;
255      db_exec(
256        "INSERT INTO `source` ".
257          "(source_id, name, comment, last_update, url, licence) ".
258          "VALUES ($$_{'source_id'},'$$_{'name'}','$$_{'comment'}',".
259          "'$$_{'last_update'}','$$_{'url'}','$$_{'licence'}');") or die;
260    }
261
262}
263
264
265########################################################################################
266#
267#                     Main
268#
269########################################################################################
270
271# Set defaults and get options from command line
272Getopt::Long::Configure('no_ignore_case');
273GetOptions ( 'lang=s'      => \$lang,
274             'icons_xml=s' => \$icons_xml,
275             'db_file=s'   => \$db_file,
276             'd+'          => \$DEBUG,
277             'debug+'      => \$DEBUG,     
278             'verbose'     => \$VERBOSE,
279             'v+'          => \$VERBOSE,
280             'h|help|x'    => \$help, 
281             'MAN'         => \$man, 
282             'man'         => \$man, 
283    )
284    or pod2usage(1);
285
286pod2usage(1) if $help;
287pod2usage(-verbose=>2) if $man;
288
289$lang = $lang || $default_lang;
290
291if ($lang eq 'en')
292  { $db_file ||= "./geoinfo.db"; }
293else
294  { $db_file ||= "./geoinfo.$lang.db"; }
295
296print "$VERSION\n";
297
298create_dbfile();
299fill_default_sources();
300fill_default_poi_types($icons_xml);
301
302
303__END__
304
305=head1 NAME
306
307B<create_geoinfo-db.pl> Version 0.1
308
309=head1 DESCRIPTION
310
311Create SQLite Database file used by GpsDrive
312Fill it with:
313   - POI Sources predefined in this script
314   - POI Types as defined in icons.xml
315   TODO: - Field Types for additional POI Information (poi_extra)
316
317=item B<--man>
318
319Print this small usage
320
321=item B<-d>
322
323Add some more Debug Output
324
325=item B<-v>
326
327Some more Otput while creating
328
329=item B<icons_xml>
330
331Icons.xml File (default ./icons.xml)
332
333=item B<db_file>
334
335the resulting geoinfo.db File (default ./geoinfo.db | geoinfo.de.db)
336
337=back
Note: See TracBrowser for help on using the repository browser.