Reading with PDAL#
This tutorial is an introduction to using PDAL to read data using pdal from the command line.
A basic inquiry example#
Our first example to demonstrate PDAL’s utility will be to simply query an LAS file to determine the data that are in it in the very first point.
Note
The interesting.las file in these examples can be found on github.
pdal info
outputs JavaScript JSON.
$ pdal info interesting.las -p 0
{
"filename": "interesting.las",
"pdal_version": "1.0.1 (git-version: 80644d)",
"points":
{
"point":
{
"Blue": 88,
"Classification": 1,
"EdgeOfFlightLine": 0,
"GpsTime": 245381,
"Green": 77,
"Intensity": 143,
"NumberOfReturns": 1,
"PointId": 0,
"PointSourceId": 7326,
"Red": 68,
"ReturnNumber": 1,
"ScanAngleRank": -9,
"ScanDirectionFlag": 1,
"UserData": 132,
"X": 637012,
"Y": 849028,
"Z": 431.66
}
}
}
A conversion example#
Conversion of data from one format to another may be lossy, in that some data in the source format may not be representable in the same format or at all in the destination format. For example, some formats don’t support spatial references for point data, some have no metadata support and others have limited dimension support. Even when data types are supported in both source and destination formats, there may be limitations with regard to data type, precision or, scaling. PDAL attempts to convert data as accurately as possible, but you should make sure that you’re aware of the capabilities of the data formats you’re using.
$ pdal translate interesting.las output.txt
"X","Y","Z","Intensity","ReturnNumber","NumberOfReturns","ScanDirectionFlag","EdgeOfFlightLine","Classification","ScanAngleRank","UserData","PointSourceId","Time","Red","Green","Blue"
637012.24,849028.31,431.66,143,1,1,1,0,1,-9,132,7326,245381,68,77,88
636896.33,849087.70,446.39,18,1,2,1,0,1,-11,128,7326,245381,54,66,68
636784.74,849106.66,426.71,118,1,1,0,0,1,-10,122,7326,245382,112,97,114
636699.38,848991.01,425.39,100,1,1,0,0,1,-6,124,7326,245383,178,138,162
636601.87,849018.60,425.10,124,1,1,1,0,1,-4,126,7326,245383,134,104,134
636451.97,849250.59,435.17,48,1,1,0,0,1,-9,122,7326,245384,99,85,95
...
The text format supports all point attributes, but provides no support for metadata such as the input spatial reference system or the LAS header fields, such as UUID. You may need to preserve some more information as part of your conversion to make it useful down the road.
Metadata#
PDAL carries metadata for each stage through the PDAL processing pipeline. The metadata can be written in JSON form using the pdal info command
$ pdal info --metadata interesting.las
This produces metadata that looks like
this. You can use
your JSON manipulation tools to extract this information.
For formats that do not have the ability to
preserve this metadata internally, you can keep a .json
file
alongside the .txt
file as auxiliary information.
A Pipeline Example#
The full power of PDAL comes in the form of pipeline invocations. Pipelines allow you to take advantage of PDAL’s ability to manipulate data as they are converted. This section will provide a basic example and demonstration of pipeline usage. See the pipeline specification, for more detailed exposition of the topic.
The pipeline describes a series of processing stages to be performed in JSON format. Each stage can be provided a set of options that control the details of processing. PDAL is single-threaded and stages are executed in a linear order. Some stages support what is known as “stream mode”. If all stages in a pipeline support stream mode the command is run using using stream mode to reduce the memory processing footprint. Even when run in stream mode, execution is single-threaded and can be thought of as linear.
Simple conversion#
The following JSON document defines a pipeline that takes the file.las
LAS file and converts it to a new file called output.las
.
[
"file.las",
"output.las"
]
Loop a directory and filter it through a pipeline#
This bash script loops through a directory and pushes the las files through a pipeline, substituting the input and output as it goes.
ls *.las | cut -d. -f1 | xargs -P20 -I{} pdal pipeline -i /path/to/proj.json --readers.las.filename={}.las --writers.las.filename=output/{}.laz
Here is an example doing something similar with Windows PowerShell
$indir="Documents\inlas"
$outdir="Documents\outlas"
get-childitem $indir |
foreach-object {
if ($_.extension -ne ".las") {
continue
}
$outname = $outdir + "\" + $_.name
pdal pipeline -i \path\to\proj.json $_.fullname $outname
}