HELP: Las files not tiling to 3D tiles in ION correctly

Hi

I have two LAS files from different location with slightly different headers. One of the Las files tiles correctly and is positioned as expected however the other does not. It is positioned incorrectly and it’s orientation is also wrong.

These are the headers of the two files:

Las File A: This one is working as expected:

lasinfo (221128) report for ‘370500_6908500.las’
reporting all LAS header entries:
file signature: ‘LASF’
file source ID: 0
global_encoding: 1
project ID GUID data 1-4: 00000000-0000-0000-0000-000000000000
version major.minor: 1.4
system identifier: ‘’
generating software: ‘TerraScan’
file creation day/year: 63/2022
header size: 375
offset to point data: 1905
number var. length records: 4
point data format: 6
point data record length: 30
number of point records: 0
number of points by return: 0 0 0 0 0
scale factor x y z: 0.001 0.001 0.001
offset x y z: 500000 7000000 -0
min x y z: 370500.000 6908500.000 175.940
max x y z: 370999.999 6908999.999 272.903
start of waveform data packet record: 0
start of first extended variable length record: 0
number of extended_variable length records: 0
extended number of point records: 15101426
extended number of points by return: 11530314 2808367 685477 74086 3168 14 0 0 0 0 0 0 0 0 0
variable length header record 1 of 4:
reserved 0
user ID ‘LASF_Projection’
record ID 34735
length after header 208
description ‘GeoKeyDirectoryTag (mandatory)’
GeoKeyDirectoryTag version 1.1.0 number of keys 25
key 1024 tiff_tag_location 0 count 1 value_offset 1 - GTModelTypeGeoKey: ModelTypeProjected
key 1025 tiff_tag_location 0 count 1 value_offset 2 - GTRasterTypeGeoKey: RasterPixelIsPoint
key 1026 tiff_tag_location 34737 count 28 value_offset 0 - GTCitationGeoKey: GDA2020 / MGA zone 55 / AHD
key 2048 tiff_tag_location 0 count 1 value_offset 32767 - GeographicTypeGeoKey: user-defined
key 2049 tiff_tag_location 34737 count 8 value_offset 56 - GeogCitationGeoKey: GDA2020
key 2050 tiff_tag_location 0 count 1 value_offset 32767 - GeogGeodeticDatumGeoKey: user-defined
key 2051 tiff_tag_location 0 count 1 value_offset 32767 - GeogPrimeMeridianGeoKey: user-defined
key 2052 tiff_tag_location 0 count 1 value_offset 9001 - GeogLinearUnitsGeoKey: Linear_Meter
key 2054 tiff_tag_location 0 count 1 value_offset 9102 - GeogAngularUnitsGeoKey: Angular_Degree
key 2056 tiff_tag_location 0 count 1 value_offset 32767 - GeogEllipsoidGeoKey: user-defined
key 2057 tiff_tag_location 34736 count 1 value_offset 0 - GeogSemiMajorAxisGeoKey: 6378137
key 2059 tiff_tag_location 34736 count 1 value_offset 1 - GeogInvFlatteningGeoKey: 298.2572221
key 2060 tiff_tag_location 0 count 1 value_offset 9102 - GeogAzimuthUnitsGeoKey: Angular_Degree
key 2061 tiff_tag_location 34736 count 1 value_offset 2 - GeogPrimeMeridianLongGeoKey: 0
key 3072 tiff_tag_location 0 count 1 value_offset 32767 - ProjectedCSTypeGeoKey: user-defined
key 3073 tiff_tag_location 34737 count 28 value_offset 28 - PCSCitationGeoKey: GDA2020 / MGA zone 55 / AHD
key 3074 tiff_tag_location 0 count 1 value_offset 32767 - ProjectionGeoKey: user-defined
key 3075 tiff_tag_location 0 count 1 value_offset 1 - ProjCoordTransGeoKey: CT_TransverseMercator
key 3076 tiff_tag_location 0 count 1 value_offset 9001 - ProjLinearUnitsGeoKey: Linear_Meter
key 3080 tiff_tag_location 34736 count 1 value_offset 4 - ProjNatOriginLongGeoKey: 147
key 3081 tiff_tag_location 34736 count 1 value_offset 3 - ProjNatOriginLatGeoKey: 0
key 3082 tiff_tag_location 34736 count 1 value_offset 5 - ProjFalseEastingGeoKey: 500000
key 3083 tiff_tag_location 34736 count 1 value_offset 6 - ProjFalseNorthingGeoKey: 10000000
key 3092 tiff_tag_location 34736 count 1 value_offset 7 - ProjScaleAtNatOriginGeoKey: 0.9996
key 4099 tiff_tag_location 0 count 1 value_offset 9001 - VerticalUnitsGeoKey: Linear_Meter
variable length header record 2 of 4:
reserved 0
user ID ‘LASF_Projection’
record ID 34736
length after header 64
description ‘GeoDoubleParamsTag (optional)’
GeoDoubleParamsTag (number of doubles 8)
6.37814e+06 298.257 0 0 147 500000 1e+07 0.9996
variable length header record 3 of 4:
reserved 0
user ID ‘LASF_Projection’
record ID 34737
length after header 64
description ‘GeoASCIIParamsTag (optional)’
GeoAsciiParamsTag (number of characters 64)
GDA2020 / MGA zone 55 / AHD|GDA2020 / MGA zone 55 / AHD|GDA2020|
variable length header record 4 of 4:
reserved 0
user ID ‘LASF_Projection’
record ID 2112
length after header 976
description ‘OGC COORDINATE SYSTEM WKT’
WKT OGC COORDINATE SYSTEM:
COMPD_CS[“GDA2020 / MGA zone 55 / AHD”,PROJCS[“GDA2020 / MGA zone 55 / AHD”,GEOGCS[“GDA2020 / MGA zone 55 / AHD”,DATUM[“GDA2020”,SPHEROID[“GRS 1980”,6378137.000,298.257222101,AUTHORITY[“EPSG”,“7019”]],AUTHORITY[“EPSG”,“1168”]],PRIMEM[“Greenwich”,0.0000000000000000,AUTHORITY[“EPSG”,“8901”]],UNIT[“Degree”,0.01745329251994329547,AUTHORITY[“EPSG”,“9102”]],AUTHORITY[“EPSG”,“7855”]],PROJECTION[“Transverse_Mercator”,AUTHORITY[“EPSG”,“9807”]],PARAMETER[“latitude_of_origin”,0.0000000000000000],PARAMETER[“central_meridian”,147.0000000000000000],PARAMETER[“scale_factor”,0.9996000000000000],PARAMETER[“false_easting”,500000.000],PARAMETER[“false_northing”,10000000.000],UNIT[“Meter”,1.00000000000000000000,AUTHORITY[“EPSG”,“9001”]],AXIS[“Easting”,EAST],AXIS[“Northing”,NORTH],AUTHORITY[“EPSG”,“7855”]],VERT_CS[“Orthometric Heights”,VERT_DATUM[“AUSGeoid2020_20180201_win”,2005,AUTHORITY[“EPSG”,“0”]],UNIT[“Meter”,1.00000000000000000000,AUTHORITY[“EPSG”,“9001”]],AXIS[“Height”,UP]]]
the header is followed by 2 user-defined bytes
reporting minimum and maximum for all LAS point record entries …

