We occasionally get permission to distribute a nice data sets and blog about how to best process it with LAStools because this gets around having to pay our „outrageous“ consulting fees. (-: This time we received a nice photogrammetric point cloud of the Tafawa Balewa Square in Lagos Island, Lagos, Nigeria. This area is part of the central business district of Lagos and characterized by high-rise buildings. The Tafawa Balewa Square was constructed in 1972 over the site of a defunct track for horse racing and is bounded by Awolowo road, Cable street, Force road, Catholic Mission street and the 26-story Independence House. We want to create a nice Digital Terrain Model from the dense-matching point cloud that was generated with Photoscan by AgiSoft and – as always with photogrammetry – we have to take special care of low noise points. The final result is shown below. All processing commands used are here.
After downloading the data it is useful to familiarize yourself with the file, which can be done with lasview, lasinfo, and lasgrid using the command lines shown below. According to the lasinfo report there are around 47 million points points with RGB colors in the file and their average density is around 100 points per square meter.
lasview -i 0_raw\TafawaBalewa.laz lasinfo -i 0_raw\TafawaBalewa.laz ^ -cd -histo intensity 256 ^ -histo z 1 ^ -odir 1_quality -odix _info -otxt lasgrid -i 0_raw\TafawaBalewa.laz ^ -step 1 ^ -density ^ -false -set_min_max 50 150 ^ -odir 1_quality -odix _d_50_150 -opng
The average point density value of 100 from the lasinfo report suggests that 50 as the minimum and 150 as the maximum are good false color ramp values for a map showing how the point density per square meter is distributed.
We use lastile to create a buffered tiling for the 47 million points. We use a tile size of 200 meters and request a large buffer of 50 meters around every tile because there are large buildings in the survey areas. We also flag buffer points as withheld so they can be easily be dropped later.
lastile -i 0_raw\TafawaBalewa.laz ^ -tile_size 200 -buffer 50 -flag_as_withheld ^ -odir 2_tiles_raw -o tafawa.laz
If you inspect the resulting tiles – such as ‚tafawa_544000_712600.laz‘ as shown here – with lasview you will see the kind of low noise that is shown below and that may cause a ground classification algorithm. While our lasground software is able to deal with a certain amount of low noise – if there are too many it will likely latch onto them. Therefore we will first generate a subset of points that has as few as possible of such low noise points.
Next we use a sequence of three LAStools modules, namely lasthin, lasground, and lasheight to classify this photogrammtric point cloud into ground and non-ground points. All processing commands used are here. First we use lasthin to give the point the classification code 8 that is closest to the 50th percentile in elevation within every 50 centimeter by 50 centimeter cell (but only if the cells containing at least 20 points).
lasthin -i 2_tiles_raw\tafawa*.laz ^ -step 0.5 ^ -percentile 50 20 ^ -classify_as 8 ^ -odir 3_tiles_median_50cm -olaz ^ -cores 3
Next we use lasground to ground-classify only the points that have classification code 8 (i.e. by ignoring those with classification codes 0) and set their classification code to ground (2) or non-ground (1). Because of the large buildings in this urban scene we use ‚-metro‘ which uses a large step size of 50 meters for the pre-processing. This also sets the internally used bulge parameter to 5.0 which you can see if you run the tool in verbose ‚-v‘ mode. In three different trial runs we determined that forcing the bulge parameter to be 0.5 instead gave better results. The bulge and the spike parameters can be useful to vary in order to improve ground classification results (also see the README file).
lasground -i 3_tiles_median_50cm\tafawa*.laz ^ -ignore_class 0 ^ -metro -bulge 0.5 ^ -odir 4_tiles_ground_50cm -olaz ^ -cores 3
The resulting ground points are a subset with a resolution of 50 centimeter that is good enough to create a DTM with meter resolution, which we do with las2dem command line shown below. We really like storing DTM elevation rasters to the LAZ point format because it is a more compressed way of storing elevation rasters compared to ASC, BIL, TIF, or IMG. It also makes the raster output a natural input to subsequent LAStools processing steps.
las2dem -i 4_tiles_ground_50cm\tafawa*.laz ^ -keep_class 2 ^ -step 1 -kill 100 ^ -use_tile_bb ^ -odir 5_tiles_dtm_1m -olaz ^ -cores 3
Finally we use blast2dem to create a seamless hill-shaded version of our 1 meter DTM from on-the-fly merged elevation rasters. This is the DTM pictured at the beginning of this article.
blast2dem -i 5_tiles_dtm_1m\tafawa*.laz -merged ^ -step 1 ^ -hillshade ^ -o dtm_1m.png
The corresponding DSM pictured at the beginning of this article was generated with the two command lines below by first keeping only the 95th percentile highest elevation of every 50 cm by 50 cm cell with lasthin (which remove spurious high noise points) and then by triangulating the surviving points with blast2dem into a seamless TIN that is also hill-shaded and rasterized with 1 meter resolution. Running the 64 bit version of lasthin (note the ‚-cpu64‚ switch) allows us to work on the entire data set (rather than its tiles version) at once, where the standard 32 bit version may run out of memory.
lasthin -i 0_raw\TafawaBalewa.laz ^
-cpu64 ^
-step 0.5 ^
-percentile 95 20 ^
-o 0_raw\TafawaBalewa_p95_50.laz
blast2dem -i 0_raw\TafawaBalewa_p95_50.laz ^
-step 1 ^
-hillshade ^
-o dsm_1m.png
In order to generate the final DTM at higher resolution we use lasheight to pull all points into the ground class that lie within a 5 cm distance vertically below or a 15 cm distance vertically above the triangulated surface of ground points computed in the previous step. You could experiment with other values here to be less or more conservative about pulling detail into the ground class.
lasheight -i 4_tiles_ground_50cm\tafawa*.laz ^ -classify_between -0.05 0.15 2 ^ -odir 6_tiles_ground -olaz ^ -cores 3
We repeat the same processing step as before las2dem to create the raster DTM tiles, but this time with a resolution of 25 cm.
las2dem -i 6_tiles_ground\tafawa*.laz ^ -keep_class 2 ^ -step 0.25 -kill 100 ^ -use_tile_bb ^ -odir 7_tiles_dtm_25cm -olaz ^ -cores 3
And we again use blast2dem to create a seamless hill-shaded version of the DTM from on-the-fly merged elevation rasters, but this time with a resolution of 25 cm. This is the DTM shown below. All processing commands used are here.
blast2dem -i 7_tiles_dtm_25cm\tafawa*.laz -merged ^ -step 0.25 ^ -hillshade ^ -o dtm_25cm.png
Final DTM is not „clean“, you know. You leave a many stumps after deleting buildings and cars, most of them reach more than half meter in height above terrain. It happen because most DTM-filtres and classificators works with the one algorithm – turn dense cloud upside down and cut all near icicles, but leaves „shoulders“ http://www.cloudcompare.org/doc/wiki/index.php?title=File:CSF_principle.jpg
I’m find solution about it, but I’m not a programmist. After „lasheight“ procedure we need to expand filtered „building“ dense points with one or more meter. I don’t know how realize it. Maybe you can help with this?