Subversion Repositories Projects

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
727 rain-er 1
###############################################################################
2
#
3
# map.pl -  Map definition
4
#
5
## Copyright (C) 2009  Rainer Walther  (rainerwalther-mail@web.de)
6
#
7
# Creative Commons Lizenz mit den Zusaetzen (by, nc, sa)
8
#
9
# Es ist Ihnen gestattet: 
10
#     * das Werk vervielfältigen, verbreiten und öffentlich zugänglich machen
11
#     * Abwandlungen bzw. Bearbeitungen des Inhaltes anfertigen
12
# 
13
# Zu den folgenden Bedingungen:
14
#     * Namensnennung.
15
#       Sie müssen den Namen des Autors/Rechteinhabers in der von ihm festgelegten Weise nennen.
16
#     * Keine kommerzielle Nutzung.
17
#       Dieses Werk darf nicht für kommerzielle Zwecke verwendet werden.
18
#     * Weitergabe unter gleichen Bedingungen.
19
#       Wenn Sie den lizenzierten Inhalt bearbeiten oder in anderer Weise umgestalten,
20
#       verändern oder als Grundlage für einen anderen Inhalt verwenden,
21
#       dürfen Sie den neu entstandenen Inhalt nur unter Verwendung von Lizenzbedingungen
22
#       weitergeben, die mit denen dieses Lizenzvertrages identisch oder vergleichbar sind.
23
# 
24
# Im Falle einer Verbreitung müssen Sie anderen die Lizenzbedingungen, unter welche dieses
25
# Werk fällt, mitteilen. Am Einfachsten ist es, einen Link auf diese Seite einzubinden.
26
# 
27
# Jede der vorgenannten Bedingungen kann aufgehoben werden, sofern Sie die Einwilligung
28
# des Rechteinhabers dazu erhalten.
29
# 
30
# Diese Lizenz lässt die Urheberpersönlichkeitsrechte unberührt.
31
# 
32
# Weitere Details zur Lizenzbestimmung gibt es hier:
33
#   Kurzform: http://creativecommons.org/licenses/by-nc-sa/3.0/de/
34
#   Komplett: http://creativecommons.org/licenses/by-nc-sa/3.0/de/legalcode
35
#
36
###############################################################################
37
##
38
# 2009-03-06 0.0.1 rw created
39
# 2009-04-01 0.1.0 rw RC1
40
# 2009-04-18 0.1.1 rw Select default map, if configured map does not exist
41
# 2009-07-22 0.1.2 rw Offset_x and Offset_y for adjustment of map calibration
42
# 2009-08-15 0.1.3 rw Tracking Antenne Home position added
43
#                     Player home position added
44
#                     Read map definition from XML file
45
# 2009-09-29 0.1.4 rw Read map definition from KML file (GE import)
46
#                     Allow Config lines in map definition file (like mkcockpit.xml)
47
#
48
###############################################################################
49
 
50
$Version{'map/map.pl'} = "0.1.4 - 2009-09-29";
51
 
52
use XML::Simple;             # http://search.cpan.org/dist/XML-Simple-2.18/lib/XML/Simple.pm
53
 
54
%Maps =
55
    (
56
    Default => {
57
        'Name' => "Default",
58
        'File' => 'default-800.gif',
59
 
60
        'P1_x' => '71',               # calibration P1, P2
61
        'P1_y' => '472',
62
        'P2_x' => '500',
63
        'P2_y' => '103',
64
        'P1_Lat' => '48.856253',
65
        'P1_Lon' => '2.3500000',
66
        'P2_Lat' => '54.090153',
67
        'P2_Lon' => '12.133249',
68
 
69
        # 'Offset_x' =>  5,             # Optional Pixel offset MK to right
70
        # 'Offset_y' =>  5,             # Optional pixel offset MK to top
71
 
72
        # 'Home_Lat' => '54.090153',    # Optional home position for player
73
        # 'Home_Lon' => '12.133249',    # Optional home position for player
74
 
75
        # 'Poi_Lat' => '54.090153',    # Optional POI position for player
76
        # 'Poi_Lon' => '12.133249',    # Optional POI position for player
77
 
78
        # 'Track_Lat' => '49.685333',   # Optional Tracking Antenna pos
79
        # 'Track_Lon' => '10.950134',   # Optional Tracking Antenna pos
80
        # 'Track_Alt' => '500',         # Optional Tracking Antenna altitude
81
        # 'Track_Bearing' =>  10,       # Optional Tracking antenne direction
82
 
83
        #  'Border' => [ 555, 430,       # airfield border
84
        #              516, 555,
85
        #              258, 555,
86
        #              100, 300,
87
        #              580, 260,
88
        #              530, 94,
89
        #              627, 130,
90
        #              735, 300,
91
        #              680, 400,
92
        #              757, 470,
93
        #              720, 515,
94
        #              575, 420,
95
        #            ],
96
        },
97
    );
