Per-point features from .las to 3D tiles

Hi Cesium Team

I was reading some discussions (e.g. in order to get more understanding regarding the process of getting per-point features (both default ones such as classification, intensity, etc. and custom properties defined in the Extra Bytes VLRs) from a point cloud file in .las format (see specification) into the corresponding 3D tile.

In my understanding so far these attributes (that I would like to use for styling) should be stored in the batch table.
Currently I am getting the 3D tiles by simply uploading the .las file on Cesium Ion. When I request the asset in my application I can see that only the classification property is stored in the batch table. I would like to understand why are the other properties (intensity etc.) not accessible as well and how can I add more properties to the batch table (should they be defined in a special way in .las or is there something I can do at uploading time)?

Many thanks!!

Hi - Can you confirm whether the LAS file(s) you are uploading to Cesium ion include the properties? The Tiling pipelines on Cesium ion use the standard LAS classes (see page 11 of The software you are using to produce the LAS files needs to embed those properties along with the data.


Yes, I can confirm that all the necessary properties are stored in the LAS file. I managed to obtain the intensity in the batch table (I got confused because the intensity values were zero and therefore got ignored, setting them to a value different than zero solved the issue).

Unfortunately, I still cannot get the properties stored as extra bytes (currently one float - 4 extra bytes - after each point data record) in the batch table. And I am sure these values are stored within the point records and described in one VLR. Do you have any other input on this regard?


Are you able to share the output from LASinfo for your file?


Here is the output of LASinfo of my file.

lasinfo (220107) report for '../test_las_with_VLR_40.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:          'EXTRACTION'
  generating software:        'Manual'
  file creation day/year:     52/2022
  header size:                375
  offset to point data:       621
  number var. length records: 1
  point data format:          2
  point data record length:   30
  number of point records:    500
  number of points by return: 0 0 0 0 0
  scale factor x y z:         0.01 0.01 0.01
  offset x y z:               4328388.159274342469871 754958.345977500546724 4611259.014021673239768
  min x y z:                  4328388.16 754958.35 4611259.01
  max x y z:                  4328550.18 755060.11 4611371.87
WARNING: stored resolution of max_x not compatible with x_offset and x_scale_factor: 4328550.180518767796457
WARNING: stored resolution of max_y not compatible with y_offset and y_scale_factor: 755060.105570004205219
WARNING: stored resolution of max_z not compatible with z_offset and z_scale_factor: 4611371.870564143173397
  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: 500
  extended number of points by return: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
variable length header record 1 of 1:
  reserved             0
  user ID              'LASF_Spec'
  record ID            4
  length after header  192
  description          'Additional per-point attributes'
    Extra Byte Descriptions
      data type: 9 (float), name "temperature", description: "The temperature at each cell", scale: 1 (not set), offset: 0 (not set)
reporting minimum and maximum for all LAS point record entries ...
  X          -432838815      16202
  Y           -75495834      10175
  Z          -461125901      11285
  intensity         100        100
  return_number       1          1
  number_of_returns   0          0
  edge_of_flight_line 0          0
  scan_direction_flag 0          0
  classification      9          9
  scan_angle_rank     0          0
  user_data           0          0
  point_source_ID     1          1
  Color R 0 255
        G 0 255
        B 0 255
  attribute0      -9999          0  ('temperature')
WARNING: 1 points outside of header bounding box
number of first returns:        500
number of intermediate returns: 0
number of last returns:         500
number of single returns:       500
WARNING: for return 1 real number of points by return is 500 but header entry was not set.
WARNING: real extended number of points by return [1] is 500 but header entry was not set.
WARNING: there are 500 points with a number of returns of given pulse of 0
histogram of classification of points:
             500  water (9)
WARNING: real min x smaller than header min x by 4328388.150000
WARNING: real min y smaller than header min y by 754958.340000
WARNING: real min z smaller than header min z by 4611259.010000

Hi - The tiling pipelines currently only support intensity and standard classifications from LAS. Support for Custom Properties is on the roadmap, but we don’t have an ETA for it to ship at this time.

So when running the LAS file through Cesium ion, it will preserve classification and intensity. Let me know if you are having trouble with these.

Hi, I’m wodering if attributes from LAS file are somehow transferred to 3dtileset or after conversion there is several 3dtileste files, one for every attribute (intensity, classification, etc)?


The Cesium ion Point Cloud Tiling Pipeline preserves the color (RGB), intensity, and standard classifications from the LAS files.

See Cesium Sandcastle as an example tileset.