Las File B: This one is NOT working as expected:

lasinfo (221128) report for ‘353000_6842000.las’
reporting all LAS header entries:
file signature: ‘LASF’
file source ID: 0
global_encoding: 1
project ID GUID data 1-4: 00000000-0000-0000-0000-000000000000
version major.minor: 1.4
system identifier: ‘’
generating software: ‘TerraScan’
file creation day/year: 261/2021
header size: 375
offset to point data: 1661
number var. length records: 4
point data format: 6
point data record length: 30
number of point records: 0
number of points by return: 0 0 0 0 0
scale factor x y z: 0.001 0.001 0.001
offset x y z: 500000 7000000 -0
min x y z: 353000.000 6842000.000 149.843
max x y z: 353499.999 6842499.999 200.063
start of waveform data packet record: 0
start of first extended variable length record: 0
number of extended_variable length records: 0
extended number of point records: 14076848
extended number of points by return: 13019750 920265 128436 8239 158 0 0 0 0 0 0 0 0 0 0
variable length header record 1 of 4:
reserved 0
user ID ‘LASF_Projection’
record ID 34735
length after header 8
description ‘GeoKeyDirectoryTag (mandatory)’
GeoKeyDirectoryTag version 1.1.0 number of keys 0
variable length header record 2 of 4:
reserved 0
user ID ‘LASF_Projection’
record ID 2112
length after header 996
description ‘OGC COORDINATE SYSTEM WKT’
WKT OGC COORDINATE SYSTEM:
COMPD_CS[“GDA2020 / MGA zone 55 / AUSGeoid20”,PROJCS[“GDA2020 / MGA zone 55 / AUSGeoid20”,GEOGCS[“GDA2020 / MGA zone 55 / AUSGeoid20”,DATUM[“GDA2020”,SPHEROID[“GRS 1980”,6378137.000,298.257222101,AUTHORITY[“EPSG”,“7019”]],AUTHORITY[“EPSG”,“1168”]],PRIMEM[“Greenwich”,0.0000000000000000,AUTHORITY[“EPSG”,“8901”]],UNIT[“Degree”,0.01745329251994329547,AUTHORITY[“EPSG”,“9102”]],AUTHORITY[“EPSG”,“7855”]],PROJECTION[“Transverse_Mercator”,AUTHORITY[“EPSG”,“9807”]],PARAMETER[“latitude_of_origin”,0.0000000000000000],PARAMETER[“central_meridian”,147.0000000000000000],PARAMETER[“scale_factor”,0.9996000000000000],PARAMETER[“false_easting”,500000.000],PARAMETER[“false_northing”,10000000.000],UNIT[“Meter”,1.00000000000000000000,AUTHORITY[“EPSG”,“9001”]],AXIS[“Easting”,EAST],AXIS[“Northing”,NORTH],AUTHORITY[“EPSG”,“7855”]],VERT_CS[“Orthometric Heights”,VERT_DATUM[“AUSGeoid2020_20180201_win”,2005,AUTHORITY[“EPSG”,“0”]],UNIT[“Meter”,1.00000000000000000000,AUTHORITY[“EPSG”,“9001”]],AXIS[“Height”,UP]]]
variable length header record 3 of 4:
reserved 0
user ID ‘BayesMap’
record ID 3001
length after header 32
description ‘PREVIOUS SYSTEM IDENTIFIER’
variable length header record 4 of 4:
reserved 0
user ID ‘BayesMap’
record ID 3002
length after header 32
description ‘PREVIOUS GENERATING SOFTWARE’
the header is followed by 2 user-defined bytes
reporting minimum and maximum for all LAS point record entries …