98
 
99
 
100
#
101
# load additional Maps from XML files
102
#
103
my $MapDir = $Cfg->{'map'}->{'MapDir'} || "map";
104
if ( -d $MapDir )
105
    {
106
    opendir DIR, $MapDir;
107
    my @Files = readdir DIR;
108
    @Files = grep /\.xml$/, @Files;
109
    closedir DIR;
110
 
111
    foreach $Xml (@Files)
112
        {
113
        my $MapConfigFile = "$MapDir/$Xml";
114
        if ( -f $MapConfigFile )
115
            {
116
            my $XmlMap = XMLin($MapConfigFile);
117
 
118
            foreach $Location (keys %{$XmlMap})
119
                {
120
                foreach $Key (keys %{$XmlMap->{$Location}} )
121
                    {
122
                    my $Value = $XmlMap->{$Location}->{$Key};
123
                    if ( $Key =~ /Border/i )
124
                        {
125
                        $Value =~ s/\s//g;
126
                        my @Border = split ',', $Value;
127
                        @{$Maps{$Location}->{$Key}}  = @Border;
128
                        }
129
                    else
130
                        {
131
                        $Maps{$Location}->{$Key}  = $Value;
132
                        }
133
                    }
134
                }
135
            }
136
        }
137
    }
138
 
139
 
