Commit 759c4eee authored by Fernando Silva Coira's avatar Fernando Silva Coira
Browse files

Initial commit

parents

Too many changes to show.

To preserve performance only 1000 of 1000+ files are displayed.
.idea/
cmake-build-debug/
cmake_minimum_required(VERSION 2.8.7)
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
include(AppendCompilerFlags)
project(k3-tree_sdsl)
set(PROJECT_VENDOR "Fernando Silva Coira")
set(CMAKE_PROJECT_NAME "k3-tree_sdsl")
set(PROJECT_CONTACT "fernando.silva@udc.es")
set(CMAKE_INSTALL_PREFIX /home/fernando/software)
set(CMAKE_BUILD_TYPE "Release")
# Set output folder
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# C++11 compiler Check
if(NOT CMAKE_CXX_COMPILER_VERSION) # work around for cmake versions smaller than 2.8.10
execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE CMAKE_CXX_COMPILER_VERSION)
endif()
if(CMAKE_CXX_COMPILER MATCHES ".*clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(CMAKE_COMPILER_IS_CLANGXX 1)
endif()
if( (CMAKE_COMPILER_IS_GNUCXX AND ${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 4.7) OR
(CMAKE_COMPILER_IS_CLANGXX AND ${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 3.2))
message(FATAL_ERROR "Your C++ compiler does not support C++11. Please install g++ 4.7 (or greater) or clang 3.2 (or greater)")
else()
message(STATUS "Compiler is recent enough to support C++11.")
endif()
if( CMAKE_COMPILER_IS_GNUCXX )
append_cxx_compiler_flags("-std=c++11 -Wall -Wextra " "GCC" CMAKE_CXX_FLAGS)
append_cxx_compiler_flags("-msse4.2 -O3 -ffast-math -funroll-loops -fno-omit-frame-pointer -g" "GCC" CMAKE_CXX_FLAGS_RELEASE)
else()
append_cxx_compiler_flags("-std=c++11" "CLANG" CMAKE_CXX_FLAGS)
append_cxx_compiler_flags("-stdlib=libc++" "CLANG" CMAKE_CXX_FLAGS)
append_cxx_compiler_flags("-msse4.2 -O3 -ffast-math -funroll-loops -DNDEBUG" "CLANG" CMAKE_CXX_FLAGS_RELEASE)
endif()
include(CheckSSE)
FindSSE ()
if( SSE4_2_FOUND )
if( CMAKE_COMPILER_IS_GNUCXX )
append_cxx_compiler_flags("-msse4.2" "GCC" CMAKE_CXX_FLAGS)
else()
append_cxx_compiler_flags("-msse4.2" "CLANG" CMAKE_CXX_FLAGS)
endif()
message(STATUS "CPU does support SSE4.2.")
else()
message(STATUS "CPU does NOT support SSE4.2")
endif()
add_subdirectory(external/sdsl-lite)
add_subdirectory(external/LASlib)
include_directories("${PROJECT_SOURCE_DIR}/external/googletest/include"
${CMAKE_HOME_DIRECTORY}/include
${CMAKE_BINARY_DIR}/external/sdsl-lite/include
${CMAKE_BINARY_DIR}/external/sdsl-lite/external/libdivsufsort/include/
${CMAKE_HOME_DIRECTORY}/external/googletest/include
${CMAKE_HOME_DIRECTORY}/external/sdsl-lite/external/FastPFor/headers/
${PROJECT_SOURCE_DIR}/external/
${PROJECT_SOURCE_DIR}/external/LASlib/
${STXXL_INCLUDE_DIRS}
${gtest_SOURCE_DIR}/include
)
# Set source files
set(SOURCES
include/others/conceptual_node.hpp
include/k3_tree.hpp
include/k3_tree_points.hpp
include/LIDAR/k3_tree_LIDAR_points.hpp
include/k3_tree_base.hpp
include/util/dac_vector.hpp
)
############
# ENCODE #
############
# Encode
add_executable(k3_tree_encode src/k3_tree_encode.cpp ${SOURCES} )
target_link_libraries(k3_tree_encode sdsl divsufsort divsufsort64)
# Encode LIDAR
add_executable(k3_tree_LIDAR_encode src/LIDAR/k3_tree_LIDAR_encode.cpp ${SOURCES} )
target_link_libraries(k3_tree_LIDAR_encode sdsl divsufsort divsufsort64 las)
############
# QUERIES #
############
# Query GET
add_executable(k3_tree_get src/k3_tree_get.cpp ${SOURCES} )
target_link_libraries(k3_tree_get sdsl divsufsort divsufsort64 las)
# Query GET REGION
add_executable(k3_tree_get_region src/k3_tree_get_region.cpp ${SOURCES} )
target_link_libraries(k3_tree_get_region sdsl divsufsort divsufsort64 las)
# Query GET LIDAR Attr
add_executable(k3_tree_LIDAR_get src/LIDAR/k3_tree_LIDAR_get.cpp ${SOURCES} )
target_link_libraries(k3_tree_LIDAR_get sdsl divsufsort divsufsort64 las)
# Query GET REGION LIDAR Attr
add_executable(k3_tree_LIDAR_get_region src/LIDAR/k3_tree_LIDAR_get_region.cpp ${SOURCES} )
target_link_libraries(k3_tree_LIDAR_get_region sdsl divsufsort divsufsort64 las)
# Query GET REGION + intensity LIDAR Attr
add_executable(k3_tree_LIDAR_get_region_int src/LIDAR/k3_tree_LIDAR_get_region_int.cpp ${SOURCES} )
target_link_libraries(k3_tree_LIDAR_get_region_int sdsl divsufsort divsufsort64 las)
############
# UTIL #
############
# Create random data
add_executable(create_random_data src/util/create_random_file.cpp include/util/file.hpp)
target_link_libraries(create_random_data sdsl divsufsort divsufsort64)
# Create get queries
add_executable(create_get_queries src/util/create_get_queries.cpp ${SOURCES})
target_link_libraries(create_get_queries sdsl divsufsort divsufsort64 las)
# Create region queries
add_executable(create_get_region_queries src/util/create_get_region_queries.cpp ${SOURCES})
target_link_libraries(create_get_region_queries sdsl divsufsort divsufsort64 las)
#################
# TEST gtest #
#################
add_executable(test_k3_tree test/test_k3_tree.cpp ${SOURCES})
target_link_libraries(test_k3_tree sdsl divsufsort divsufsort64 gtest)
add_executable(test_k3_tree_points test/test_k3_tree_points.cpp ${SOURCES})
target_link_libraries(test_k3_tree_points sdsl divsufsort divsufsort64 gtest)
\ No newline at end of file
include(CheckCSourceCompiles)
include(CheckCXXSourceCompiles)
macro(append_c_compiler_flags _flags _name _result)
set(SAFE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
string(REGEX REPLACE "[-+/ ]" "_" cname "${_name}")
string(TOUPPER "${cname}" cname)
foreach(flag ${_flags})
string(REGEX REPLACE "^[-+/ ]+(.*)[-+/ ]*$" "\\1" flagname "${flag}")
string(REGEX REPLACE "[-+/ ]" "_" flagname "${flagname}")
string(TOUPPER "${flagname}" flagname)
set(have_flag "HAVE_${cname}_${flagname}")
set(CMAKE_REQUIRED_FLAGS "${flag}")
check_c_source_compiles("int main() { return 0; }" ${have_flag})
if(${have_flag})
set(${_result} "${${_result}} ${flag}")
endif(${have_flag})
endforeach(flag)
set(CMAKE_REQUIRED_FLAGS ${SAFE_CMAKE_REQUIRED_FLAGS})
endmacro(append_c_compiler_flags)
macro(append_cxx_compiler_flags _flags _name _result)
set(SAFE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
string(REGEX REPLACE "[-+/ ]" "_" cname "${_name}")
string(TOUPPER "${cname}" cname)
foreach(flag ${_flags})
string(REGEX REPLACE "^[-+/ ]+(.*)[-+/ ]*$" "\\1" flagname "${flag}")
string(REGEX REPLACE "[-+/ ]" "_" flagname "${flagname}")
string(TOUPPER "${flagname}" flagname)
set(have_flag "HAVE_${cname}_${flagname}")
set(CMAKE_REQUIRED_FLAGS "${flag}")
check_cxx_source_compiles("int main() { return 0; }" ${have_flag})
if(${have_flag})
set(${_result} "${${_result}} ${flag}")
endif(${have_flag})
endforeach(flag)
set(CMAKE_REQUIRED_FLAGS ${SAFE_CMAKE_REQUIRED_FLAGS})
endmacro(append_cxx_compiler_flags)
# Check if SSE instructions are available on the machine where
# the project is compiled.
MACRO (FindSSE)
IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
EXEC_PROGRAM(cat ARGS "/proc/cpuinfo" OUTPUT_VARIABLE CPUINFO)
STRING(REGEX REPLACE "^.*(sse2).*$" "\\1" SSE_THERE ${CPUINFO})
STRING(COMPARE EQUAL "sse2" "${SSE_THERE}" SSE2_TRUE)
IF (SSE2_TRUE)
set(SSE2_FOUND true CACHE BOOL "SSE2 available on host")
ELSE (SSE2_TRUE)
set(SSE2_FOUND false CACHE BOOL "SSE2 available on host")
ENDIF (SSE2_TRUE)
# /proc/cpuinfo apparently omits sse3 :(
STRING(REGEX REPLACE "^.*[^s](sse3).*$" "\\1" SSE_THERE ${CPUINFO})
STRING(COMPARE EQUAL "sse3" "${SSE_THERE}" SSE3_TRUE)
IF (NOT SSE3_TRUE)
STRING(REGEX REPLACE "^.*(T2300).*$" "\\1" SSE_THERE ${CPUINFO})
STRING(COMPARE EQUAL "T2300" "${SSE_THERE}" SSE3_TRUE)
ENDIF (NOT SSE3_TRUE)
STRING(REGEX REPLACE "^.*(ssse3).*$" "\\1" SSE_THERE ${CPUINFO})
STRING(COMPARE EQUAL "ssse3" "${SSE_THERE}" SSSE3_TRUE)
IF (SSE3_TRUE OR SSSE3_TRUE)
set(SSE3_FOUND true CACHE BOOL "SSE3 available on host")
ELSE (SSE3_TRUE OR SSSE3_TRUE)
set(SSE3_FOUND false CACHE BOOL "SSE3 available on host")
ENDIF (SSE3_TRUE OR SSSE3_TRUE)
IF (SSSE3_TRUE)
set(SSSE3_FOUND true CACHE BOOL "SSSE3 available on host")
ELSE (SSSE3_TRUE)
set(SSSE3_FOUND false CACHE BOOL "SSSE3 available on host")
ENDIF (SSSE3_TRUE)
STRING(REGEX REPLACE "^.*(sse4_1).*$" "\\1" SSE_THERE ${CPUINFO})
STRING(COMPARE EQUAL "sse4_1" "${SSE_THERE}" SSE41_TRUE)
IF (SSE41_TRUE)
set(SSE4_1_FOUND true CACHE BOOL "SSE4.1 available on host")
ELSE (SSE41_TRUE)
set(SSE4_1_FOUND false CACHE BOOL "SSE4.1 available on host")
ENDIF (SSE41_TRUE)
STRING(REGEX REPLACE "^.*(sse4_2).*$" "\\1" SSE_THERE ${CPUINFO})
STRING(COMPARE EQUAL "sse4_2" "${SSE_THERE}" SSE42_TRUE)
IF (SSE42_TRUE)
set(SSE4_2_FOUND true CACHE BOOL "SSE4.2 available on host")
ELSE (SSE42_TRUE)
set(SSE4_2_FOUND false CACHE BOOL "SSE4.2 available on host")
ENDIF (SSE42_TRUE)
ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Darwin")
EXEC_PROGRAM("/usr/sbin/sysctl -n machdep.cpu.features" OUTPUT_VARIABLE
CPUINFO)
STRING(REGEX REPLACE "^.*[^S](SSE2).*$" "\\1" SSE_THERE ${CPUINFO})
STRING(COMPARE EQUAL "SSE2" "${SSE_THERE}" SSE2_TRUE)
IF (SSE2_TRUE)
set(SSE2_FOUND true CACHE BOOL "SSE2 available on host")
ELSE (SSE2_TRUE)
set(SSE2_FOUND false CACHE BOOL "SSE2 available on host")
ENDIF (SSE2_TRUE)
STRING(REGEX REPLACE "^.*[^S](SSE3).*$" "\\1" SSE_THERE ${CPUINFO})
STRING(COMPARE EQUAL "SSE3" "${SSE_THERE}" SSE3_TRUE)
IF (SSE3_TRUE)
set(SSE3_FOUND true CACHE BOOL "SSE3 available on host")
ELSE (SSE3_TRUE)
set(SSE3_FOUND false CACHE BOOL "SSE3 available on host")
ENDIF (SSE3_TRUE)
STRING(REGEX REPLACE "^.*(SSSE3).*$" "\\1" SSE_THERE ${CPUINFO})
STRING(COMPARE EQUAL "SSSE3" "${SSE_THERE}" SSSE3_TRUE)
IF (SSSE3_TRUE)
set(SSSE3_FOUND true CACHE BOOL "SSSE3 available on host")
ELSE (SSSE3_TRUE)
set(SSSE3_FOUND false CACHE BOOL "SSSE3 available on host")
ENDIF (SSSE3_TRUE)
STRING(REGEX REPLACE "^.*(SSE4.1).*$" "\\1" SSE_THERE ${CPUINFO})
STRING(COMPARE EQUAL "SSE4.1" "${SSE_THERE}" SSE41_TRUE)
IF (SSE41_TRUE)
set(SSE4_1_FOUND true CACHE BOOL "SSE4.1 available on host")
ELSE (SSE41_TRUE)
set(SSE4_1_FOUND false CACHE BOOL "SSE4.1 available on host")
ENDIF (SSE41_TRUE)
STRING(REGEX REPLACE "^.*(SSE4.2).*$" "\\1" SSE_THERE ${CPUINFO})
STRING(COMPARE EQUAL "SSE4.2" "${SSE_THERE}" SSE42_TRUE)
IF (SSE42_TRUE)
set(SSE4_2_FOUND true CACHE BOOL "SSE4.2 available on host")
ELSE (SSE42_TRUE)
set(SSE4_2_FOUND false CACHE BOOL "SSE4.2 available on host")
ENDIF (SSE42_TRUE)
ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Windows")
# TODO
set(SSE2_FOUND true CACHE BOOL "SSE2 available on host")
set(SSE3_FOUND false CACHE BOOL "SSE3 available on host")
set(SSSE3_FOUND false CACHE BOOL "SSSE3 available on host")
set(SSE4_1_FOUND false CACHE BOOL "SSE4.1 available on host")
set(SSE4_2_FOUND false CACHE BOOL "SSE4.2 available on host")
ELSE(CMAKE_SYSTEM_NAME MATCHES "Linux")
set(SSE2_FOUND true CACHE BOOL "SSE2 available on host")
set(SSE3_FOUND false CACHE BOOL "SSE3 available on host")
set(SSSE3_FOUND false CACHE BOOL "SSSE3 available on host")
set(SSE4_1_FOUND false CACHE BOOL "SSE4.1 available on host")
set(SSE4_2_FOUND false CACHE BOOL "SSE4.2 available on host")
ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
IF(CMAKE_COMPILER_IS_GNUCXX)
EXECUTE_PROCESS(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
IF(GCC_VERSION VERSION_LESS 4.2)
set(SSE4_1_FOUND false CACHE BOOL "SSE4.1 available on host" FORCE)
set(SSE4_2_FOUND false CACHE BOOL "SSE4.2 available on host" FORCE)
ENDIF()
ENDIF(CMAKE_COMPILER_IS_GNUCXX)
if(NOT SSE2_FOUND)
MESSAGE(STATUS "Could not find support for SSE2 on this machine.")
endif(NOT SSE2_FOUND)
if(NOT SSE3_FOUND)
MESSAGE(STATUS "Could not find support for SSE3 on this machine.")
endif(NOT SSE3_FOUND)
if(NOT SSSE3_FOUND)
MESSAGE(STATUS "Could not find support for SSSE3 on this machine.")
endif(NOT SSSE3_FOUND)
if(NOT SSE4_1_FOUND)
MESSAGE(STATUS "Could not find support for SSE4.1 on this machine.")
endif(NOT SSE4_1_FOUND)
if(NOT SSE4_2_FOUND)
MESSAGE(STATUS "Could not find support for SSE4.2 on this machine.")
endif(NOT SSE4_2_FOUND)
mark_as_advanced(SSE2_FOUND SSE3_FOUND SSSE3_FOUND SSE4_1_FOUND SSE4_2_FOUND)
ENDMACRO(FindSSE)
This diff is collapsed.
k<sup>3</sup>-tree - A compacta data strucutre to represent a 3-dimensional binary matrix
=========================
## Compilation ##
To compile the code you need to execute the following commands:
```bash
cd k3-tree_sdsl
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make
```
or
```bash
cd k3-tree_sdsl
sh compile.sh
```
Executables files are stored in
* ./build/bin/
Library files are stored in
* ./build/lib/
## Encode data ##
To encode a file of unsigned integers (32 bits), you have to run the command:
```bash
./k3_tree_encode <input_data> <size> <output_data> <set_check> <k3_tree_type>
```
Where:
* **\<input_data>** input file (lit of unsigned integers of 32 bits)
* **\<size>** size of the input data (size x size x size)
* **\<output_data>** output path where store the k<sup>3</sup>-tree
* **\<check>** A 1 if after constructing the structure performs a check point by point. Or a 0 otherwise
* **\<k3_tree_type>** Type of k<sup>3</sup>-tree that is used to encode the input data. The possible values are:
* **Type 0**: Basic k<sup>3</sup>-tree
* **Type 1**: k<sup>3</sup>-tree with limit of points
* **Type 2**: k<sup>3</sup>-tree with limit of levels
#### Example ####
For example, a data cube of size 6x6x6 with 4 points [(0, 2, 3), (2, 2, 5), (3, 5, 1) and (5, 5, 6)] is stored in ./input_data.bin as sequence of unsigned integers of 32 bits. And we want to encode with type 0 (basic k<sup>3</sup>-tree)
The input file would be: \[ 0 2 3 2 2 5 3 5 1 5 5 6 ] (4 points * 3 coordinates = 12 values, where the first three numbers correspond to the first point, the next three numbers correspond to the second point and so on).
```bash
./k3_tree_encode ./input_data.bin 6 ./output_file.k3tree 1 0
```
## Encode LIDAR data ##
To encode a LIDAR file, you have to run the command:
```bash
./k3_tree_LIDAR_encode <input_data> <n_digits> <n_params> <output_data> <set_check>
```
Where:
* **\<input_data>** input file (a LAS or LAZ file)
* **\<output_data>** output path where store the k<sup>3</sup>-tree
* **\<check>** A 1 if after constructing the structure performs a check point by point. Or a 0 otherwise
* **\<k3_tree_type>** Type of k<sup>3</sup>-tree that is used to encode the input data. The possible values are:
* **Type 10**: k<sup>3</sup>-tree LIDAR with limit of points
#### Example ####
```bash
./k3_tree_LIDAR_encode ./input_data.las ./output_file.k3tree 1 10
```
## Queries ##
#### Obtaining a point ####
Given a position (x, y, z), this query returns if there is that point in the dataset.
```bash
./k3_tree_get <k3_tree_file> <query_file>
```
Where:
* **\<k3_tree_file>** Path of the file where the *k<sup>3</sup>-tree* is stored
* **\<query_file>** File with a set of queries. Each line is a query with format *"pos_X pos_Y pos_Z"*
#### Obtaining a point (with attributes) ####
Given a position (x, y, z), this query returns the information about that point. Only for k<sup>3</sup>-tree LIDAR.
```bash
./k3_tree_LIDAR_get <k3_tree_file> <query_file>
```
Where:
* **\<k3_tree_file>** Path of the file where the *k<sup>3</sup>-tree* is stored
* **\<query_file>** File with a set of queries. Each line is a query with format *"pos_X pos_Y pos_Z"*
#### Obtaining all points of a region ####
Given a region, this query retrieves all points that are within that region.
```bash
./k3_tree_get_region <k3_tree_file> <query_file> <check>
```
Where:
* **\<k3_tree_file>** Path of the file where the *k<sup>3</sup>-tree* is stored
* **\<query_file>** File with a set of queries. Each line is a query with format *"i_pos_X i_pos_Y i_pos_Z e_pos_X e_pos_Y e_pos_Z"* (**i**nitial and **e**nd point)
* **\<check>** 1 to check if the final result is correct. 0 in other case.
#### Obtaining all points of a region (with attributes)####
Given a region, this query retrieves all points that are within that region. For each point information of its attributes is included. Only for k<sup>3</sup>-tree LIDAR.
```bash
./k3_tree_LIDAR_get_region <k3_tree_file> <query_file> <check>
```
Where:
* **\<k3_tree_file>** Path of the file where the *k<sup>3</sup>-tree* is stored
* **\<query_file>** File with a set of queries. Each line is a query with format *"i_pos_X i_pos_Y i_pos_Z e_pos_X e_pos_Y e_pos_Z"* (**i**nitial and **e**nd point)
* **\<check>** 1 to check if the final result is correct. 0 in other case.
#### Implemented By ####
Fernando Silva-Coira - <fernando.silva@udc.es>
#!/bin/sh
echo "Removing folders..."
rm -rf cmake-build-debug
echo "DONE!!!"
\ No newline at end of file
#!/bin/sh
echo "Clean project"
sh ./clean.sh
echo "Create folder build"
mkdir -p build
cd build
echo "Run CMake"
cmake ..
echo "Run make"
make
echo "DONE!!!"
\ No newline at end of file
#!/bin/sh
rm -rf output
mkdir output
../build/bin/k3_tree_LIDAR_encode ./data/alcoy_5_300k.laz ./output/alcoy_5_300k.k3tree 1 10
../build/bin/k3_tree_LIDAR_encode ./data/example_1.laz ./output/example_1.k3tree 1 10
#xdg-open ./output/alcoy_5_300k.k3tree.html
This diff is collapsed.
#!/bin/sh
echo "Testing alcoy_5_300k............"
echo "Creating a file with 1000 random queries"
../build/bin/create_get_region_queries ./output/alcoy_5_300k.k3tree ./output/queries_region_alcoy_5_300k.txt 100
echo "Running test"
../build/bin/k3_tree_LIDAR_get_region ./output/alcoy_5_300k.k3tree ./output/queries_region_alcoy_5_300k.txt 1
echo ""
echo ""
echo "Testing example_1............"
echo "Creating a file with 1000 random queries"
../build/bin/create_get_region_queries ./output/alcoy_5_300k.k3tree ./output/queries_region_example_1.txt 100
echo "Running test"
../build/bin/k3_tree_LIDAR_get_region ./output/alcoy_5_300k.k3tree ./output/queries_region_example_1.txt 1
\ No newline at end of file
Release
Debug
LASlib.ncb
LASlib.opt
LASlib.plg
*~
20 May 2018 -- LASlib, all LAStools: bug fix when trying to set CRS via '-gda94 -utm 56south' in command line
12 May 2018 -- las2las, LASlib: new filters '-drop_RGB_red 5000 6000' and '-drop_RGB_green 200 10000'
8 May 2018 -- las2las: handling of OGC WKT and more clear "setting" versus "reprojecting" the CRS
19 April 2018 -- las2las: 'remove_all_evlrs' and '-remove_all_evlr 0' and '-remove_evlrs_from_to 1 3'
17 April 2018 -- lasinfo: better formatted output when bins of histograms have decimal digitls
29 March 2018 -- LASlib, all LAStools: fix for "missing points" when writing just decompressed "native" LAS 1.4
28 March 2018 -- lasinfo: also report TOWGS84 Helmert transform stored in GeoTIFF key 2062 (GeogTOWGS84GeoKey)
23 March 2018 -- LASlib, all LAStools: more checks for correct arguments for LAStransforms
20 March 2018 -- LASlib: new '-transform_helmert 598.1,73.7,418.2,0.202,0.045,-2.455,6.7' for ECEF coordinates
3 March 2018 -- LASlib, all LAStools: "allow '-odir' to just specify a drive such as '-odir f:' of '-odir f:\'
28 February 2018 -- LASlib, all LAStools: now '-set_RGB_of_class' also works for classifications > 31
24 February 2018 -- las2las: automatically move eligible EVLRs to VLR section when downgrading LAS 1.4
23 February 2018 -- las2las: bug fix when downgrading LAS 1.4 with new point types via '-set_version 1.3'
9 February 2018 -- LASzip: minor version increment to 3.2 as POINT14_v4 fixes context inefficiency bug
9 February 2018 -- LASlib: new LASreaderStored supports stdin/stdout piping for multi-pass tools
31 January 2018 -- las2las: fix proper functioning of '-set_ogc_wkt' for certain command line argument combinations
30 January 2018 -- txt2las and LASlib: use 'I' to parse NIR channel and 'J' to parse hexadecimal intensities
28 December 2017 -- LASlib: prepare to correct 'context switch' bug reported by Wanwannodao on some future date
25 December 2017 -- LASlib: fixed half-pixel shift in on-the-fly-reading of BIL without BLW (ulxmap/ulymap are used)
15 December 2017 -- LASlib: support for auto flightline assignment '-faf' and '-faf 101' even with '-cores 4'
14 December 2017 -- LASlib: keep multiple flightlines with '-keep_point_source 2 3 4'
10 December 2017 -- LASlib: new '-keep_random_fraction 0.2 4711' allows seeding the random generator with 4711
1 December 2017 -- LASlib: support additional point attributes (aka extra bytes) during '-merged' operations
30 November 2017 -- las2las: set OGC WKT with '-set_ogc_wkt "PROJCS[\"WGS84\",GEOGCS[\"GCS_ ...". note the many '\'s in front of each '\"'
22 November 2017 -- las2txt: parse extra bytes attributes with indices larger than 9 by bracketing (12) them
21 November 2017 -- txt2las: allow adding up to 32 (from 10) additional extra bytes attributes
17 November 2017 -- LASlib: new transform '-copy_intensity_into_NIR' (makes only sense for point type 8)
30 October 2017 -- las2las: new option '-vertical_evrf2007' for European Vertical Reference Frame 2007
14 October 2017 -- lasinfo: new WARNING when bounding box in LAS header miss-matches coordinate resolution
10 October 2017 -- las2las: allow both piping input ('-stdin') *and* output ('-stdout') if no filter or coordinate change
17 August 2017 -- LASlib: switch on "native LAS 1.4 extension". turns off with '-no_native'.
5 August 2017 -- LASlib: unless '-buffered 25' just created buffers always '-remain_buffered'
5 August 2017 -- LASlib: removed option '-unbuffered' because it makes too many assumptions
18 July 2017 -- LASzip + LASlib: bug fix for spatially-indexed reading from native compressed LAS 1.4 files
14 July 2017 -- las2las: fixed missing 'comma' in compound (COMPD_CS) OGC WKT string
13 July 2017 -- lasdiff: added missing checks for LAS 1.4 EVLR size and payloads
24 June 2017 -- LASlib: corrected on-the-fly conversion from BIL rasters to point clouds for unsigned integers
11 May 2017 -- LASlib: new transforms '-copy_classification_into_user_data' and '-copy_attribute_into_user_data 1'
20 April 2017 -- LASlib: new option '-unbuffered' for lasreadopener removes buffers from on-the-fly buffering
16 April 2017 -- txt2las: allow requesting a particular point type with new option '-set_point_type 6'
14 April 2017 -- LASlib: enable "adaptive chunking" for "native LAS 1.4 extension" for compressing new LAS 1.4
8 April 2017 -- LASlib: new check to detect corrupt LAZ files generated by libLAS for files with "Extra Bytes"
30 March 2017 -- LASlib: alpha-release of "native LAS 1.4 extension" for LASzip compression of new LAS 1.4 points
29 March 2017 -- LASlib: enable "native LAS 1.4 extension" for LASzip via '-native'
22 March 2017 -- LASlib: new filter '-thin_points_with_time 0.000001' vs '-thin_pulses_with_time 0.001'
12 March 2017 -- LASlib: new filters '-drop_every_nth' '-drop_number_of_returns' '-keep_number_of_returns'
8 March 2017 -- LASlib: new transform '-copy_user_data_into_scanner_channel' fixes bad LAS 1.4 files
6 March 2017 -- LASlib: new transform '-copy_NIR_into_intensity' for point types 8 and 10
1 February 2017 -- LASlib: better support for OGC WKT strings in VLRs or EVLRs when reading
1 February 2017 -- LASlib: new transform '-copy_intensity_into_z' for use in lasgrid or lascanopy
16 January 2017 -- LASlib: support for NAVD88 Geoids when generating OGC WKT string via '-vertical_navd88_geoid12b'
6 January 2017 -- all LAStools: rudimentary support for Lambert Conic Conformal (1SP) by ignoring scale factor
6 January 2017 -- all LAStools: more EPSG codes due to updates 'pcs.csv' and 'gcs.csv' files
4 January 2017 -- all LAStools: added DHHN92 "Deutsches Haupthoehennetz 1992" for OpenNRW LiDAR (-vertical_dhhn92)
2 January 2017 -- all LAStools: more support for CRS with "user defined" AlbersEqualArea projection in GeoTIFF tags
28 November 2016 -- all LAStools: new filters '-keep_second_last' and '-drop_second_last' return
13 November 2016 -- all LAStools: early FALSE when setting output directory via '-odir __' will not succeed
9 November 2016 -- all LAStools: support CRS via "user defined" AlbersEqualArea projection in GeoTIFF tags
23 October 2016 -- las2las: OGC WKT string stores COMPD_CS for projection + vertical
22 October 2016 -- las2las: new '-set_ogc_wkt_in_elvr' store to EVLR instead of VLR
22 October 2016 -- LASlib: ability to not only read but also write EVLR
16 October 2016 -- LASlib, las2las: new filters '-keep_attribute_between' and '-drop_attribute_between'
30 September 2016 -- LASlib, las2las: new filter -keep_NDVI_blue_is_NIR -0.1 0.5 (computed from R of RGB and B = NIR)
30 September 2016 -- LASlib, las2las: new filter -keep_NDVI_green_is_NIR 0.4 0.8 (computed from R of RGB and G = NIR)
30 September 2016 -- LASlib, las2las: new filter -keep_NDVI_intensity_is_NIR -0.2 0.2 (computed from R of RGB and intensity = NIR)
30 September 2016 -- LASlib, las2las: new filter -keep_NDVI_from_CIR 0.4 0.8 (computed from RGB = CIR)
30 September 2016 -- LASlib, las2las: new filter -keep_NDVI 0.2 0.7 (computed from R+NIR for point type 8)
29 September 2016 -- LASlib, las2las: new filters -keep_extended_scanner_channel 1 and -drop_extended_scanner_channel 0
21 September 2016 -- LASlib, las2las: new filters '-drop_attribute_above' and '-keep_attribute_below'
18 September 2016 -- LASlib, lasinfo: improved reporting of (extended & legacy) classification histograms
16 September 2016 -- laszip: corrected "LAS 1.4 compatibility mode" for case that legacy counters are zero
30 July 2016 -- las2las: correct naming of stateplanes when combining '-sp83 CA_I' with 'set_ogc_wkt'
19 July 2016 -- las2las: fixed bug with '-target_survey_feet' not always working with '-cores 8'
13 July 2016 -- las2las: added AUTHORITY EPSG code 1116 associated with NAD83 2011 for OGC WKT output
9 July 2016 -- LAStools: added Norwegian vertical datums -vertical_nn2000 -vertical_nn54
2 July 2016 -- LAStools: add datums -vertical_navd88 -vertical_cgvd2013 -vertical_cgvd28 -vertical_dvr90
28 June 2016 -- LASlib: new transforms '-set_extended_return_number 11' and '-set_extended_number_of_returns 13'
28 June 2016 -- LASlib: new filters '-keep_first_of_many' and '-keep_last_of_many'
24 June 2016 -- LASlib: the 'reserved' field of newly created VLRs is set to zero instead of 0xAABB
8 June 2016 -- LASlib: ASCII text input can have ';' as a seperator (e.g. 500936.36;104300.50;711.73)
20 May 2016 -- las2las: '-move_ancient_to_extended_classification' 5 bits + flags = 8 bit classifications
15 May 2016 -- LASlib: '-translate_raw_xy_at_random 2 2' perturbes X/Y for faster Delaunay of points on grid
29 April 2016 -- LASlib: don't EXIT but produce WARNINGs when rescale / reoffset overflows integers
10 April 2016 -- LASlib: exit with ERROR when '-rescale 0.001 ...' or '-reoffset ...' overflow integer
9 April 2016 -- lasinfo: new option '-set_file_source_ID_from_point_source_ID'
28 February 2016 -- LASlib: new filters '-drop_extended_class 42' and '-drop_extended_class 219'
18 February 2016 -- lasinfo: more useful '-set_number_of_variable_length_records' and friends
25 January 2016 -- LASlib: brand-new opportunity to do a '-filtered_transform'
24 January 2016 -- txt2las: better support for storing attributes in "Extra Bytes with '-add_attribute'
19 January 2016 -- LASlib: new transform to '-scale_rgb 1.5 2.1 1.8'
1 January 2016 -- las2las & txt2las: create OGC WKT string for CRS for full LAS 1.4 compliance
25 September 2015 -- LASlib: disabling auto-upgrade to LAS 1.4 introduced in 150924. now it just warns.
24 September 2015 -- LASlib: upgrade to LAS 1.4 when '-merged'ing more points than older LAS allows
24 September 2015 -- LASlib: consistant zeroing of legacy counters for new LAS 1.4 point types
28 August 2015 -- lasinfo: option '-repair_counters' corrected for 64 bit counters of LAS 1.4 files
18 August 2015 -- lasdiff: fixed report for truncated files (fewer or more points)
1 August 2015 -- LASlib: moving LASpoint, LASquantizer, and LASattributer to LASzip for "compatibility"
25 July 2015 -- LAStools: EPSG codes (http://groups.google.com/d/topic/lastools/9fUZaLKPReg/discussion)
6 June 2015 -- LASlib: added filters '-keep_overlap' and '-drop_overlap' for new LAS 1.4 point types