So far, LAStools could already read PTX files. These contain a small header including a rotation/transformation matrix. LAStools read the matrix and stored it in a VLR of the LAS/LAZ result – but without using the header. Now, LAStools supports PTX import and is able to convert the data through the PTX header matrix.

We will show this with a demo file “sample.ptx”:

3
3
0.000000 0.000000 0.000000
1.000000 0.000000 0.000000
0.000000 1.000000 0.000000
0.000000 0.000000 1.000000
-0.955179 0.296021 -0.002106 0.000000
-0.296023 -0.955180 0.001152 0.000000
-0.001670 0.001724 0.999997 0.000000
3.847211 12.235314 -0.425777 1.000000
1.111111 2.111111 3.111 0.111
1.222222 2.222222 3.222 0.212
0 0 0 0
0 0 0 0 
1.333333 2.333333 3.333 0.312
1.444444 2.444444 3.444 0.423
0 0 0 0
1.555555 2.555555 3.555 0.534
1.666666 2.666666 3.666 0.678

Reference: CloudCompare and Leica Cyclone.

Import the ptx and export to LAS: sample_cc.las

Convert to text:

las2txt -i sample_cc.las -o sample_cc.txt -parse xyzi -v

lasinfo -i sample_cc.las

2.156 10.553 2.685 0
2.017 10.480 2.796 0
1.877 10.407 2.907 0
1.738 10.334 3.018 0
1.599 10.261 3.129 1
1.460 10.188 3.240 1

The intensity column was converted to integer – but this is not the subject now.

To show what was already possible in previous versions: Put the header into a VLR:

txt2las -i sample.ptx -iptx -parse xyzi -drop_intensity_below 1 -o sample_vlr.laz -v

To test the result, convert this to text:

las2txt -i sample_vlr.laz -o sample_vlr.txt -parse xyzi -v

For testing purposes, this can also be converted in one go:

txt2las -i sample.ptx -iptx -parse xyzi -otxt -o sample_txt.txt -oparse xyzi -drop_intensity_below 1 -v

The result contains only the header matrix as VLR and the raw input values. Use the matrix with the latest version of LAStools (220310) and replace -iptx with -iptx_transform:

txt2las -i sample.ptx -iptx_transform -parse xyzi -drop_intensity_below 1 -o sample_tm.laz -v

Drop the “empty” lines and convert to txt:

las2txt -i sample_tm.laz -o sample_tm.txt -parse xyzi -v

Result:

2.1557700 10.5530968 2.68 455
2.0165640 10.4800466 2.79 868
1.8773580 10.4069965 2.90 1278
1.7381520 10.3339463 3.01 1732
1.5989293 10.2609134 3.13 2187
1.4597233 10.1878632 3.24 2776

Input intensity column in range [0..1] was converted to a range [0..4096].

So txt2las got the extension to work not only with Helmert and Affine Matrix but also with general 3×3/4×4 matrix. If users want to use this immediately, the new option is ‘-transform_matrix’.
Specify the matrix values ​​as parameters:

[r11 r21 r31 0]
[r12 r22 r32 0]
[r13 r23 r33 0]
[tr1 tr2 tr3 1]
txt2las -iptx -i sample.ptx -transform_matrix ^
 -0.955179,-0.296023,-0.001670  
 0.296021,-0.955180,0.001724 ^
 -0.002106,0.001152,0.999997 ^
 3.847211,12.235314,-0.425777 ^ 
  -parse xyzi -drop_intensity_below 1 -set_scale 0.001 0.001 0.001 ^ 
  -otxt -oparse xyzi -o sample_rm.txt -v

This transformation can be applied to all other files.
Example:

las2las -i france.laz ^
 -transform_matrix ^
 -0.955179,-0.296023,-0.001670  
 0.296021,-0.955180,0.001724 ^
 -0.002106,0.001152,0.999997 ^
 3.847211,12.235314,-0.425777 ^ 
 -o france_mod.laz -v

Limitations:

So far, we just support *1* dataset in a ptx file. If you need this also for multiple datasets please contact us.

About PTX files:

Leica LiDAR scanners use this ASCII format to save their data. For details see: http://www.paulbourke.net/dataformats/ptx/