140
#
141
# load additional Maps from KML files
142
#
143
my $MapDir = $Cfg->{'map'}->{'MapDir'} || "map";
144
if ( -d $MapDir )
145
    {
146
    opendir DIR, $MapDir;
147
    my @Files = readdir DIR;
148
    @Files = grep /\.kml$/, @Files;
149
    closedir DIR;
150
 
151
    foreach $Kml (@Files)
152
        {
153
        my $MapConfigFile = "$MapDir/$Kml";
154
        if ( -f $MapConfigFile )
155
            {
156
            my $KmlMap = XMLin($MapConfigFile);
157
 
158
            my $Name = $KmlMap->{'Document'}->{'Folder'}->{'name'};
159
            my $Desc = $KmlMap->{'Document'}->{'Folder'}->{'description'};
160
 
161
            $Maps{$Name}->{'Name'} = $Name;
162
 
163
            # Airfield Border
164
            my $Border = "";
165
            my $bBorder = 0;
166
 
167
            # parse config lines
168
            @DescLines = split '\n', $Desc;
169
            foreach $Line (@DescLines)
170
                {
171
                if ( $bBorder )
172
                    {
173
                    # collect border lines
174
                    if ( $Line =~ /=/i )
175
                        {
176
                        # New keyword found. End of multi-line border config
177
                        $bBorder = 0;
178
                        }
179
                    else
180
                        {
181
                        $Border = "$Border" . "$Line";
182
                        }
183
                    }
184
 
185
                if ( $Line =~ /\s*(\S*)\s*=\s*(.*)/i)
186
                    {
187
                    my $Key = $1;
188
                    my $Value = $2;
189
                    chomp $Value;
190
 
191
                    # search for border keyword
192
                    if ($Key =~ /border/i )
193
                        {
194
                        $Border = $Value;
195
                        $bBorder = 1;
196
                        }
197
                    else
198
                        {
199
                        $Maps{$Name}->{$Key} = $Value;
200
                        }
201
                    }
202
                }
203
 
204
            if ( $Border ne "" )
205
                {
206
                $Border =~ s/\s//g;
207
                my @Border = split ',', $Border;
208
                @{$Maps{$Name}->{'Border'}}  = @Border;
209
                }
210
 
211
            # P1 calibration point
212
            my $P1 = $KmlMap->{'Document'}->{'Folder'}->{'Placemark'}->{'P1'}->{'Point'}->{'coordinates'};
213
            my $P1Desc = $KmlMap->{'Document'}->{'Folder'}->{'Placemark'}->{'P1'}->{'description'};
214
            ($Maps{$Name}->{'P1_Lon'}, $Maps{$Name}->{'P1_Lat'}) = split ',', $P1;
215
            if ( $P1Desc =~ /\s*x\s*=\s*(\d*)/i)  { $Maps{$Name}->{'P1_x'} = $1; }  # x=nnn
216
            if ( $P1Desc =~ /\s*y\s*=\s*(\d*)/i)  { $Maps{$Name}->{'P1_y'} = $1; }  # y=nnn
217
 
218
            # P2 calibration point
219
            my $P2 = $KmlMap->{'Document'}->{'Folder'}->{'Placemark'}->{'P2'}->{'Point'}->{'coordinates'};
220
            my $P2Desc = $KmlMap->{'Document'}->{'Folder'}->{'Placemark'}->{'P2'}->{'description'};
221
            ($Maps{$Name}->{'P2_Lon'}, $Maps{$Name}->{'P2_Lat'}) = split ',', $P2;
222
            if ( $P2Desc =~ /\s*x\s*=\s*(\d*)/i)  { $Maps{$Name}->{'P2_x'} = $1; }  # x=nnn
223
            if ( $P2Desc =~ /\s*y\s*=\s*(\d*)/i)  { $Maps{$Name}->{'P2_y'} = $1; }  # y=nnn
224
 
225
            # Home position
226
            if ( $KmlMap->{'Document'}->{'Folder'}->{'Placemark'}->{'Home'}->{'visibility'} ne "0" )
227
                {
228
                my $Home = $KmlMap->{'Document'}->{'Folder'}->{'Placemark'}->{'Home'}->{'Point'}->{'coordinates'};
229
                my $HomeDesc = $KmlMap->{'Document'}->{'Folder'}->{'Placemark'}->{'Home'}->{'description'};
230
                ($Maps{$Name}->{'Home_Lon'}, $Maps{$Name}->{'Home_Lat'}) = split ',', $Home;
231
                }
232
 
233
            # POI position
234
            if ( $KmlMap->{'Document'}->{'Folder'}->{'Placemark'}->{'POI'}->{'visibility'} ne "0" )
235
                {
236
                my $Poi = $KmlMap->{'Document'}->{'Folder'}->{'Placemark'}->{'POI'}->{'Point'}->{'coordinates'};
237
                my $PoiDesc = $KmlMap->{'Document'}->{'Folder'}->{'Placemark'}->{'POI'}->{'description'};
238
                ($Maps{$Name}->{'Poi_Lon'}, $Maps{$Name}->{'Poi_Lat'}) = split ',', $Poi;
239
                }
240
 
241
            # Antenna tracker position
242
            if ( $KmlMap->{'Document'}->{'Folder'}->{'Placemark'}->{'Antenna'}->{'visibility'} ne "0" )
243
                {
244
                my $Track = $KmlMap->{'Document'}->{'Folder'}->{'Placemark'}->{'Antenna'}->{'Point'}->{'coordinates'};
245
                my $TrackDesc = $KmlMap->{'Document'}->{'Folder'}->{'Placemark'}->{'Antenna'}->{'description'};
246
                ($Maps{$Name}->{'Track_Lon'}, $Maps{$Name}->{'Track_Lat'}) = split ',', $Track;
247
                if ( $TrackDesc =~ /\s*Track_Alt\s*=\s*(\d*)/i)      { $Maps{$Name}->{'Track_Alt'} = $1; }      # Track_Alt=nnn
248
                if ( $TrackDesc =~ /\s*Track_Bearing\s*=\s*(\d*)/i)  { $Maps{$Name}->{'Track_Bearing'} = $1; }  # Track_Bearing=nnn
249
                }
250
            }
251
        }
252
    }
253
 
254
#
255
# Die verwendete Karte
256
#
257
my $MapDefault = $Cfg->{'map'}->{'MapDefault'};
258
if ( defined $Maps{$MapDefault} )
259
    {
260
    $Maps{'Current'} = $Maps{$MapDefault};
261
    }
262
else
263
    {
264
    $Maps{'Current'} = $Maps{'Default'};
265
    print "Map \"$MapDefault\" not found in map.pl. Using \"Default\" map\n";
266
    }
267
 
268
 
269
#
270
# Todo: Karte automatisch anhand der aktuellen GPS Position auswählen
271
#
272
 
273
1;
274
 
275
__END__