BGL File Format

From FSDeveloper Wiki
Revision as of 19:55, 27 August 2014 by Patrick Germain (talk | contribs)
Jump to navigationJump to search

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
See http://support.microsoft.com/kb/188768

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.
I don’t know what these subareas are used for.
To compute the bounding coordinates, please see Computing the bounding coordinates from a DWORD value.
To get the bounding coordinates of the square area covered by the file, just keep the minimal and maximal values of each bounding coordinates.



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

Sections

Following the header, at offset 0x38, there are as many sections as defined at offset 0x14 of the header. A same file may contain sections of different type. Each section has a size of 20 bytes and has the following structure:

Relative Offset Number of bytes Description
0x00 4 - DWORD Section type (as defined by Microsoft Flight Simulator): one of the following values:
  • None = 0x0
  • Copyright = 0x1
  • Guid = 0x2
  • Airport = 0x3
  • Nav = 0x13
  • Ndb = 0x17
  • Marker = 0x18
  • Boundary = 0x20
  • Waypoint = 0x22
  • Geopol = 0x23
  • SceneryObject = 0x25
  • AirportNameIndex = 0x27
  • VorIcaoIndex = 0x28
  • NdbIcaoIndex = 0x29
  • WaypointIcaoIndex = 0x2A
  • ModelData = 02B
  • AirportSummary = 0x2C
  • Exclusion = 0x2E
  • TimeZone = 0x2F
  • TerrainVectorDb = 0x65
  • TerrainElevation = 0x67
  • TerrainLandClass = 0x68
  • TerrainWaterClass = 0x69
  • TerrainRegion = 0x6A
  • PopulationDensity = 0x6C
  • AutogenAnnotation = 0x6D
  • TerrainIndex = 0x6E (Note: According to George (Golf-HotelDelta), non-seasonal photo scenery compiled with resample also has this type.
  • TerrainTextureLookup = 0x6F
  • TerrainSeasonJan = 0x78
  • TerrainSeasonFeb = 0x79
  • TerrainSeasonMar = 0x7A
  • TerrainSeasonApr = 0x7B
  • TerrainSeasonMay = 0x7C
  • TerrainSeasonJun = 0x7D
  • TerrainSeasonJul = 0x7E
  • TerrainSeasonAug = 0x7F
  • TerrainSeasonSep = 0x80
  • TerrainSeasonOct = 0x81
  • TerrainSeasonNov = 0x82
  • TerrainSeasonDec = 0x83
  • TerrainPhotoJan = 0x8C
  • TerrainPhotoFeb = 0x8D
  • TerrainPhotoMar = 0x8E
  • TerrainPhotoApr = 0x8F
  • TerrainPhotoMay = 0x90
  • TerrainPhotoJun = 0x91
  • TerrainPhotoJul = 0x92
  • TerrainPhotoAug = 0x93
  • TerrainPhotoSep = 0x94
  • TerrainPhotoOct = 0x95
  • TerrainPhotoNov = 0x96
  • TerrainPhotoDec = 0x97
  • TerrainPhotoNight = 0x98
  • FakeTypes = 0x2710
  • IcaoRunway = 0x2711
0x04 4 - DWORD Unknown
0x08 4 - DWORD Number of subsections in the section.
0x0C 4 - DWORD File offset = position in the file where the first subsection starts.
0x10 4 - DWORD Total Size (in bytes) of all the subsections. This value should be equal to : 16 * nbSubSections


Note that a cvx*.bgl file have at least a section of type 101 (0x65) = TerrainVectorDb.

Example

For example, in cvx2815.bgl, the only one section, at offset 0x38, has this:

Offset Values Description
0x38
65 00 00 00
TerrainVectorDb = 101 = 0x65
0x3C
01 00 00 00
Unknown
0x40
8D 07 00 00
0x078D = 1933 subsections in the section
0x44
01 CD 1F 00
0x1FCD01 = File offset = position in the file where the first subsection starts.
0x48
D0 78 00 00
Size (in bytes) =0x78D0 = 30928 bytes

Subsections

A subsection contains information about the geographical area it covers. If also contains the file offset of the subsection’s data. All subsections of a same section are contiguous meaning that they are following each other in the file.
A subsection has the following structure:

Relative Offset Number of bytes Description
0x00 4 - DWORD Bounding coordinates of a squared area covered by this subsection. See Annexe A.
0x04 4 - DWORD Number of records contained in the subsection's data.
It is 0 for TerrainVectorDb (which actually means only 1 record).
0x08 4 - DWORD File Offset = Position in the file of the subsection’s data
0x0C 4 - DWORD Size of the subsection’s data


The interpretation of the section data depends on the section type.

Example

Offset Values Description
0x1FCD01
00 FA 81 00
Bounding coordinates:
  • MinLatitude(Deg) = 47.63671875
  • MaxLatitude(Deg) = 47.8125
  • MinLongitude(Deg) =- 75.0
  • MaxLongitude(Deg) = -74.765625
0x1FCD05
00 00 00 00
Number of records = 0
0x1FCD09
4C 00 00 00
0x4C = File Offset = Position in the file of the subsection’s data.
0x1FCD0D
DD 00 00 00
Size of the subsection’s data = 0xDD = 221 bytes.