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__ |