The size of the union has to account for both size and alignment requirements:
GndOrigin has a size of 12 but also has a 4-byte alignment requirement so that the UInt32 members are properly aligned on 4-byte boundaries. Note that 12 is a multiple of 4 so that if you have an array of GndOrigin objects, every entry is properly aligned.
UavInformation has a size of 14 and has a 2-byte alignment requirement to make every UInt16 properly aligned.
Since DataSection contains both GndOrigin and UavInformation, it must use the most restrictive alignment requirement, so DataSection should be 4-byte aligned.
If DataSection used only the size, it would be size 14. However, if we had an array of DataSection objects, array[0].a.a would be properly aligned at offset 0 but array[1].a.a would be improperly aligned at offset 14. Changing the size of DataSection to 16 forces proper alignment.
Note that there are some processors which can handle misaligned accesses (such as a 32-bit read which is not aligned on a 4-byte boundary), but there may or may not be a performance penalty for such an access. Many compilers provide an option for "packing" structs and arrays to ignore alignment requirements to pack the members as tightly as possible.