I believe they BOTH have the 2112 headers

According to this post

----QUOTE----
Our point cloud tiler first checks for a WKT VLR (record ID = 2112). If a WKT VLR doesn’t exist, the tiler manually checks for GeoTIFF keys (record IDs = 34735, 34736, 34737) to reconstruct the WKT.

  • 2112 = OGC Coordinate System WKT
  • 34735 = GeoKeyDirectoryTag
  • 34736 = GeoDoubleParamsTag
  • 34737 = GeoAsciiParamsTag

See this documentation for more on these VLRs: http://www.asprs.org/a/society/committees/standards/LAS_1_4_r12.pdf

Here is some more information on WKT vs. GeoTIFF keys for point clouds: LAS Reading and Writing with PDAL — pdal.io

Was this the information you needed? Please let us know.
----QUOTE----

So ION should be looking at the 2112 header first right ?

The ION asset ids is this:

The working File A 370500_6908500:
ION ID = 1630185

The NOT working File B 353000_6842000:
ION ID = 1630144

@peterdelahunty Sorry for the delay here. I have asked our las experts to take a look at this and see if anything obvious jumps out and to confirm if this is a bug on our end or something odd about the headers.

We rely on the WKT bit of the global bit field encoding in the LAS header to decide whether to read the WKT in record 2112. If that bit is not set, we fall back to reading geotiff keys. In both of these LAS files, the WKT bit is 0. That is why the file with the geotiff keys shows up in the right place and the one without doesn’t.

See page 4 “COORDINATE REFERENCE SYSTEM (CRS) REPRESENTATION” and page 6 “Global Encoding” of the specification: https://www.asprs.org/a/society/committees/standards/LAS_1_4_r12.pdf.

For the file without geotiff keys, I suggest setting the WKT bit of the global encoding to 1.