BGL File Format: Difference between revisions
No edit summary |
No edit summary |
||
| Line 7: | Line 7: | ||
:This is the first document about BGL file format. It describes the generic format of a BGL file and the content of some important sections like Airport, Scenery Objects,etc. | :This is the first document about BGL file format. It describes the generic format of a BGL file and the content of some important sections like Airport, Scenery Objects,etc. | ||
* Some reverse engineering work on the TmfViewer and BglComp applications. | * Some reverse engineering work on the TmfViewer and BglComp applications. | ||
= BGL Common Format = | = BGL Common Format = | ||
All BGL files share the same generic format. A BGL file is made of a header, sections, subsections and subsection data. Subsections are children of sections. The sections are here to help us locate the subsections in the file. Data specific information is contained in the subsections data and their format is dependent on the section type. | All BGL files share the same generic format. A BGL file is made of a header, sections, subsections and subsection data. Subsections are children of sections. The sections are here to help us locate the subsections in the file. Data specific information is contained in the subsections data and their format is dependent on the section type. | ||
| Line 13: | Line 14: | ||
<br/> | <br/> | ||
[[File:Cvx_BGLFormat.png]] | [[File:Cvx_BGLFormat.png]] | ||
== File Header == | |||
The header consists of 0x38 (56) bytes. It contains the number of sections defined in the file as well as the bounding geographical coordinates of the covered squared area. | |||
{| class="wikitable" | |||
|- | |||
! Offset | |||
! Number of bytes | |||
! Description | |||
|- | |||
| 0x00 | |||
| 4 - DWORD | |||
| Magic Number #1 – Must be 0x01, 0x02, 0x92, 0x19 | |||
|- | |||
| 0x04 | |||
| 4 - DWORD | |||
| Header size : 0x38 | |||
|- | |||
| 0x08 | |||
| 4 - DWORD | |||
| dwLowDateTime of the FILETIME structure.<br/>Date and Time the file was created<br/> | |||
The FILETIME structure represents the number of 100-nanosecond intervals since January 1, 1601<br/> | |||
See <span class="plainlinks">http://support.microsoft.com/kb/188768</span> | |||
|- | |||
| 0x0C | |||
| 4 - DWORD | |||
| dwHighDateTime of the FILETIME structure | |||
|- | |||
| 0x10 | |||
| 4 - DWORD | |||
| Magic Number #2 – Must be 0x03, 0x18, 0x05, 0x08<br/>Maybe to identify the FS version | |||
|- | |||
| 0x14 | |||
| 4 - DWORD | |||
| The number of sections following this header. | |||
|- | |||
| 0x18 | |||
| 32 | |||
| Array[8] of unsigned integers (DWORD).<br/>Each value describes the bounding coordinates of a squared subarea.<br/> | |||
Even if 8 slots are provided, it is not necessary to have all 8 values filled. The list stops at the first null (0x00000000) value.<br/> | |||
I don’t know what these subareas are used for.<br/>To compute the bounding coordinates, please see [[#Computing the bounding coordinates from a DWORD value|Computing the bounding coordinates from a DWORD value]].<br/>To get the bounding coordinates of the square area covered by the file, just keep the minimal and maximal values of each bounding coordinates. | |||
|} | |||
<br/> | |||
<br/> | |||
=== Example === | |||
For example, in CVX2815.bgl : | |||
{| class="wikitable" | |||
|- | |||
! Offset | |||
! Values | |||
! Description | |||
|- | |||
| 0x00 | |||
| <pre>01 02 92 19</pre> | |||
| Magic Number #1 | |||
|- | |||
| 0x04 | |||
| <pre>38 00 00 00</pre> | |||
| Header size | |||
|- | |||
| 0x08 | |||
| <pre>EF 82 DF E2</pre> | |||
| Low = 3806298863 | |||
|- | |||
| 0x0C | |||
| <pre>E8 C7 C6 01</pre> | |||
| High = 29804520<br/> => February 27, 2007 | |||
|- | |||
| 0x10 | |||
| <pre>03 18 15 08</pre> | |||
| Magic Number #2 | |||
|- | |||
| 0x14 | |||
| <pre>01 00 00 00</pre> | |||
| 1 section following this header | |||
|- | |||
| 0x18 | |||
| <pre>E8 07 02 00</pre> | |||
| MinLatitude(Deg) = 46.40625<br/>MaxLatitude(Deg) = 47.8125<br/>MinLongitude(Deg) = -75.0<br/>MaxLongitude(Deg) = -73.125 | |||
|- | |||
| 0x1C | |||
| <pre>E9 07 02 00</pre> | |||
| MinLatitude(Deg) = 46.40625<br/>MaxLatitude(Deg) = 47.8125<br/>MinLongitude(Deg) = - 73.125<br/>MaxLongitude(Deg) = -71.25 | |||
|- | |||
| 0x20 | |||
| <pre>EA 07 02 00</pre> | |||
| MinLatitude(Deg) = 45.0<br/>MaxLatitude(Deg) = 46.40625<br/>MinLongitude(Deg) = -75.0<br/>MaxLongitude(Deg) = -73.125 | |||
|- | |||
| 0x24 | |||
| <pre>EB 07 02 00</pre> | |||
| MinLatitude(Deg) = 45.0<br/>MaxLatitude(Deg) = 46.40625<br/>MinLongitude(Deg) = -73.124<br/>MaxLongitude(Deg) = -71.25 | |||
|- | |||
| 0x28 | |||
| <pre>00 00 00 00</pre> | |||
| | |||
|- | |||
| 0x2C | |||
| <pre>00 00 00 00</pre> | |||
| | |||
|- | |||
| 0x30 | |||
| <pre>00 00 00 00</pre> | |||
| | |||
|- | |||
| 0x34 | |||
| <pre>00 00 00 00</pre> | |||
| | |||
|} | |||
You’ll notice that only 4 subareas are defined (on a possibility of 8) and the last 4 available slots are empty (Value = 0)<br/> | |||
So the bounding coordinates of the area covered by cvx2815.bgl are:<br/> | |||
:MinLatitude(Deg) = 45.0 | |||
:MaxLatitude(Deg) = 47.8125 | |||
:MinLongitude(Deg) = -75.0 | |||
:MaxLongitude(Deg) = -71.25 | |||
Revision as of 19:54, 27 August 2014
Introduction
The information contained in this wiki comes from different sources:
- "FSX File structure" by Winfried Orthmann
- This is the first document about BGL file format. It describes the generic format of a BGL file and the content of some important sections like Airport, Scenery Objects,etc.
- Some reverse engineering work on the TmfViewer and BglComp applications.
BGL Common Format
All BGL files share the same generic format. A BGL file is made of a header, sections, subsections and subsection data. Subsections are children of sections. The sections are here to help us locate the subsections in the file. Data specific information is contained in the subsections data and their format is dependent on the section type.
A BGL file is really a big container where all kind of information can be stored (in the subsection).The meaning of the data contained in the subsections is known only by the application using it. Th only contraint is for the file to comply to the generic format described below.
A BGL file always start with a header (Size = 0x38 bytes), followed by a list of section pointers. The number of section pointers is defined in the header.
File Header
The header consists of 0x38 (56) bytes. It contains the number of sections defined in the file as well as the bounding geographical coordinates of the covered squared area.
| Offset | Number of bytes | Description |
|---|---|---|
| 0x00 | 4 - DWORD | Magic Number #1 – Must be 0x01, 0x02, 0x92, 0x19 |
| 0x04 | 4 - DWORD | Header size : 0x38 |
| 0x08 | 4 - DWORD | dwLowDateTime of the FILETIME structure. Date and Time the file was created The FILETIME structure represents the number of 100-nanosecond intervals since January 1, 1601 |
| 0x0C | 4 - DWORD | dwHighDateTime of the FILETIME structure |
| 0x10 | 4 - DWORD | Magic Number #2 – Must be 0x03, 0x18, 0x05, 0x08 Maybe to identify the FS version |
| 0x14 | 4 - DWORD | The number of sections following this header. |
| 0x18 | 32 | Array[8] of unsigned integers (DWORD). Each value describes the bounding coordinates of a squared subarea. Even if 8 slots are provided, it is not necessary to have all 8 values filled. The list stops at the first null (0x00000000) value. |
Example
For example, in CVX2815.bgl :
| Offset | Values | Description |
|---|---|---|
| 0x00 | 01 02 92 19 |
Magic Number #1 |
| 0x04 | 38 00 00 00 |
Header size |
| 0x08 | EF 82 DF E2 |
Low = 3806298863 |
| 0x0C | E8 C7 C6 01 |
High = 29804520 => February 27, 2007 |
| 0x10 | 03 18 15 08 |
Magic Number #2 |
| 0x14 | 01 00 00 00 |
1 section following this header |
| 0x18 | E8 07 02 00 |
MinLatitude(Deg) = 46.40625 MaxLatitude(Deg) = 47.8125 MinLongitude(Deg) = -75.0 MaxLongitude(Deg) = -73.125 |
| 0x1C | E9 07 02 00 |
MinLatitude(Deg) = 46.40625 MaxLatitude(Deg) = 47.8125 MinLongitude(Deg) = - 73.125 MaxLongitude(Deg) = -71.25 |
| 0x20 | EA 07 02 00 |
MinLatitude(Deg) = 45.0 MaxLatitude(Deg) = 46.40625 MinLongitude(Deg) = -75.0 MaxLongitude(Deg) = -73.125 |
| 0x24 | EB 07 02 00 |
MinLatitude(Deg) = 45.0 MaxLatitude(Deg) = 46.40625 MinLongitude(Deg) = -73.124 MaxLongitude(Deg) = -71.25 |
| 0x28 | 00 00 00 00 |
|
| 0x2C | 00 00 00 00 |
|
| 0x30 | 00 00 00 00 |
|
| 0x34 | 00 00 00 00 |
You’ll notice that only 4 subareas are defined (on a possibility of 8) and the last 4 available slots are empty (Value = 0)
So the bounding coordinates of the area covered by cvx2815.bgl are:
- MinLatitude(Deg) = 45.0
- MaxLatitude(Deg) = 47.8125
- MinLongitude(Deg) = -75.0
- MaxLongitude(Deg) = -71.25