Pointcloud processing engine
About the library ● 1.0.1 release now available (September 2015) (OSGeo4W/64) ● BSD Licensed (Supports proprietary plugins) ● C++ development git repo (https://github.com/PDAL/PDAL) ○ pull requests welcome ○ ● pdal main command many subcommands (kernels) ○ ● Pipelines (a chain of processing steps) XML processing language ○ VRT like ○ Nesting dolls ○
History / Goals ● libLAS development outgrew ASPRS LAS (Oracle) ● Focused on data management ● Extensibility and integration ● Not just LAS-focused ● Leverage existing tools (GDAL, proj.4, libgeotiff, Python, PCL)
readers / writers ● readers.buffer ● writers.derivative ● readers.faux ● writers.geowave ● readers.geowave ● writers.las ● readers.greyhound ● writers.matlab ● readers.las ● writers.nitf ● readers.mrsid ● writers.oci ● readers.nitf ● writers.ply ● readers.oci ● writers.p2g ● readers.optech ● writers.pcd ● readers.pcd ● writers.pgpointcloud ● readers.pgpointcloud ● writers.pclvisualizer ● readers.ply ● writers.rialto ● readers.qfit ● writers.sqlite ● readers.rxp ● writers.text ● readers.sbet ● readers.sqlite
filters ● filters.attribute ● filters.pclblock ● filters.colorization ● filters.predicate ● filters.chipper ● filters.programmable ● filters.crop ● filters.range ● filters.decimation ● filters.reprojection ● filters.ferry ● filters.sort ● filters.hexbin ● filters.stats ● filters.mortonorder ● filters.transformation ● filters.merge
subcommands ● ground ● info ● split ● tindex ● translate ● pipeline
Ground ● Classifies a pointcloud ○ ground and non-ground points ○ optionally removes non-ground points ● Uses the PCL (PMF) Progressive Morphological Filter ○ same as a pipeline with PCLBlock ○ also an approximate version (much faster)
Ground - Before
Ground - After
Info pdal info --summary source.laz { "pdal_version": "PDAL 1.0.0.b1 (399539)", "summary": {"bounds": {"X": { "max": 581026.95000719489, "min": 580304.60002865398 }, "Y": { "max": 4505023.6300240532, "min": 4504450.3600357873 }, "Z": { "max": 92.11999999999999, "min": -0.78000000000000025 } }, "dimensions": "X, Y, Z, Intensity, ReturnNumber, NumberOfReturns, ScanDirectionFlag, EdgeOfFlightLine, Classification, ScanAngleRank, UserData, PointSourceId", "num_points": 255772, "spatial_reference": "PROJCS["NAD83 / UTM zone 18N" ….]" } }
Top down view
Info --Boundary Default output $ pdal info --boundary source.laz
Info --boundary Add options to command line $ pdal info --boundary source.laz --filters.hexbin.threshold=10 --filters.hexbin.sample_size=10 --filters.hexbin.edge_size=2
Info --P (Point) $ pdal info Liberty-Island.ALS70.NYC_2013085-15.laz -p 2633 "Classification": 2, "EdgeOfFlightLine": 0, "GpsTime": 0, "Intensity": 23, "NumberOfReturns": 1, "PointId": 2633, "PointSourceId": 20, "ReturnNumber": 1, "ScanAngleRank": -10, "ScanDirectionFlag": 1, "UserData": 0, "X": 580814.96002865396, "Y": 4504512.6400357876, "Z": 0.02000000000000024
Split (Capacity) pdal split -i Liberty-Island.ALS70.NYC_2013085-15.laz -o Liberty-Island-Tile.las --capacity 50000
Split (Length) pdal split -i Liberty-Island.ALS70.NYC_2013085-15.laz -o Liberty-Island2-Tile. laz --length 100
tindex ● Creates a tile index of pointclouds in any gdal vector format ● Can then be used for merge/clip operations pdal tindex --merge --tindex filename.ogr --polygon "wkt" --filespec output.laz
tindex - example pdal tindex --merge --tindex LibertyTindex2.db --filespec clipped_merged_LibertyTinde x.laz --polygon "POLYGON ((-74.0459708 40.690573, -74.045082 40.689164, -74.046622 40.688406, -74.047320 40.690348, -74.0459708 40.690573))"
Translate ● Basic pointcloud format changes ○ -i myfile.las -o myfile.laz ● also advanced options to the reader/writer/projection steps ○ --writers.las.system_id="Custom" --writers. las.scale_z=0.00001 System ID: 'Custom' Generating Software: 'PDAL 1.0.0.b1 (399539)' Min X Y Z: 580497.62 4504606.39 -0.78000 Max X Y Z: 580686.27 4504845.65 46.72000
Pipeline ● Access to the full power of pdal ● allows stacking of range of operations with one pass through data ● great for programmatically building workflows ● command line specification of values for batch processing
Pipeline - cli values $ pdal pipeline range.xml --readers.las. <Pipeline version="1.0"> filename=myfile.las --writers.las. <Writer type="writers.las"> filename=myrangefile.laz <Filter type="filters.range"> <Option name="dimension">Z $ find . -name="*.laz" | xargs pdal <Options> pipeline --readers.las.filename={} -- <Option name="min">0</Option> writers.las.filename=newdir/{} <Option name="max">99999</Option> </Options> </Option> <Reader type="readers.las"></Reader> </Filter> </Writer>
colorization filter ● Can use any gdal image source ● Must match projections though <Pipeline version="1.0"> <Writer type="writers.las"> <Filter type="filters.colorization"> <Option name="raster"> <![CDATA[http://isse.cr.usgs. gov/arcgis/rest/services/Orthoimagery/USGS_EROS_Ortho_1Foot/ImageServer/ exportImage?bbox=580304.600,4504450.360,581026.950,4505023.630 &bboxSR=26918&size=1000, 1000&imageSR=26918&format=tiff&pixelType=U8&noDataInterpretation=esriNoD ataMatchAny&interpolation=+RSP_BilinearInterpolation&f=image]]> </Option> <Reader type="readers.las"> </Reader> </Filter> </Writer> </Pipeline>
COLORization - cli New Syntax: $ pdal translate -i infile.laz -o outfile_color.laz --filter filters.colorization --filters.colorization. raster=myraster.tif
reprojection filter Assigning and reprojecing data: $ pdal pipeline proj.xml <Pipeline version="1.0"> <Writer type="writers.las"> --readers.las.filename=src.laz <Filter type="filters.reprojection"> --writers.las.filename=dest.laz <Option name="in_srs">EPSG:26918</Option> <Option name="out_srs">EPSG:26919</Option> <Reader type="readers.las"/> </Filter> </Writer> </Pipeline> Assign and project with translate also: ls *.las | xargs -P10 pdal translate --filters filters.reprojection --filters.reprojection.in_srs=epsg:26910 --filters.reprojection.out_srs=epsg:26911 -i {} -o newdir/{}
p2g writer (DEMs) <Pipeline version="1.0"> <Writer type="writers.p2g"> <Option name="grid_dist_y">1.0</Option> <Option name="grid_dist_x">1.0</Option> <Option name="output_format">tif</Option> <Option name="output_type">idw</Option> <Option name="filename">destination</Option> <Filter type="filters.range"> <Option name="dimension">Classification <Options> <Option name="equals">2</Option> </Options> </Option> <Reader type="readers.las"> <Option name="filename">source.laz </Option> </Reader> </Filter> </Writer> </Pipeline>
p2g writer (DEMs) pdal translate -i source.laz -o destination.tif --writer=writers.p2g --writers.p2g.grid_dist_y=0.5 -- writers.p2g.grid_dist_x=0.5 --writers.p2g. output_format=tif --writers.p2g.output_type=idw You can turn the above into a pipeline with --pipeline dem_pipeline.xml
the kennel plas.io Greyhound Entwine
plas.io The LASzip compression algorithm refactored for compilation via Emscripten to JavaScript allowing LAS/LAZ viewing with a WebGL enabled browser (FF, Chrome, IE11, Safari)
GreyHound ● RESTful HTTP environment for serving and streaming point cloud data ● LAZ-style compression ● Dynamic schema ● Metadata
's new parallel indexing engine iowalidar.com: 163 Billion points in a browser (quadtree) speck.ly: NYC, USA 4.7 Billion points (octree)
Questions?
Recommend
More recommend