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

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