[pdal] 04/08: Imported Upstream version 1.1.0
Sebastiaan Couwenberg
sebastic at moszumanska.debian.org
Sun Mar 20 03:18:29 UTC 2016
This is an automated email from the git hooks/post-receive script.
sebastic pushed a commit to branch master
in repository pdal.
commit 54437b996d21373902892f160c1d133275bceeab
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date: Tue Mar 15 21:01:02 2016 +0100
Imported Upstream version 1.1.0
---
CMakeLists.txt | 6 +-
ChangeLog | 8091 ++++++++++++++++++++
apps/pdal-config | 2 +-
cmake/geowave.cmake | 4 +-
cmake/jace.cmake | 4 +-
cmake/jni.cmake | 15 +-
cmake/modules/FindGeoWave.cmake | 2 +-
cmake/modules/FindJace.cmake | 13 +-
doc/_templates/layout.html | 20 +
doc/_themes/bootstrap/bootstrap.js | 2038 -----
doc/_themes/bootstrap/bootstrap.min.js | 7 -
doc/_themes/bootstrap/indexsidebar.html | 42 -
doc/_themes/bootstrap/static/bootstrap-default.css | 5624 --------------
.../bootstrap/static/bootstrap-default.min.css | 9 -
doc/_themes/bootstrap/static/bootstrap-dropdown.js | 81 -
.../bootstrap/static/bootstrap-engineauth.css | 5700 --------------
.../bootstrap/static/bootstrap-engineauth.min.css | 829 --
.../bootstrap/static/bootstrap-responsive.css | 1040 ---
.../bootstrap/static/bootstrap-responsive.min.css | 9 -
doc/_themes/bootstrap/static/bootstrap-sapling.css | 6484 ----------------
doc/_themes/bootstrap/static/jquery.js | 4 -
doc/_themes/bootstrap/static/sphinx-bootstrap.css | 188 -
doc/api/cpp/bounds.rst | 7 +-
doc/api/cpp/{option.rst => filter.rst} | 9 +-
doc/api/cpp/index.rst | 2 +-
doc/api/cpp/log.rst | 3 +-
doc/api/cpp/metadata.rst | 8 +-
doc/api/cpp/options.rst | 3 +-
doc/api/cpp/pointtable.rst | 3 +-
doc/api/cpp/pointview.rst | 3 +-
doc/api/cpp/reader.rst | 41 +-
doc/api/cpp/stage.rst | 10 +-
doc/api/cpp/writer.rst | 3 +-
doc/api/index.rst | 19 +-
doc/apps.rst | 4 +-
doc/community.rst | 52 +-
doc/compilation/dependencies.rst | 91 +-
doc/compilation/index.rst | 10 +-
doc/compilation/media/OSGeo4WInstallIConv.png | Bin 31629 -> 35153 bytes
doc/compilation/unix.rst | 110 +-
doc/compilation/windows.rst | 15 +
doc/conf.py | 115 +-
doc/development/conventions.rst | 37 +-
doc/development/docs.rst | 103 +-
doc/development/errorhandling.rst | 24 +-
doc/development/goals.rst | 35 +-
doc/development/index.rst | 27 +-
doc/development/testing.rst | 380 +-
doc/development/usecases.rst | 99 -
doc/docbuild/Dockerfile | 28 +
doc/docbuild/run.sh | 8 +
doc/docs.rst | 34 -
doc/download.rst | 17 +-
doc/faq.rst | 7 +
doc/index.rst | 84 +-
doc/metadata.rst | 2 +-
doc/stages/filters.attribute.rst | 165 +-
doc/stages/filters.chipper.rst | 11 +-
doc/stages/filters.colorization.rst | 100 +-
doc/stages/filters.dartsample.rst | 24 +
doc/stages/filters.decimation.rst | 13 +-
doc/stages/filters.divider.rst | 55 +
doc/stages/filters.ferry.rst | 32 +-
doc/stages/filters.greedyprojection.rst | 20 +
doc/stages/filters.gridprojection.rst | 20 +
doc/stages/filters.ground.rst | 42 +
doc/stages/filters.height.rst | 12 +
doc/stages/filters.hexbin.rst | 12 +-
doc/stages/filters.merge.rst | 4 +-
doc/stages/filters.mortonorder.rst | 2 +-
doc/stages/filters.movingleastsquares.rst | 22 +
doc/stages/filters.poisson.rst | 23 +
doc/stages/filters.predicate.rst | 39 +-
doc/stages/filters.radiusoutlier.rst | 31 +
...lters.mortonorder.rst => filters.randomize.rst} | 19 +-
doc/stages/filters.range.rst | 43 +-
doc/stages/filters.sort.rst | 2 +-
doc/stages/filters.splitter.rst | 8 +-
doc/stages/filters.statisticaloutlier.img1.png | Bin 0 -> 123326 bytes
doc/stages/filters.statisticaloutlier.img2.png | Bin 0 -> 236137 bytes
doc/stages/filters.statisticaloutlier.rst | 53 +
doc/stages/filters.stats.rst | 4 +-
doc/stages/filters.transformation.rst | 12 +-
doc/stages/filters.voxelgrid.rst | 34 +
doc/stages/index.rst | 89 +-
doc/stages/ranges.rst | 57 +
doc/stages/readers.bpf.rst | 7 +-
doc/stages/readers.buffer.rst | 6 +-
doc/stages/readers.gdal.rst | 78 +
doc/stages/readers.geowave.rst | 36 +-
doc/stages/readers.greyhound.rst | 4 +-
doc/stages/readers.ilvis2.metadata.png | Bin 0 -> 284685 bytes
doc/stages/readers.ilvis2.rst | 39 +
doc/stages/readers.las.rst | 67 +-
doc/stages/readers.ply.rst | 2 +-
doc/stages/readers.tindex.rst | 125 +
doc/stages/writers.bpf.rst | 20 +-
doc/stages/writers.geowave.rst | 36 +-
doc/stages/writers.las.rst | 40 +-
doc/stages/writers.nitf.rst | 43 +-
doc/stages/writers.null.rst | 2 +-
doc/stages/writers.oci.rst | 2 +-
doc/stages/writers.p2g.rst | 26 +-
doc/stages/writers.text.rst | 18 +-
doc/tutorial/autzen-elevation.png | Bin 0 -> 576093 bytes
doc/tutorial/autzen-height.png | Bin 0 -> 594313 bytes
doc/tutorial/autzen-shapes-clipped.png | Bin 0 -> 873023 bytes
doc/tutorial/autzen-shapes-point-cloud.png | Bin 0 -> 2749626 bytes
doc/tutorial/autzen-shapes-to-clip.png | Bin 0 -> 1306328 bytes
doc/tutorial/calculating-normalized-heights.rst | 192 +
doc/tutorial/clipping-with-shapefile.rst | 208 +
doc/tutorial/dart-throwing.rst | 77 +
doc/tutorial/index.rst | 4 +
doc/tutorial/liblas_to_pdal.rst | 20 +-
doc/tutorial/overview.rst | 7 +-
doc/tutorial/pcl_ground.rst | 7 +-
doc/tutorial/pcl_spec.rst | 44 +-
doc/tutorial/reading.rst | 142 +-
doc/tutorial/subsample-ex1.png | Bin 0 -> 73699 bytes
doc/tutorial/subsample-ex2.png | Bin 0 -> 106284 bytes
doc/tutorial/subsample-ex3.png | Bin 0 -> 446842 bytes
doc/tutorial/subsample-ex4.png | Bin 0 -> 776586 bytes
doc/tutorial/subsample-ex5.png | Bin 0 -> 220476 bytes
doc/tutorial/using.rst | 4 +
doc/tutorial/writing-filter.rst | 98 +-
doc/tutorial/writing-kernel.rst | 51 +-
doc/tutorial/writing-reader.rst | 189 +-
doc/tutorial/writing-writer.rst | 162 +-
doc/tutorial/writing.rst | 16 +-
doc/vagrant.rst | 82 +-
examples/writing-filter/MyFilter.cpp | 41 +-
examples/writing-filter/MyFilter.hpp | 38 +-
examples/writing-kernel/MyKernel.cpp | 117 +-
examples/writing-kernel/MyKernel.hpp | 29 +-
examples/writing-reader/MyReader.cpp | 180 +-
examples/writing-reader/MyReader.hpp | 47 +-
examples/writing-reader/pipeline-myreader.xml | 16 +
examples/writing-reader/test-reader-input.txt | 16 +
examples/writing-writer/MyWriter.cpp | 158 +-
examples/writing-writer/MyWriter.hpp | 43 +-
examples/writing-writer/pipeline-mywriter.xml | 19 +
examples/writing/tutorial.cpp | 24 +-
filters/CMakeLists.txt | 2 +
filters/colorization/ColorizationFilter.cpp | 238 +-
filters/colorization/ColorizationFilter.hpp | 39 +-
filters/crop/CropFilter.cpp | 72 +-
filters/crop/CropFilter.hpp | 9 +-
filters/divider/CMakeLists.txt | 14 +
filters/divider/DividerFilter.cpp | 137 +
.../RangeFilter.hpp => divider/DividerFilter.hpp} | 56 +-
filters/ferry/FerryFilter.cpp | 56 +-
filters/ferry/FerryFilter.hpp | 1 +
filters/merge/MergeFilter.cpp | 25 +
filters/merge/MergeFilter.hpp | 13 +-
filters/randomize/CMakeLists.txt | 5 +
.../RandomizeFilter.cpp} | 15 +-
.../RandomizeFilter.hpp} | 31 +-
filters/range/RangeFilter.cpp | 219 +-
filters/range/RangeFilter.hpp | 42 +-
filters/reprojection/ReprojectionFilter.cpp | 129 +-
filters/reprojection/ReprojectionFilter.hpp | 7 +-
include/pdal/Compression.hpp | 171 +-
include/pdal/FlexWriter.hpp | 17 +-
include/pdal/GDALUtils.hpp | 89 +-
include/pdal/Geometry.hpp | 146 +
include/pdal/Kernel.hpp | 11 +-
include/pdal/KernelSupport.hpp | 2 +-
include/pdal/Metadata.hpp | 2 +-
include/pdal/Options.hpp | 148 +-
include/pdal/PDALUtils.hpp | 11 +-
include/pdal/PipelineManager.hpp | 2 +-
include/pdal/PointTable.hpp | 23 +-
include/pdal/PointView.hpp | 24 +-
include/pdal/SpatialReference.hpp | 19 +
include/pdal/Stage.hpp | 18 +-
include/pdal/StageWrapper.hpp | 5 +-
include/pdal/util/Algorithm.hpp | 25 +
include/pdal/util/Utils.hpp | 81 +-
io/CMakeLists.txt | 3 +
io/bpf/BpfWriter.cpp | 38 +-
io/bpf/BpfWriter.hpp | 5 +-
io/derivative/DerivativeWriter.cpp | 18 +-
io/derivative/DerivativeWriter.hpp | 3 +-
io/faux/FauxReader.cpp | 47 +-
io/gdal/CMakeLists.txt | 10 +
io/gdal/GDALReader.cpp | 205 +
.../FerryFilter.hpp => io/gdal/GDALReader.hpp | 47 +-
io/ilvis2/CMakeLists.txt | 21 +
io/ilvis2/Ilvis2Reader.cpp | 225 +
.../FerryFilter.hpp => io/ilvis2/Ilvis2Reader.hpp | 35 +-
io/las/LasError.hpp | 7 +-
io/las/LasHeader.cpp | 29 +-
io/las/LasHeader.hpp | 8 +
io/las/LasReader.cpp | 172 +-
io/las/LasReader.hpp | 12 +-
io/las/LasUtils.cpp | 16 +
io/las/LasUtils.hpp | 12 +
io/las/LasWriter.cpp | 353 +-
io/las/LasWriter.hpp | 26 +-
io/ply/CMakeLists.txt | 4 +-
io/ply/PlyReader.cpp | 2 -
io/text/TextWriter.cpp | 6 +-
io/tindex/CMakeLists.txt | 10 +
io/tindex/TIndexReader.cpp | 343 +
.../TIndexKernel.hpp => io/tindex/TIndexReader.hpp | 89 +-
kernels/info/InfoKernel.cpp | 5 +-
kernels/info/InfoKernel.hpp | 2 +-
kernels/tindex/TIndexKernel.cpp | 36 +-
kernels/tindex/TIndexKernel.hpp | 1 +
kernels/translate/TranslateKernel.cpp | 6 +
pdal_defines.h.in | 2 +
plugins/attribute/CMakeLists.txt | 5 +
plugins/attribute/filters/AttributeFilter.cpp | 268 +-
plugins/attribute/filters/AttributeFilter.hpp | 69 +-
plugins/attribute/test/AttributeFilterTest.cpp | 186 +
plugins/geowave/CMakeLists.txt | 2 -
plugins/geowave/io/GeoWaveReader.cpp | 71 +-
plugins/geowave/io/GeoWaveReader.hpp | 4 +-
plugins/geowave/io/GeoWaveWriter.cpp | 65 +-
plugins/greyhound/io/GreyhoundReader.cpp | 2 +-
plugins/hexbin/filters/HexBin.cpp | 32 +
plugins/hexbin/filters/HexBin.hpp | 1 +
plugins/nitf/io/NitfReader.cpp | 10 +-
plugins/nitf/io/NitfReader.hpp | 3 +-
plugins/nitf/io/NitfWriter.cpp | 93 +-
plugins/nitf/io/NitfWriter.hpp | 7 +-
plugins/nitf/test/NitfReaderTest.cpp | 2 +-
plugins/nitf/test/NitfWriterTest.cpp | 10 +-
plugins/oci/io/OciReader.cpp | 5 +-
plugins/oci/io/OciWriter.cpp | 8 +-
plugins/p2g/io/P2gWriter.cpp | 29 +-
plugins/p2g/io/P2gWriter.hpp | 1 +
plugins/pcl/CMakeLists.txt | 39 +
.../Plang.hpp => pcl/dartsample/dart_sample.cpp} | 38 +-
plugins/pcl/dartsample/dart_sample.h | 112 +
plugins/pcl/dartsample/dart_sample.hpp | 116 +
.../filters/{PCLBlock.cpp => DartSampleFilter.cpp} | 93 +-
.../{GroundFilter.hpp => DartSampleFilter.hpp} | 32 +-
.../{PCLBlock.cpp => GreedyProjectionFilter.cpp} | 104 +-
...GroundFilter.hpp => GreedyProjectionFilter.hpp} | 32 +-
.../{PCLBlock.cpp => GridProjectionFilter.cpp} | 99 +-
.../{GroundFilter.hpp => GridProjectionFilter.hpp} | 32 +-
plugins/pcl/filters/GroundFilter.cpp | 42 +-
plugins/pcl/filters/GroundFilter.hpp | 3 +-
plugins/pcl/filters/HeightFilter.cpp | 180 +
.../filters/{GroundFilter.hpp => HeightFilter.hpp} | 31 +-
.../{PCLBlock.cpp => MovingLeastSquaresFilter.cpp} | 72 +-
...oundFilter.hpp => MovingLeastSquaresFilter.hpp} | 32 +-
plugins/pcl/filters/PCLBlock.cpp | 21 +-
.../filters/{PCLBlock.cpp => PoissonFilter.cpp} | 99 +-
.../{GroundFilter.hpp => PoissonFilter.hpp} | 33 +-
.../{GroundFilter.cpp => RadiusOutlierFilter.cpp} | 116 +-
.../{GroundFilter.hpp => RadiusOutlierFilter.hpp} | 19 +-
...oundFilter.cpp => StatisticalOutlierFilter.cpp} | 116 +-
...oundFilter.hpp => StatisticalOutlierFilter.hpp} | 19 +-
.../filters/{PCLBlock.cpp => VoxelGridFilter.cpp} | 69 +-
.../{GroundFilter.hpp => VoxelGridFilter.hpp} | 32 +-
plugins/pcl/kernel/GroundKernel.cpp | 16 +-
plugins/pcl/pipeline/PCLPipeline.hpp | 10 +-
plugins/pgpointcloud/io/PgReader.cpp | 1 +
.../pgpointcloud/test/PgpointcloudWriterTest.cpp | 47 +-
plugins/python/filters/ProgrammableFilter.cpp | 1 -
plugins/python/plang/CMakeLists.txt | 34 -
plugins/python/plang/Plang.cpp | 78 -
plugins/rxp/io/RxpReader.hpp | 1 +
scripts/ci/before_install.sh | 15 +
scripts/ci/script.sh | 2 +
scripts/linux-install-scripts/geowave | 4 +-
scripts/linux-install-scripts/geowave.sh | 27 +-
scripts/linux-install-scripts/packages.sh | 3 +-
scripts/linux-install-scripts/pdal.sh | 13 +-
src/CMakeLists.txt | 2 +-
src/GDALUtils.cpp | 276 +
src/Kernel.cpp | 122 +-
src/KernelSupport.cpp | 4 +-
src/Options.cpp | 69 +-
src/PDALUtils.cpp | 3 -
src/PipelineReader.cpp | 20 -
src/PluginManager.cpp | 29 +
src/PointLayout.cpp | 2 +-
src/PointTable.cpp | 16 -
src/PointView.cpp | 2 -
src/SpatialReference.cpp | 16 +-
src/Stage.cpp | 34 +-
src/StageFactory.cpp | 7 +
src/gitsha.cpp | 2 +-
src/plang/Environment.cpp | 18 +
test/data/autzen/attributes.json | 11 +
test/data/autzen/attributes.vrt | 9 +
test/data/autzen/autzen-APMF.json | 19 +
test/data/autzen/autzen-interpolate.xml | 30 +
test/data/autzen/hag.py | 53 +
test/data/autzen/hag.xml.in | 34 +
test/data/bpf/simple-extra.bpf | Bin 0 -> 82180 bytes
test/data/filters/colorize.xml.in | 34 +-
test/data/filters/ferry.xml.in | 17 +-
test/data/filters/merge2.xml.in | 20 +
test/data/filters/merge3.xml.in | 18 +
test/data/filters/range_classification.xml.in | 7 +-
test/data/filters/range_z.xml.in | 8 +-
test/data/filters/range_z_classification.xml.in | 14 +-
test/data/hole/crop.xml.in | 4 +-
.../ilvis2/ILVIS2_GL2009_0414_R1401_042504.TXT | 1000 +++
.../ilvis2/ILVIS2_GL2009_0414_R1401_042504.TXT.xml | 780 ++
test/data/ilvis2/ilvis.xml | 13 +
test/data/las/autzen_trim.las | Bin 0 -> 3742038 bytes
test/data/las/test_epsg_4047.las | Bin 0 -> 1666 bytes
test/data/las/test_epsg_4326.las | Bin 0 -> 1439 bytes
test/data/las/test_epsg_4326x3.las | Bin 0 -> 2119 bytes
test/data/las/test_utm16.las | Bin 0 -> 793 bytes
test/data/las/test_utm17.las | Bin 0 -> 1039 bytes
test/data/laz/autzen_trim.laz | Bin 0 -> 603353 bytes
test/data/misc/opts2json.txt | 30 +-
test/data/misc/opts2json_meta.txt | 30 +-
test/data/pipeline/tindex.xml | 31 +
test/data/pipeline/tindex.xml.in | 31 +
test/unit/CMakeLists.txt | 7 +
test/unit/MetadataTest.cpp | 31 +-
test/unit/OptionsTest.cpp | 48 +-
test/unit/PDALUtilsTest.cpp | 17 +-
test/unit/PointViewTest.cpp | 11 +
test/unit/SpatialReferenceTest.cpp | 67 +-
test/unit/Support.cpp | 51 +
test/unit/Support.hpp | 2 +
test/unit/filters/ColorizationFilterTest.cpp | 44 +-
test/unit/filters/CropFilterTest.cpp | 38 +-
test/unit/filters/DividerFilterTest.cpp | 204 +
test/unit/filters/FerryFilterTest.cpp | 50 +-
test/unit/filters/MergeTest.cpp | 40 +
.../{MergeTest.cpp => RandomizeFilterTest.cpp} | 45 +-
test/unit/filters/RangeFilterTest.cpp | 182 +-
test/unit/filters/StatsFilterTest.cpp | 16 +-
test/unit/io/bpf/BPFTest.cpp | 65 +
test/unit/io/faux/FauxReaderTest.cpp | 23 +
.../ilvis2/Ilvis2ReaderTest.cpp} | 52 +-
test/unit/io/las/LasReaderTest.cpp | 47 +
test/unit/io/las/LasWriterTest.cpp | 194 +-
vendor/{rply-1.1.3 => rply-1.1.4}/LICENSE | 4 +-
vendor/{rply-1.1.3 => rply-1.1.4}/etc/convert.c | 0
vendor/{rply-1.1.3 => rply-1.1.4}/etc/dump.c | 0
vendor/{rply-1.1.3 => rply-1.1.4}/etc/input.ply | 0
vendor/{rply-1.1.3 => rply-1.1.4}/etc/sconvert.c | 0
.../{rply-1.1.3 => rply-1.1.4}/manual/manual.html | 365 +-
.../manual/reference.css | 0
vendor/{rply-1.1.3 => rply-1.1.4}/manual/rply.png | Bin
vendor/{rply-1.1.3 => rply-1.1.4}/rply.c | 267 +-
vendor/{rply-1.1.3 => rply-1.1.4}/rply.h | 60 +-
vendor/rply-1.1.4/rplyfile.h | 68 +
348 files changed, 19942 insertions(+), 26414 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 92a4e96..c439d7d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -28,14 +28,14 @@ mark_as_advanced(CMAKE_VERBOSE_MAKEFILE)
# the next line is the ONLY place in the entire pdal system where
# the version info is hard-coded
-set(PDAL_VERSION_STRING "1.0.1" CACHE STRING "PDAL version" FORCE)
+set(PDAL_VERSION_STRING "1.1.0" CACHE STRING "PDAL version" FORCE)
DISSECT_VERSION()
GET_OS_INFO()
SET_INSTALL_DIRS()
set(PDAL_API_VERSION "1")
-set(PDAL_BUILD_VERSION "1.0.0")
+set(PDAL_BUILD_VERSION "2.0.0")
# Name of C++ library
@@ -252,7 +252,7 @@ include_directories("${CMAKE_CURRENT_BINARY_DIR}/include")
include_directories(vendor/eigen-3.1.91)
include_directories(vendor/nanoflann-1.1.8)
-include_directories(vendor/rply-1.1.3)
+include_directories(vendor/rply-1.1.4)
#------------------------------------------------------------------------------
# subdirectory controls
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..044451d
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,8091 @@
+2015-11-23
+ * Andrew Bell <andrew.bell.ia at gmail.com> Set output view SRS on merge filter. Close #1049 (12:24:30)
+ * Howard Butler <howard at hobu.co> Implement readers.tindex #1052 (11:29:06)
+
+2015-11-22
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (17:49:03)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make VLR reading/writing more closely match LAS spec. (17:48:38)
+ * Howard Butler <howard at hobu.co> Merge pull request #1047 from scott-lewis-nsidc/update-tutorial-writing-writer (08:39:53)
+ * Howard Butler <howard at hobu.co> Merge pull request #1051 from redheli/pgreader_pcid (08:39:31)
+ * Max <zhiyong.weng at gmail.com> use pg_class.oid ,pg_attribute.attrelid to get correct pcid (04:25:29)
+
+2015-11-20
+ * Howard Butler <howard at hobu.co> doc updates (17:11:12)
+
+2015-11-19
+ * Scott Lewis <scott.lewis at nsidc.org> Fixed the filename for the input. (16:00:37)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Squashed commit of the following: (12:29:44)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Debug for testing. (07:36:35)
+
+2015-11-18
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix code for windows. (19:21:07)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (17:52:47)
+ * Scott Lewis <scott.lewis at nsidc.org> Minor addition to the tutorial documentation (17:17:50)
+ * Scott Lewis <scott.lewis at nsidc.org> Updating Writing a Writer tutorial. (17:15:45)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add missed comment. (11:20:37)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Explicitly load symbols from libpython when libplang gets loaded. Close #1010. (10:59:05)
+ * chambbj <brad.chambers at gmail.com> Dart sample radius should be a double (12:17:00)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix typo. (09:31:23)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (09:27:59)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Update LAS reader doc. Close #1044 (09:27:19)
+
+2015-11-17
+ * Howard Butler <howard at hobu.co> more doc tweaks (22:07:27)
+ * Howard Butler <howard at hobu.co> predicate doc tweak (21:48:29)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (15:13:50)
+ * Howard Butler <howard at hobu.co> computing nominal point density for tessellated polygon in filters.hexbin (15:12:56)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Better comment on path elimination logic. Move init/finish to unnamed namespace in Geometry. (11:47:37)
+
+2015-11-16
+ * Andrew Bell <andrew.bell.ia at gmail.com> Don't include hexbin node twice. (19:38:07)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (17:07:53)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Smooth hexbin-generated boundaries. (17:07:10)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #1039 from gadomski/point-view-bounds-checking (15:24:22)
+ * Pete Gadomski <pete.gadomski at gmail.com> Check point view size in `getFieldAs` (07:38:55)
+ * Howard Butler <howard at hobu.co> Merge pull request #1041 from PDAL/pcl-dartsample-filter (11:05:08)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #1032 from PDAL/bpf-auto-xyz-offsets (07:35:11)
+
+2015-11-12
+ * Bradley J Chambers <brad.chambers at gmail.com> Add PCL DartSample filter, and a PDAL filter to wrap it (07:49:59)
+ * chambbj <brad.chambers at gmail.com> Fix italics in tutorial (21:23:01)
+ * chambbj <brad.chambers at gmail.com> Link the correct tutorial image (15:22:36)
+ * Howard Butler <howard at hobu.co> Merge pull request #1033 from scott-lewis-nsidc/update-write-kernel-tutorial (14:12:32)
+ * Scott Lewis <scott.lewis at nsidc.org> Changed library filename to be inline (13:36:58)
+ * Scott Lewis <scott.lewis at nsidc.org> Updating Kernel tutorial to work with new code. (13:33:58)
+ * Bradley J Chambers <brad.chambers at gmail.com> Add doc note for BPF offset=auto (12:39:53)
+ * Bradley J Chambers <brad.chambers at gmail.com> Make XYZ auto offset by default in BPF writer (11:27:16)
+ * Howard Butler <howard at hobu.co> Merge pull request #1027 from PDAL/pdal-docs-docker (08:26:09)
+ * Howard Butler <howard at hobu.co> Merge pull request #1030 from PDAL/height-filter (08:25:58)
+
+2015-11-14
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #1037 from gadomski/rivlib-cleanup (12:24:26)
+ * Pete Gadomski <pete.gadomski at gmail.com> Set default value for boolean in RxpReader (11:50:27)
+
+2015-11-13
+ * Howard Butler <howard at hobu.co> Merge pull request #1036 from scott-lewis-nsidc/update-writing-reader-tutorial (19:13:11)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix reporting check for nameValid(). (18:28:00)
+ * Scott Lewis <scott.lewis at nsidc.org> Updating reader tutorial. (17:27:03)
+
+2015-11-11
+ * chambbj <brad.chambers at gmail.com> Fix small typo in filter tutorial (19:13:02)
+ * chambbj <brad.chambers at gmail.com> Add labels for filter tutorial update (19:12:08)
+ * Bradley J Chambers <brad.chambers at gmail.com> Add note about ASPRS/LAS point classifications (14:19:29)
+ * Bradley J Chambers <brad.chambers at gmail.com> getDefaultOptions is unused, check for Classification dim when preparing filter (14:06:08)
+ * Bradley J Chambers <brad.chambers at gmail.com> Add some error checking, examples, and finalize the tutorial (13:29:16)
+ * Bradley J Chambers <brad.chambers at gmail.com> Initial commit of PCL-based normalized height filter (12:44:07)
+ * Bradley J Chambers <brad.chambers at gmail.com> Update the filter writing tutorial (08:14:13)
+
+2015-11-10
+ * Andrew Bell <andrew.bell.ia at gmail.com> gcc doesn't take declaration in argument, apparently. (17:52:08)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (17:39:30)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix option names in ground kernel. Add debug information in the case that a bad option name is found. Add a simple test for invalid option names. Close #1029 (17:38:16)
+ * chambbj <brad.chambers at gmail.com> Remove extra apostrophe in apps.rst (14:08:28)
+
+2015-11-09
+ * Howard Butler <howard at hobu.co> a note about using other dimensions besides classification (19:06:45)
+ * Howard Butler <howard at hobu.co> clipping doc tweaks (19:03:09)
+ * Howard Butler <howard at hobu.co> don't include fnctl if _WIN32 (18:51:02)
+ * Howard Butler <howard at hobu.co> clean up extra paragraph in tutorial (17:07:34)
+ * Howard Butler <howard at hobu.co> add a tutorial to describe clipping with shapefiles (16:59:23)
+ * Howard Butler <howard at hobu.co> fcntl.h no impliclitly included in later libc++ (15:55:50)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Print warning if we can't read GeoTiff VLR when one exists. Close #128 (12:44:05)
+
+2015-11-07
+ * Connor Manning <connor at hobu.co> Avoid possibly uninitialized value warning. (10:30:21)
+
+2015-11-06
+ * Howard Butler <howard at hobu.co> add Dockerfile that builds pdal.io (22:57:27)
+ * Howard Butler <howard at hobu.co> capitalization tweak from #1026 (10:16:47)
+ * Howard Butler <howard at hobu.co> Merge pull request #1026 from scott-lewis-nsidc/update-writing-tutorial (10:13:41)
+
+2015-11-05
+ * Scott Lewis <scott.lewis at nsidc.org> Updated Writing tutorial. (13:09:17)
+
+2015-11-03
+ * Howard Butler <howard at hobu.co> more doc tweaks (10:55:19)
+
+2015-11-02
+ * Howard Butler <howard at hobu.co> introductory material for stages (15:10:12)
+ * Howard Butler <howard at hobu.co> add PDAL logo back (15:00:30)
+ * Howard Butler <howard at hobu.co> point to OSGeo4W and Vagrant in windows compilation doc (11:50:20)
+ * Howard Butler <howard at hobu.co> point to vagrant in compilation doc (11:44:33)
+
+2015-11-01
+ * Howard Butler <howard at hobu.co> more doc tweaks (23:35:55)
+ * Howard Butler <howard at hobu.co> typos (23:03:13)
+ * Howard Butler <howard at hobu.co> document GDAL_CACHEMAX sensitivity in filters.colorization (22:58:51)
+ * Howard Butler <howard at hobu.co> output the PDAL plugin search path to stderr when PDAL_DEBUG environment variable is set (22:58:33)
+ * Howard Butler <howard at hobu.co> Merge pull request #1018 from PDAL/issues/997-plugin-debug (20:36:32)
+
+2015-10-30
+ * Howard Butler <howard at hobu.co> update my example cmake to catch up to elcapitan (22:15:38)
+ * Howard Butler <howard at hobu.co> output docs to build directory (22:15:15)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Move LAS metadata extraction to initialize(). (12:47:05)
+
+2015-10-29
+ * Howard Butler <howard at hobu.co> Merge pull request #1023 from PDAL/srs-prepare (16:38:31)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Test changes for SRS setting in prepare(). (15:12:06)
+ * Connor Manning <connormanning at users.noreply.github.com> Merge pull request #1021 from PDAL/reprojection-filtering (14:31:24)
+ * Connor Manning <connor at hobu.co> Merge branch 'master' into reprojection-filtering (10:22:47)
+ * Connor Manning <connor at hobu.co> Oops, throw the error, not the string. (10:18:32)
+ * Connor Manning <connor at hobu.co> Correct reprojection culling by reverting to the original behavior. Keep the reintroduced filter call. (10:15:04)
+ * Howard Butler <howard at hobu.co> Merge pull request #1020 from PDAL/reprojection-filtering (08:37:41)
+
+2015-10-28
+ * Connor Manning <connor at hobu.co> Reintroduce ReprojectionFilter::filter, used by FilterWrapper for standalone Views. Some performance tweaks. (22:45:37)
+ * Howard Butler <howard at hobu.co> lard up PluginManager with debugging lint for when PDAL_DEBUG enviro variable is set #997 (16:12:18)
+ * Howard Butler <howard at hobu.co> update the doc-building doc (13:28:05)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix range doc. (11:53:25)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Have range filter support multiple ranges for each dimension. Use simple and consistent logical arrangement of ranges. Close #1014 (11:19:46)
+ * Howard Butler <howard at hobu.co> cull top links for shorter heading on website (08:42:44)
+
+2015-10-27
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (15:35:57)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Don't divide by zero. Close #1015 (15:35:20)
+ * Howard Butler <howard at hobu.co> Documentation work. New theme and some organization. (15:13:48)
+
+2015-10-26
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (16:33:00)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Divider filter. (16:32:37)
+ * Connor Manning <connor at hobu.co> Add all dimensions for LAS QuickInfo. (11:35:31)
+
+2015-10-23
+ * Andrew Bell <andrew.bell.ia at gmail.com> New rply version. (14:33:38)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Look for FauxReader in the right place. (13:41:21)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Randomize filter. (12:51:21)
+
+2015-10-21
+ * Howard Butler <howard at hobu.co> Merge pull request #1011 from PDAL/issues/1009-cull-bad-reprojection (15:05:22)
+ * Howard Butler <howard at hobu.co> make transform() call simpler when we want to cull bad points (13:41:01)
+
+2015-10-20
+ * Andrew Bell <andrew.bell.ia at gmail.com> Change range negation character to '!' from '~'. (20:31:39)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Allow negation of ranges. Close #1001 (20:27:59)
+ * Andrew Bell <andrew.bell.ia at gmail.com> LasWriter doc update. (20:09:18)
+ * Howard Butler <howard at hobu.co> add capability to cull bad reprojection (11:24:58)
+
+2015-10-14
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove reference to dead inplacereprojection filter. (11:54:07)
+
+2015-10-13
+ * Andrew Bell <andrew.bell.ia at gmail.com> Allow digits in option names. (15:53:57)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix stuff for options changes caught in debug mode. (13:23:58)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Option names only lowercase and underscore. (11:33:50)
+
+2015-10-12
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add support for 'all' 'extra-dims' in LasWriter. (13:35:42)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix pipeline tests to work with new options. (10:47:47)
+
+2015-10-09
+ * Andrew Bell <andrew.bell.ia at gmail.com> Don't allow sub-options. (16:14:26)
+ * Andrew Bell <andrew.bell.ia at gmail.com> commit dc48725c1f54cb30649eea93691d8c5e0711c9c4 Author: Andrew Bell <andrew.bell.ia at gmail.com> Date: Wed Oct 7 11:47:40 2015 -0500 (15:25:06)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (13:51:13)
+ * Howard Butler <howard at hobu.co> compare correct thing in readers.gdal (11:18:13)
+
+2015-10-07
+ * Andrew Bell <andrew.bell.ia at gmail.com> Don't use fixed format for doubles. Use default format with significant precision. (11:30:25)
+
+2015-10-05
+ * Andrew Bell <andrew.bell.ia at gmail.com> Flat options for colorization. (10:01:19)
+
+2015-10-02
+ * Andrew Bell <andrew.bell.ia at gmail.com> Be more accepting of spaces in range specification. (09:50:32)
+
+2015-10-01
+ * Andrew Bell <andrew.bell.ia at gmail.com> Error feedback on parsing limits option. Handle various constant double formats. (20:40:10)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' into range-options (15:56:54)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add extract(). (15:56:43)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Support output_dims options for BPF. (14:33:12)
+
+2015-09-30
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'linkop' (14:26:44)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'lasperf' (14:14:58)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Somewhat improved kernel option parsing. (12:19:44)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Eliminate nested option in ferry filter. (11:59:29)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove dead code. (09:58:27)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #1007 from rouault/fix_pdal_filters_stats_test (07:39:15)
+ * Even Rouault <even.rouault at spatialys.com> StatsFilterTest: Use EXPECT_DOUBLE_EQ (05:40:33)
+
+2015-09-29
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix stats test to handle metadata more flexibly. (15:35:59)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (15:23:23)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Used fixed format for string output. (15:22:35)
+ * Howard Butler <howard at hobu.co> Merge pull request #1005 from PDAL/ilvis2-reader (11:18:58)
+ * Howard Butler <howard at hobu.co> add ILVIS2 reader test (10:48:11)
+
+2015-09-28
+ * Howard Butler <howard at hobu.co> provide untested implementation of ILVIS2 ASCII reader #1004 (14:37:10)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (11:12:08)
+
+2015-09-25
+ * Howard Butler <howard at hobu.co> Merge pull request #1003 from jwomeara/geowave-update (14:30:49)
+ * Whitney O'Meara <womeara at radiantblue.com> Updated GeoWave install script to use the latest version of GeoWave (12:54:47)
+ * Bradley J Chambers <brad.chambers at gmail.com> First cut at a revised set of options for RangeFilter (12:01:02)
+
+2015-05-28
+ * Whitney O'Meara <womeara at radiantblue.com> Updated GeoWave CMake config (08:43:30)
+ * Connor Manning <connor at hobu.co> Destruct temporary layout. (19:12:08)
+ * Connor Manning <connor at hobu.co> Add some logging to BPF dimension parsing code. (14:07:53)
+ * Connor Manning <connormanning at users.noreply.github.com> Merge pull request #929 from PDAL/close-streams (12:51:52)
+
+2015-05-15
+ * Whitney O'Meara <womeara at radiantblue.com> Updated linux-install-scripts to use precompiled geowave binaries (09:33:34)
+ * Howard Butler <howard at hobu.co> Merge pull request #918 from PDAL/p2g-zero-points (11:45:38)
+ * Howard Butler <howard at hobu.co> forward the PointTable SpatialReference() down to the raster output #917 (10:49:06)
+ * Howard Butler <howard at hobu.co> Handle P2G with zero points #914 and support collecting XYZ from all PointViews, not just the first one (10:27:55)
+ * Howard Butler <howard at hobu.co> Merge pull request #916 from PDAL/kernel-label-option (09:18:37)
+ * Howard Butler <howard at hobu.co> add option --label to kernel default arguments to allow people to tag processes (09:02:01)
+
+2015-05-06
+ * Whitney O'Meara <womeara at radiantblue.com> GeoWave package name updates (15:51:12)
+ * Michael P. Gerlek <mpg at flaxen.com> fix for #895 (15:07:09)
+ * Michael P. Gerlek <mpg at flaxen.com> temp outputs (15:06:53)
+
+2015-09-24
+ * Howard Butler <howard at hobu.co> CMAKE_SOURCE_DIR typo (12:44:04)
+ * Howard Butler <howard at hobu.co> Provide a Height Above Ground example as processed with `pdal ground` APMF filter and `filters.programmable` (12:19:26)
+
+2015-09-23
+ * Andrew Bell <andrew.bell.ia at gmail.com> Support LazPerf for compression/decompression. (18:41:53)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (17:26:28)
+ * Andrew Bell <andrew.bell.ia at gmail.com> LazPerf test depends on LasZip. (17:25:55)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' into lasperf (17:20:26)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Testing (17:01:49)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Testing (16:04:58)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Testing (15:52:56)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Testing (15:20:27)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Test install of laszip (14:50:15)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Set correct initial offset for proper chunk size. Remove debug. (13:54:57)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #999 from PDAL/remove-options (10:15:57)
+ * Bradley J Chambers <brad.chambers at gmail.com> Remove by key to remove all matching elements (10:13:51)
+ * Bradley J Chambers <brad.chambers at gmail.com> Implement Options::remove and Stage::removeOptions (08:18:42)
+ * Bradley J Chambers <brad.chambers at gmail.com> Add screenshots for outlier removal (10:06:28)
+ * Bradley J Chambers <brad.chambers at gmail.com> Change statistical outlier defaults (09:57:48)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Testing. (08:03:26)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Testing. (07:37:53)
+
+2015-09-22
+ * Andrew Bell <andrew.bell.ia at gmail.com> Formatting and comment fix. (15:39:41)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix compilation warning. (15:39:11)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' into lasperf (14:53:36)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (14:29:28)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove references to dead --xml option. Close #998 (14:21:11)
+ * Howard Butler <howard at hobu.co> no longer refer to XML output #998 (12:29:08)
+
+2015-09-18
+ * Howard Butler <howard at hobu.co> style tweaks (10:19:30)
+ * Howard Butler <howard at hobu.co> Merge pull request #992 from rouault/avoid_failures_on_pgpointcloudtest (10:17:56)
+ * Howard Butler <howard at hobu.co> readers.gdal reader for reading in raster data as point clouds #996 (10:13:46)
+
+2015-09-17
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix chunking of LazPerf writer. Add LazPerf writer test. Add documentation regarding compressor/decompressor selection. (08:15:45)
+
+2015-09-16
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' into lasperf (10:27:30)
+ * Andrew Bell <andrew.bell.ia at gmail.com> First-cut at LAZperf compression. (10:27:04)
+
+2015-09-15
+ * Howard Butler <howard at hobu.co> clean up a bunch of sphinx doc warnings (10:18:50)
+
+2015-09-14
+ * chambbj <brad.chambers at gmail.com> Merge pull request #995 from PDAL/pcl-stuff-as-filters (20:45:10)
+
+2015-09-03
+ * Bradley J Chambers <brad.chambers at gmail.com> Make some PCL functions accessible as filters (12:44:13)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add support for VLR forwarding. (17:18:16)
+
+2015-09-11
+ * Howard Butler <howard at hobu.co> Merge pull request #993 from rouault/fix_tutorial (16:32:02)
+ * Even Rouault <even.rouault at spatialys.com> Tutorial mentions rst and xml output (16:28:32)
+ * Even Rouault <even.rouault at spatialys.com> Fix failure on PgpointcloudWriterTest (15:50:10)
+ * Andrew Bell <andrew.bell.ia at gmail.com> No longer need cast. (15:27:11)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Replace raw pointer with unique_ptr. (15:24:36)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #990 from rouault/fix_kernel_memleaks (14:38:19)
+ * Even Rouault <even.rouault at spatialys.com> Add destructor to Kernel class to fix memleaks (14:34:08)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #989 from rouault/fix_pdal_info_help (14:22:23)
+ * Even Rouault <even.rouault at spatialys.com> Fix 'pdal info --help' regarding --all option (14:20:15)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Test for reading with LAZperf. Allow programmatic selection of LAZperf or LASzip. (12:16:20)
+ * Howard Butler <howard at hobu.co> point to 1.0.1 release (11:12:12)
+ * Howard Butler <howard at hobu.co> incrememnt version to 1.0.1 for release (11:09:41)
+ * Howard Butler <howard at hobu.co> add HOWTORELEASE doc (11:09:03)
+ * Howard Butler <howard at hobu.co> clean up usage() for pdal-config (11:05:48)
+ * Howard Butler <howard at hobu.co> make sure to 'make dist' in package.sh (10:45:52)
+ * Howard Butler <howard at hobu.co> add package.sh for release generation, use pdal-config for fetching version for packaging (10:44:02)
+ * Bradley J Chambers <brad.chambers at gmail.com> Fix main CMakeLists (08:25:55)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix #ifdefs. (08:14:29)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Decompress with LAZperf and v. 2 VLR item types. (06:47:56)
+
+2015-09-10
+ * Howard Butler <howard at hobu.co> point to 1.0.0 release (16:27:21)
+ * Howard Butler <howard at hobu.co> increment versions and add SOVERSION for 1.0.0 release (13:53:26)
+ * Howard Butler <howard at hobu.co> Merge pull request #986 from PDAL/issues-961-xml-schema-version (13:12:41)
+ * Howard Butler <howard at hobu.co> Merge pull request #988 from PDAL/issue/987-pc2pc (13:08:38)
+ * Bradley J Chambers <brad.chambers at gmail.com> Be sure to set the compression flag when inferring LAZ (12:09:03)
+ * Howard Butler <howard at hobu.co> link to BPF specification in docs (10:24:51)
+ * Howard Butler <howard at hobu.co> add -std=c++11 to --cxxflags output for pdal-config #984 (09:59:30)
+
+2015-09-09
+ * Howard Butler <howard at hobu.co> python setup.py fixups (23:21:06)
+ * Howard Butler <howard at hobu.co> add --plugin-dir to pdal-config output (22:51:31)
+ * Howard Butler <howard at hobu.co> Add optional version number to XMLSchema output #961 (22:20:22)
+ * Howard Butler <howard at hobu.co> XSD/XML Schema version tweaking (15:59:57)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (14:58:52)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Don't overload add() with default arguments. Close #985 (14:57:35)
+ * Howard Butler <howard at hobu.co> Add version number to XMLSchema output #961 (14:53:20)
+ * Howard Butler <howard at hobu.co> fix up pkg-config and pdal-config scripts #984 (14:18:10)
+ * Howard Butler <howard at hobu.co> Python 2 compatible string handling (10:43:42)
+ * Howard Butler <howard at hobu.co> python3-compatible unicode handling (10:37:03)
+ * Howard Butler <howard at hobu.co> init plang environment in Invocation constructor (10:36:41)
+
+2015-09-08
+ * chambbj <brad.chambers at gmail.com> Merge pull request #980 from PDAL/omni-kernel-pipeline-manager (09:26:03)
+
+2015-08-17
+ * Bradley J Chambers <brad.chambers at gmail.com> Update the translate kernel (14:26:54)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Change BOX3D to BOX2D in translate bounds option. (14:49:06)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Correct invalid SRS option. Don't explictly set scale -- allow writer to set. Close #971 (13:07:58)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Quiet compiler. (08:45:29)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove dead "register" hint. (08:32:43)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (08:19:24)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #974 from PDAL/derivative-writer (08:04:25)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #973 from PDAL/issue/972-ground-kernel-approx (07:40:33)
+ * Bradley J Chambers <brad.chambers at gmail.com> Add approximate option, pass along debug and verbose options too (07:14:21)
+
+2015-09-05
+ * Howard Butler <howard at hobu.co> Merge pull request #983 from wenzeslaus/liblas-to-pdal-transition (07:38:25)
+
+2015-09-04
+ * Vaclav Petras <wenzeslaus at gmail.com> Improve transition guide heading and fix label (11:49:52)
+ * Vaclav Petras <wenzeslaus at gmail.com> Add error handling and mention other formats (11:43:38)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Metadata for python filters. (11:28:05)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove Utils::saturation_cast. (09:51:41)
+
+2015-09-02
+ * Vaclav Petras <wenzeslaus at gmail.com> Complete 3 libLAS related questions (14:09:42)
+ * Vaclav Petras <wenzeslaus at gmail.com> Text for from libLAS transition and toc entry (14:04:39)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Use linker script to avoid linking two libraries. Linker scripts don't work on OSX :( Use --reexport_library instead. Actually use custom PointTable in test. Close #977 (09:39:41)
+
+2015-09-01
+ * Vaclav Petras <wenzeslaus at gmail.com> Add questions about libLAS (20:51:25)
+ * Vaclav Petras <wenzeslaus at gmail.com> Main code samples for libLASC API to PDAL transition (20:50:30)
+ * Andrew Bell <andrew.bell.ia at gmail.com> reexport_library for libpdal_util (16:37:43)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Diagnostic fixes for old GCC. (12:39:54)
+
+2015-08-31
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (14:48:53)
+ * Andrew Bell <andrew.bell.ia at gmail.com> New forwarding syntax. (14:48:10)
+
+2015-08-25
+ * Andrew Bell <andrew.bell.ia at gmail.com> Don't run SRS tests without Geotiff. (13:44:03)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Set and use m_srs variable in LasWriter. Add tests for set SRS. Close #981 (12:48:15)
+ * Howard Butler <howard at hobu.co> Update MrSID reader up to date with current PDAL (09:43:07)
+
+2015-08-24
+ * Howard Butler <howard at hobu.co> catch up CPD plugin to current PDAL master (09:06:53)
+
+2015-08-21
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add support for lost --polygon option in translate kernel. (12:06:57)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (12:01:54)
+
+2015-08-20
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (10:20:22)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make translate kernel more straightforward. (10:20:00)
+
+2015-08-19
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (16:15:03)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (16:15:03)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Change BOX3D to BOX3D for tindex. (16:14:27)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Eliminates/suppress warnings. (12:41:48)
+ * Connor Manning <connor at hobu.co> Get rid of a couple GCC warnings. (11:46:48)
+
+2015-08-18
+ * Andrew Bell <andrew.bell.ia at gmail.com> Replace ...contains... with ...covers... Close #976 (08:49:26)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix doc for pdal translate. (08:48:36)
+
+2014-07-03
+ * Bradley J Chambers <brad.chambers at gmail.com> Add DerivativeWriter (10:53:57)
+
+2015-08-12
+ * Howard Butler <howard at hobu.co> Merge pull request #970 from PDAL/release-gitdir-mode (20:40:47)
+ * Howard Butler <howard at hobu.co> DLL export transformWkt call (20:12:07)
+ * Howard Butler <howard at hobu.co> git/release version setting (19:56:14)
+
+2015-08-11
+ * Andrew Bell <andrew.bell.ia at gmail.com> Doc for a_srs option on tindex kernel. (19:12:51)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Handle file with missing SRS and --a_srs option. Close #969 (17:20:41)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge of lots of little changes. Support transformation of crop input geometry. (13:55:29)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (10:37:16)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Change import_array() call to deal with python 3. (10:27:59)
+
+2015-08-09
+ * Howard Butler <howard at hobu.co> update AUTHORS (23:21:01)
+
+2015-08-07
+ * Howard Butler <howard at hobu.co> sort test output from python dict for stability (11:03:44)
+ * Howard Butler <howard at hobu.co> set host to localhost, not test for pgpointcloud test in my example config (10:43:59)
+ * Howard Butler <howard at hobu.co> add PGPOINTCLOUD_TEST_DB_HOST to my example config (10:29:18)
+ * Howard Butler <howard at hobu.co> add my OCI config for testing to my example file (10:21:29)
+ * Howard Butler <howard at hobu.co> libplang.so needs to do PDAL_ADD_LIBRARY for @rpath and such (08:45:05)
+
+2015-08-06
+ * Howard Butler <howard at hobu.co> Merge pull request #963 from PDAL/add-reclassification-example (13:53:59)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (13:49:47)
+ * Howard Butler <howard at hobu.co> update my example cmake configuration (13:48:49)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/python' into python (13:42:45)
+ * Howard Butler <howard at hobu.co> add tutorial links to main docs page (13:42:44)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Lost...? (13:42:32)
+ * Andrew Bell <andrew.bell.ia at gmail.com> More MSVC fixes. (12:51:26)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fixes for MSVC. (09:48:02)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Explict cast in numericCast(). (08:02:41)
+
+2015-08-05
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/python' into python (21:48:13)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' into python (21:33:45)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix link issues that allow python to be embedded in a dll with gcc. (20:13:55)
+
+2015-08-04
+ * Howard Butler <howard at hobu.co> add filters.programmable example that does classification reassignment (13:07:17)
+
+2015-07-31
+ * Howard Butler <howard at hobu.co> fix up greyhound compilation failure (15:15:16)
+ * Andrew Bell <andrew.bell.ia at gmail.com> More tests for ColorizationFilter. (13:54:39)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Have colorization filter add the dimensions it's going to write. (13:08:47)
+
+2015-07-29
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add bundle test files. (17:32:06)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add support to write bundled files in BPF3. (17:10:49)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (16:49:42)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add getFilename() for FileUtils. (16:49:22)
+
+2015-07-27
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' into python (16:40:17)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix output for non-GEOS case. (13:18:09)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Update crop filter doc. (12:48:56)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (12:35:53)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Have CropFilter take 2D bounds instead of 3D to be consistent with polygon. Use both bounds and polygons if both are specified. (12:34:58)
+
+2015-07-24
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make location scaling (auto conversion to/from scaled int) more generic to handle data that may have been written as scaled floats, etc. (21:53:04)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Explicitly link libdl. Not sure why. (16:47:50)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (16:30:23)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Scale X,Y and Z, even if we're not doing ints. (16:29:55)
+
+2015-07-23
+ * Howard Butler <howard at hobu.co> tweak missing calculateBounds call (22:33:46)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Don't double-prepare a pipeline. (18:01:08)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Don't build HeightAboveGroundKernel for now. (17:53:30)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add Utils::hexDump(). (17:43:57)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Roll back change to library install location for now. (17:31:44)
+
+2015-07-22
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (17:10:33)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make BOX2D and adjust code and tests. Close #897 (16:53:10)
+ * Howard Butler <howard at hobu.co> Merge branch 'issues/871-CMAKE_INSTALL_LIBDIR-usage' (00:36:18)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' into initial-hag-kernel (00:33:54)
+ * Howard Butler <howard at hobu.co> Add Brad's API reader/writer/filter usage tutorials. (00:03:38)
+
+2015-07-21
+ * Howard Butler <howard at hobu.co> Salvage #928 and keep SQLite error handling additions that were in that PR (23:59:36)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix to global_encoding bit. (13:58:21)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (13:57:11)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Have crop filter create an output PointView for each box/poly set as an arg. Add Options::getValues(). (13:55:00)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Revert accidental commit. (13:36:13)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Use our numericCast to get rid of boost::numeric_cast -- for now. (11:33:26)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Call done() on LazPerfCompressor if there's an exception. (10:19:37)
+
+2015-07-20
+ * Andrew Bell <andrew.bell.ia at gmail.com> Better debug for out-of-range data for packed DB ints. (18:18:16)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add comment. (10:27:20)
+
+2015-07-17
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (09:13:53)
+ * Andrew Bell <andrew.bell.ia at gmail.com> ifdef unix-only stuff. (09:13:25)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #959 from oscarmartinezrubiorg/master (08:56:28)
+ * “oscar.martinez.rubi” <omrubi at gmail.com> Add options for x and y origins and change data type of m_length option. Also include origin attributes when passing options to the Splitter filter (05:22:12)
+ * “oscar.martinez.rubi” <omrubi at gmail.com> Change m_lenght to double (as required by the Splitter filter) and add attributes for the x and y origins (also doubles) (05:20:38)
+ * “oscar.martinez.rubi” <omrubi at gmail.com> Make default value a double (1000.) (05:18:51)
+
+2015-07-16
+ * Howard Butler <howard at hobu.co> Merge pull request #957 from PDAL/revert-943-pcl-travis (16:43:16)
+ * Howard Butler <howard at hobu.co> Merge pull request #958 from PDAL/inline-pdal-error (16:43:06)
+ * Howard Butler <howard at hobu.co> inline a few more exceptions (16:07:49)
+ * Howard Butler <howard at hobu.co> inline the definition of pdal_error in an attempt to shut up MSVC about exports (15:42:49)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add progress reporting for pipelines. (14:46:27)
+ * Howard Butler <howard at hobu.co> Revert "Turn PCL on in Travis as an optional component" (10:10:51)
+
+2015-07-15
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove dead code. (16:14:06)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Put all utilities in the same namespace. (15:57:27)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Move Utils.XX to util subdir. (14:16:18)
+
+2015-07-14
+ * Andrew Bell <andrew.bell.ia at gmail.com> Update CompressionTest for new schema. (19:18:44)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix 1.4 scan angle. (18:05:41)
+
+2015-07-13
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix writing of point formats 6-10 to match spec. (15:03:55)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Allow info kernel to take extra command-line options. (13:34:56)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add "count" option to stats filter. Close #955 (13:08:32)
+
+2015-07-10
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove dead code. (11:11:38)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix repro filter test now that GEOTIFF macro is fixed. (11:11:05)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix GEOTIFF include directive. (10:40:18)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix comment typo. (10:39:40)
+
+2015-07-08
+ * Andrew Bell <andrew.bell.ia at gmail.com> Update NitfWriter documentation. Remove dead code. (11:54:52)
+
+2015-07-07
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add tests for NitfWriter as FlexWriter. (16:35:08)
+
+2015-07-06
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add documentation for LasWriter as FlexWriter. (19:56:22)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make LasWriter a FlexWriter. (18:58:55)
+
+2015-07-05
+ * Howard Butler <howard at hobu.co> Merge pull request #943 from PDAL/pcl-travis (15:17:35)
+
+2015-07-03
+ * Howard Butler <howard at hobu.co> bring forward inferred options from the writer (for compression) for tindex (14:50:22)
+ * Howard Butler <howard at hobu.co> trap for when we can't make the filters.hexbin stage in tindex (14:11:01)
+ * Howard Butler <howard at hobu.co> make sure to set filename when fetching file info in tindex (13:35:24)
+ * Howard Butler <howard at hobu.co> PclVisualizer typo (13:15:55)
+ * Howard Butler <howard at hobu.co> Merge remote-tracking branch 'origin/master' into grid-1.4.0 (13:11:02)
+
+2015-07-02
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make BpfWriter a FlexWriter. (14:59:12)
+
+2015-07-01
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add back ctors. (11:05:05)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' into grid-1.4.0 (09:36:01)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Minor clean-up. (08:20:47)
+
+2015-06-30
+ * Andrew Bell <andrew.bell.ia at gmail.com> BPF writer header_data option doc. (17:02:09)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add support for writing extra BPF header data. (16:57:27)
+
+2015-06-26
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove pdal_error. (19:35:19)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Simplify exception hierarchy. Close #12 (18:35:44)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #949 from gadomski/issues/907-matlab-writer (16:44:32)
+ * Connor Manning <connor at hobu.co> Remove extraneous quotation mark. (11:56:25)
+
+2015-05-20
+ * Pete Gadomski <pete.gadomski at gmail.com> Add a matlab writer (09:30:22)
+ * Pete Gadomski <pete.gadomski at gmail.com> Remove outfile check in the hexbin test (09:36:28)
+ * Pete Gadomski <pete.gadomski at gmail.com> Enable hexbin tests on travis (09:35:08)
+ * Howard Butler <howard at hobu.co> Merge remote-tracking branch 'origin/master' into grid-1.4.0 (15:16:51)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add --write_absolute_path option to tindex kernel. (15:13:25)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add dump() function for BPF Mueller matrix. (14:52:12)
+
+2015-06-25
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #948 from gadomski/hexboundary-on-travis (18:42:01)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Allow a count to be provided as part of `pdal info --query`. Close #922 (17:25:16)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove unimplemented function definition. Close #946 (16:03:57)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fixup pdal options. (15:53:21)
+ * Howard Butler <howard at hobu.co> Merge remote-tracking branch 'origin/master' into grid-1.4.0 (14:17:48)
+
+2015-06-24
+ * Andrew Bell <andrew.bell.ia at gmail.com> Better fix for ply reader error. (15:12:54)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Have kdtree_distance actually work. Use radius properly. Check for valid dimensions in KDIndex. (14:18:08)
+
+2015-06-23
+ * Andrew Bell <andrew.bell.ia at gmail.com> Set dimensionality of KDIndex at compile time. (17:33:41)
+ * Andrew Bell <andrew.bell.ia at gmail.com> More hardening of nanoflann/KDIndex. (13:49:02)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Cast user-data in callback to proper type to avoid test failures. (11:23:08)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (11:22:13)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Eliminte data corruption in KDIndex. Part of Issue 922. (08:49:29)
+
+2015-06-22
+ * chambbj <brad.chambers at gmail.com> Merge pull request #945 from PDAL/issue/944-ground-classify-broken (13:30:02)
+ * Bradley J Chambers <brad.chambers at gmail.com> Fix scope of ground filtered indices (13:29:13)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add test for KDIndex. (10:25:56)
+
+2015-06-20
+ * Howard Butler <howard at hobu.co> Merge branch 'master' into grid-1.4.0 (14:14:38)
+
+2015-06-19
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (15:52:47)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Allow delta kernel to evaluate all dimensions. Close #640 (15:50:25)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Set default build type to RelWithDebInfo. (08:52:49)
+
+2015-06-18
+ * Bradley J Chambers <brad.chambers at gmail.com> Turn PCL on in Travis as an optional component (12:41:42)
+ * Howard Butler <howard at hobu.co> don't throw an error when we see options we can't split for --reader.whatever (08:45:34)
+
+2015-06-17
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add support for conditional options on stages. Support extra stage options for tindex. (14:30:53)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Pass bounds box to crop filter if it exists. (11:17:18)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Allow bounding box specified as X,Y,Z as well as WKT for geometry filter. (10:31:54)
+
+2015-06-16
+ * Andrew Bell <andrew.bell.ia at gmail.com> Rework a bit of the info kernel to simplify and avoid multiple calls to prepare(). Allow multiple options to be specified in many cases. (16:42:00)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Don't use info kernel for tindex kernel. (15:49:43)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (09:22:39)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Move portable_endian to util. (09:22:09)
+
+2015-06-15
+ * Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (20:26:30)
+ * Howard Butler <howard at hobu.co> public method to do --summary from code (20:26:26)
+ * Howard Butler <howard at hobu.co> --fast-boundary implementation based on --summary info (20:26:02)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Initialize pointers and check values on destruction. (16:55:08)
+ * Andrew Bell <andrew.bell.ia at gmail.com> More doc fixes and updates for consistency. (11:56:46)
+
+2015-06-11
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (09:15:39)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Doc updates. (09:15:15)
+
+2015-06-10
+ * Howard Butler <howard at hobu.co> Merge remote-tracking branch 'origin/master' into grid-1.4.0 (20:53:32)
+ * Howard Butler <howard at hobu.co> protect initialization of LasReader stream from destruction (NITF driver interaction (20:25:25)
+ * Howard Butler <howard at hobu.co> don't use fancy deleter for OGRCT and OGRSpatialReferenceH (19:55:24)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://www.github.com/PDAL/PDAL (14:54:39)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix tests to go with correct GEOTIFF tag. Close #937 (14:49:05)
+ * Howard Butler <howard at hobu.co> doc typo (14:23:28)
+ * Howard Butler <howard at hobu.co> tweak mike's bash example (14:22:05)
+ * Howard Butler <howard at hobu.co> add mike's bash example to docs (14:20:27)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Correct record ID for GEOTIFF doubles records. (12:04:09)
+
+2015-06-07
+ * Howard Butler <howard at hobu.co> Merge pull request #936 from PDAL/fast-boundary-tindex (16:48:30)
+ * Howard Butler <howard at hobu.co> provide --fast-boundary method for pdal tindex to just use the bbox of the file instead of hexbin boundary (16:48:08)
+ * Howard Butler <howard at hobu.co> Merge pull request #935 from PDAL/GDALUtils-spatialref-empty (16:47:15)
+ * Howard Butler <howard at hobu.co> add empty() method to check if a GDAL srs doesn't have anything (16:46:50)
+ * Howard Butler <howard at hobu.co> Merge pull request #934 from PDAL/no-default-hexbin (16:45:46)
+ * Howard Butler <howard at hobu.co> only do filters.hexbin boundary for pdal info if --boundary is given as an argument (16:41:37)
+ * Howard Butler <howard at hobu.co> a note about lidar2dems (10:53:12)
+ * Howard Butler <howard at hobu.co> Merge pull request #933 from PDAL/rialto-removal (10:24:05)
+
+2015-06-05
+ * Michael P. Gerlek <mpg at flaxen.com> removal of (old) Rialto from PDAL repo (14:33:20)
+ * Howard Butler <howard at hobu.co> check if we have already indexed a particular file and don't do it if we have (12:54:24)
+ * Howard Butler <howard at hobu.co> mark us as not initialized if we destroyStream (12:36:54)
+
+2015-06-04
+ * Howard Butler <howard at hobu.co> protect against multiple initialize() calls leaking streams (19:51:34)
+ * Howard Butler <howard at hobu.co> some tindex docs (09:55:35)
+ * Howard Butler <howard at hobu.co> Merge remote-tracking branch 'origin/master' into grid-1.4.0 (09:31:02)
+ * Howard Butler <howard at hobu.co> Merge pull request #932 from PDAL/stdin-pdal-tindex-930 (09:30:23)
+ * Howard Butler <howard at hobu.co> support stdin as read mechanism for file list for #930 (09:25:55)
+
+2015-05-29
+ * Connor Manning <connor at hobu.co> Attempted stopgap fix for BPF V1 header parsing. (09:59:56)
+
+2015-05-27
+ * Connor Manning <connor at hobu.co> Clean up streams. (17:01:40)
+ * Michael P. Gerlek <mpg at flaxen.com> pretty up the error strings (07:38:22)
+
+2015-05-26
+ * Andrew Bell <andrew.bell.ia at gmail.com> Set valid flag on QuickInfo. (14:27:48)
+ * Howard Butler <howard at hobu.co> Merge remote-tracking branch 'origin/master' into grid-1.4.0 (13:17:22)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Initialize data to 0. (09:51:01)
+ * Michael P. Gerlek <mpg at flaxen.com> explicitly scope the database read & write (09:41:30)
+ * Michael P. Gerlek <mpg at flaxen.com> better error handling, as per #927 (09:38:49)
+
+2015-05-21
+ * Howard Butler <howard at hobu.co> Merge remote-tracking branch 'origin/master' into grid-1.4.0 (14:52:58)
+ * Howard Butler <howard at hobu.co> Merge pull request #925 from PDAL/explicit-plugin-load (14:52:41)
+ * Howard Butler <howard at hobu.co> explicit plugin loading via option #924 (14:42:12)
+ * Howard Butler <howard at hobu.co> explicit loadPlugin function for filter Options specified in pipelines #924 (14:12:10)
+
+2015-05-19
+ * Andrew Bell <andrew.bell.ia at gmail.com> Use feature instead of SRS for field string. (20:04:21)
+ * Howard Butler <howard at hobu.co> OGR_F_SetFieldString needs hFeature, not gdal::SpatialRef as first argument (16:26:59)
+
+2015-05-18
+ * Andrew Bell <andrew.bell.ia at gmail.com> Windows work. (14:47:18)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Always register X, Y and Z for BPF as doubles. (14:05:41)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add missed call to fileTimes(). (12:20:53)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Use _stat instead of stat for windows. (11:53:56)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix file time stuff for windows. (11:39:33)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix for Windows. (10:45:21)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge of tindex. (10:32:25)
+
+2015-05-13
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #913 from PDAL/stage-ownership (11:39:39)
+
+2015-05-12
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add support for owning stages in the StageFactory. (19:11:11)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #910 from PDAL/bbox_precisionloss (17:30:26)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #911 from PDAL/sqlite_improvements (17:29:22)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #912 from PDAL/lasreadertest-lint (17:28:52)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (16:24:56)
+ * Michael P. Gerlek <mpg at flaxen.com> boost removals (16:18:21)
+ * Michael P. Gerlek <mpg at flaxen.com> cleaner LogPtr (16:17:43)
+ * Michael P. Gerlek <mpg at flaxen.com> misc refactoring and cleanups (15:05:16)
+ * Michael P. Gerlek <mpg at flaxen.com> Fix for bbox precision loss (#909) (14:29:33)
+ * Howard Butler <howard at hobu.co> Merge pull request #903 from PDAL/approximate-pdal-ground (11:30:36)
+ * Howard Butler <howard at hobu.co> Merge pull request #904 from PDAL/detect-bad-las-files (11:29:35)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Use a != a instead of isnan(). (09:46:27)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add cmath. (09:37:57)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (09:25:26)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix nan comparison. (09:25:06)
+
+2015-05-09
+ * Howard Butler <howard at hobu.co> clean up extra tabs in gitignore (15:26:17)
+ * Howard Butler <howard at hobu.co> Don't blindly read LAS files that don't have the first four magic 'LASF' bytes (14:38:55)
+
+2015-05-08
+ * Howard Butler <howard at hobu.co> Add --approximate option to 'pdal ground' for much faster computation #883 (14:52:46)
+ * Howard Butler <howard at hobu.co> Merge pull request #901 from PDAL/issue-897 (12:54:05)
+ * Howard Butler <howard at hobu.co> Merge pull request #902 from PDAL/las-header-incorrect-pointcount (12:53:54)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge pull request #896 from PDAL/issue-895 (12:08:18)
+ * Howard Butler <howard at hobu.co> Attempt to support mis-labeled LAS headers in the case where the header's size is larger than the actual number of bytes in the file would otherwise suggest. This supercedes #893. (11:20:29)
+ * Howard Butler <howard at hobu.co> Merge branch 'gadomski-las-header-incorrect-pointcount' into las-header-incorrect-pointcount (10:54:16)
+ * Howard Butler <howard at hobu.co> Merge pull request #887 from PDAL/pm-consistency (10:43:04)
+ * Michael P. Gerlek <mpg at flaxen.com> committing again, this time without gratuitous actor fix (10:42:41)
+ * Michael P. Gerlek <mpg at flaxen.com> (fails on MSVC, see #897 and #900) (10:28:28)
+ * Howard Butler <howard at hobu.co> loadByPath should load DynamicLibrary if they're not already loaded (09:41:31)
+ * Howard Butler <howard at hobu.co> Merge pull request #899 from strk/pointcloud-docs (08:17:23)
+ * Howard Butler <howard at hobu.co> Merge pull request #898 from strk/patch-2 (08:17:16)
+ * Michael P. Gerlek <mpg at flaxen.com> added note and test case for #897 (07:20:56)
+ * Sandro Santilli <strk at keybit.net> Document "pcid" option of PgPointcloud writer plugin (03:16:27)
+ * Sandro Santilli <strk at keybit.net> Add website link to README file (03:01:49)
+
+2015-05-07
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (13:02:10)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add origin support for SplitterFilter. (13:01:51)
+ * Connor Manning <connor at hobu.co> Remove extraneous semicolons. (11:09:53)
+
+2015-05-05
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove boost from Log code. Remove dead code from GDALUtils. (21:10:08)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add doc for BPF reader/writer. Add description of "auto" scaling. (15:04:36)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (12:18:25)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix extra options for PCL kernels. (12:18:02)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #894 from gadomski/issues/878-ply-writer (07:29:59)
+
+2015-05-04
+ * Pete Gadomski <pete.gadomski at gmail.com> Add a ply writer (09:48:48)
+ * Pete Gadomski <pete.gadomski at gmail.com> Failing test for invalid pointcount in las header (16:00:01)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #892 from gadomski/issues/878-ply-reader (13:34:21)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #891 from gadomski/fix-merge-test (10:25:55)
+ * Pete Gadomski <pete.gadomski at gmail.com> Add space between filename and output redirection (09:59:49)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge kernel. (09:18:23)
+
+2015-05-01
+ * Pete Gadomski <pete.gadomski at gmail.com> Add a ply reader (19:37:10)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' into python (15:41:36)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add auto-scaling. (11:17:17)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #889 from PDAL/casting (10:17:24)
+
+2015-04-30
+ * Connor Manning <connor at hobu.co> Remove boost::numeric_cast. (15:51:45)
+
+2015-04-29
+ * Andrew <andrew at abell-vb2.(none)> Fixes for g++/Ubuntu compilation. (10:34:50)
+ * Andrew <andrew at abell-vb2.(none)> Fixes for g++/Ubuntu compilation. (10:34:50)
+
+2015-04-28
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' into python (10:53:47)
+
+2015-04-27
+ * Andrew Bell <andrew.bell.ia at gmail.com> Const applies to type, in this case a reference, which makes no sense, so introduce a const type. (20:01:28)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Redo zone calculation based on several sources found elsewhere. Eliminate bad abs() call and resulting confusion. (20:00:31)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Changes in python based on changes in master. (19:55:28)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into python (19:54:03)
+
+2015-04-26
+ * Connor Manning <connor at hobu.co> Merge remote-tracking branch 'gadomski/missing-plugin-cleanup' into pm-consistency (10:20:14)
+ * Connor Manning <connor at hobu.co> Plugin manager tweaks. Avoid integer return codes and simplify a couple things. (10:19:34)
+
+2015-04-25
+ * Pete Gadomski <pete.gadomski at gmail.com> Load only one plugin when guessing plugin names (10:53:15)
+
+2015-04-24
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'enable-sqlite-on-travis' (08:00:52)
+
+2015-04-23
+ * Pete Gadomski <pete.gadomski at gmail.com> Enable sqlite on travis (15:31:52)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'enable-points2grid-on-travis' (15:17:02)
+ * Pete Gadomski <pete.gadomski at gmail.com> Enable points2grid testing on Travis (13:26:54)
+
+2015-04-22
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'icebridge-on-travis' (16:49:29)
+ * Pete Gadomski <pete.gadomski at gmail.com> Enable icebridge plugin on Travis (16:31:06)
+ * Connor Manning <connormanning at users.noreply.github.com> Merge pull request #882 from PDAL/constify-stage-factory (11:31:08)
+ * Connor Manning <connor at hobu.co> Constify StageFactory functions. (10:49:49)
+
+2015-04-21
+ * Howard Butler <howard at hobu.co> support STDOUT or STOUT as spelling for stdout (10:23:48)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (10:08:32)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add doc for pdal split. (10:08:12)
+ * Howard Butler <howard at hobu.co> STDOUT output for --pointcloudschema hidden option #863 (09:56:05)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add split kernel. (09:37:59)
+
+2015-04-20
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove dead code. (09:27:39)
+
+2015-04-18
+ * Pete Gadomski <pete.gadomski at gmail.com> Fix up rxp reader and tests for new regime (16:32:09)
+
+2015-04-15
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add support for enumeration of statistics values. (13:06:37)
+
+2015-04-14
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add test for non-standard dimension names. (14:41:10)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make schema hold XMLdims so that names get output for non-standard dimensions. (14:13:04)
+
+2015-04-11
+ * Howard Butler <howard at hobu.co> Merge pull request #877 from jwomeara/geowave-vagrant-fix (09:24:04)
+
+2015-04-10
+ * Whitney O'Meara <womeara at radiantblue.com> Fixed documentation URL and line endings for geowave service script (19:19:35)
+ * Howard Butler <howard at hobu.co> use CMAKE_INSTALL_LIBDIR to catch lib64 on certain platforms for lib/ installation location #871 (15:36:28)
+ * Howard Butler <howard at hobu.co> Merge pull request #876 from PDAL/PointCloudSchema-update (15:26:45)
+ * Howard Butler <howard at hobu.co> increment version of PointCloudSchema XSD to 1.3 to include <metadata> for every dimension #872 (15:14:19)
+ * Howard Butler <howard at hobu.co> Merge pull request #875 from jwomeara/docs-update (15:00:37)
+ * Whitney O'Meara <womeara at radiantblue.com> Updated GeoWave plugin config URL (14:51:24)
+ * Howard Butler <howard at hobu.co> Merge pull request #874 from jwomeara/geowave-update (11:46:42)
+ * Whitney O'Meara <womeara at radiantblue.com> Updated vagrant provisioning to use common GeoWave jace bindings (09:25:05)
+
+2015-04-09
+ * Howard Butler <howard at hobu.co> make sure to add base options to 'pdal info' in addition to hidden ones described in #863 (15:49:50)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Ensure sufficient precision for offset and scale in XMLSchema. (15:13:56)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove some dead code. Make call_once use consistent. (11:58:20)
+ * Howard Butler <howard at hobu.co> Merge pull request #863 from PDAL/sdo_pc (10:17:27)
+ * Howard Butler <howard at hobu.co> Refactor and cleanup of gdal::Debug => gdal::ErrorHandler #870 (10:12:13)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'more-optional-deps-from-ppa' (08:59:28)
+ * Howard Butler <howard at hobu.co> Merge remote-tracking branch 'origin/master' into sdo_pc (08:35:33)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Change LazPerfCompressor warning from exception to error output. (07:12:31)
+
+2015-04-06
+ * Pete Gadomski <pete.gadomski at gmail.com> Install laz-perf from our PPA (09:05:16)
+ * Connor Manning <connor at hobu.co> Remove unnecessary typedef declarations. (13:40:20)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #868 from PDAL/layout-ownership (12:28:34)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add compression to OCI. Add a simple buffer implementation to the Compression header. Make sure done() only gets called once for the LazPerf compressor. Have compression tests use new compression buffer. (12:19:26)
+ * Connor Manning <connor at hobu.co> Make the PointTable's Layout not be a shared pointer. (11:23:40)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #866 from gadomski/travis-cleanup (08:48:06)
+
+2015-04-08
+ * Andrew Bell <andrew.bell.ia at gmail.com> Duh. (14:10:57)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove debug. (13:10:04)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Use custom comparator for PointViewSet. Test comparator for PointViewSet. (12:52:04)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (09:06:51)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add OCI test code. (09:06:27)
+
+2015-04-07
+ * Andrew Bell <andrew.bell.ia at gmail.com> Formatting. (14:39:29)
+ * Connor Manning <connormanning at users.noreply.github.com> Merge pull request #869 from PDAL/filter-reference (13:40:36)
+ * Connor Manning <connor at hobu.co> Take PointView reference instead of shared_ptr in filter(). (13:03:10)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/nitf-writer-igeolo-precision' (09:56:24)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'issues-854' (09:52:30)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix typo. (09:50:04)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Change plugin.h to plugin.hpp. Modify the plugin structure to use std::string. (09:10:28)
+
+2015-04-05
+ * Pete Gadomski <pete.gadomski at gmail.com> Remove unused cmake variables in CI script (14:23:01)
+ * Pete Gadomski <pete.gadomski at gmail.com> Reorganize apt-get installs (14:09:37)
+ * Pete Gadomski <pete.gadomski at gmail.com> Use pdal's ppa for pgpointcloud (09:42:07)
+
+2015-03-27
+ * Pete Gadomski <pete.gadomski at gmail.com> Consolidate apt-get installs (16:40:57)
+ * Pete Gadomski <pete.gadomski at gmail.com> Install libgeotiff from apt instead of from source (16:39:46)
+ * Pete Gadomski <pete.gadomski at gmail.com> Bump required cmake version to 2.8.11 (15:43:41)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #852 from PDAL/geotiff-optional-cmake (19:40:10)
+ * Pete Gadomski <pete.gadomski at gmail.com> Allow fresh cmake builds w/o geotiff (16:32:05)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #844 from strk/test-built-plugins (16:11:09)
+
+2015-04-03
+ * Andrew Bell <andrew.bell.ia at gmail.com> commit aea7c9db37f3b30a3d035aa6559dc20609233ae5 Author: Andrew Bell <andrew.bell.ia at gmail.com> Date: Fri Apr 3 14:02:09 2015 -0500 (16:03:24)
+ * Howard Butler <howard at hobu.co> apply patch from Todd Murphy to ensure valid boxes for small footprints in IGEOLO in writers.nitf (15:18:55)
+ * Howard Butler <howard at hobu.co> protect XMLSchema with PDAL_HAVE_LIBXML2 (08:09:00)
+
+2015-04-02
+ * Howard Butler <howard at hobu.co> add ability for pdal::Kernel to add hidden switches, use to implement --pointcloudschema output for pdal info and pdal pipeline (16:33:26)
+
+2015-04-01
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix point-major reads for OCI. Add point-major tests for OCI. (20:50:50)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make OCI tests work. Allow OCI connection string to be set in CMakeCache.txt or with --connection=string on command line. (17:13:10)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add auto-offset support to OCI. (13:53:35)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove errant size set for location scaling. (13:32:01)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Force ordering of PointViews in sets to follow creation order. (07:34:19)
+
+2015-03-31
+ * Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (16:01:58)
+ * Howard Butler <howard at hobu.co> split up nitf tests (16:00:57)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Separate NITF reader/writer tests. (14:06:04)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Missed file. (13:43:55)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (13:35:45)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Move test main from cmake to pdal code. (13:35:14)
+ * Howard Butler <howard at hobu.co> Merge pull request #856 from PDAL/add-boost-dirs-to-config (11:40:18)
+ * Howard Butler <howard at hobu.co> Merge pull request #857 from PDAL/catch-up-geowave (11:33:17)
+ * Howard Butler <howard at hobu.co> catch up GeoWave to new plugin architecture #855 (10:32:38)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/reader-callbacks' (10:31:28)
+ * chambbj <brad.chambers at gmail.com> external projects using pdal will also need the boost include and library dirs (09:26:28)
+
+2015-03-30
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove unused pack option. Don't add size to total twice in point-major writes. (20:46:08)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (18:40:24)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix problems with reading/writing multiple tiles. Fix issue with positioning for dimension-major files. (18:39:54)
+
+2015-03-26
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (18:43:51)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Debug. (18:42:33)
+ * Connor Manning <connor at hobu.co> Fix warnings. Add virtual destructor to PointView. (14:31:44)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #849 from PDAL/travis-optimization (14:15:57)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #850 from PDAL/export-toJSON (13:32:34)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #842 from PDAL/windows-warnings (13:32:03)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #846 from strk/travis (09:06:01)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #848 from gadomski/homepage-typo (08:46:35)
+ * Bradley J Chambers <brad.chambers at gmail.com> export overloaded toJSON, make appveyor/windows happy (08:09:05)
+ * Bradley J Chambers <brad.chambers at gmail.com> see if ninja works out of the box with the existing cmake ppa (07:41:55)
+
+2015-03-25
+ * Pete Gadomski <pete.gadomski at gmail.com> Fix small typo in homepage index (23:17:34)
+ * Sandro Santilli <strk at keybit.net> Have Travis run pgpointcloud tests (04:31:06)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (09:38:23)
+ * Andrew Bell <andrew.bell.ia at gmail.com> emplace not supported on older 4.7 gcc. (09:38:00)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #847 from gadomski/2d-bounds-bug (09:05:01)
+ * Pete Gadomski <pete.gadomski at gmail.com> Fix maxy bug for 2D BOX3Ds (08:52:26)
+
+2015-03-24
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add NullWriter doc. (15:40:48)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (15:19:49)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add a NULL writer. (15:19:27)
+ * Connor Manning <connor at hobu.co> Layout members private->protected for derivers. (15:17:50)
+ * Sandro Santilli <strk at keybit.net> Request ctest to load plugins from the build dir (12:53:27)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (12:50:30)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add toMetadata to Options. (12:48:55)
+ * Howard Butler <howard at hobu.co> don't install bash-completion globally, put in CMAKE_INSTALL_PREFIX (10:29:34)
+
+2015-03-23
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add support for options -> JSON. (19:13:48)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Format changes. (10:48:34)
+
+2015-03-20
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #837 from strk/pgpointcloud-quotes (09:48:45)
+
+2015-03-19
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (20:10:15)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Rename StageTester -> StageWrapper (20:09:51)
+ * Connor Manning <connor at hobu.co> Allow Layout::update override. (15:19:22)
+ * Bradley J Chambers <brad.chambers at gmail.com> fix typo in MortonOrderFilter (09:27:01)
+ * Bradley J Chambers <brad.chambers at gmail.com> fix bad rebase with master (06:44:40)
+
+2015-03-18
+ * Bradley J Chambers <brad.chambers at gmail.com> revert some changes, use /W3 instead of /W4 (14:05:03)
+ * Connor Manning <connor at hobu.co> Add reader callbacks. (21:21:18)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (18:39:08)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Squashed commit of the following: (16:23:26)
+ * Howard Butler <howard at hobu.co> Merge pull request #815 from strk/bash-completion (15:01:40)
+ * Howard Butler <howard at hobu.co> Merge pull request #814 from strk/check (15:01:29)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #841 from strk/pgpointcloud-capacity (10:21:22)
+ * Sandro Santilli <strk at keybit.net> Stop advertising unsupported "capacity" pgpointcloud writer option (10:15:49)
+ * Sandro Santilli <strk at keybit.net> Do not assume default column name in PgWriter::writeTile (08:30:30)
+ * Sandro Santilli <strk at keybit.net> Fix fetchPcid in presence of a schema option (08:20:49)
+ * Sandro Santilli <strk at keybit.net> Properly quote PG identifiers (05:09:46)
+ * Sandro Santilli <strk at keybit.net> Drop partial support for "capacity" option in pgpointcloud. (09:30:53)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Enhance replaceAll test. (08:46:59)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (08:27:17)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix Utils::replaceAll. Add tests. (08:26:48)
+ * chambbj <brad.chambers at gmail.com> Update install.cmd (06:26:23)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #838 from strk/patch-1 (06:18:01)
+ * Sandro Santilli <strk at keybit.net> fix typo (06:13:09)
+ * chambbj <brad.chambers at gmail.com> Update appveyor.yml (05:54:51)
+
+2015-03-13
+ * Bradley J Chambers <brad.chambers at gmail.com> Windows clean-up (mostly warnings) (11:16:39)
+ * Sandro Santilli <strk at keybit.net> Install bash completion IFF /etc/bash_completion.d exists (05:09:04)
+ * Sandro Santilli <strk at keybit.net> Add bash completion script (04:43:29)
+ * Sandro Santilli <strk at keybit.net> Add a --list-commands switch to pdal app (04:23:21)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' into issues-778 (16:57:59)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #817 from PDAL/issues-816 (16:49:50)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Don't access different lists in loop. (16:19:35)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (11:37:53)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove unused arguments. (11:37:24)
+ * Howard Butler <howard at hobu.co> update slack notification token (08:43:15)
+ * Bradley J Chambers <brad.chambers at gmail.com> use standard compiler macros (07:12:31)
+ * Bradley J Chambers <brad.chambers at gmail.com> silence two particularly noisy warnings on windows (c4244 and c4290) (07:09:50)
+ * Bradley J Chambers <brad.chambers at gmail.com> fix the appveyor badge once again (06:04:01)
+ * Sandro Santilli <strk at keybit.net> Add "check" Makefile rule as an alias for "test" (03:27:03)
+
+2015-03-17
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add support for user-specified backing-buffers and reader callbacks. (13:03:08)
+
+2015-03-16
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #831 from PDAL/issues-821 (16:55:54)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #830 from PDAL/issues-812 (16:55:12)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove unused option "cloud_id" from OCI writer. (16:02:25)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Don't open LAZ file if we can't compress. (15:50:58)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #823 from PDAL/issues-778 (14:52:47)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #824 from gadomski/issues/820-laszip-and-lastools-cmake (12:14:21)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #828 from PDAL/issues-822 (11:43:35)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix text. (11:42:20)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #827 from PDAL/issues-822 (11:40:37)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove debug. (11:38:10)
+ * Pete Gadomski <pete.gadomski at gmail.com> Don't use PATH_PREFIXES in FindLASzip (10:36:46)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Handle bad filter stage on reading pipeline. Pass though specific errors detected on parsing. (09:51:56)
+
+2015-03-12
+ * Bradley J Chambers <brad.chambers at gmail.com> update url in appveyor badge (15:17:00)
+ * Bradley J Chambers <brad.chambers at gmail.com> fix typo in README (14:49:57)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #813 from PDAL/appveyor (14:42:13)
+
+2015-03-11
+ * Bradley J Chambers <brad.chambers at gmail.com> Add initial appveyor configuration with status badge (13:27:22)
+ * Howard Butler <howard at hobu.co> Merge pull request #809 from PDAL/hobu-doc-updates-3-2015 (21:22:10)
+ * Howard Butler <howard at hobu.co> a bunch of doc updates (16:57:43)
+ * Howard Butler <howard at hobu.co> Merge pull request #808 from PDAL/issues-805 (13:43:45)
+ * Howard Butler <howard at hobu.co> Merge pull request #807 from PDAL/excise-float-equal (13:43:37)
+ * Howard Butler <howard at hobu.co> remove float-equal from test/ (11:48:03)
+ * Howard Butler <howard at hobu.co> turn off -Wfloat-equal (11:41:34)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make code match documentation. (10:59:51)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (10:35:10)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Quiet compiler. (10:34:45)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #804 from PDAL/catch-up-pcl-kernel-to-plugin-changes (10:34:07)
+ * Bradley J Chambers <brad.chambers at gmail.com> consolidate the debug, verbosity, and log options as part of setCommonOptions (09:52:38)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #784 from PDAL/rialto-writer (09:39:16)
+ * Bradley J Chambers <brad.chambers at gmail.com> appease msvc once again, overload BOX3D::grow, and guard redefinition of MaximumNumberOfReturns, etc. in OptechReader (09:38:24)
+ * Bradley J Chambers <brad.chambers at gmail.com> add RialtoWriter to StageFactory and sort sections by filters/readers/writers (09:24:56)
+ * Bradley J Chambers <brad.chambers at gmail.com> getDefaultOptions is no longer static (09:14:42)
+ * Bradley J Chambers <brad.chambers at gmail.com> update RialtoWriter per the recent plugin changes, make sure it compiles on msvc (09:06:14)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #803 from PDAL/issue/802-unresolved-external-highest-lowest (08:22:51)
+
+2015-03-02
+ * Bradley J Chambers <brad.chambers at gmail.com> Add RialtoWriter (13:33:13)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Reset BPF stream on initialization. (19:57:24)
+
+2015-03-10
+ * Bradley J Chambers <brad.chambers at gmail.com> move grow from hpp to cpp (15:26:26)
+ * Bradley J Chambers <brad.chambers at gmail.com> move references to HIGHEST and LOWEST from .hpp to .cpp to make msvc happy (13:46:18)
+ * Bradley J Chambers <brad.chambers at gmail.com> some missing includes and exports (14:45:50)
+ * Howard Butler <howard at hobu.co> catch up PCL kernels to new plugin changes #774 (14:19:50)
+ * Bradley J Chambers <brad.chambers at gmail.com> be explicit about type so that msvc does not complain (14:06:38)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #801 from PDAL/plugin-manager-fix (13:42:38)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #798 from PDAL/issue/792-isnan (12:56:18)
+ * Bradley J Chambers <brad.chambers at gmail.com> provide default constructor for PluginInfo, no initializer lists on msvc (12:54:00)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #791 from gadomski/issues/783-purge-read-n (12:46:55)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #796 from PDAL/issues/793-795-windows (12:07:07)
+ * Bradley J Chambers <brad.chambers at gmail.com> test if val was provided without use of nan at all (11:48:52)
+ * Howard Butler <howard at hobu.co> Merge pull request #797 from PDAL/oci-wrapper-namespace (11:33:09)
+ * Bradley J Chambers <brad.chambers at gmail.com> provide fixes for MSVC2012 (11:31:20)
+ * Howard Butler <howard at hobu.co> oci wrapper stuff needs to live in pdal namespace -- there's a GDAL global version of same (11:30:34)
+ * Bradley J Chambers <brad.chambers at gmail.com> add missing include cstdint, sort includes (11:25:42)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Plugin framework refactoring (10:39:35)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (10:24:37)
+
+2015-03-07
+ * Pete Gadomski <pete.gadomski at gmail.com> Remove read_n and read_field from Utils.hpp (10:30:46)
+ * Pete Gadomski <pete.gadomski at gmail.com> Remove read_n from Terrasolid reader (10:27:39)
+ * Pete Gadomski <pete.gadomski at gmail.com> Smarten up the Terrasolid return number (09:34:06)
+ * Pete Gadomski <pete.gadomski at gmail.com> Increment counter in TerrasolidReader (09:33:38)
+ * Pete Gadomski <pete.gadomski at gmail.com> Add TerrasolidReaderTest (09:32:26)
+ * Pete Gadomski <pete.gadomski at gmail.com> Refactor the QFit reader to not use Utils::read_n (08:17:33)
+ * Pete Gadomski <pete.gadomski at gmail.com> Add Switchable Extractor and IStream (08:16:15)
+ * Pete Gadomski <pete.gadomski at gmail.com> Seek to the end of an IStream (10:49:55)
+
+2015-03-06
+ * Howard Butler <howard at hobu.co> Merge pull request #790 from PDAL/issues/789-dataformat_id-metadata-output (19:13:35)
+ * Howard Butler <howard at hobu.co> output dataformat_id as metadata for LAS reader (19:12:30)
+
+2015-03-05
+ * Connor Manning <connormanning at users.noreply.github.com> Merge pull request #786 from PDAL/quad-tweak (16:37:24)
+ * Connor Manning <connormanning at users.noreply.github.com> Merge pull request #787 from PDAL/compression-updates (16:36:31)
+ * Pete Gadomski <pete.gadomski at gmail.com> PDAL_DLL the OptechReader (15:12:40)
+ * Connor Manning <connor at hobu.co> Include pdal_internal to ensure ifdef is valid. Constify input ptr. (15:08:49)
+ * Howard Butler <howard at hobu.co> Merge pull request #782 from gadomski/optech (15:03:45)
+ * Howard Butler <howard at hobu.co> point to PDAL RPM repo (13:50:12)
+ * Pete Gadomski <pete.gadomski at gmail.com> Add reader for Optech csd files (03:42:50)
+ * Pete Gadomski <pete.gadomski at gmail.com> Add georeference utility (03:42:50)
+ * Pete Gadomski <pete.gadomski at gmail.com> Add missing includes to Extractor.hpp (03:42:50)
+
+2015-02-15
+ * Connor Manning <connor at hobu.co> Switch attribute filter to the changed QuadIndex interface. (13:52:54)
+ * Connor Manning <connor at hobu.co> Quad index interface changes. (13:17:19)
+
+2015-03-04
+ * Howard Butler <howard at hobu.co> PCL support needs PCL 1.7.2+, not pipeline branch anymore (16:28:10)
+ * Howard Butler <howard at hobu.co> Merge pull request #779 from PDAL/StageRunner-is-private (16:09:04)
+ * Howard Butler <howard at hobu.co> Merge pull request #780 from PDAL/move-to-util (16:08:54)
+ * Howard Butler <howard at hobu.co> Merge pull request #776 from jwomeara/geowave-vagrant (16:04:42)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make getDimension private. (15:54:18)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Move StageRunner.hpp to src dir. (15:53:10)
+
+2015-02-27
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (10:28:41)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add write tests for BPF. (10:28:14)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove dead option from OciReader. (10:27:12)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix duplicate backout of offset. (10:26:21)
+ * Bradley J Chambers <brad.chambers at gmail.com> move Charbuf, Extractor, Inserter, IStream, and OStream to util (09:26:34)
+
+2015-02-26
+ * Bradley J Chambers <brad.chambers at gmail.com> StageRunner is local to Stage and does not need to be part of the public interface (16:03:48)
+ * Whitney O'Meara <womeara at radiantblue.com> Updated GeoWave plugin to check to see if the JVM is already running. Also udpated GeoWaveReader to limit query results by count. (13:09:57)
+
+2015-02-13
+ * Whitney O'Meara <womeara at radiantblue.com> Initial attempt at setting GeoWave up as a plugin within Vagrant. (12:02:00)
+
+2015-02-25
+ * Connor Manning <connor at hobu.co> Update Vagrant's trusty image URL. (10:39:20)
+
+2015-02-24
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (15:57:05)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Replace getBytes() with getPackedPoint(). (15:56:27)
+ * Howard Butler <howard at hobu.co> Merge pull request #772 from PDAL/fix-make-clean (15:51:55)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #773 from PDAL/fix-hexbin-tesselation-output (15:25:53)
+ * Howard Butler <howard at hobu.co> put back tesselation output in hexbin test so tests pass (13:38:01)
+ * Howard Butler <howard at hobu.co> only nuke the files in ./lib on clean for 'make clean', not the lib directory itself (11:24:48)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #768 from PDAL/pointaccess (08:54:05)
+
+2015-02-23
+ * Andrew Bell <andrew.bell.ia at gmail.com> Support for LAS extra bytes VLR. A couple of fixes for reading/writing LAS files. (21:56:11)
+
+2015-02-22
+ * Howard Butler <howard at hobu.co> Merge pull request #770 from gadomski/yet-more-osx-linking (17:15:45)
+
+2015-02-21
+ * Pete Gadomski <pete.gadomski at gmail.com> Use @loader_path/../lib (11:25:14)
+
+2015-02-20
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #769 from gadomski/rxp-cleanup (18:27:43)
+
+2015-02-10
+ * Pete Gadomski <pete.gadomski at gmail.com> General cleanup of the rxp reader (16:55:09)
+ * womeara <womeara at radiantblue.com> Configured GeoWave drivers to run as plugins. (11:20:13)
+ * Howard Butler <howard at hobu.co> Merge pull request #755 from PDAL/vagrant-updates (15:01:17)
+ * Howard Butler <howard at hobu.co> move package installation into a linux-install-scripts/packages.sh file instead of in Vagrantfile only (14:30:30)
+ * Howard Butler <howard at hobu.co> build and install laz-perf (14:29:50)
+ * Howard Butler <howard at hobu.co> Add wget to Vagrantfile (09:44:35)
+
+2015-02-18
+ * Howard Butler <howard at hobu.co> Merge pull request #767 from PDAL/reprojection-gdal-environment (18:20:34)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Allow raw point access. (14:41:06)
+ * Howard Butler <howard at hobu.co> Merge pull request #766 from matthewhanson/fix_p2g_radius (14:36:02)
+ * Matthew Hanson <mhanson at appliedgeosolutions.com> changed parameter m_RADIUS_SQ to m_RADIUS then pass in the square to OutCoreInterp (14:33:15)
+ * Howard Butler <howard at hobu.co> light up GDAL environment for reprojection filter #764 (14:27:26)
+ * Howard Butler <howard at hobu.co> Merge pull request #763 from matthewhanson/fix_p2gwriter_gtiff (13:47:55)
+ * Matthew Hanson <mhanson at appliedgeosolutions.com> fixed half pixel x and y offset in GeoTransform (p2g plugin) (11:05:55)
+
+2015-02-12
+ * Howard Butler <howard at hobu.co> Merge pull request #759 from jwomeara/geowave-doc (13:22:19)
+ * Whitney O'Meara <womeara at radiantblue.com> Updated GeoWave documentation to specify which srs to use when writing data. Also, updated the index with GeoWave entries. (13:14:49)
+
+2015-02-11
+ * chambbj <brad.chambers at gmail.com> Merge pull request #752 from jwomeara/geowave-io (12:53:28)
+ * womeara <womeara at radiantblue.com> Added documentation for the GeoWave plugin. (12:08:25)
+ * Howard Butler <howard at hobu.co> Merge pull request #758 from PDAL/issues/756-cmake-boost-required (12:20:01)
+ * Howard Butler <howard at hobu.co> Adapt @vmora's patch from #756 to make find_package for Boost REQUIRED (11:48:25)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (11:22:47)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Strange performance thing. (11:22:22)
+
+2015-02-06
+ * Whitney O'Meara <womeara at radiantblue.com> Updated GeoWave driver to support FeatureCollectionDataAdapter. Also, updated writer to use AccumuloIndexWriter. (10:16:33)
+
+2015-02-02
+ * Whitney O'Meara <womeara at radiantblue.com> Updated GeoWave cmake scripts (14:59:09)
+ * Whitney O'Meara <womeara at radiantblue.com> Initial checkin of GeoWave PDAL driver (13:48:03)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (20:53:59)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Register LAS dimensions with their actual size. (20:53:16)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Small optimizations. (20:52:26)
+
+2015-02-05
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (15:13:58)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add test for output_dims option. (15:13:40)
+ * Howard Butler <howard at hobu.co> Merge pull request #751 from PDAL/hexbin-no-tesselation (12:45:46)
+ * Howard Butler <howard at hobu.co> Merge pull request #750 from PDAL/all-output-mode-for-pdal-info (12:45:37)
+ * Howard Butler <howard at hobu.co> add filename to 'pdal info' output (12:22:48)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (11:51:07)
+ * Howard Butler <howard at hobu.co> add '--all' output mode for 'pdal info' (11:19:09)
+ * Howard Butler <howard at hobu.co> default to not outputting tesselation in Metadata with output_tesselation option (11:18:18)
+ * Howard Butler <howard at hobu.co> Merge pull request #738 from gadomski/postgres-off-by-default (11:02:18)
+ * Howard Butler <howard at hobu.co> Merge pull request #737 from PDAL/issues/733-cmake-osx-rpath (11:02:08)
+ * Howard Butler <howard at hobu.co> Merge pull request #743 from PDAL/add-passthrough-filter (11:01:57)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (10:36:10)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add output_dims support. (10:35:34)
+
+2015-01-30
+ * Bradley J Chambers <brad.chambers at gmail.com> Add range filter (11:26:42)
+ * Pete Gadomski <pete.gadomski at gmail.com> Disable pgpointcloud plugin if no postgres found (15:38:17)
+ * Howard Butler <howard at hobu.co> In relation to #733, turn on @loader_path and @executable_path for rpath on OSX. (15:29:38)
+ * Howard Butler <howard at hobu.co> Merge pull request #732 from PDAL/dont-throw-error-for-empty-geotiff-keys (15:28:50)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add better diagnostic output for ReprojectionFilter. (15:26:41)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (14:09:51)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove dead constructors. (14:09:20)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #735 from gadomski/cpd (14:06:36)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (12:45:04)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Semi-decent error message for bad pipeline XML. (12:42:53)
+ * Howard Butler <howard at hobu.co> Merge pull request #736 from PDAL/pipelinemgr (12:28:32)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into pipelinemgr (11:47:48)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove m_lastWriter from PipelineManager. (11:13:08)
+ * Pete Gadomski <pete.gadomski at gmail.com> Add kernel plugin for Coherent Point Drift (08:37:35)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #734 from gadomski/pipeline-manager-bug-fix (10:46:09)
+ * Howard Butler <howard at hobu.co> Merge pull request #733 from gadomski/rpath-on-osx (10:44:00)
+ * Pete Gadomski <pete.gadomski at gmail.com> Update m_lastStage in PipelineManager::addWriter (10:00:15)
+ * Pete Gadomski <pete.gadomski at gmail.com> Remove CMAKE_BUILD_WITH_INSTALL_RPATH=TRUE for OSX (08:29:25)
+
+2015-02-04
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #748 from PDAL/issues-746-747 (17:03:08)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add test for writing scaled X,Y,Z values. (16:04:51)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make sure that hexrep is properly sized before appending to insertion buffer. Close #746 Close #747 (15:26:51)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Actually commit changes to removeTrailing/Leading blanks. Support options -> vector of strings. (13:45:40)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add removeLeadingBlanks. Fix removeTrailingBlanks. (13:00:07)
+ * Howard Butler <howard at hobu.co> don't try to trap for missing connections, let gtest catch them in pgpointcloud tests #744 (10:11:09)
+ * Howard Butler <howard at hobu.co> Merge pull request #744 from strk/libpq (09:58:32)
+
+2015-02-03
+ * Andrew Bell <andrew.bell.ia at gmail.com> Small optimizations/Explicit types for LAS dims. (11:49:12)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Rollback. (09:29:20)
+ * Sandro Santilli <strk at keybit.net> Allow running pgpointcloud tests against non-default installs (03:24:37)
+
+2015-01-21
+ * Bradley J Chambers <brad.chambers at gmail.com> WIP - drafts of tutorial for writing filters, kernels, readers, and writers, with accompanying sample code (13:35:40)
+ * Howard Butler <howard at hobu.co> read our custom dimension out of ProgrammableFilter (17:34:10)
+ * Howard Butler <howard at hobu.co> default my build to building with python (17:33:54)
+ * Howard Butler <howard at hobu.co> manual merge (16:49:16)
+ * Howard Butler <howard at hobu.co> Merge pull request #714 from PDAL/PDALConfig (16:46:09)
+ * Howard Butler <howard at hobu.co> Merge pull request #716 from PDAL/issue/689-ground-filter (16:46:00)
+ * Howard Butler <howard at hobu.co> Merge pull request #721 from PDAL/use-real-dimension-name-for-filtering (16:45:53)
+ * Howard Butler <howard at hobu.co> We were using the default dimension name rather than the actual dimension name for filtering. Custom dimensions ended up being '' (11:04:58)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (10:46:09)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove debug. (10:45:50)
+ * Howard Butler <howard at hobu.co> Merge pull request #720 from gadomski/with-python (10:42:07)
+ * Pete Gadomski <pete.gadomski at gmail.com> BUILD_PLUGIN_PYTHON should not depend (09:41:26)
+
+2015-02-01
+ * Howard Butler <howard at hobu.co> don't do RPATH install on linux, just OSX (10:44:08)
+ * Howard Butler <howard at hobu.co> Merge pull request #739 from gadomski/pdal-config-version (10:36:01)
+ * Howard Butler <howard at hobu.co> Merge pull request #740 from gadomski/translate-crop-null-stage-ptr (10:35:50)
+
+2015-01-31
+ * Pete Gadomski <pete.gadomski at gmail.com> Fix NULL pointer in `pdal translate --polygon` (21:52:01)
+ * Pete Gadomski <pete.gadomski at gmail.com> Use correct cmake version variable in pdal-config (20:58:40)
+
+2015-01-27
+ * Bradley J Chambers <brad.chambers at gmail.com> Add PCL kernel to compute Height Above Ground (12:35:15)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Avoid numeric cast if possible. (21:48:32)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Don't create copy of collection when finding. (21:31:32)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Create/use classes to insert/extract byte-ordered data from a buffer. (19:20:30)
+ * Howard Butler <howard at hobu.co> Merge pull request #725 from PDAL/issue/723-nuke-pkgconfig (13:28:55)
+ * Howard Butler <howard at hobu.co> Merge pull request #727 from PDAL/make-kernel-public (13:28:48)
+ * Howard Butler <howard at hobu.co> Merge pull request #728 from PDAL/move-to-utils (13:22:40)
+ * Howard Butler <howard at hobu.co> min/max/mean typo in delta kernel (09:07:19)
+
+2015-01-29
+ * Howard Butler <howard at hobu.co> Don't throw an error with empty GeoTIFF keys, instead just set it as an empty SRS (10:47:50)
+ * Connor Manning <connormanning at users.noreply.github.com> Merge pull request #731 from PDAL/json-quotes (10:21:36)
+
+2015-01-28
+ * Connor Manning <connor at hobu.co> Escape quotes in JSON string values. (22:05:09)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix memcpy to vector. (13:02:01)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (12:48:17)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Minimize stream writes. Eliminate unnecessary numeric casts. (12:47:19)
+ * Connor Manning <connormanning at users.noreply.github.com> Merge pull request #730 from PDAL/kdindex-forward-declares-nanoflann (12:01:49)
+ * Connor Manning <connor at hobu.co> Smart ptr instead of raw, move some implementations into cpp. (11:51:05)
+ * Connor Manning <connormanning at users.noreply.github.com> Merge pull request #729 from PDAL/gcc (11:24:29)
+ * Connor Manning <connor at hobu.co> Merge branch 'gcc' into kdindex-forward-declares-nanoflann (11:22:27)
+ * Connor Manning <connor at hobu.co> Prefix standard classes with std::, fix const qualifier warning. (11:20:24)
+ * Bradley J Chambers <brad.chambers at gmail.com> forward declare nanoflann in KDIndex, so that nanoflann does not need to be installed (11:06:14)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (10:42:51)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Don't call clearTemps() each time a point is added. Read LAS points in blocks. (10:37:07)
+ * Howard Butler <howard at hobu.co> Rollup of version-related tweaks #719 (08:21:26)
+
+2015-01-26
+ * Bradley J Chambers <brad.chambers at gmail.com> Move Kernel* back to "public interface" and fix the include paths (14:21:12)
+
+2015-01-12
+ * Bradley J Chambers <brad.chambers at gmail.com> Move Algorithm, Endian, and FileUtils to the util library (11:15:25)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' (16:30:44)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Move all python stuff to plugin directory. (16:29:58)
+ * Howard Butler <howard at hobu.co> Merge pull request #674 from PDAL/cpack-packaging (14:44:47)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' into cpack-packaging (14:40:51)
+ * Connor Manning <connormanning at users.noreply.github.com> Merge pull request #702 from PDAL/issue/701-greyhound-lazperf (12:19:29)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (12:10:20)
+ * Howard Butler <howard at hobu.co> Merge pull request #703 from PDAL/issue/700-third-vs-vendor (11:51:58)
+ * Bradley J Chambers <brad.chambers at gmail.com> move nanoflann from ./include/pdal/third to ./vendor/nanoflann-1.1.8 (11:39:08)
+ * Bradley J Chambers <brad.chambers at gmail.com> Merge remote-tracking branch 'upstream/master' (10:51:48)
+ * Bradley J Chambers <brad.chambers at gmail.com> remove unused CMake variables/commented code (10:51:16)
+ * Bradley J Chambers <brad.chambers at gmail.com> disable entire ReadCompressed class when LAZPERF is not present (10:39:37)
+ * Bradley J Chambers <brad.chambers at gmail.com> fix #701, check that PDAL has LAZPERF support (10:30:34)
+ * Connor Manning <connor at hobu.co> Initialization order warning. (10:27:00)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' into cpack-packaging (08:43:15)
+ * Howard Butler <howard at hobu.co> Merge pull request #697 from PDAL/greyhound-compression (08:43:00)
+ * Howard Butler <howard at hobu.co> Merge pull request #698 from PDAL/remove-dead-cmake (08:42:50)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' into cpack-packaging (08:42:33)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Plang update. (08:30:44)
+
+2015-01-25
+ * Bradley J Chambers <brad.chambers at gmail.com> boost -> std thread, clean up bad merge (21:43:43)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Don't access summary objects through shared pointers. (20:45:21)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (20:28:22)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Change vector to deque for PointBuffer index. (20:27:49)
+
+2015-01-24
+ * Howard Butler <howard at hobu.co> need <ostream> include (11:17:44)
+
+2015-01-23
+ * Bradley J Chambers <brad.chambers at gmail.com> Remove package config (22:31:01)
+ * Andrew Bell <andrew.bell.ia at gmail.com> More testing. (18:37:09)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Debug Travis. (17:36:55)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into python (17:04:16)
+
+2015-01-22
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix transformation math according to revised document. (15:49:36)
+
+2015-01-20
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add scaling to BPF writer. (20:56:37)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #718 from gadomski/rivlib-tests (16:17:12)
+ * Pete Gadomski <pete.gadomski at gmail.com> Fix rivlib test's cmakelists (15:15:52)
+ * Howard Butler <howard at hobu.co> add gcc-multilib and g++-multilib to the Vagrant config (14:52:01)
+ * Bradley J Chambers <brad.chambers at gmail.com> remove redundant export of pdal_util (13:15:04)
+ * Bradley J Chambers <brad.chambers at gmail.com> we can specify multiple targets on the export line (12:55:29)
+ * Howard Butler <howard at hobu.co> Merge pull request #713 from PDAL/issues/699-move-bounds (13:09:02)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (12:06:19)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add UTM option for BpfWriter. Add default options for BpfWriter. Remove stream() from BpfWriter. Correct options description for LAS writer. (12:05:13)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Verify we have X, Y and Z and they're the first three dimensions. (11:23:45)
+ * Howard Butler <howard at hobu.co> move bounds to include/pdal/util #699 (11:14:22)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (10:03:28)
+ * Howard Butler <howard at hobu.co> remove @executable_path install_name for OSX (10:03:21)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (08:55:06)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Move more fancy compression stuff to the compressor. Add comments. (08:54:33)
+
+2015-01-16
+ * Bradley J Chambers <brad.chambers at gmail.com> Add `filters.ground` and `kernels.ground` (13:49:19)
+ * Howard Butler <howard at hobu.co> set PDAL_DRIVER_PATH for vagrant invocation (10:20:06)
+ * Howard Butler <howard at hobu.co> Merge pull request #709 from PDAL/compute-utm-zone (09:57:25)
+
+2015-01-14
+ * Bradley J Chambers <brad.chambers at gmail.com> initial commit of PDALConfig.cmake (13:19:26)
+ * Andrew Bell <andrew.bell.ia at gmail.com> First cut at BPF writer. (19:16:44)
+ * Howard Butler <howard at hobu.co> Merge pull request #705 from PDAL/issue/704-make-buffer-reader-public (11:00:05)
+ * Bradley J Chambers <brad.chambers at gmail.com> make BufferReader a public header (09:21:05)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Actually add all the files. (08:06:49)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Finish movement of plang to plugin-land. (07:47:47)
+
+2015-01-19
+ * Howard Butler <howard at hobu.co> only CMAKE_BUILD_WITH_INSTALL_RPATH when APPLE (16:32:10)
+ * Howard Butler <howard at hobu.co> don't recursively install pdalutil headers (16:12:21)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (16:01:52)
+ * Howard Butler <howard at hobu.co> another whack at rpath -- don't install plugins in a special directory (16:01:50)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (14:17:40)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add support for byte-segregated data. (14:16:53)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (14:09:51)
+ * Howard Butler <howard at hobu.co> working dev and install rpath on OSX (13:42:13)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add support for writing dimension-major data. (10:13:50)
+
+2015-01-17
+ * Howard Butler <howard at hobu.co> rpath kind of working (17:26:17)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (08:41:19)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add compression to BPF writer. (08:40:56)
+
+2015-01-15
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix Mueller matrix initialization/math. Add test. (19:21:47)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Apply transformation to BPF points as read. (14:07:16)
+ * Howard Butler <howard at hobu.co> Add SpatialReference::computeUTMZone(const BOX3D& box) const to calculate the UTM zone when you have a box in another coordinate system (13:45:13)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Properly initialize Mueller matrix. Check for X, Y and Z dimensions as now required by specification. (13:38:37)
+ * Bradley J Chambers <brad.chambers at gmail.com> dimension max in bpf header never gets updated (11:38:22)
+ * Howard Butler <howard at hobu.co> Merge pull request #708 from PDAL/remove-iconv (11:00:18)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #706 from PDAL/bpfwriter (10:55:30)
+ * Bradley J Chambers <brad.chambers at gmail.com> Merge remote-tracking branch 'upstream/master' (10:40:05)
+ * Bradley J Chambers <brad.chambers at gmail.com> MSVC complains about multiply defined symbols, same workaround provided previously in LasHeader.cpp (10:38:52)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' into remove-iconv (10:35:25)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (10:35:12)
+ * Howard Butler <howard at hobu.co> remove iconv #707 (10:35:09)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove lambda with default arg. (10:34:44)
+ * Bradley J Chambers <brad.chambers at gmail.com> if we do not want to rely on PDAL (pdal_export.hpp) to build the Utils library, then we need to define PDAL_DLL locally (10:16:39)
+ * Bradley J Chambers <brad.chambers at gmail.com> pdal_export will always need pdal_defines (rather than hoping the including file took care of it first) (10:10:50)
+ * Bradley J Chambers <brad.chambers at gmail.com> PDALUtils needs to export toJSON (10:10:03)
+ * Bradley J Chambers <brad.chambers at gmail.com> TransformationFilter needs to export transformationMatrixFromString (10:09:28)
+
+2015-01-13
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' into python (19:03:00)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Provide file metadata option in info kernel. Clean up JSON output. (14:27:16)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Simplify JSON output of metadata. (13:05:43)
+
+2015-01-11
+ * Howard Butler <howard at hobu.co> decrufting (22:58:35)
+ * Howard Butler <howard at hobu.co> remove dead cmake Find* modules (22:53:14)
+ * Connor Manning <connor at hobu.co> Read compressed data from Greyhound when possible. (15:34:19)
+ * Connor Manning <connor at hobu.co> Update schema format expectations, restructure slightly to begin decompression work. (11:31:17)
+
+2015-01-10
+ * Connor Manning <connor at hobu.co> Expected schema response from Greyhound was out of date. (23:31:23)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' into cpack-packaging (22:01:51)
+ * Howard Butler <howard at hobu.co> Merge pull request #695 from PDAL/pgpointcloud-test-db-failure (22:00:31)
+ * Howard Butler <howard at hobu.co> Fail pgpointcloud test more gracefully when you can't connect to db (21:56:39)
+ * Howard Butler <howard at hobu.co> Merge pull request #694 from PDAL/issue/687-translate-segfault (21:36:49)
+ * Howard Butler <howard at hobu.co> Merge pull request #693 from PDAL/remove-uuid-global-environment (21:36:41)
+ * Bradley J Chambers <brad.chambers at gmail.com> remove md5 and string_ref per discussions with hobu (21:30:10)
+ * Howard Butler <howard at hobu.co> remove <random> and friends from GlobalEnvironment -- it was needed for UUIDs which we don't do anymore (21:10:15)
+ * Bradley J Chambers <brad.chambers at gmail.com> avoid segfault in translate kernel (20:32:16)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' into cpack-packaging (19:16:54)
+ * Howard Butler <howard at hobu.co> Big bunch of cmake-related fixes to get Vagrant config going #684 (19:15:47)
+ * Connor Manning <connor at hobu.co> Merge branch 'master' into greyhound-compression (16:57:32)
+ * Connor Manning <connor at hobu.co> Merge branch 'master' into greyhound-compression (13:43:11)
+ * Connor Manning <connormanning at users.noreply.github.com> Merge pull request #692 from PDAL/make-install (13:31:03)
+ * Connor Manning <connormanning at users.noreply.github.com> Merge pull request #691 from PDAL/gcc-lasdump (13:29:15)
+ * Connor Manning <connor at hobu.co> Get installer working with new directory structure. (13:09:13)
+ * Connor Manning <connor at hobu.co> Break greyhound exchanges into hpp/cpp instead of all header. (09:45:43)
+
+2015-01-09
+ * Connor Manning <connor at hobu.co> Allow build on GCC. (17:50:58)
+ * Connor Manning <connor at hobu.co> Update lazperf include. (16:54:02)
+ * Connor Manning <connormanning at users.noreply.github.com> Merge pull request #686 from PDAL/find-lazperf (14:54:44)
+ * Connor Manning <connor at hobu.co> Remove FindLazperf.cmake module. (14:37:34)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'filters/transformation' (13:29:13)
+ * Pete Gadomski <pete.gadomski at gmail.com> Add transformation filter (09:55:29)
+ * Howard Butler <howard at hobu.co> std:: prefix cout for dumper (11:27:53)
+ * Connor Manning <connor at hobu.co> Add greyhound reader doc. (09:33:20)
+
+2015-01-08
+ * Howard Butler <howard at hobu.co> Merge pull request #683 from PDAL/hdf5-linux-updates (15:54:57)
+ * Howard Butler <howard at hobu.co> need <iostream> in Dumper for std::cout (15:40:37)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add lasdump and separate build dependencies. (15:08:24)
+ * Howard Butler <howard at hobu.co> make IceBridge work on Vagrant (14:45:24)
+ * Bradley J Chambers <brad.chambers at gmail.com> Rename FindPoints2Grid to FindP2G so that FeatureSummary will behave correctly. (14:42:31)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' into cpack-packaging (13:26:43)
+ * Bradley J Chambers <brad.chambers at gmail.com> We generally do not need a copy when using auto. (08:54:59)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Initialize position with something reasonable so that sorting works. (12:48:46)
+ * Howard Butler <howard at hobu.co> ADDITIONAL_MAKE_CLEAN_FILES directory property for lib/ to wipe plugins on 'make clean' (12:48:20)
+
+2015-01-07
+ * Bradley J Chambers <brad.chambers at gmail.com> Cleanup Drivers.hpp (13:36:04)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' into cpack-packaging (17:13:25)
+ * Howard Butler <howard at hobu.co> Merge pull request #679 from PDAL/issue/549-plugin-version (17:11:48)
+ * Howard Butler <howard at hobu.co> Merge pull request #681 from PDAL/pdal-app-driver-options-listing (17:11:33)
+ * Howard Butler <howard at hobu.co> Merge pull request #682 from gadomski/rxp-include-directories (17:11:24)
+ * Pete Gadomski <pete.gadomski at gmail.com> Update rxp plugin's include directories (11:24:35)
+ * Bradley J Chambers <brad.chambers at gmail.com> Modify pdal app outputs (10:47:38)
+ * Connor Manning <connormanning at users.noreply.github.com> Merge pull request #680 from PDAL/with-compression-flag (10:46:54)
+ * Connor Manning <connor at hobu.co> Update travis/example config compression flag. (10:34:00)
+ * Connor Manning <connor at hobu.co> Fix last GCC warning, and minor tweaks. (10:16:21)
+ * Connor Manning <connor at hobu.co> Change WITH_COMPRESSION cmake flag to WITH_LAZPERF for consistency (10:13:17)
+ * Bradley J Chambers <brad.chambers at gmail.com> only print plugin version if it is set (06:55:48)
+
+2015-01-06
+ * Bradley J Chambers <brad.chambers at gmail.com> record plugin version as part of stage info (21:42:44)
+ * Howard Butler <howard at hobu.co> Merge pull request #678 from PDAL/issue/673-remove-set-stage-enabled (13:48:45)
+
+2015-01-05
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove Metadata -> JSON test (moved to PDALUtils). (16:08:37)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Verify we handle Non-ASCII UTF-8 characters properly in Metadata/XMLSchema. (15:19:23)
+ * Bradley J Chambers <brad.chambers at gmail.com> Remove SET_STAGE_ENABLED and SET_KERNEL_ENABLED (13:02:09)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' into cpack-packaging (11:50:43)
+ * Howard Butler <howard at hobu.co> change LICENSE.txt pointer to (11:50:26)
+ * Howard Butler <howard at hobu.co> Merge pull request #677 from edigonzales/master (08:11:28)
+
+2015-01-04
+ * Stefan Ziegler <edi.gonzales at gmail.com> db schema support when appending data to an existing table (11:56:30)
+
+2015-01-03
+ * Howard Butler <howard at hobu.co> Merge branch 'cpack-packaging' of git://github.com/PDAL/PDAL into cpack-packaging (10:00:46)
+ * Howard Butler <howard at hobu.co> add TGZ generator, point to license (10:00:44)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' into cpack-packaging (09:31:55)
+ * Howard Butler <howard at hobu.co> set SOVERSION (09:31:45)
+
+2015-01-02
+ * Connor Manning <connormanning at users.noreply.github.com> Merge pull request #676 from PDAL/byte-order (13:15:49)
+ * Connor Manning <connor at hobu.co> Alleviate flood of type-punned pointer warnings on GCC. (12:43:56)
+ * Connor Manning <connor at hobu.co> Write OStream floating point vals in little-endian. (12:28:35)
+
+2015-01-01
+ * Bradley J Chambers <brad.chambers at gmail.com> clean up commented lines in test/unit/CMakeLists.txt, dead unit tests, etc. (19:54:52)
+ * Connor Manning <connormanning at users.noreply.github.com> Merge pull request #675 from PDAL/quad (17:10:25)
+ * Connor Manning <connor at hobu.co> Don't segfault with PointBuffer stream constructor. (15:45:16)
+ * Connor Manning <connor at hobu.co> Merge branch 'master' into quad (12:46:13)
+
+2014-12-31
+ * Andrew Bell <andrew.bell.ia at gmail.com> DTD requires orientation to precede metadata. (17:07:44)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Provide access to QuickInfo through pdal info --summary. Remove dead code. Remove ptree from InfoKernel. (15:56:14)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make sure log is set before passing to BpfHeader. (14:34:28)
+ * Howard Butler <howard at hobu.co> Merge branch 'cpack-packaging' of git://github.com/PDAL/PDAL into cpack-packaging (14:28:41)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (12:12:46)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Move metadata -> JSON translation to PDALUtils. (11:33:53)
+
+2014-12-30
+ * Howard Butler <howard at hobu.co> LICENSE.txt link no good for CPACK_RESOURCE_FILE_LICENSE (15:29:40)
+ * Howard Butler <howard at hobu.co> source packaging regex mods (15:11:10)
+ * Howard Butler <howard at hobu.co> source packaging regex mods (15:10:28)
+ * Howard Butler <howard at hobu.co> bump version to 1.0.0b1 in preparation for release (10:46:42)
+ * Howard Butler <howard at hobu.co> tweak version regex (10:46:29)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove dead ptree code. (10:40:25)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Don't test for stage descriptions. Don't default to app bundle on OSX. (10:08:43)
+
+2014-12-29
+ * Howard Butler <howard at hobu.co> add some light docs to the SET_STAGE_NAME macro for many drivers. (15:45:15)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove debug. (10:46:37)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add metadata test file. (10:30:12)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix template args. (09:51:06)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (09:10:36)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Changes to support preview of stages and general stats filter changes. (09:10:10)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Enhance support tests to handle streams. (08:39:28)
+
+2014-12-26
+ * Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (09:24:55)
+ * Howard Butler <howard at hobu.co> pipeline doc updates (09:24:47)
+
+2014-12-23
+ * Howard Butler <howard at hobu.co> Merge pull request #672 from PDAL/issues/666-kernel-plugins (14:08:46)
+ * Howard Butler <howard at hobu.co> Merge pull request #670 from PDAL/update-tests-using-deprecated-filters (14:08:37)
+ * Howard Butler <howard at hobu.co> Merge pull request #671 from PDAL/cmake-tweaks (14:08:25)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove unused stats support from pdal info. (10:51:10)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Simple split on char. (08:52:10)
+
+2014-12-22
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove cruft from stats filter. Fix tests. (18:07:49)
+ * Bradley J Chambers <brad.chambers at gmail.com> test binary directory may differ from the pdal app directory (if PDAL_BUNDLE=ON), test names may also change, so just use pdal app instead of a specific test (13:39:55)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add split() and split2() to replace boost::split. (13:36:28)
+ * Bradley J Chambers <brad.chambers at gmail.com> use KernelFactory and KernelInfo to display list of available kernels and determine if the provided kernel is valid in PDAL application (13:34:39)
+ * Bradley J Chambers <brad.chambers at gmail.com> fix two more paths to configured pipelines (10:31:01)
+ * Bradley J Chambers <brad.chambers at gmail.com> tidying up, fixing paths to XMLs in the unit tests (10:16:23)
+ * Bradley J Chambers <brad.chambers at gmail.com> configure tests to more reliably locate test data, beef up pcpipelineTest to test the sample pipelines (09:49:36)
+
+2014-12-19
+ * Bradley J Chambers <brad.chambers at gmail.com> Widespread CMake updates (12:47:21)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add a test for compression of all types. (20:56:27)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Enhance XMLSchema test. (16:32:30)
+
+2014-12-18
+ * Andrew Bell <andrew.bell.ia at gmail.com> Use DimType in XMLDim. Minimize use of XMLDim. (16:50:55)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove debug. (08:39:02)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (08:36:00)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Cache location scaling. (08:35:44)
+
+2014-11-19
+ * Bradley J Chambers <brad.chambers at gmail.com> Clean up tests that invoked deprecated filters (15:05:55)
+ * Bradley J Chambers <brad.chambers at gmail.com> Port Chipper filter (13:55:49)
+ * Bradley J Chambers <brad.chambers at gmail.com> move attribute sources and fix typos (20:07:14)
+ * Bradley J Chambers <brad.chambers at gmail.com> attribute filter depends on geos, so it should be a plugin filter (19:50:52)
+ * Howard Butler <howard at hobu.co> more cleanups due to #616 (15:49:32)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge remote-tracking branch 'origin/master' into dbintwriter (15:46:50)
+ * Howard Butler <howard at hobu.co> Merge pull request #616 from PDAL/remove-deprecated-filters (15:10:28)
+ * Howard Butler <howard at hobu.co> Merge pull request #609 from PDAL/move-terrasolid-driver (15:10:19)
+ * Howard Butler <howard at hobu.co> catch up Terrasolid PR to master (15:10:05)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' into move-terrasolid-driver (15:09:49)
+ * Bradley J Chambers <brad.chambers at gmail.com> nuke deprecated filters (14:43:38)
+ * Howard Butler <howard at hobu.co> Merge pull request #615 from PDAL/move-attribute-filter (14:40:21)
+ * Howard Butler <howard at hobu.co> Merge pull request #614 from PDAL/updated-ci-script (14:40:08)
+ * Howard Butler <howard at hobu.co> Merge pull request #612 from pramsey/master (14:36:53)
+ * Howard Butler <howard at hobu.co> Merge pull request #610 from PDAL/move-las-driver (14:34:00)
+ * Howard Butler <howard at hobu.co> catch up LAS reorg to master (14:12:06)
+ * Howard Butler <howard at hobu.co> Catch up LAS reorg to master (14:11:38)
+ * Andrew Bell <andrew.bell.ia at gmail.com> First steps to write ints instead of doubles for DB drivers. (13:26:36)
+ * Bradley J Chambers <brad.chambers at gmail.com> all plugins explicitly turned off, all optional components toggled with flag (GEOS and COMPRESSION were missing) (13:15:49)
+ * Bradley J Chambers <brad.chambers at gmail.com> stubs have been gone for a while now (13:14:24)
+ * Bradley J Chambers <brad.chambers at gmail.com> WITH_CARIS no longer used (13:05:07)
+ * Paul Ramsey <pramsey at cleverelephant.ca> Move connection setup to initialize() (13:04:25)
+ * Bradley J Chambers <brad.chambers at gmail.com> update api docs to match reality (13:02:24)
+ * Paul Ramsey <pramsey at cleverelephant.ca> Allow connection for addDimension to get access to the database (12:49:40)
+ * Paul Ramsey <pramsey at cleverelephant.ca> Merge branch 'master' of https://github.com/PDAL/PDAL (12:12:09)
+ * Paul Ramsey <pramsey at cleverelephant.ca> More useful message during failure to connect (12:09:14)
+ * Howard Butler <howard at hobu.co> build terrasolid (10:51:53)
+ * Howard Butler <howard at hobu.co> Catch up TerraSolid PR to current master (10:47:10)
+ * Howard Butler <howard at hobu.co> update PCL plugin to deal with BufferReader rename (10:17:20)
+ * Bradley J Chambers <brad.chambers at gmail.com> remove unused definitions from pdal_defines (09:36:45)
+ * Bradley J Chambers <brad.chambers at gmail.com> remove caris driver (it will be posted to PDAL/Caris) (09:31:20)
+ * Howard Butler <howard at hobu.co> Merge pull request #611 from PDAL/move-buffer-driver (09:09:26)
+ * Bradley J Chambers <brad.chambers at gmail.com> update tutorial that uses BufferReader (09:05:07)
+ * Bradley J Chambers <brad.chambers at gmail.com> Port Buffer driver (08:59:33)
+ * Howard Butler <howard at hobu.co> Merge pull request #606 from PDAL/move-qfit-driver (09:01:54)
+ * Howard Butler <howard at hobu.co> Merge pull request #607 from PDAL/move-bpf-driver (09:01:44)
+ * Howard Butler <howard at hobu.co> Merge pull request #608 from PDAL/move-text-driver (09:01:35)
+
+2014-12-17
+ * Bradley J Chambers <brad.chambers at gmail.com> replacing more boost with c++11 where appropriate; moment and density accumulators are unused (15:16:21)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (17:27:12)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Eliminate ExtDimType in favor of enhanced DimType. (17:26:17)
+ * Connor Manning <connor at hobu.co> Add include. (15:00:39)
+ * Bradley J Chambers <brad.chambers at gmail.com> PDAL_EMBED_BOOST no longer exists (14:23:28)
+ * Bradley J Chambers <brad.chambers at gmail.com> remove Application.hpp - unused (14:08:35)
+ * Bradley J Chambers <brad.chambers at gmail.com> use Support::temppath to create temp files in temp directory (12:56:17)
+ * Bradley J Chambers <brad.chambers at gmail.com> on windows, boost filesystem current directory ends in backslash, and does not need a trailing slash appended (12:52:48)
+ * Bradley J Chambers <brad.chambers at gmail.com> replace boost::shared_ptr with std::shared_ptr, update docs to reflect what we actually use from Boost (11:55:49)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make proper temporary PointRef objects. Close #631 (10:50:58)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove debug. (09:23:26)
+
+2014-12-16
+ * Bradley J Chambers <brad.chambers at gmail.com> create typedefs for FilterPtr, ReaderPtr, and WriterPtr (12:24:54)
+ * Bradley J Chambers <brad.chambers at gmail.com> remove dependency on boost random (14:08:18)
+ * Bradley J Chambers <brad.chambers at gmail.com> remove dependency on boost threads, fixing pclvisualizer linker issue (windows only) along the way (13:46:53)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix extra brace. (13:29:55)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #664 from PDAL/issues-631 (11:55:46)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #663 from PDAL/plugin-cmake-macro-update (11:08:51)
+ * Bradley J Chambers <brad.chambers at gmail.com> no longer using Boost unit_test_framework (10:40:49)
+ * Andrew <andrew at abell-vb2.(none)> Use custom swap_iter for sorting PointBufferIter. (10:22:02)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #662 from PDAL/stage-creation-tweak (09:36:02)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #659 from PDAL/move-python-filters (08:51:09)
+
+2014-12-15
+ * Bradley J Chambers <brad.chambers at gmail.com> Update PDAL_ADD_PLUGIN to use FILES and LINK_WITH keywords for passing multiple arguments (11:23:15)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #661 from PDAL/pcl-visualizer-improvements (15:39:21)
+ * Bradley J Chambers <brad.chambers at gmail.com> fix broken SupportTest and python plugin options (11:29:00)
+ * Bradley J Chambers <brad.chambers at gmail.com> accidently deleted wrong line in macro, fix it (10:37:02)
+ * Bradley J Chambers <brad.chambers at gmail.com> use CMakeParseArguments in PDAL_ADD_TEST (10:16:42)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Don't link in PDAL source files in plugin. (12:54:09)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #660 from PDAL/issues-658 (12:30:43)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove debug. (12:01:55)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make build work with and without LAZperf. (11:35:33)
+
+2014-12-01
+ * Bradley J Chambers <brad.chambers at gmail.com> PCLVisualizer now has x, y, z, rgb, and intensity color handlers (10:23:36)
+
+2014-12-10
+ * Bradley J Chambers <brad.chambers at gmail.com> use create<Reader|Writer|Filter> methods when creating driver stages, especially for plugins, use unique_ptr's for stages (13:19:53)
+ * Pete Gadomski <pete.gadomski at gmail.com> Use OPTIONAL_COMPONENT_SWITCH for attribute plugin (14:30:37)
+ * Bradley J Chambers <brad.chambers at gmail.com> make the crop filter a builtin filter once again (19:18:56)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #648 from PDAL/clean-up-crop (13:03:36)
+ * Bradley J Chambers <brad.chambers at gmail.com> remove comments, WITH_GEOS has no meaning anymore (12:34:56)
+ * Bradley J Chambers <brad.chambers at gmail.com> CropFilter should be built with or without GEOS (12:08:56)
+ * Bradley J Chambers <brad.chambers at gmail.com> add_test needs WORKING_DIRECTORY set on linux (11:33:20)
+ * Bradley J Chambers <brad.chambers at gmail.com> help find plugins in build location (10:37:40)
+ * Bradley J Chambers <brad.chambers at gmail.com> fix the crop filter tests (10:13:24)
+ * Howard Butler <howard at hobu.co> Merge pull request #647 from PDAL/move-crop-filter (09:19:59)
+ * Howard Butler <howard at hobu.co> Merge pull request #646 from PDAL/move-stats-filter (08:51:16)
+
+2014-12-08
+ * Bradley J Chambers <brad.chambers at gmail.com> Port of python filters (predicate and programmable) to plugins; separate test executables (10:58:39)
+ * Andrew Bell <andrew.bell.ia at gmail.com> SQLite checked with compression and integrated into int I/O. (19:55:57)
+ * Pete Gadomski <pete.gadomski at gmail.com> Fix typo in name of ZVelocity dimension (08:36:07)
+ * Bradley J Chambers <brad.chambers at gmail.com> Move Reprojection filter (08:25:47)
+
+2014-12-12
+ * Bradley J Chambers <brad.chambers at gmail.com> LasReader is unused in XMLSchemaTest (23:28:56)
+ * Bradley J Chambers <brad.chambers at gmail.com> need to export XMLSchema (23:08:52)
+ * Bradley J Chambers <brad.chambers at gmail.com> set CMAKE_PREFIX_PATH to help locate PCL in OSGeo4W default location (23:08:05)
+ * Howard Butler <howard at hobu.co> Merge pull request #657 from PDAL/tweak-windows-definitions (21:49:23)
+ * Bradley J Chambers <brad.chambers at gmail.com> fvisibility-inlines-hidden not relevant on windows, pdal_dll_export can probably be defined project wide (15:39:07)
+ * Howard Butler <howard at hobu.co> Merge pull request #652 from PDAL/objects-needed-in-msvc (20:55:25)
+ * Howard Butler <howard at hobu.co> Merge pull request #645 from PDAL/issues-599 (20:55:06)
+ * Connor Manning <connor at hobu.co> Allow quad-tree to represent a subtree. (15:37:18)
+ * Connor Manning <connor at hobu.co> Various tweaks. (14:47:18)
+ * Connor Manning <connormanning at users.noreply.github.com> Merge pull request #656 from PDAL/issues/653-dependent-tests (14:22:08)
+ * Connor Manning <connor at hobu.co> Need iostream include for std::ios::pos_type. (14:14:54)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into issues-599 (11:39:43)
+ * Howard Butler <howard at hobu.co> Merge pull request #655 from PDAL/issues/654-windows-plugin-search-path (10:15:15)
+ * Bradley J Chambers <brad.chambers at gmail.com> fix default for dependent tests, also check for WITH_TESTS before adding plugin tests (10:10:51)
+ * Bradley J Chambers <brad.chambers at gmail.com> add bin dir for windows users and add default paths to KernelFactory (09:32:06)
+
+2014-12-11
+ * Howard Butler <howard at hobu.co> Merge pull request #649 from gadomski/optional-component-switch-on-plugins (11:07:00)
+ * Howard Butler <howard at hobu.co> Merge pull request #650 from PDAL/make-crop-builtin-filter (09:30:09)
+ * Howard Butler <howard at hobu.co> Merge pull request #651 from PDAL/gtest-fix-msvc (09:29:58)
+ * Bradley J Chambers <brad.chambers at gmail.com> _VARIADIC_MAX must be increased on msvc for gtest (08:38:28)
+
+2014-12-04
+ * Bradley J Chambers <brad.chambers at gmail.com> Only Windows needs to have the object libraries included in apps/tests (11:40:18)
+ * Andrew Bell <andrew.bell.ia at gmail.com> DbReader for OCI. (11:09:52)
+
+2014-11-21
+ * Bradley J Chambers <brad.chambers at gmail.com> Move Crop filter (09:59:12)
+ * Bradley J Chambers <brad.chambers at gmail.com> Port Stats filter (21:11:12)
+ * Howard Butler <howard at hobu.co> hammer NUMTHREADS in travis build to 1 to see if first build stops getting killed (23:44:44)
+ * Howard Butler <howard at hobu.co> catch up drivers->io rename to master (23:27:55)
+ * Bradley J Chambers <brad.chambers at gmail.com> Port MortonOrder filter (19:57:33)
+ * Bradley J Chambers <brad.chambers at gmail.com> Port Splitter filter (20:23:33)
+ * Howard Butler <howard at hobu.co> Merge pull request #626 from PDAL/move-ferry-filter (23:10:18)
+ * Bradley J Chambers <brad.chambers at gmail.com> Port Ferry filter (19:33:45)
+ * Howard Butler <howard at hobu.co> Merge pull request #625 from PDAL/move-decimation-filter (19:53:10)
+ * Bradley J Chambers <brad.chambers at gmail.com> Port Decimation filter (16:08:17)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix tests for missing LIBGEOTIFF. (15:37:00)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #624 from PDAL/pgpointcloud-vagrant (15:26:47)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #623 from PDAL/linux-issues (15:26:37)
+ * Bradley J Chambers <brad.chambers at gmail.com> pgpointcloud xmls in vagrant need updating (15:25:10)
+ * Bradley J Chambers <brad.chambers at gmail.com> we do not need to include the object libs in the app (13:53:42)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Replace stuff I shouldn't have removed. (13:27:27)
+ * Howard Butler <howard at hobu.co> A bunch of windows warnings and cleanups #622 (11:42:40)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into issues-599 (11:23:00)
+ * Howard Butler <howard at hobu.co> Merge pull request #621 from PDAL/issues-617 (08:26:25)
+
+2014-12-09
+ * Howard Butler <howard at hobu.co> Merge pull request #644 from PDAL/convert-boost-test-to-google-test (21:25:25)
+ * Howard Butler <howard at hobu.co> gtest unsigned comparison cleanups (21:03:39)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into issues-599 (16:38:51)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Write scale into XMLSchema. (16:08:40)
+ * Bradley J Chambers <brad.chambers at gmail.com> optional plugin tests should also be dependent on WITH_TESTS (11:40:25)
+ * Bradley J Chambers <brad.chambers at gmail.com> malformed test in GDALUtilsTest (10:27:01)
+ * Bradley J Chambers <brad.chambers at gmail.com> update tests to address warnings, most of which were signed/unsigned or int/float comparisons (09:56:06)
+ * Howard Butler <howard at hobu.co> Merge pull request #643 from PDAL/move-reprojection-filter (09:04:39)
+ * Howard Butler <howard at hobu.co> Merge pull request #642 from gadomski/zvelocity-name-typo (09:04:33)
+
+2014-12-02
+ * Bradley J Chambers <brad.chambers at gmail.com> Convert unit tests from Boost Test to Google Test (14:08:32)
+ * Bradley J Chambers <brad.chambers at gmail.com> remove remaining refernces to boost standard integer types (14:31:07)
+ * Bradley J Chambers <brad.chambers at gmail.com> Remove dangling references to drivers, mostly in the plugins (11:11:21)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make DbReader. Hook to pgpointcloud. (20:03:13)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove XMLSchema from Info.hpp. (11:27:28)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove PDAL_HAVE_LIBXML2 from XMLSchema files. Use build system instead. (10:58:02)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Ignore float equality warning. (10:05:25)
+ * Bradley J Chambers <brad.chambers at gmail.com> remove cruft, fPIC seems to be required for Kernel common object library (10:05:11)
+ * Bradley J Chambers <brad.chambers at gmail.com> missed rename of Support to KernelSupport (09:39:30)
+ * Bradley J Chambers <brad.chambers at gmail.com> remove extraneous clearing of PDAL_TARGET_OBJECTS (09:27:36)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove XML schema reader/writer. Remove exceptions from XML schema. Remove pointer wrappers. Remove storage of DimTypes (use XMLDims instead) (09:13:55)
+
+2014-12-05
+ * Howard Butler <howard at hobu.co> Merge pull request #639 from PDAL/move-merge-and-sort-filters (10:58:57)
+ * Bradley J Chambers <brad.chambers at gmail.com> Moving merge and sort filters (10:05:55)
+
+2014-12-03
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into issues-599 (20:14:35)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into issues-599 (20:12:20)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (17:48:19)
+ * Howard Butler <howard at hobu.co> cleanups related to #637 (17:48:12)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Writer support for scaled 32-bit ints in OCI. (17:08:13)
+ * Howard Butler <howard at hobu.co> Merge pull request #638 from PDAL/remove-boost-cstdint (13:16:29)
+ * Bradley J Chambers <brad.chambers at gmail.com> still need sudo for make install though (12:19:47)
+ * Bradley J Chambers <brad.chambers at gmail.com> sudo the ctest call to avoid segfault on travis (12:01:02)
+ * Howard Butler <howard at hobu.co> Merge pull request #637 from PDAL/plugin-renames (10:30:21)
+ * Howard Butler <howard at hobu.co> Merge pull request #636 from PDAL/move-kernels (08:42:33)
+ * Howard Butler <howard at hobu.co> Merge pull request #635 from PDAL/move-colorization-filter (08:42:18)
+ * Howard Butler <howard at hobu.co> Merge pull request #632 from gadomski/red-hat-build-fixes (08:39:00)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into issues-599 (07:23:47)
+
+2014-11-14
+ * Bradley J Chambers <brad.chambers at gmail.com> Port ALL kernels (15:04:45)
+ * Bradley J Chambers <brad.chambers at gmail.com> Port Attributes Filter (14:56:44)
+ * Bradley J Chambers <brad.chambers at gmail.com> Port Terrasolid Reader (14:25:41)
+ * Bradley J Chambers <brad.chambers at gmail.com> Port Text Writer (14:17:04)
+ * Bradley J Chambers <brad.chambers at gmail.com> Port BPF driver (11:31:51)
+ * Bradley J Chambers <brad.chambers at gmail.com> Port QFIT Reader (14:46:35)
+ * Bradley J Chambers <brad.chambers at gmail.com> Port SBET Reader and Writer (13:22:31)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #593 from PDAL/cast (15:29:11)
+ * Pete Gadomski <pete.gadomski at gmail.com> Allow text writer precision to be configured (14:50:00)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add base64-encoding of header extra data. (13:57:52)
+ * Paul Ramsey <pramsey at cleverelephant.ca> Merge branch 'master' of https://github.com/PDAL/PDAL (13:47:34)
+ * Connor Manning <connormanning at users.noreply.github.com> Merge pull request #591 from PDAL/issues/583-pgpointcloud-ignore (10:33:57)
+ * Connor Manning <connor at hobu.co> Ignore generated Pgtest-Support file. (10:31:01)
+ * Pete Gadomski <pete.gadomski at gmail.com> Never build OCI on travis (09:44:57)
+ * Pete Gadomski <pete.gadomski at gmail.com> Simplify oci's CMakeLists.txt (09:21:54)
+ * Pete Gadomski <pete.gadomski at gmail.com> Default BUILD_WITH_OCI=OFF if no ORACLE_HOME (09:21:17)
+ * Pete Gadomski <pete.gadomski at gmail.com> Change case in FindOracle.cmake (09:15:43)
+ * Pete Gadomski <pete.gadomski at gmail.com> Install during travis's script (08:32:38)
+
+2014-11-20
+ * Bradley J Chambers <brad.chambers at gmail.com> Port Colorization filter (08:33:24)
+ * Bradley J Chambers <brad.chambers at gmail.com> rename drivers as io (20:29:30)
+ * Bradley J Chambers <brad.chambers at gmail.com> rename drivers as io (20:29:30)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Warnings for bad return numbers and number of returns. (17:22:32)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Utils to namespace. (15:46:07)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Replace removed function. (12:11:29)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (11:37:03)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix Nitf test include. (11:35:39)
+ * Howard Butler <howard at hobu.co> adjust plugin tests to reflect Chipper move (11:35:26)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (11:24:26)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove dead code from Utils. (11:23:36)
+ * Howard Butler <howard at hobu.co> Merge pull request #618 from PDAL/move-chipper-filter (08:37:10)
+ * Howard Butler <howard at hobu.co> Merge pull request #619 from PDAL/convert-attribute-to-plugin (08:32:12)
+
+2014-11-26
+ * Pete Gadomski <pete.gadomski at gmail.com> Metadata.hpp needs a <memory> include (12:20:49)
+ * Pete Gadomski <pete.gadomski at gmail.com> Specify languages in cmake project (12:19:07)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add support for writing int32's to DbWriter. Schema mods still needed. (11:08:32)
+
+2014-11-25
+ * Bradley J Chambers <brad.chambers at gmail.com> pclvisualizer is a writer, not a reader (19:45:41)
+ * Howard Butler <howard at hobu.co> Merge pull request #630 from PDAL/move-morton-filter (12:30:35)
+ * Howard Butler <howard at hobu.co> Merge pull request #620 from PDAL/drivers-to-io (12:30:24)
+
+2014-11-22
+ * Howard Butler <howard at hobu.co> try NUMTHREADS=2 (08:53:59)
+
+2014-11-24
+ * Paul Ramsey <pramsey at cleverelephant.ca> Fix cross-references (18:32:07)
+ * Paul Ramsey <pramsey at cleverelephant.ca> Groups readers w/ readers, writers w/ writers (17:43:32)
+ * Bradley J Chambers <brad.chambers at gmail.com> if no point indices provided in view kernel, visualize all points (14:59:00)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #628 from PDAL/pcl-visualize-tweaks (14:48:35)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #629 from pramsey/doc_filter_rename (14:32:12)
+ * Bradley J Chambers <brad.chambers at gmail.com> add ability to visualize a range of points in view kernel (13:37:58)
+ * Paul Ramsey <pramsey at cleverelephant.ca> Fix mistaken touch of kernel names (13:30:22)
+ * Paul Ramsey <pramsey at cleverelephant.ca> Fix readers/readres typos (13:27:21)
+ * Paul Ramsey <pramsey at cleverelephant.ca> Rename all drivers.*.reader to readers.* and rename all drivers.*.writer to writers.* (13:21:17)
+ * Bradley J Chambers <brad.chambers at gmail.com> view kernel need not be built without PCL_VISUALIZATION_FOUND, it can also use the visualize method to invoke the visualizer (10:56:48)
+ * Bradley J Chambers <brad.chambers at gmail.com> remove unused includes in Random.hpp (trips up Windows) (08:28:34)
+
+2014-11-23
+ * Howard Butler <howard at hobu.co> Merge pull request #627 from PDAL/move-splitter-filter (22:53:32)
+
+2014-11-18
+ * Bradley J Chambers <brad.chambers at gmail.com> capitalization matters (22:25:28)
+ * Howard Butler <howard at hobu.co> Implement stream-based PointBuffer constructor and byte fetching #604 (20:55:22)
+ * Howard Butler <howard at hobu.co> Merge pull request #603 from PDAL/issues/581-system-identifier (18:49:04)
+ * Howard Butler <howard at hobu.co> Merge pull request #597 from PDAL/move-sbet-drivers (18:48:32)
+ * Howard Butler <howard at hobu.co> Merge pull request #605 from PDAL/run-plugin-tests (18:48:25)
+ * Bradley J Chambers <brad.chambers at gmail.com> try using ctest to run all tests on Travis again (14:07:49)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #602 from PDAL/fix-pc2pc-on-windows (13:03:29)
+ * Bradley J Chambers <brad.chambers at gmail.com> fix test/unit/CMakeLists (13:01:28)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #601 from PDAL/no-initializer-lists (12:14:19)
+ * Bradley J Chambers <brad.chambers at gmail.com> fix exename on windows, should be noop otherwise (12:09:47)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #600 from PDAL/open-binary-mode (11:53:53)
+ * Bradley J Chambers <brad.chambers at gmail.com> cannot use initializer lists with the vector of strings on msvc2012 (11:38:39)
+ * Bradley J Chambers <brad.chambers at gmail.com> need to make sure we open in binary mode (11:30:50)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Don't attempt to read extra header info if there is none. (11:19:07)
+ * Howard Butler <howard at hobu.co> Merge pull request #598 from PDAL/test-path-update (10:24:50)
+ * Bradley J Chambers <brad.chambers at gmail.com> slightly alter path to test executable in macro (09:42:01)
+
+2014-11-17
+ * Bradley J Chambers <brad.chambers at gmail.com> Port LAS drivers (16:04:52)
+ * Paul Ramsey <pramsey at cleverelephant.ca> Merge branch 'master' of https://github.com/PDAL/PDAL (18:47:24)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make tests pass if there's no GEOTIFF. (16:53:08)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add inspect() to BPF. (15:33:45)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (14:18:24)
+ * Andrew Bell <andrew.bell.ia at gmail.com> preview() infrastructure and las implementation. (14:17:51)
+ * Bradley J Chambers <brad.chambers at gmail.com> order matters, driver object libs need to be created before test (13:17:11)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove bad comment. (11:44:48)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (11:21:54)
+ * Howard Butler <howard at hobu.co> Merge pull request #596 from PDAL/register-tre-handler (11:15:46)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (11:10:35)
+ * Howard Butler <howard at hobu.co> point to new location of Faux reader in OCITest (11:10:29)
+ * Bradley J Chambers <brad.chambers at gmail.com> use PluginRegistry C API instead, as C++ symbols are not exported on windows (11:10:16)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (10:58:16)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Get spatial reference, rather than storing directly into metadata. (10:57:28)
+ * Bradley J Chambers <brad.chambers at gmail.com> nitf plugin needs gitsha (10:41:43)
+ * Howard Butler <howard at hobu.co> Merge pull request #595 from PDAL/option-empty (10:31:05)
+ * Bradley J Chambers <brad.chambers at gmail.com> empty does not need to be guarded on windows (10:27:15)
+ * Howard Butler <howard at hobu.co> Merge pull request #592 from gadomski/text-writer-precision (09:57:11)
+ * Howard Butler <howard at hobu.co> Merge pull request #586 from PDAL/auto-load-update (09:53:36)
+ * Howard Butler <howard at hobu.co> Merge pull request #589 from gadomski/default-oracle-off (09:53:16)
+ * Howard Butler <howard at hobu.co> Merge pull request #587 from PDAL/faux-rename-reorg (09:53:06)
+ * Howard Butler <howard at hobu.co> Merge pull request #588 from gadomski/ci-test-install (09:52:55)
+
+2014-11-12
+ * Bradley J Chambers <brad.chambers at gmail.com> this is a bit of a hack, but it clears up the issue of the static variable not being exported with the DLL on MSVC (13:35:57)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add non-const data() (19:26:36)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Two types of data. (17:11:59)
+ * Andrew Bell <andrew.bell.ia at gmail.com> More cast fun. (16:31:43)
+ * Howard Butler <howard at hobu.co> pgpointcloud test cleanup (15:52:52)
+ * Howard Butler <howard at hobu.co> _TESTS of corresponding _PLUGIN cmake_dependent_option should default to ON (15:52:35)
+ * Howard Butler <howard at hobu.co> default my config to use the new BUILD_PLUGIN syntax (15:51:55)
+ * Howard Butler <howard at hobu.co> un-break master due to #562 compression stuff (15:22:35)
+ * Howard Butler <howard at hobu.co> Implement laz-perf compression #562 (15:14:20)
+ * Howard Butler <howard at hobu.co> Merge pull request #582 from gadomski/nitf-default-off (14:35:47)
+ * Pete Gadomski <pete.gadomski at gmail.com> Turn off NITF by default (14:13:00)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #514 from PDAL/issues/514-charbuf-export (12:07:41)
+ * Howard Butler <howard at hobu.co> Charbuf uses std::ios::pos_type, not Charbuf::pos_type #512 (11:26:00)
+
+2014-11-15
+ * Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (08:15:26)
+ * Howard Butler <howard at hobu.co> change the 'spatialreference' metadata item to be eHorizontalOnly and add a 'comp_spatialreference' metadata item for compount (vertical + horizontal) SRSs #571 (08:15:23)
+
+2014-11-13
+ * Bradley J Chambers <brad.chambers at gmail.com> Port FauxReader (09:18:31)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #584 from PDAL/cmake-2.8.12-on-travis (21:27:38)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #585 from PDAL/issues/583-pgpointcloud-include (21:25:33)
+ * Bradley J Chambers <brad.chambers at gmail.com> auto directory_iterator works on OSX not linux (21:24:15)
+ * Bradley J Chambers <brad.chambers at gmail.com> default to reasonable plugin locations if PDAL_DRIVER_PATH not set (15:10:36)
+ * Bradley J Chambers <brad.chambers at gmail.com> include pgpointcloud bin directory (20:48:06)
+ * Bradley J Chambers <brad.chambers at gmail.com> install cmake 2.8.12 from PPA (20:45:09)
+
+2014-11-11
+ * Andrew Bell <andrew.bell.ia at gmail.com> Squashed commit of the following: (12:58:09)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'issues/554-port-all-plugins' (12:11:44)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Missed file. (12:04:52)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' into issues/554-port-all-plugins (12:04:23)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add tests for LAS metadata/option handling. (10:41:12)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #579 from PDAL/issues/563-base64-metadata (08:13:09)
+
+2014-11-10
+ * Andrew Bell <andrew.bell.ia at gmail.com> Change PointRef to PtRef to work around MSVC problem. (21:53:11)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into issues/563-base64-metadata (16:18:11)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Provide type conversion for metadata. Provide automatic base 64 decoding for metadata. (15:43:12)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (15:36:23)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add support for stream redirection/restoration. (15:35:59)
+ * Howard Butler <howard at hobu.co> Merge pull request #578 from PDAL/issues/576-typename-outside-template (09:16:06)
+ * Bradley J Chambers <brad.chambers at gmail.com> remove typename keyword in PointBufferIter.hpp (08:53:04)
+
+2014-11-06
+ * Pete Gadomski <pete.gadomski at gmail.com> Change case of SQLiteTest.cpp (10:15:49)
+ * Bradley J Chambers <brad.chambers at gmail.com> link plugin libraries to plugin tests by default (16:02:52)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add dimension documentation. (13:38:37)
+
+2014-11-04
+ * Bradley J Chambers <brad.chambers at gmail.com> still need to include directories (21:19:57)
+ * Bradley J Chambers <brad.chambers at gmail.com> simplify the original pdal unit tests, using the new cmake macro, also regrouping sources to make it a little easier to read/find things (18:06:40)
+ * Bradley J Chambers <brad.chambers at gmail.com> names must match, this is too easy to mess up, need to make it foolproof (17:12:11)
+ * Bradley J Chambers <brad.chambers at gmail.com> nitf::Writer is now nitf::NitfWriter (17:02:08)
+ * Bradley J Chambers <brad.chambers at gmail.com> cannot pass unique_ptr to setInput (15:43:58)
+ * Howard Butler <howard at hobu.co> link PCL_LIBRARIES for PCL plugins after tweak in #573 (10:28:36)
+ * Howard Butler <howard at hobu.co> Merge pull request #573 from gadomski/plugin-marco-changes (07:18:51)
+ * Howard Butler <howard at hobu.co> Merge pull request #568 from PDAL/issues/568-desdata-offset-length (07:18:41)
+
+2014-11-02
+ * Bradley J Chambers <brad.chambers at gmail.com> typo in file extension (20:29:52)
+ * Howard Butler <howard at hobu.co> put DESDATA_LENGTH and DESDATA_OFFSET in metadata #568 (22:28:27)
+
+2014-11-01
+ * Bradley J Chambers <brad.chambers at gmail.com> set lib names within macro, quote variables so lists stay intact (21:58:05)
+
+2014-10-29
+ * Bradley J Chambers <brad.chambers at gmail.com> remove all the USE_PDAL_PLUGIN_FOO refs (21:55:27)
+ * Bradley J Chambers <brad.chambers at gmail.com> not expecting nitro to be present on travis, so pin BUILD_PLUGIN_NITRO=OFF (21:52:12)
+ * Bradley J Chambers <brad.chambers at gmail.com> update recently added NitfReader test (13:43:07)
+ * Bradley J Chambers <brad.chambers at gmail.com> lint (13:21:46)
+ * Bradley J Chambers <brad.chambers at gmail.com> cleaning up (12:50:48)
+ * Bradley J Chambers <brad.chambers at gmail.com> drop find_package REQUIRED, let FOO_FOUND do all the work and only be a stickler about version if it becomes an issue (12:24:00)
+ * Bradley J Chambers <brad.chambers at gmail.com> renamed hexer as hexbin, should not necessarily name the plugins after their dependencies (12:00:11)
+ * Bradley J Chambers <brad.chambers at gmail.com> Port HexBin driver to plugin framework, fix BUILD_PLUGIN_NITF (11:56:54)
+ * Bradley J Chambers <brad.chambers at gmail.com> reflect renamed options, update vagrant scripts (11:35:55)
+ * Bradley J Chambers <brad.chambers at gmail.com> WITH_ changed to BUILD_PLUGIN_ for plugin options, add dependent options for whether or not to build certain tests (e.g., certain databases may not be available for testing) (11:23:51)
+
+2014-10-27
+ * Bradley J Chambers <brad.chambers at gmail.com> Port NITF driver to plugin framework, having trouble with PDALRegister symbols being exported (15:12:42)
+ * Bradley J Chambers <brad.chambers at gmail.com> Port MrSID driver to plugin framework (10:59:20)
+ * Bradley J Chambers <brad.chambers at gmail.com> Port pgpointcloud driver to plugin framework (21:05:07)
+ * Bradley J Chambers <brad.chambers at gmail.com> remove icebridge from Drivers.hpp (21:07:36)
+ * Bradley J Chambers <brad.chambers at gmail.com> Port p2g driver to plugin framework (14:29:25)
+ * Bradley J Chambers <brad.chambers at gmail.com> handle status of missing dependencies uniformly in plugins (14:15:49)
+ * Bradley J Chambers <brad.chambers at gmail.com> Port oci drivers to plugin framework (13:59:40)
+ * Bradley J Chambers <brad.chambers at gmail.com> Port icebridge driver to plugin framework (13:07:00)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (14:57:45)
+ * Howard Butler <howard at hobu.co> ignore .pyc files (14:17:48)
+ * Howard Butler <howard at hobu.co> Merge pull request #561 from PDAL/issues/553-greyhound-plugin (13:01:23)
+ * Bradley J Chambers <brad.chambers at gmail.com> initial greyhound plugin (11:45:57)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (10:45:37)
+ * Howard Butler <howard at hobu.co> Merge pull request #551 from PDAL/pcl-ground-doc (10:45:18)
+ * Howard Butler <howard at hobu.co> Merge pull request #552 from PDAL/issues/551-pcl-visualization-check (10:45:09)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'las1.4' (10:45:03)
+ * Bradley J Chambers <brad.chambers at gmail.com> PCL_VISUALIZATION_FOUND will be TRUE if it is supported, only build the PCLVisualization driver if that is the case (10:35:14)
+ * Howard Butler <howard at hobu.co> Merge pull request #532 from PDAL/pcl-submodule (09:51:44)
+
+2014-10-28
+ * Bradley J Chambers <brad.chambers at gmail.com> move plugin tests to plugins folder, add macro for adding plugin tests (20:22:00)
+ * Bradley J Chambers <brad.chambers at gmail.com> only link PDAL in PDAL_ADD_DRIVER, link deps in the plugin CMakeLists file (12:01:48)
+ * Bradley J Chambers <brad.chambers at gmail.com> fix some typos, add PDAL_LINKAGE within pdal_macros and the pcl CMakeLists (09:08:09)
+ * Bradley J Chambers <brad.chambers at gmail.com> Port sqlite driver to plugin framework (07:32:31)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (22:50:15)
+ * Howard Butler <howard at hobu.co> default my cmake config to Debug (22:50:12)
+ * Howard Butler <howard at hobu.co> put back hackish code to set global_encoding/reserved from base64 Metadata/Option (22:50:00)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (17:40:37)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add test for NITF spatial reference option override. (17:40:05)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Simplify test names. (17:37:58)
+ * Howard Butler <howard at hobu.co> Merge pull request #548 from PDAL/issues/548-oci-connection-filename (15:05:55)
+ * Howard Butler <howard at hobu.co> support reading oracle connection string from a filename in addition to simply using the string #548 (14:40:07)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (11:05:53)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add type registration tests. (11:05:19)
+ * Howard Butler <howard at hobu.co> drivers.oci.reader: override XYZ dimensions to <double> before reading them from XML schema (11:03:28)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (09:46:57)
+ * Bradley J Chambers <brad.chambers at gmail.com> fix title/section delineation in ground tutorial (09:45:17)
+
+2014-11-03
+ * Howard Butler <howard at hobu.co> fix copy/paste bug in drivers.las.writer for CreationDOY/CreationYear (16:42:13)
+ * Pete Gadomski <pete.gadomski at gmail.com> Update PDAL_ADD_PLUGIN target_link_libraries (15:13:20)
+ * Pete Gadomski <pete.gadomski at gmail.com> Add PDAL_ADD_TEST cmake macro (15:12:44)
+ * Howard Butler <howard at hobu.co> Merge pull request #566 from PDAL/windows-fixes (14:50:11)
+ * Paul Ramsey <pramsey at cleverelephant.ca> Merge branch 'master' of github.com:pramsey/PDAL (12:52:57)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix setting header system ID. (10:41:02)
+ * Howard Butler <howard at hobu.co> add filters.attribute to stage list (08:56:45)
+
+2014-10-30
+ * Bradley J Chambers <brad.chambers at gmail.com> Fix Windows linker errors (LNK2005, LNK2019) (11:58:14)
+ * Howard Butler <howard at hobu.co> Merge pull request #564 from PDAL/forward (18:51:39)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into iter (17:12:17)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Handle forwarded metadata regardless of case. (16:45:39)
+
+2014-10-31
+ * Andrew <andrew at abell-vb2.(none)> Use fewer threads for g++ to conserve memory. (14:28:32)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix initialization order. (13:03:37)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #565 from PDAL/iter (11:50:24)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix bad merge. (11:18:35)
+
+2014-10-22
+ * Bradley J Chambers <brad.chambers at gmail.com> Add a more detailed ground filtering tutorial (13:36:53)
+ * Bradley J Chambers <brad.chambers at gmail.com> use unique_ptr with createKernel (21:33:39)
+ * Bradley J Chambers <brad.chambers at gmail.com> do the macro thing (21:14:31)
+ * Bradley J Chambers <brad.chambers at gmail.com> update Sort from Application to Kernel (21:01:09)
+ * Bradley J Chambers <brad.chambers at gmail.com> Query is OBE (20:58:23)
+ * Bradley J Chambers <brad.chambers at gmail.com> port over visualization fix from master (20:48:57)
+ * Howard Butler <howard at hobu.co> include tweak #532 (14:52:55)
+ * Bradley J Chambers <brad.chambers at gmail.com> addressing abell's comments (14:07:19)
+ * Bradley J Chambers <brad.chambers at gmail.com> oops, still need the guard for now (20:28:08)
+ * Bradley J Chambers <brad.chambers at gmail.com> will not even try to visualize if PDAL_HAVE_PCL_VISUALIZATION not present (15:09:30)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Use read instead of get for strings to avoid problems with embedded newlines. (22:26:04)
+ * Howard Butler <howard at hobu.co> Support setting spatialite module name via options #539 (16:23:31)
+ * Howard Butler <howard at hobu.co> Merge pull request #533 from PDAL/issues/533-attribute-filter (15:26:16)
+ * Howard Butler <howard at hobu.co> Merge pull request #537 from PDAL/add-morton-order-sort (15:25:47)
+ * Howard Butler <howard at hobu.co> LAS 1.4 Support. Refactoring of LAS/LAZ reader/writer #534 (15:19:51)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Formatting. (14:53:19)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into iter (14:50:51)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Working sort filter. (14:50:32)
+ * Howard Butler <howard at hobu.co> Merge pull request #536 from PDAL/issues/535-write-fixed-point-count (14:29:14)
+ * Howard Butler <howard at hobu.co> rearrange some includes #533 (14:26:17)
+ * Bradley J Chambers <brad.chambers at gmail.com> change m_limit to point_count_t and remove template types, which are inferred (13:41:03)
+ * Howard Butler <howard at hobu.co> handle GDAL <= 1.10 #533 (13:33:53)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into iter (13:11:18)
+ * Andrew Bell <andrew.bell.ia at gmail.com> More swap work. (12:55:39)
+ * Howard Butler <howard at hobu.co> #include <ogr_api.h> for OGRRegisterAll() in GDALUtils.hpp #533 (12:55:36)
+ * Howard Butler <howard at hobu.co> Implement filters.attribute -- setting of point dimension using Polygons and OGR #533 (12:13:37)
+ * Bradley J Chambers <brad.chambers at gmail.com> fix some documentation typos (08:53:18)
+ * Bradley J Chambers <brad.chambers at gmail.com> Add option to limit number of points written in Translate, using Decimation filter modification. Remove count from all other kernels (except Random, where it us used in the FauxReader). (08:35:35)
+
+2014-10-15
+ * Bradley J Chambers <brad.chambers at gmail.com> Isolate plugins and their dependencies, starting with PCL. Create Kernel class for kernel plugins. (11:12:16)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add empty for PointBuffer. (15:30:59)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove dead tests. (14:36:57)
+
+2014-10-26
+ * Howard Butler <howard at hobu.co> Merge pull request #538 from PDAL/remove-cannot-visualize-error (11:05:19)
+ * Howard Butler <howard at hobu.co> Merge pull request #539 from PDAL/issues/539-spatialite-module-name (11:04:59)
+
+2014-10-24
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #546 from gadomski/cmake-zlib (17:24:57)
+ * Pete Gadomski <pete.gadomski at gmail.com> Clean up zlib's cmake logic (17:08:44)
+
+2014-10-23
+ * Bradley J Chambers <brad.chambers at gmail.com> check if visualization requested in Sort and Random as well (14:13:09)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #545 from PDAL/issues/542-numeric-limits-const (13:17:04)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #544 from PDAL/issues/541-static-const-init (13:16:16)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #543 from PDAL/issues/540-demangler-windows-test (13:14:53)
+ * Bradley J Chambers <brad.chambers at gmail.com> another reference to MAX_DATA_SIZE (12:21:55)
+ * Bradley J Chambers <brad.chambers at gmail.com> move MAX_DATA_SIZE to anonymous namespace too (12:08:44)
+ * Bradley J Chambers <brad.chambers at gmail.com> move consts to anonymous namespace rather than static member vars (12:02:28)
+ * Bradley J Chambers <brad.chambers at gmail.com> use cxxabi ifndef windows (12:00:24)
+
+2014-10-21
+ * Bradley J Chambers <brad.chambers at gmail.com> Add filter to sort points by Morton order, and kernel to expose this as an app (08:46:40)
+ * Andrew Bell <andrew.bell.ia at gmail.com> More Travis fixes. (11:27:19)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into iter (11:13:44)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Iterator test. (11:13:28)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fixes for builds without libgeotiff. Fix assertion bound. (10:51:17)
+
+2014-10-20
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into las1.4 Fix NULL spatial reference for NITF clipping. Change PDAL_HAVE_SRS to PDAL_HAVE_LIBGEOTIFF (15:31:26)
+ * Andrew Bell <andrew.bell.ia at gmail.com> LAS auto-offset computation. Fix record signature for 1.0 LAS VLRs. (12:20:56)
+
+2014-10-19
+ * Howard Butler <howard at hobu.co> Implement IGEOLO support #531 (17:18:27)
+ * Howard Butler <howard at hobu.co> Merge pull request #529 from PDAL/yosemite-lint (09:54:46)
+
+2014-10-18
+ * Howard Butler <howard at hobu.co> Merge pull request #528 from PDAL/PointBuffer-constness (22:03:28)
+ * Howard Butler <howard at hobu.co> Work to regularize PDAL's dependencies and clarify what is really required vs. what is optional #523 (22:01:31)
+ * Howard Butler <howard at hobu.co> Merge pull request #524 from PDAL/issues/524-aimidb-afctb-nitf-output (16:15:36)
+
+2014-10-17
+ * Michael P. Gerlek <mpg at flaxen.com> added common header to all unit test files (10:59:28)
+ * Michael P. Gerlek <mpg at flaxen.com> added "-isystem /usr/local/include" (10:59:04)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'PointBuffer-constness' into yosemite-lint (09:44:27)
+
+2014-10-16
+ * Bradley J Chambers <brad.chambers at gmail.com> random kernel needs to set options on the faux reader now (20:19:53)
+ * Howard Butler <howard at hobu.co> Add support for NITF ACFTB and AIMIDB TREs (15:13:24)
+ * Michael P. Gerlek <mpg at flaxen.com> constify the PointBuffer::append() functions (15:03:04)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #526 from PDAL/greyhound (13:46:07)
+ * Connor Manning <connor at hobu.co> Update FindJsoncpp cmake file and Greyhound driver. (12:22:29)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix error in assertion. (12:00:42)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove dead code from LAS reader. (11:59:46)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Formatting. (11:50:34)
+
+2014-10-14
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add auto-fields to xform structure. (13:56:36)
+
+2014-10-12
+ * Howard Butler <howard at hobu.co> Merge pull request #522 from chambbj/fix-ground-pcl-kernels (21:51:34)
+
+2014-10-10
+ * Bradley J Chambers <brad.chambers at gmail.com> fix makeReader in Ground and PCL kernels (19:59:31)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into las1.4 (14:25:58)
+ * Howard Butler <howard at hobu.co> doc tweak FAQ -- add note about PCL (14:16:49)
+ * Howard Butler <howard at hobu.co> tweak front page (14:11:44)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (14:05:17)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Don't build with stubs. (14:03:11)
+ * Howard Butler <howard at hobu.co> Merge pull request #521 from chambbj/set-options-for-view (13:35:07)
+ * Howard Butler <howard at hobu.co> Merge pull request #520 from chambbj/namespace-fix-for-pcl (13:31:11)
+ * Bradley J Chambers <brad.chambers at gmail.com> options changes ripple down to PCLVisualizer and View (13:29:31)
+ * Bradley J Chambers <brad.chambers at gmail.com> PDALtoPCD now lives in the pclsupport namespace (13:13:07)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add default point sizes for 1.4 point types. Other small changes. (11:27:09)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Missed options fix. (10:25:35)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' into las1.4 (10:19:04)
+ * Howard Butler <howard at hobu.co> Remove the passing of Options from the Stage constructor #482. Instead use Stage::setOptions() at a time of your choosing before Stage::prepare() is called to control when Options should be passed into a stage. (09:09:44)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into las1.4 (08:50:37)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (08:48:43)
+ * Howard Butler <howard at hobu.co> Merge pull request #518 from PDAL/pbset-bounds (08:47:09)
+ * Howard Butler <howard at hobu.co> update hobu's cmake invocation (08:27:45)
+ * Michael P. Gerlek <mpg at flaxen.com> fixes and improvements to Bounds (08:01:45)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'las1.4' of https://github.com/PDAL/PDAL into las1.4 (07:49:24)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Move initialization of zipper/zip point inside ifdef. (07:47:46)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into las1.4 (07:47:31)
+
+2014-10-09
+ * Andrew <andrew at abell-vb2.(none)> Small build fixes. (21:08:26)
+ * Michael P. Gerlek <mpg at flaxen.com> added helper: calculateBounds(PointBufferSet) (14:29:37)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make LAZ really work. (14:04:53)
+ * Howard Butler <howard at hobu.co> Merge branch 'pcl-tests' #513 (10:15:14)
+
+2014-10-08
+ * Howard Butler <howard at hobu.co> Merge pull request #508 from chambbj/PCLVisualizer (16:32:00)
+ * Bradley J Chambers <brad.chambers at gmail.com> fix memory issue (14:34:08)
+ * Bradley J Chambers <brad.chambers at gmail.com> move the visualization code to the Application class (12:56:14)
+ * Bradley J Chambers <brad.chambers at gmail.com> visualize both input and output (11:48:06)
+ * Howard Butler <howard at hobu.co> put back docs for (09:40:30)
+ * Howard Butler <howard at hobu.co> point to filters.ferry in stages doc (09:28:47)
+ * Michael P. Gerlek <mpg at flaxen.com> PCL doc updates (09:04:34)
+ * Michael P. Gerlek <mpg at flaxen.com> namespace fix (08:34:07)
+ * Bradley J Chambers <brad.chambers at gmail.com> getVisualize should return false if PCLVisualize not available (08:03:20)
+ * Bradley J Chambers <brad.chambers at gmail.com> add --visualize flag at the Application level that will cause Ground, PCL, Random, and Translate kernels to spawn a PCLVisualizer after writing the result to disk (07:48:54)
+
+2014-10-06
+ * Bradley J Chambers <brad.chambers at gmail.com> fix the PCL stubs for PCLVisualizer (09:40:17)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add support for BPF version 1 and 2. (19:46:02)
+ * Michael P. Gerlek <mpg at flaxen.com> remove debugging (15:14:04)
+ * Michael P. Gerlek <mpg at flaxen.com> tighten up the namespaces (14:53:09)
+ * Michael P. Gerlek <mpg at flaxen.com> import PCL pipeline files from the PCL repo (14:52:07)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into las1.4 (13:33:43)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Don't allow waveform point formats. (13:33:21)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'clang-warnings' into pcl-tests (10:12:01)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'pdal-info-summary' into pcl-tests (10:10:48)
+ * Michael P. Gerlek <mpg at flaxen.com> added --summary, for a less verbose output (09:52:10)
+ * Michael P. Gerlek <mpg at flaxen.com> added ptree-to-reST dump support (09:50:18)
+
+2014-10-03
+ * Bradley J Chambers <brad.chambers at gmail.com> add PCLVisualizer writer and View kernel (14:58:09)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make ZIP stuff work again. (18:10:34)
+ * Howard Butler <howard at hobu.co> convertAndSet doesn't work on int8_t/uint8_t (14:43:51)
+ * Howard Butler <howard at hobu.co> put back PointSourceId setting option for drivers.oci.reader (13:53:09)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Bug fixes and warning cleanup. (12:57:43)
+ * Michael P. Gerlek <mpg at flaxen.com> fix various clang warnings (09:44:42)
+ * Michael P. Gerlek <mpg at flaxen.com> correct/clarify test runner doc (09:44:14)
+
+2014-10-07
+ * Howard Butler <howard at hobu.co> Merge pull request #506 from gadomski/pipeline-commandline-options (14:25:26)
+ * Howard Butler <howard at hobu.co> Merge pull request #507 from PDAL/clang-warnings (14:25:13)
+ * Howard Butler <howard at hobu.co> Merge pull request #509 from PDAL/pdal-info-summary (14:23:38)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into las1.4 (14:18:01)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Support point formats 6-10. (14:17:41)
+ * Michael P. Gerlek <mpg at flaxen.com> all the PCL filter unit tests now working (13:58:19)
+ * Michael P. Gerlek <mpg at flaxen.com> added debugging support (13:55:35)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (13:55:08)
+ * Michael P. Gerlek <mpg at flaxen.com> PCL test cleanup (11:22:23)
+ * Michael P. Gerlek <mpg at flaxen.com> cleaned up PCL docs (11:21:34)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Use a different EPSG reference for UTM north zones. (08:22:17)
+ * Michael P. Gerlek <mpg at flaxen.com> cleanups on PCL tutorial (07:42:43)
+
+2014-10-02
+ * Andrew Bell <andrew.bell.ia at gmail.com> More compilation fixes. (20:23:24)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Try to make the compiler happy. (19:16:07)
+ * Howard Butler <howard at hobu.co> sanitize [ and ] in metadata names (16:43:13)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Eliminate compiler warnings. (12:52:17)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into las1.4 (12:42:28)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Reading and writing LAS seems to work. (11:27:53)
+
+2014-10-01
+ * Pete Gadomski <pete.gadomski at gmail.com> Remove spurious options dump (16:20:01)
+ * Pete Gadomski <pete.gadomski at gmail.com> Allow extra command line options for pdal pipeline (16:06:40)
+ * Pete Gadomski <pete.gadomski at gmail.com> Delay filename requirement until processOptions (16:01:52)
+ * Howard Butler <howard at hobu.co> Merge pull request #505 from gadomski/remove-jenkins (15:41:02)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (15:37:57)
+ * Howard Butler <howard at hobu.co> fix BOX3D::clear() to properly clear bounds and add a test to validate it (15:37:14)
+ * Howard Butler <howard at hobu.co> Merge pull request #502 from gadomski/mention-tif-in-p2g-docs (13:05:22)
+ * Howard Butler <howard at hobu.co> Merge pull request #503 from PDAL/issues/503-laszip-flush (13:05:14)
+ * Howard Butler <howard at hobu.co> add LAZ-writing NITF example (12:06:51)
+ * Howard Butler <howard at hobu.co> add ::flush() method to LAS writer so that LASzip stuff gets written in NITF writer #503 (12:06:04)
+ * Pete Gadomski <pete.gadomski at gmail.com> Add "tif" to p2g docs (09:58:53)
+
+2014-09-30
+ * Connor Manning <connormanning at users.noreply.github.com> Merge pull request #501 from PDAL/genericRaster (11:03:31)
+ * Connor Manning <connor at hobu.co> Merge branch 'master' into genericRaster (09:37:24)
+ * Connor Manning <connor at hobu.co> Add a splatted query with custom bounds/resolution. (09:36:41)
+
+2014-09-29
+ * Howard Butler <howard at hobu.co> Merge pull request #500 from PDAL/issues/500-horiz-vert-srs-fetch (16:27:17)
+ * Howard Butler <howard at hobu.co> Add SpatialReference::getVertical and SpatialReference::getHorizontal methods #500 (15:03:14)
+
+2014-09-26
+ * Pete Gadomski <pete.gadomski at gmail.com> Remove leftover Jenkins files (22:41:11)
+ * Howard Butler <howard at hobu.co> Merge pull request #498 from PDAL/issues/496-bring-back-buffer-reader (13:37:21)
+ * Howard Butler <howard at hobu.co> put PDAL_HAVE_GDAL guard around setSpatialReference call in BPF reader (13:16:26)
+ * Howard Butler <howard at hobu.co> fix up BPF SRS support (13:05:29)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix signature of addBuffer (from add_buffer) (12:39:28)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Simplify BufferReader. Add test. (11:22:14)
+ * Howard Butler <howard at hobu.co> put back drivers.buffer.reader #496 (09:44:50)
+
+2014-09-25
+ * Howard Butler <howard at hobu.co> Merge pull request #496 from PDAL/issues/496-naked-write (16:51:21)
+ * Howard Butler <howard at hobu.co> remove unused variable in filters.chipper (16:45:54)
+ * Howard Butler <howard at hobu.co> Merge pull request #435 from PDAL/issues/435-ferry-filter (15:56:50)
+ * Howard Butler <howard at hobu.co> Support naked PointBufferPtr writing #496, and update tutorial to reflect capability (15:54:08)
+ * Howard Butler <howard at hobu.co> Merge pull request #495 from chambbj/MetadataNodeImpl (15:11:30)
+ * Howard Butler <howard at hobu.co> Merge pull request #494 from PDAL/reprojection-driver-updates (14:24:39)
+ * Howard Butler <howard at hobu.co> a little bit more clean up of dead code #435 (14:24:19)
+ * Bradley J Chambers <brad.chambers at gmail.com> clean up unresolved externals in MetadataNodeImpl on MSVC (14:08:21)
+ * Howard Butler <howard at hobu.co> reprojection doc updates #494 (14:06:28)
+ * Howard Butler <howard at hobu.co> Some doc updates for filters.reprojection and others (14:01:04)
+ * Howard Butler <howard at hobu.co> Merge remote-tracking branch 'origin/master' into issues/435-ferry-filter (13:42:32)
+ * Howard Butler <howard at hobu.co> Merge pull request #493 from chambbj/issues/490-win-constant-expression (13:42:24)
+ * Howard Butler <howard at hobu.co> Merge pull request #486 from PDAL/json (13:42:17)
+ * Howard Butler <howard at hobu.co> turn off ferry reprojection test when there's no GDAL #435 (13:39:36)
+ * Bradley J Chambers <brad.chambers at gmail.com> addressing multiple windows issues (12:55:46)
+ * Howard Butler <howard at hobu.co> Finish implementation of ferry filter, with docs #435 (12:35:43)
+ * Connor Manning <connor at hobu.co> Fix botched conflict fix. (11:57:07)
+ * Connor Manning <connor at hobu.co> Fix conflict with master. (10:46:32)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' into issues/435-ferry-filter (10:20:01)
+ * Howard Butler <howard at hobu.co> Merge pull request #484 from PDAL/issues/484-refactor-bounds (10:17:19)
+ * Howard Butler <howard at hobu.co> basic test of #435 failure scenario (10:10:46)
+ * Howard Butler <howard at hobu.co> Merge pull request #485 from PDAL/ghUpdate (10:08:57)
+ * Howard Butler <howard at hobu.co> Merge pull request #492 from chambbj/issues/489-windows-round (10:07:08)
+ * Bradley J Chambers <brad.chambers at gmail.com> use Utils::sround rather than std::round to fix #489 (08:59:37)
+
+2014-09-23
+ * Connor Manning <connor at hobu.co> Don't add empty fields to JSON output. Make escapeJSON() not modify the input string. (17:22:27)
+ * Connor Manning <connor at hobu.co> Don't add empty fields to JSON output. Make escapeJSON() not modify the input string. (17:22:27)
+ * Connor Manning <connor at hobu.co> Remove reader iterator from Greyhound driver. (14:32:02)
+
+2014-09-24
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://www.github.com/PDAL/PDAL (20:03:59)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Don't use C++ that breaks VS. Add test for sanitize. (20:03:28)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #488 from PDAL/empty-chipper-buffer (19:53:08)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Don't run the chipper if we have no points. Test for this case. (19:08:45)
+ * Howard Butler <howard at hobu.co> make tests pass (17:24:57)
+ * Howard Butler <howard at hobu.co> ferry filter scaffolding #435 (16:55:27)
+ * Howard Butler <howard at hobu.co> final removal of Range and Vector to complete refactor of Bounds->BOX3D #484 (15:36:26)
+ * Howard Butler <howard at hobu.co> switch off Bounds (15:20:20)
+ * Howard Butler <howard at hobu.co> refactor calculateBounds #484 (14:46:05)
+ * Howard Butler <howard at hobu.co> start excising Bounds in favor of a BOX3D (11:16:08)
+
+2014-09-22
+ * Connor Manning <connor at hobu.co> Merge branch 'master' into indexing (13:51:18)
+ * Connor Manning <connor at hobu.co> Tweak rastering index. (13:49:57)
+ * Howard Butler <howard at hobu.co> Merge pull request #479 from chambbj/issues/478-bus-error (12:04:53)
+ * Bradley J Chambers <brad.chambers at gmail.com> add fvisibility-inlines-hidden when compiling with PCL support (11:47:32)
+
+2014-09-19
+ * Howard Butler <howard at hobu.co> Merge pull request #477 from PDAL/nitro-reader3 (15:15:17)
+ * Howard Butler <howard at hobu.co> NITF test now depends on WITH_NITRO, not WITH_GDAL #477 (14:28:26)
+ * Howard Butler <howard at hobu.co> Merge pull request #475 from PDAL/issues/475-sanitize-metadata-names (13:53:35)
+ * Connor Manning <connor at hobu.co> Merge branch 'master' of https://github.com/PDAL/PDAL into indexing (13:52:02)
+ * Howard Butler <howard at hobu.co> Sanitize pdal::Metadata key names to remove some special characters #475 (13:27:19)
+ * Howard Butler <howard at hobu.co> add bpf2nitf example pipeline (11:53:52)
+ * Michael P. Gerlek <mpg at flaxen.com> missed a GDAL->NITRO ifdef (11:11:07)
+ * Michael P. Gerlek <mpg at flaxen.com> replace GDAL-based NITF reader with a Nitro-based one (10:55:18)
+ * Michael P. Gerlek <mpg at flaxen.com> replace GDAL-based NITF reader with a Nitro-based one (10:54:29)
+
+2014-09-18
+ * Howard Butler <howard at hobu.co> Merge pull request #472 from pramsey/pgdoc (16:57:39)
+ * Paul Ramsey <pramsey at cleverelephant.ca> Add undoc'ed options for pgpointcloud writer (16:21:16)
+ * Howard Butler <howard at hobu.co> Merge pull request #469 from chambbj/doc-updates (15:24:39)
+ * Howard Butler <howard at hobu.co> Merge pull request #471 from pramsey/boost56 (15:24:32)
+ * Paul Ramsey <pramsey at cleverelephant.ca> Allow build on Boost 1.56 (15:07:36)
+ * Paul Ramsey <pramsey at cleverelephant.ca> Merge branch 'master' of github.com:PDAL/PDAL (13:00:10)
+ * Howard Butler <howard at hobu.co> add additional classifcation field option to drivers.nitf.writer (12:14:51)
+ * Howard Butler <howard at hobu.co> update example to point-context-schema (no filters.scaling anymore) (12:14:35)
+ * Howard Butler <howard at hobu.co> clean up oci warning nit (10:58:47)
+
+2014-09-17
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://www.github.com/PDAL/PDAL (13:27:47)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add LAS header test. Fix scale bug in LAS header copy ctor. (13:27:05)
+ * Bradley J Chambers <brad.chambers at gmail.com> update a number of documents (PCL, deprecated filters, etc.) (13:17:23)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #468 from gadomski/travis-notify-slack (12:40:49)
+ * Pete Gadomski <pete.gadomski at gmail.com> Add secure slack notifications to travis (10:19:22)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #467 from gadomski/travis-stubs-only (10:36:40)
+ * Pete Gadomski <pete.gadomski at gmail.com> Add stubs_only mode to Travis (10:07:56)
+ * Pete Gadomski <pete.gadomski at gmail.com> Remove rxp driver (09:57:11)
+ * Howard Butler <howard at hobu.co> Merge pull request #466 from gadomski/run-tests-without-path (09:52:05)
+ * Pete Gadomski <pete.gadomski at gmail.com> Default tests' data path to repo's data (09:39:15)
+ * Howard Butler <howard at hobu.co> Merge pull request #465 from gadomski/test-without-stubs (09:18:17)
+ * Pete Gadomski <pete.gadomski at gmail.com> Always test WITH_STUBS=OFF (09:12:02)
+ * Pete Gadomski <pete.gadomski at gmail.com> Factor out rxp moving average to a free function (09:05:06)
+ * Howard Butler <howard at hobu.co> Merge pull request #464 from gadomski/ground-depends-on-pcl (08:32:01)
+ * Pete Gadomski <pete.gadomski at gmail.com> Include ground kernel app only if we have PCL (07:54:05)
+
+2014-09-16
+ * Bradley J Chambers <brad.chambers at gmail.com> add PCL version to full version string (if present) (21:39:35)
+ * Howard Butler <howard at hobu.co> Merge pull request #463 from chambbj/ground-kernel (15:32:07)
+ * Bradley J Chambers <brad.chambers at gmail.com> fix PCL stub for setJSON in pipeline (14:56:38)
+ * Pete Gadomski <pete.gadomski at gmail.com> Fix another rxp docs typo (11:14:25)
+ * Pete Gadomski <pete.gadomski at gmail.com> Fix typo in rxp docs (10:19:29)
+
+2014-03-27
+ * Bradley J Chambers <brad.chambers at gmail.com> add a new kernel to directly invoke ground filtering algorithms from the command line (currently only PMF, which requires PCL) (17:00:17)
+ * Bradley J Chambers <brad.chambers at gmail.com> apply astyle to recent PCLBlock and Splitter updates (17:44:27)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #267 from PDAL/no-stage-in-iter (17:27:05)
+ * Bradley J Chambers <brad.chambers at gmail.com> in PCLBlock, setJSON still exists, but is now used to pass the GeoJSON object as a string; setFilename is used to pass the filename (17:23:19)
+ * Bradley J Chambers <brad.chambers at gmail.com> vagrant will now checkout PCL "pipeline" branch (17:20:52)
+ * Andrew Bell <andrew.bellia at gmail.com> Remove dependence on stage for some iterators. Remove access to stage in iterator. (14:53:41)
+ * Andrew Bell <andrew.bellia at gmail.com> Add NullPointBuffer. Modify PointBuffer to behave correctly when used as a NullPointBuffer. (14:03:30)
+ * Andrew Bell <acbell at blaze.hobu.biz> Don't use stage in iterator. (08:44:53)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #265 from PDAL/issues/261-guard-linking-libxml2 (09:35:03)
+ * Bradley J Chambers <brad.chambers at gmail.com> fix #261, only link libxml2 if WITH_LIBXML2 is TRUE (09:34:02)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #263 from PDAL/i262 (09:20:18)
+ * Andrew Bell <acbell at blaze.hobu.biz> Fix typo. (08:41:58)
+ * Howard Butler <hobu.inc at gmail.com> Merge remote-tracking branch 'origin/use-options-command' (05:14:11)
+ * Howard Butler <hobu.inc at gmail.com> use make generator by default (05:13:56)
+ * Howard Butler <hobu.inc at gmail.com> small cleanups to filters.tiler (05:13:45)
+
+2014-09-15
+ * Howard Butler <howard at hobu.co> Merge pull request #462 from PDAL/ctxchunk (19:27:24)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove debug. (19:00:40)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Test to exercise large point buffers. Test random access to filled point buffer. (18:57:44)
+ * Howard Butler <howard at hobu.co> Merge pull request #461 from chambbj/issues/445-scale-offset (16:25:05)
+ * Howard Butler <howard at hobu.co> Merge pull request #458 from gadomski/guard-pcl-include (14:43:08)
+ * Howard Butler <howard at hobu.co> Merge pull request #459 from gadomski/remove-unused-variable (14:24:04)
+ * Pete Gadomski <pete.gadomski at gmail.com> Remove m_useREST from kernel/Info (14:22:01)
+ * Pete Gadomski <pete.gadomski at gmail.com> Catch bad_numeric_cast, rethrow better (13:32:03)
+ * Pete Gadomski <pete.gadomski at gmail.com> Guard a PCLConversions include (13:25:52)
+ * Howard Butler <howard at hobu.co> Merge pull request #457 from chambbj/pcl-kernel-bug (13:14:27)
+ * Bradley J Chambers <brad.chambers at gmail.com> fix small bug with pcl kernel, move pcl stage out of makeReader (13:08:53)
+ * Howard Butler <howard at hobu.co> Merge pull request #456 from gadomski/rxp-driver (10:44:43)
+ * Howard Butler <howard at hobu.co> Merge pull request #454 from chambbj/voxel-grid-ctx (10:44:33)
+ * Pete Gadomski <pete.gadomski at gmail.com> Remove a duplicate include from PointBuffer.hpp (08:27:40)
+
+2014-09-12
+ * Bradley J Chambers <brad.chambers at gmail.com> scale/offset now in Application.cpp (14:06:07)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into ptctxref (23:07:49)
+ * Andrew Bell <andrew.bell.ia at gmail.com> PointContext -> PointContextRef (23:07:27)
+ * Andrew Bell <andrew.bell.ia at gmail.com> BPF spatial reference in metadata. (14:35:28)
+ * Pete Gadomski <pete.gadomski at gmail.com> Remove leftover embedded boost cruft (13:49:22)
+ * Howard Butler <howard at hobu.co> Merge pull request #447 from gadomski/programmable-add-dimension (09:32:17)
+ * Howard Butler <howard at hobu.co> Merge pull request #450 from chambbj/random-ctx (09:32:00)
+ * Howard Butler <howard at hobu.co> Merge pull request #452 from PDAL/bpfmeta (09:31:44)
+
+2014-09-09
+ * Bradley J Chambers <brad.chambers at gmail.com> add PCL VoxelGrid as a decimation option (not the default) (20:23:28)
+ * Connor Manning <connor at hobu.co> Update Greyhound driver. (21:31:15)
+ * Pete Gadomski <pete.gadomski at gmail.com> Programmable filter can add dimensions to context (16:09:23)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove StageIterator. Remove iterator use from reader. (16:13:37)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into noiter (15:53:18)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove iterator from terrasolid driver. (15:48:50)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove iterator from SQLite driver. (12:28:20)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #446 from PDAL/scaleinit (11:26:16)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Don't set default values for scale/offset - already set in xform object ctor. (11:08:33)
+
+2014-08-14
+ * Pete Gadomski <pete.gadomski at gmail.com> Add the rxp reader (14:19:31)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix icebridge offset time & test. Use getFieldAs for icebridge tests. (13:01:47)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Differently modified colorization filter, as discussed. (12:32:29)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove un-useful schema test. (12:23:26)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (11:46:56)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix XMLSchema write test. (11:46:26)
+ * Howard Butler <howard at hobu.co> Merge pull request #408 from cuitingting01/patch-1 (10:19:06)
+ * Howard Butler <hobu.inc at gmail.com> get reprojection crop filter test passing again (10:16:32)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix sbet, stats, pointbuffer tests for new dimension scheme. (10:00:27)
+ * Connor Manning <connor at hobu.co> Fix output from Schema::toPTree() to be valid JSON without duplicate keys. (09:37:31)
+ * cuitingting01 <cuitingting01 at baidu.com> Fix Fetchpcid bug (00:03:14)
+
+2014-09-13
+ * Howard Butler <howard at hobu.co> Merge pull request #453 from gadomski/remove-embedded-boost-cruft (10:50:43)
+ * Howard Butler <howard at hobu.co> Merge pull request #455 from PDAL/ptctxref (10:50:33)
+
+2014-09-11
+ * Andrew Bell <andrew.bell.ia at gmail.com> Stick embedded BPF ULEM files into metadata. (21:38:53)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #451 from PDAL/bpfmeta (17:47:47)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix dumping of dimensions from point context. (17:44:41)
+ * Connor Manning <connor at hobu.co> Add partial and not fully tested support for raster indexing from the QuadIndex. (15:23:58)
+ * Connor Manning <connor at hobu.co> Update method used to get dimensions. (13:22:05)
+ * Howard Butler <howard at hobu.co> output std::endl for each pt in --detail of 'pdal delta' (12:43:16)
+ * Howard Butler <howard at hobu.co> Merge pull request #449 from gadomski/extract-chunk-size (10:50:14)
+ * Pete Gadomski <pete.gadomski at gmail.com> Remove chunk size (10:24:36)
+
+2014-03-31
+ * Bradley J Chambers <brad.chambers at gmail.com> add random kernel (09:15:45)
+
+2014-09-10
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix RST. (15:44:43)
+ * Howard Butler <howard at hobu.co> Reorganize test data #441 (15:08:12)
+ * Connor Manning <connor at hobu.co> Add tree depth query to QuadIndex. (12:29:01)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (12:18:36)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Update overview for readers. Add missing image. (12:18:12)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #448 from PDAL/noiter (11:43:06)
+
+2014-09-08
+ * Howard Butler <howard at hobu.co> Merge pull request #444 from PDAL/issues/442-las-scaling (20:49:54)
+ * Howard Butler <howard at hobu.co> Merge pull request #443 from PDAL/issues/307-badinfo (20:49:43)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Set scale to .01 for las writer. (19:34:28)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add ptree nodes for all selected points. (19:22:44)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into noiter Remove iterator from PCD driver. (15:59:30)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove iterator from sbet driver. Fix sbet/qfit test. (15:30:07)
+ * Bradley J Chambers <brad.chambers at gmail.com> group pcd driver files for msvc (14:07:21)
+ * Howard Butler <howard at hobu.co> Merge pull request #440 from chambbj/issues/428-stubs-on-rebased (13:53:05)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove iterator from qfit driver. (13:20:18)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove iterator from pgpointcloud driver. (12:14:26)
+ * Howard Butler <howard at hobu.co> remove lint (11:58:50)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove iterator from oci driver. (11:14:13)
+ * Howard Butler <howard at hobu.co> Merge pull request #439 from chambbj/stubs-resolution (10:08:35)
+ * Bradley J Chambers <brad.chambers at gmail.com> stubs default off in cmake, on in travis (10:04:45)
+ * Howard Butler <howard at hobu.co> Merge pull request #438 from chambbj/pcl-docs (10:00:32)
+ * Bradley J Chambers <brad.chambers at gmail.com> add PCL to the PDAL dependencies documentation, create documentation for the PCD drivers (09:24:46)
+ * Howard Butler <howard at hobu.co> Merge pull request #437 from chambbj/remove-pcview (09:41:24)
+ * Bradley J Chambers <brad.chambers at gmail.com> remove pcview from apps (09:34:10)
+ * Bradley J Chambers <brad.chambers at gmail.com> back down the boost version requirement to 1.54 (09:25:44)
+ * Howard Butler <howard at hobu.co> Merge pull request #436 from PDAL/issues/436-pcequal-pcpipeline-gone (08:43:19)
+ * Howard Butler <howard at hobu.co> remove no longer valid pcequal/pcpipeline (now in 'pdal' utility) #436 (08:23:28)
+
+2014-09-04
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix stubs for new PCD driver. (15:56:39)
+ * Howard Butler <howard at hobu.co> doc work by Andrew (20:44:03)
+ * Howard Butler <howard at hobu.co> Merge pull request #430 from PDAL/issues/430-txt-to-rst-rename (11:20:37)
+ * Howard Butler <howard at hobu.co> rename .txt to .rst #430 (11:06:18)
+ * Howard Butler <howard at hobu.co> Merge pull request #429 from gadomski/duplicate-before-install-line (10:17:41)
+ * Howard Butler <howard at hobu.co> Merge pull request #427 from PDAL/issues/427-no-boost-embed (10:17:30)
+ * Howard Butler <howard at hobu.co> more EMBED excision #427 (09:48:54)
+ * Pete Gadomski <pete.gadomski at gmail.com> Remove duplicate line from Travis before_install (09:39:48)
+ * Howard Butler <howard at hobu.co> switch off EMBED boost usage in Travis #427 (09:25:46)
+ * Howard Butler <howard at hobu.co> remove embedded boost #427 (09:22:40)
+
+2014-09-07
+ * Howard Butler <howard at hobu.co> fix up doc link (16:56:56)
+ * Howard Butler <howard at hobu.co> fix compression enum mixup in pgpointcloud writer (15:27:04)
+ * Howard Butler <howard at hobu.co> fix insertion bug (num_points was defined as int64_t vs. the supported int32_t (14:30:26)
+
+2014-09-05
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix typo. Fix type of zip objects when we're not zipping. (21:30:10)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove iterator from las/nitf. (17:36:50)
+ * Howard Butler <howard at hobu.co> Merge pull request #432 from gadomski/nuke-swig (11:28:57)
+ * Howard Butler <howard at hobu.co> Merge pull request #434 from gadomski/require-boost (11:28:50)
+ * Pete Gadomski <pete.gadomski at gmail.com> Require boost when finding package (11:17:00)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix new IStream ctor(). Fix decimation and stats tests for new faux reader interface. (11:07:48)
+ * Pete Gadomski <pete.gadomski at gmail.com> Remove all c# and python swig (07:07:58)
+
+2014-09-03
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove iterator from icebridge. (16:39:17)
+ * Howard Butler <howard at hobu.co> Vagrant: need libglew-dev for OpenGL for PCL now (16:34:03)
+ * Howard Butler <howard at hobu.co> Merge pull request #424 from gadomski/fix-faux-reader-bug (15:58:51)
+ * Howard Butler <howard at hobu.co> Merge pull request #423 from chambbj/pcd-driver (15:58:39)
+ * Howard Butler <howard at hobu.co> Merge pull request #422 from PDAL/issues/422-toJSON-toPTree (15:58:24)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove iterator from faux reader. (15:35:19)
+ * Pete Gadomski <pete.gadomski at gmail.com> Actually use numberOfReturns (15:17:17)
+ * Howard Butler <howard at hobu.co> add missing include (14:45:41)
+ * Howard Butler <howard at hobu.co> clean up typo #422 (14:19:50)
+ * Howard Butler <howard at hobu.co> move most toPTree() methods of PDAL objects out to static functions in PDALUtils.hpp #422 (13:10:31)
+ * Andrew Bell <andrew.bell.ia at gmail.com> First workings of reading without an iterator. BPF works. CARIS should work :) (11:43:08)
+
+2014-04-04
+ * Bradley J Chambers <brad.chambers at gmail.com> first cut at a dedicated pcd reader/writer (21:33:40)
+ * Andrew Bell <andrew.bellia at gmail.com> Change return type of getField from reference to value. (17:54:02)
+ * Howard Butler <howard at hobu.co> Merge pull request #281 from gadomski/pdal-info-s-flag (16:16:42)
+ * Pete Gadomski <pete.gadomski at gmail.com> Remove -s flag for --schema option in `pdal info` (13:58:17)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #280 from abellgithub/format (13:58:19)
+ * Andrew Bell <andrew.bellia at gmail.com> Make things in the las Writer fit in 80 columns. Remove a few superfluous "return" statements. A couple of other small fixes to simplify code - no functional change. (13:17:06)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #279 from PDAL/fixup (10:31:03)
+ * Andrew Bell <andrew.bellia at gmail.com> Fix point count in las iterators. (09:24:51)
+ * Howard Butler <howard at hobu.co> Merge pull request #274 from gadomski/pipeline-mosaic-without-python (08:36:21)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #276 from PDAL/issues/272-rel-filenames (08:18:29)
+
+2014-08-29
+ * Howard Butler <howard at hobu.co> Merge branch 'point-context-schema' (12:11:07)
+ * Connor Manning <connor at hobu.co> Constify a parameter reference. (10:47:40)
+
+2014-08-28
+ * Bradley J Chambers <brad.chambers at gmail.com> toJSON and toPTree are unresolved otherwise (20:04:34)
+ * Bradley J Chambers <brad.chambers at gmail.com> using WIN32_LEAN_AND_MEAN to avoid redefinition of symbols in winsock.h (20:03:05)
+ * Howard Butler <howard at hobu.co> more JSON output for pdal info (13:25:53)
+ * Howard Butler <howard at hobu.co> quote object name in toJSON() method (13:25:31)
+ * Howard Butler <hobu.inc at gmail.com> remove dead Dimension.cpp file (10:25:51)
+ * Howard Butler <hobu.inc at gmail.com> implement JSON escaping for Metadata::toJSON() (10:03:14)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context-schema' of github.com:PDAL/PDAL into point-context-schema (09:19:40)
+ * Howard Butler <hobu.inc at gmail.com> a little bit of doc work (09:19:36)
+ * Bradley J Chambers <brad.chambers at gmail.com> also changing case in the logtest text files (08:26:17)
+ * Bradley J Chambers <brad.chambers at gmail.com> changing case of the remainder of the LogLevels (08:06:26)
+
+2014-08-27
+ * Bradley J Chambers <brad.chambers at gmail.com> LogLevels are no longer all caps - ERROR and INFO were colliding with Windows defines (13:04:44)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Provide a ctor for BandInfo. (12:02:27)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (11:47:19)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Disallow direct access of PointContext from PointBuffer. (11:46:54)
+ * Howard Butler <howard at hobu.co> Merge pull request #418 from PDAL/issues/417-emplace-back (11:33:52)
+ * Bradley J Chambers <brad.chambers at gmail.com> use emplace_back and dump the initializer list (11:29:57)
+ * Howard Butler <howard at hobu.co> Merge pull request #415 from chambbj/issues/414-pdal-macros (10:49:56)
+ * Bradley J Chambers <brad.chambers at gmail.com> move pdal_macros include to pdal_internal (10:48:27)
+
+2014-08-26
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context-schema' of github.com:PDAL/PDAL into point-context-schema (16:19:25)
+ * Howard Butler <hobu.inc at gmail.com> support setting options via command line for 'pdal translate' (16:19:18)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Use Metadata::addList for arrays. Make sure stage metadata parent has a name. (14:51:03)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (14:19:10)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Metadata lists. (14:17:29)
+ * Howard Butler <hobu.inc at gmail.com> whoops, missed a file (13:33:17)
+ * Howard Butler <hobu.inc at gmail.com> get rid of getPrevStages in favor of getInputs (13:15:54)
+ * Howard Butler <hobu.inc at gmail.com> remove Stage::getPrevStage (11:43:35)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context-schema' of github.com:PDAL/PDAL into point-context-schema (10:01:24)
+ * Howard Butler <howard at hobu.co> Merge pull request #413 from gadomski/las-skip-high-return-numbers (10:00:52)
+
+2014-08-25
+ * Pete Gadomski <pete.gadomski at gmail.com> Skip, don't fail, when writing high return num las (18:03:36)
+ * Pete Gadomski <pete.gadomski at gmail.com> Add number_of_returns option to FauxReader (17:31:45)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context-schema' of github.com:PDAL/PDAL into point-context-schema (15:02:59)
+ * Connor Manning <connor at hobu.co> Fix KD index typo. (14:51:24)
+ * Howard Butler <hobu.inc at gmail.com> turn off debug (14:45:57)
+ * Howard Butler <hobu.inc at gmail.com> auto'up the Iterator typedefs (11:51:09)
+ * Howard Butler <hobu.inc at gmail.com> throw an exception if pipeline does not have a writer and it is called with 'pdal pipeline' (11:24:14)
+ * Howard Butler <hobu.inc at gmail.com> move splitter/chipper into filters (11:08:22)
+ * Howard Butler <hobu.inc at gmail.com> chipper example rearranges data and simply writes out las file (11:07:53)
+ * Howard Butler <hobu.inc at gmail.com> remove dead cache filter (09:45:53)
+
+2014-08-24
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context-schema' of github.com:PDAL/PDAL into point-context-schema (21:09:33)
+ * Howard Butler <hobu.inc at gmail.com> drivers.oci.{reader|writer} fixups (21:09:27)
+ * Connor Manning <connor at hobu.co> Expose Dimension type (baseType and size) and fix a warning. (18:55:35)
+
+2014-08-22
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context-schema' of github.com:PDAL/PDAL into point-context-schema (11:55:50)
+ * Howard Butler <hobu.inc at gmail.com> cleanup of oci test a little bit (still fails when manually run though) (11:55:48)
+ * Howard Butler <hobu.inc at gmail.com> write orientation into XML (11:54:45)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Use toJSON in Info. Fix NULL top-level node in Metadata JSON output. (11:42:11)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove dead code from PipelineWriter. Clean up PipelineWriter. (10:45:08)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove test output. (10:17:47)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (10:14:21)
+ * Howard Butler <hobu.inc at gmail.com> support applyin scaling info to XYZ for dimension-major data (10:10:46)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (10:04:35)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add Metadata::toJSON. (10:04:18)
+ * Howard Butler <hobu.inc at gmail.com> update manual oracle test pipelines (08:27:07)
+
+2014-08-21
+ * Connor Manning <connor at hobu.co> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (14:04:36)
+ * Connor Manning <connor at hobu.co> Advertise Dimension info via JSON. (14:04:33)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix typo. (13:52:06)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (13:44:33)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Get rid of very old TODOs and such. (13:44:10)
+ * Howard Butler <hobu.inc at gmail.com> Classification is Unsigned8, not 16 (12:55:08)
+ * Howard Butler <hobu.inc at gmail.com> useREST still exists, just not switched back on yet (12:54:52)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context-schema' of github.com:PDAL/PDAL into point-context-schema (12:53:21)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context' into point-context-schema (10:59:03)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (10:56:17)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context-schema (10:55:49)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into point-context-schema (09:20:18)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix various todos. (09:03:05)
+ * Howard Butler <hobu.inc at gmail.com> Classification should be a Unsigned16, not 8 (08:49:11)
+ * Howard Butler <howard at hobu.co> Merge pull request #411 from gadomski/backport-travis-fix (08:30:38)
+ * Howard Butler <hobu.inc at gmail.com> Intensity should be an Unsigned16, not an Unsigned8 (08:20:11)
+ * Howard Butler <hobu.inc at gmail.com> getField now getFieldAs in sqlite driver test (08:14:28)
+
+2014-08-20
+ * Howard Butler <howard at hobu.co> Merge pull request #410 from gadomski/linux-rpath (16:21:35)
+ * Pete Gadomski <pete.gadomski at gmail.com> Backport some Travis fixes from point-context (15:04:46)
+ * Pete Gadomski <pete.gadomski at gmail.com> Revert RPATH to cmake's recommended setup (14:46:45)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove more FIXMEs. (13:29:44)
+ * Howard Butler <hobu.inc at gmail.com> only create index in drivers.oci.writer when we've created a block table (13:27:09)
+ * Howard Butler <hobu.inc at gmail.com> put back old Schema::toPTree() method (13:01:48)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix some FIXMEs. (12:21:18)
+ * Howard Butler <hobu.inc at gmail.com> fix up --sdo_pc metadata for 'pdal info' (12:11:23)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (10:57:03)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Allow user-defined scaling for LAS output. (10:56:28)
+
+2014-08-19
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context-schema' of github.com:PDAL/PDAL into point-context-schema (16:09:55)
+ * Howard Butler <hobu.inc at gmail.com> more work on 'pdal info' stats, metadata, and json output (16:09:52)
+ * Howard Butler <hobu.inc at gmail.com> add local spatial ref (16:09:29)
+ * Howard Butler <hobu.inc at gmail.com> remove dead code (16:09:03)
+ * Andrew Bell <andrew.bell.ia at gmail.com> No bounds unless calculated. (15:48:13)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (15:14:41)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove getField<> in favor of getFieldAs<> (15:13:55)
+ * Andrew <andrew at abell-vb2.(none)> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (14:08:19)
+ * Andrew <andrew at abell-vb2.(none)> Fix spatial reference for pgpointcloud. (14:06:47)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix pgpointcloud spatial ref. (14:01:36)
+ * Howard Butler <hobu.inc at gmail.com> Merge point-context down to point-context-schema (11:03:36)
+ * Howard Butler <hobu.inc at gmail.com> only commit in done(), not ~ (10:37:06)
+ * Howard Butler <hobu.inc at gmail.com> put back pipeline-serialization (10:24:59)
+
+2014-08-18
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (16:44:57)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix non-static initialization. Clean-up. (16:43:07)
+ * Bradley J Chambers <brad.chambers at gmail.com> fix lambda in PCLConversions.hpp (11:59:43)
+ * Bradley J Chambers <brad.chambers at gmail.com> protect against rounding errors in PCL/PDAL conversions by computing and using bounds to offset data (10:57:55)
+ * Bradley J Chambers <brad.chambers at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (10:18:59)
+ * Howard Butler <hobu.inc at gmail.com> remove dead Writer.cpp file in sqlite driver (09:20:49)
+ * Connor Manning <connor at hobu.co> Check for quadtree validity before querying. (09:03:38)
+ * Connor Manning <connor at hobu.co> Add bbox query to quad tree index. (08:54:11)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (07:47:55)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove dead code. Make Selector, InPlaceReprojection and Scaling NOOP filters. (07:47:19)
+
+2014-08-17
+ * Connor Manning <connor at hobu.co> SQLite capitalization. (09:33:17)
+ * Howard Butler <hobu.inc at gmail.com> getFieldAs instaed of getField for fetching values (08:38:18)
+
+2014-08-16
+ * Howard Butler <hobu.inc at gmail.com> port SQLite driver over to point-context-schema (19:57:06)
+ * Connor Manning <connor at hobu.co> Add quad tree index. (17:34:25)
+ * Howard Butler <hobu.inc at gmail.com> fix up p2g writer (17:13:23)
+
+2014-08-15
+ * Andrew Bell <andrew.bell.ia at gmail.com> Update OCI to write schema. (21:03:33)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix delta. (20:40:29)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Diff cleanup. (20:35:43)
+ * Andrew Bell <andrew.bell.ia at gmail.com> PCL app cleanup. (20:27:39)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Cleanup. (19:52:57)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (16:41:50)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge filter and test. Modify PipelineReader to support merge filter. Remove old MultiFilter handling. Remove Schema, MultiFilter, MultiFilterIterator (16:34:42)
+ * Bradley J Chambers <brad.chambers at gmail.com> bring p2g driver into the PointContext world and make it aware of the GTIFF output capability of points2grid (14:34:46)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context-schema' of github.com:PDAL/PDAL into point-context-schema (13:46:57)
+ * Howard Butler <hobu.inc at gmail.com> start re-implementing 'pdal info' (13:46:52)
+ * Howard Butler <hobu.inc at gmail.com> toPTree methods (13:46:37)
+ * Howard Butler <hobu.inc at gmail.com> getMetadata method for PipelineManager (13:45:56)
+ * Howard Butler <hobu.inc at gmail.com> remove dead variable (13:45:27)
+ * Howard Butler <hobu.inc at gmail.com> add() for Metadata, toPTree methods (13:44:51)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context-schema (09:43:16)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix arg list in conditional compilation. (09:10:49)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix programmable tests. Comment out pdal info test. (07:36:46)
+
+2014-08-13
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix bug(type) in splitter. getField to getFieldAs in PointBufferTest. (20:28:36)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix Dimension::base(). (16:50:39)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix types on BufferedInvocation. (16:15:13)
+
+2014-08-12
+ * Andrew Bell <andrew.bell.ia at gmail.com> Allow upgrade of dimension type on conflicts. Use consistent buffer for BPF byte-major. Use getFieldAs instead of getField. (14:59:52)
+
+2014-08-11
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix bugs in PointBuffer, RawPtBf, PointContext. Use local buffer for BPF byte-major reads. (22:03:24)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Set offsets in dimensions. (17:48:52)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Tests to new dimension scheme. (16:46:53)
+ * Connor Manning <connor at hobu.co> Constify and tweak for readability. (15:21:37)
+ * Connor Manning <connor at hobu.co> Give KDIndex a const reference to its PointBuffer since it doesn't/shouldn't modify it. (09:48:41)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Tests to new dimension scheme. (07:08:02)
+
+2014-08-09
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make main app link. (22:50:03)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context-schema' of https://github.com/PDAL/PDAL into point-context-schema (08:11:17)
+ * Andrew Bell <andrew.bell.ia at gmail.com> More changes for new dimension scheme. (08:09:09)
+
+2014-08-08
+ * Howard Butler <hobu.inc at gmail.com> fix up filters.pcl to work with schema-less stuff (15:45:24)
+ * Howard Butler <hobu.inc at gmail.com> finish porting over 'pdal delta' and 'pdal info' (14:33:01)
+ * Howard Butler <hobu.inc at gmail.com> partially port over 'pdal diff' (14:18:06)
+ * Howard Butler <hobu.inc at gmail.com> add autzen-thin-srs to add srs info (13:49:20)
+ * Howard Butler <hobu.inc at gmail.com> plang compiles (13:48:11)
+ * Bradley J Chambers <brad.chambers at gmail.com> cache filter no longer needed in PCL kernel (13:22:53)
+ * Bradley J Chambers <brad.chambers at gmail.com> closes #407 (13:13:46)
+ * Howard Butler <hobu.inc at gmail.com> plang work (11:37:42)
+ * Howard Butler <hobu.inc at gmail.com> port filters.colorization to new dimension mechanism (09:38:38)
+ * Howard Butler <hobu.inc at gmail.com> LogLevel rename (09:38:21)
+ * Howard Butler <hobu.inc at gmail.com> LogLevel rename (09:38:05)
+ * Howard Butler <hobu.inc at gmail.com> fetch X, Y for HexBin using new mechanism (09:37:25)
+
+2014-08-07
+ * Andrew Bell <andrew.bell.ia at gmail.com> Update filters to new dimension scheme. (17:19:09)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Icebridge to new dimension scheme. (14:52:38)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Sbet to new dimension scheme. (14:40:53)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove dead headers. (14:27:03)
+ * Andrew Bell <andrew.bell.ia at gmail.com> pgpointcloud to new dimension scheme. Move setField to PointBuffer in lieu of setRawField. (14:24:06)
+ * Howard Butler <hobu.inc at gmail.com> more travis (14:03:01)
+ * Howard Butler <hobu.inc at gmail.com> more travis (13:19:54)
+ * Howard Butler <hobu.inc at gmail.com> more travis (12:00:15)
+ * Howard Butler <hobu.inc at gmail.com> more travis (11:31:27)
+ * Howard Butler <hobu.inc at gmail.com> more travis (11:05:07)
+ * Howard Butler <hobu.inc at gmail.com> more travis (10:52:32)
+ * Howard Butler <hobu.inc at gmail.com> more travis (09:48:29)
+ * Howard Butler <hobu.inc at gmail.com> more travis (09:27:03)
+ * Howard Butler <hobu.inc at gmail.com> more travis (08:59:06)
+ * Howard Butler <hobu.inc at gmail.com> more travis (08:47:46)
+ * Howard Butler <hobu.inc at gmail.com> more travis (08:32:56)
+
+2014-08-06
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context-schema (17:42:47)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Qfit and Text changes. (16:50:47)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Text and qfit changes. (16:49:37)
+ * Howard Butler <hobu.inc at gmail.com> another swing at travis-ci (15:44:49)
+ * Howard Butler <hobu.inc at gmail.com> another swing at travis-ci (15:37:35)
+ * Howard Butler <hobu.inc at gmail.com> another swing at travis-ci (15:24:05)
+ * Howard Butler <hobu.inc at gmail.com> another swing at travis-ci (13:56:01)
+ * Howard Butler <hobu.inc at gmail.com> another swing at travis-ci (13:43:01)
+ * Howard Butler <hobu.inc at gmail.com> another swing at travis-ci (13:37:14)
+ * Howard Butler <hobu.inc at gmail.com> try debiangis-unstable for Travis packages (13:32:18)
+ * Howard Butler <hobu.inc at gmail.com> try debiangis-unstable for Travis packages (13:23:31)
+ * Howard Butler <hobu.inc at gmail.com> another swing at getting travis going (12:52:49)
+ * Howard Butler <hobu.inc at gmail.com> attempt to get Travis going again (11:39:31)
+ * Howard Butler <hobu.inc at gmail.com> default to osgeo4w64 for library path on windows (11:33:21)
+ * Howard Butler <hobu at hobu.co> better-defined PointId typedef and clean up of aftermath (11:19:39)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Temporary commit - new Dimension code. (10:27:48)
+ * Howard Butler <hobu.inc at gmail.com> fix up readBufferImpl virtual to return point_count_t (09:40:44)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context' of github.com:PDAL/PDAL into point-context (09:16:16)
+
+2014-08-05
+ * Howard Butler <hobu at hobu.co> more MSVC warnings cleanups (21:22:41)
+ * Howard Butler <hobu at hobu.co> some MSVC warnings cleanups (21:16:57)
+ * Howard Butler <hobu at hobu.co> windows tweaks to my config file (21:16:37)
+ * Howard Butler <hobu at hobu.co> a whole bunch of windows-related fixups. compiles with osgeo4w64 on msvc2013 (16:48:04)
+
+2014-08-03
+ * Howard Butler <hobu.inc at gmail.com> @rpath support for OSX (only) (16:51:43)
+
+2014-07-29
+ * Bradley J Chambers <brad.chambers at gmail.com> be a little more explicit about what PCL modules are built (14:14:21)
+ * Bradley J Chambers <brad.chambers at gmail.com> remove VTK dependency (11:43:06)
+
+2014-07-28
+ * Andrew Bell <andrew.bell.ia at gmail.com> Changes for schema (08:07:09)
+
+2014-07-27
+ * Howard Butler <hobu.inc at gmail.com> turn off sqlite3_enable_load_extension which isn't quite working yet (12:21:06)
+ * Howard Butler <hobu.inc at gmail.com> working drivers.sqlite.reader with tests (12:12:10)
+ * Howard Butler <hobu.inc at gmail.com> more drivers.sqlite.reader -- still not quite working (09:52:12)
+ * Howard Butler <hobu.inc at gmail.com> some cleanups, more logs (09:52:02)
+ * Howard Butler <hobu.inc at gmail.com> ask ABELL about what happens when appendPoint is given bad input (09:51:13)
+
+2014-07-25
+ * Howard Butler <hobu.inc at gmail.com> put some more logging in, shutdown/initialize for sqlite3 (16:52:56)
+ * Howard Butler <hobu.inc at gmail.com> almost working drivers.sqlite.reader (13:55:04)
+
+2014-07-24
+ * Howard Butler <hobu.inc at gmail.com> handle situation where a query doesn't return any rows. insert schema correctly into cloud table (12:29:58)
+ * Howard Butler <hobu.inc at gmail.com> fix ups for drivers.sqlite.writer to actually work (12:02:51)
+ * Howard Butler <hobu.inc at gmail.com> add sqlite to StageFactory (12:02:33)
+ * Howard Butler <hobu.inc at gmail.com> rename drivers.sqlite to SQLiteWriter/SQLiteReader (10:54:39)
+ * Howard Butler <hobu.inc at gmail.com> drivers.sqlite.writer based on sqlite3 C API. remove SOCI dependency (10:26:50)
+
+2014-07-23
+ * Howard Butler <hobu.inc at gmail.com> the actual buffer size of the xmlBuffer is b->use, not b->size. you're so obvious libxml2 (16:34:22)
+ * Howard Butler <hobu.inc at gmail.com> update my config (10:18:56)
+ * Howard Butler <hobu.inc at gmail.com> no need to explicitly find libtiff. libgeotiff is already linked against it (10:18:43)
+
+2014-07-22
+ * Andrew Bell <andrew.bell.ia at gmail.com> Changes to support new schema configuration. (21:21:30)
+ * Howard Butler <hobu.inc at gmail.com> only do policy check for CMAKE > 2.x (11:24:29)
+ * Howard Butler <hobu.inc at gmail.com> silence annoying cmake policies for now (11:07:20)
+
+2014-07-18
+ * Howard Butler <hobu.inc at gmail.com> rehabilitate 'pdal delta' command (11:59:22)
+
+2014-07-17
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (12:11:57)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove color filter as discussed. (12:08:04)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context' of github.com:PDAL/PDAL into point-context (12:00:05)
+ * Howard Butler <hobu.inc at gmail.com> remove Stage::m_bounds (12:00:00)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (10:46:15)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove ThreadEnvironment. Hide random number generator. Fix plang test. Fix stream factory test. (10:45:34)
+ * Howard Butler <hobu.inc at gmail.com> new hex_to_binary method for drivers.pgpointcloud.reader (09:14:49)
+ * Howard Butler <hobu.inc at gmail.com> remove bounds from filters.inplacereprojection (08:46:38)
+
+2014-07-16
+ * Howard Butler <hobu.inc at gmail.com> add missing pgpointcloud file (17:06:05)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context' of github.com:PDAL/PDAL into point-context (16:34:15)
+ * Howard Butler <hobu.inc at gmail.com> fix up drivers.pgpointcloud (16:34:10)
+
+2014-07-15
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove dead code from PointBuffer. (17:14:57)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Point buffer tests. (16:48:15)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Reenable pipeline manager test. (15:43:13)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (15:29:57)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Icebridge to point context. (15:24:47)
+ * Howard Butler <hobu.inc at gmail.com> pdal::Write returns the PointBufferSet of data it has written (11:55:27)
+ * Howard Butler <hobu.inc at gmail.com> re-enable drivers.pgpointcloud tests (11:42:26)
+ * Howard Butler <hobu.inc at gmail.com> allow drivers.sqlite.reader to compile (not working yet) (10:57:04)
+ * Howard Butler <hobu.inc at gmail.com> tweak sqlite reader to be able to compile (10:08:25)
+ * Howard Butler <hobu.inc at gmail.com> use homebrew hexer for hobu's config (09:56:56)
+ * Howard Butler <hobu.inc at gmail.com> fix up icebridge driver so it compiles (doesn't work) (09:56:32)
+
+2014-07-14
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (21:39:31)
+ * Connor Manning <connor at hobu.co> Fix build when Greyhound capabilities are off. (17:02:47)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (16:18:25)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Enable user callback test. (16:17:48)
+ * Connor Manning <connor at hobu.co> Merge point-context updates into Greyhound branch. (16:01:16)
+ * Connor Manning <connor at hobu.co> Change GH reader to use setField since the remote schema is not necessarily the same as the final local schema. (15:52:35)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix some tests. (14:31:27)
+ * Connor Manning <connor at hobu.co> Fix boundary error when points are split between multiple websocket receptions. (14:04:24)
+
+2014-07-11
+ * Connor Manning <connor at hobu.co> Simplify Reader and make PointBuffer population (mostly) work. Points at the end of the WebSocket MTU boundary that are split between response frames will not be added correctly or double added. (18:39:10)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove more dead code. (14:49:35)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (12:40:25)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove more dead code. (12:39:52)
+ * Connor Manning <connor at hobu.co> Simplify exchange variables in Reader. (10:45:38)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove dead code. (10:36:42)
+ * Connor Manning <connor at hobu.co> Make GH exchanges more robust to simplify the Reader. (09:48:44)
+ * Howard Butler <hobu.inc at gmail.com> port drivers.sqlite.writer to point-context -- not really tested yet because OSX sucks (09:20:04)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix build with no hexer. (08:02:17)
+
+2014-07-10
+ * Connor Manning <connor at hobu.co> Some light cleanup. (21:49:29)
+ * Connor Manning <connor at hobu.co> Get Greyhound driver commands set up. PointBuffer is not yet properly populated on a read, but the communication flow with Greyhound occurs. (21:36:29)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add hexbin output file with consistent origin. (21:20:53)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into point-context (16:17:38)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (14:01:43)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make a simple hexbin test. (14:01:19)
+
+2014-07-09
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context' of github.com:PDAL/PDAL into point-context (16:56:20)
+ * Howard Butler <hobu.inc at gmail.com> port drivers.pgpointcloud.writer to point-context (16:56:17)
+ * Howard Butler <hobu.inc at gmail.com> tweak my cmake example (16:55:55)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix pipeline files as input to pdal info. Fix stats output for pdal info. Fix point listing output for pdal info. (14:08:51)
+
+2014-07-08
+ * chambbj <brad.chambers at gmail.com> Merge pull request #404 from chambbj/pcl-doc-update (19:57:44)
+ * Bradley J Chambers <brad.chambers at gmail.com> update the pcl documentation to include ground filtering example and explanation of parameters (19:50:32)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add configuration ifdef guard. (12:31:33)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (10:36:52)
+ * Andrew Bell <andrew.bell.ia at gmail.com> HexBin to point context. (10:34:18)
+
+2014-07-07
+ * Connor Manning <connor at hobu.co> Add bare WebSocketClient class and plumb it it with CMakeLists. (17:28:09)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove schema from stage. (15:12:22)
+ * Connor Manning <connor at hobu.co> Get Jsoncpp and Websocketpp hooked into CMake. Stub out the Greyhound Reader a little more thoroughly. (14:13:41)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (12:40:44)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Purge old copying code from PointBuffer. Remove depedent calls(). (12:24:18)
+ * Connor Manning <connor at hobu.co> Initial file structure and compilation additions. (11:15:01)
+
+2014-07-06
+ * Andrew Bell <andrew.bell.ia at gmail.com> Changes to support translate app. (20:36:46)
+
+2014-07-02
+ * Howard Butler <hobu.inc at gmail.com> don't chop off classification bits #403 (09:03:00)
+
+2014-06-30
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (13:14:56)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove buffer driver. Remove PointBufferCache filter. Remove remaining references to FauxWriter. Fix Nitf copy/assignment ctor/operator. (13:11:24)
+ * Connor Manning <connor at hobu.co> Get gcc 4.8.2 building, fix a warning. (10:53:13)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Work around broken VS compiler. (09:18:02)
+
+2014-06-27
+ * Andrew Bell <andrew.bell.ia at gmail.com> Sbet writer to point context. (17:16:32)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into point-context (12:31:48)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Sbet reader to point context. (12:31:27)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #398 from chambbj/issues/397-msvc-version-handling (12:11:45)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove faux writer - use stats filter instead. Remove dead includes from PCL block tests. (07:52:21)
+
+2014-05-01
+ * Bradley J Chambers <brad.chambers at gmail.com> rework the MSVC version logic slightly, add possibility of VC2012/2013 to pdal_defines (21:58:19)
+ * Howard Butler <howard at hobu.co> Merge pull request #341 from gadomski/feature/split-infer-writer-driver (16:48:38)
+ * Pete Gadomski <pete.gadomski at gmail.com> Split inferWriterDriver into two (14:40:14)
+ * Pete Gadomski <pete.gadomski at gmail.com> Remove two-argument version of inferReaderDriver (11:54:39)
+ * Howard Butler <howard at hobu.co> Merge pull request #338 from gadomski/issue/337-test-case-return (12:49:22)
+ * Pete Gadomski <pete.gadomski at gmail.com> Remove returns from BOOST_AUTO_TEST_CASEs (12:30:15)
+ * Pete Gadomski <pete.gadomski at gmail.com> Without reader type, infer from filename (11:00:08)
+ * Pete Gadomski <pete.gadomski at gmail.com> Infer the reader driver, no options required (10:58:12)
+
+2014-06-26
+ * Andrew Bell <andrew.bell.ia at gmail.com> PCLBlock to point context. (14:57:14)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Predicate to point context. (08:56:08)
+
+2014-06-25
+ * Andrew Bell <andrew.bell.ia at gmail.com> Programmable to point context. (13:49:04)
+
+2014-06-24
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make scaling filter do point context. (14:24:07)
+
+2014-06-23
+ * Andrew Bell <andrew.bell.ia at gmail.com> Splitter to point context. Finish deprecating ByteSwap and Cache filters. (13:02:18)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Deprecate ByteSwap and Cache filters. (13:01:26)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into point-context (09:38:04)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Decimation filter to point context. (09:37:23)
+
+2014-06-22
+ * Howard Butler <howard at hobu.co> Merge pull request #396 from connormanning/vagrantUpdate (09:19:47)
+
+2014-06-20
+ * Andrew Bell <andrew.bell.ia at gmail.com> Re-enable stats tests. (22:15:52)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Faux reader to point context. (14:27:47)
+ * Connor Manning <connor at hobu.co> Merge upstream and fix conflict. (10:44:51)
+ * Connor Manning <connor at hobu.co> Update vagrant config. (10:11:00)
+
+2014-06-19
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix crop filter for point context. (15:13:47)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (11:55:19)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Colorization filter update. (11:54:39)
+
+2014-06-16
+ * Howard Butler <hobu.inc at gmail.com> put the interpretation name into the toPTree() output of pdal::Dimension (14:30:11)
+ * Howard Butler <hobu.inc at gmail.com> put the dimensions under a 'schema' object so the xml that --schema outputs is valid (14:29:50)
+
+2014-06-13
+ * Andrew Bell <andrew.bell.ia at gmail.com> Uncomment code. (20:16:19)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix stats metadata. (20:15:44)
+
+2014-06-12
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix nested las metadata in nitf file (20:27:40)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Namespace for istringstream. (16:25:45)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove PointContext argument from initialize() (15:52:01)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix findVlr. Add vlr metadata test. (15:29:00)
+ * Andrew Bell <andrew.bell.ia at gmail.com> New metadata implementation. (14:47:34)
+
+2014-06-11
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (12:24:03)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Update to allow merge. (11:40:34)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Clean up SpatialReference. (11:16:11)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Reenable SpatialReference test. (10:41:28)
+
+2014-06-10
+ * Andrew Bell <andrew.bell.ia at gmail.com> Have NITF use PointContext. (19:32:38)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fixup nitf writer. (11:15:38)
+
+2014-06-05
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into point-context (13:06:22)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (12:12:37)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix stats filter. (12:11:54)
+
+2014-06-04
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context' of github.com:PDAL/PDAL into point-context (15:20:32)
+ * Howard Butler <hobu.inc at gmail.com> cumulate bounds with new grow() method (15:20:06)
+ * Howard Butler <hobu.inc at gmail.com> add grow() method that takes in a simple xyz double triplet (15:19:37)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix info --schema. (14:25:19)
+ * Pete Gadomski <pete.gadomski at gmail.com> Re-enable Ninja, but set the thread count (12:43:20)
+ * Pete Gadomski <pete.gadomski at gmail.com> Disable Ninja builds for clang (12:35:15)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Actually set the fetched flag in OciReader. (11:28:49)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (11:09:36)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Don't double Fetch() the first row. (11:09:09)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #389 from gadomski/travis-clang-ninja (10:56:12)
+ * Pete Gadomski <pete.gadomski at gmail.com> Use ninja when building with clang (10:02:48)
+ * Pete Gadomski <pete.gadomski at gmail.com> Use elseif not else in CMakeLists.txt (09:28:04)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (09:17:40)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Initialize Block::m_num_remaining. (09:17:10)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #388 from gadomski/clang (08:29:53)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'point-context' of github.com:PDAL/PDAL into point-context (07:29:45)
+ * Howard Butler <hobu.inc at gmail.com> remove capacity from schema fetch (07:29:31)
+ * Howard Butler <hobu.inc at gmail.com> fetch SDO_PC instead of SDO_PC_BLK_TYPE (07:29:01)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Set block's num_remaining when a block is read. (06:08:59)
+
+2014-06-03
+ * Pete Gadomski <pete.gadomski at gmail.com> Build with clang and g++-4.8 on travis (10:40:04)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Set dimensions. (21:48:36)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make sure variable is in scope. (15:50:46)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Get normalization flag to iterator. (15:30:49)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into point-context (15:26:34)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Minor writer change/question. Fix test? to work with new reader. (15:07:17)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (14:34:35)
+ * Andrew Bell <andrew.bell.ia at gmail.com> OCI reader with PointContext. (14:33:55)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #372 from gadomski/travis-build-without-optionals (09:36:21)
+
+2014-05-20
+ * Pete Gadomski <pete.gadomski at gmail.com> Add a second Travis build config (12:35:32)
+ * Pete Gadomski <pete.gadomski at gmail.com> Conditionally exclude python-dependent filters (15:13:48)
+ * Pete Gadomski <pete.gadomski at gmail.com> Conditionally exclude PCL (15:04:26)
+ * Pete Gadomski <pete.gadomski at gmail.com> Exclude colorization filter if we don't have GDAL (14:42:38)
+ * Pete Gadomski <pete.gadomski at gmail.com> Guard tests that require srs support (14:21:15)
+ * Pete Gadomski <pete.gadomski at gmail.com> Build and test bpf without zlib (13:55:48)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix setRawField for new PointBuffer behavior. (12:11:50)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into point-context (09:00:40)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into point-context (09:00:33)
+ * Howard Butler <hobu.inc at gmail.com> Revert "Remove unused variable m_pclblockFilter" (08:43:47)
+ * Howard Butler <howard at hobu.co> Merge pull request #360 from chambbj/issues/358-explicitly-deleted-fcns (08:38:29)
+ * Howard Butler <howard at hobu.co> Merge pull request #369 from gadomski/issue/292-postgres-segfault (08:38:13)
+ * Howard Butler <howard at hobu.co> Merge pull request #370 from gadomski/pcl-block-unused-member-var (08:37:54)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Modify reprojection filter for new infrastructure. Remove template on applyScaling/removeScaling. Have setField automatically transform data to proper type for dimension. Add setFieldUnscaled to invoke removeScaling automatically. (08:33:44)
+
+2014-06-02
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge pull request #374 from gadomski/build-without-optional-components (14:00:55)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #385 from chambbj/issues/384-fix-vagrant-pdal-script (10:55:47)
+ * Bradley J Chambers <brad.chambers at gmail.com> PCL block is in master now, Vagrant users are missing out on other improvements in master (10:42:34)
+ * Howard Butler <hobu.inc at gmail.com> fix up OCI writer to be able to write data (10:03:13)
+ * Howard Butler <hobu.inc at gmail.com> start porting OCITest to PointContext (09:41:53)
+
+2014-05-30
+ * Howard Butler <hobu.inc at gmail.com> add smb-shared folder for win32 clients (15:27:23)
+
+2014-05-29
+ * chambbj <brad.chambers at gmail.com> Merge pull request #383 from chambbj/issues/382-include-pdal_macros (07:38:46)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #381 from chambbj/issues/380-apps-documentation-update (07:38:26)
+ * Bradley J Chambers <brad.chambers at gmail.com> Add missing include required by lround. Closes #382 (07:21:20)
+
+2014-05-28
+ * Bradley J Chambers <brad.chambers at gmail.com> Update documentation for apps. Closes #380 (14:11:41)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make OCI writer use PointContext. (13:47:55)
+
+2014-05-26
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix Travis build? (20:15:50)
+ * Andrew Bell <andrew.bell.ia at gmail.com> First chipper test. (17:46:46)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Chipper uses PointContext. (17:13:45)
+
+2014-05-23
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (11:05:33)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (11:05:00)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #376 from chambbj/more-explicitly-deleted-fcns (11:02:37)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into point-context (10:57:10)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Have InPlaceReprojection use PointBuffer. (10:56:49)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #377 from chambbj/template-parameter-names (10:30:49)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #379 from PDAL/issues/378-lround (10:30:14)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #375 from chambbj/brace-enclosed-initializer-list (10:24:31)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add lround for windows. (10:04:15)
+
+2014-05-22
+ * Bradley J Chambers <brad.chambers at gmail.com> explicitly deleted functions are not supported in MSVC2012 (06:50:57)
+ * Bradley J Chambers <brad.chambers at gmail.com> IN and OUT are already defined on Windows, use a different template parameter name; also missing include for set (06:53:10)
+ * Bradley J Chambers <brad.chambers at gmail.com> MSVC2012 does not like brace-enclosed initializer-lists (neither did gcc4.6.3 as discussed in 41b15068 (06:48:08)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #365 from chambbj/issues/335-cxxabi (06:05:57)
+
+2014-05-21
+ * Andrew Bell <andrew.bell.ia at gmail.com> Forgot to add test. (12:17:18)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Reprojection filter fix and test. (11:55:53)
+
+2014-05-19
+ * Pete Gadomski <pete.gadomski at gmail.com> Remove unused variable m_pclblockFilter (16:29:49)
+
+2014-05-14
+ * Pete Gadomski <pete.gadomski at gmail.com> Check for null pointers when using pg_query_once (10:25:11)
+
+2014-05-18
+ * Andrew Bell <andrew.bell.ia at gmail.com> More LAS writer tests work. (21:39:05)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Pipelines are no longer a stage. Use PipelineManager. (20:51:36)
+
+2014-05-16
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL into point-context (16:56:53)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make selector filter work with point context. Fix selector test. (16:55:56)
+ * Bradley J Chambers <brad.chambers at gmail.com> use try_compile to see if we can demangle (11:45:54)
+ * Bradley J Chambers <brad.chambers at gmail.com> offer alternative if cxxabi.h is not available (08:24:55)
+ * Howard Butler <howard at hobu.co> Merge pull request #362 from chambbj/issues/355-prevent-macro-expansion (11:15:32)
+ * Howard Butler <howard at hobu.co> Merge pull request #361 from chambbj/issues/334-IN-OUT (11:15:03)
+ * Howard Butler <howard at hobu.co> Merge pull request #363 from chambbj/issues/359-sys-param (11:14:52)
+ * Howard Butler <howard at hobu.co> Merge pull request #364 from chambbj/issues/356-malloc-char-buf (11:14:35)
+ * Howard Butler <howard at hobu.co> Merge pull request #366 from chambbj/issues/357-boost-rounding (11:09:15)
+ * Howard Butler <howard at hobu.co> Merge pull request #368 from chambbj/issues/367-find-zlib (11:08:52)
+ * Howard Butler <howard at hobu.co> Merge pull request #354 from PDAL/issues/354-pdal-delta-json-output (11:08:40)
+ * Bradley J Chambers <brad.chambers at gmail.com> unique_ptr (09:59:35)
+ * Bradley J Chambers <brad.chambers at gmail.com> check for presence of zlib to support bpf compression (09:14:55)
+ * Howard Butler <hobu.inc at gmail.com> implement xml and json output for pdal delta #354 (09:45:34)
+ * Bradley J Chambers <brad.chambers at gmail.com> prevent expansion of min and max on windows (08:33:41)
+ * Bradley J Chambers <brad.chambers at gmail.com> IN and OUT are already defined on windows, replace with T_IN and T_OUT (08:31:49)
+ * Bradley J Chambers <brad.chambers at gmail.com> revert the explicitly deleted behavior of these functions, unavailable on MSVC2012 (08:27:58)
+ * Bradley J Chambers <brad.chambers at gmail.com> use boost for lround, as it is not available on MSVC2012 (08:26:15)
+ * Bradley J Chambers <brad.chambers at gmail.com> sys/param.h is unavailable and unneeded on windows (08:22:59)
+ * Bradley J Chambers <brad.chambers at gmail.com> malloc the char buffer because size is not constant (08:19:10)
+
+2014-05-15
+ * Andrew Bell <andrew.bell.ia at gmail.com> Enable the LAS writer tests that pass. (12:43:25)
+ * Andrew Bell <andrew.bell.ia at gmail.com> We now write LAS points through a pipeline. (11:47:06)
+
+2014-05-13
+ * Andrew Bell <andrew.bellia at gmail.com> Merge branch 'point-context' of https://github.com/PDAL/PDAL into point-context (21:28:02)
+ * Andrew Bell <andrew.bellia at gmail.com> More pipeline work. (21:27:42)
+ * Andrew Bell <andrew.bellia at gmail.com> Fixes for gcc 4.6. (19:36:03)
+
+2014-05-12
+ * Andrew Bell <andrew.bellia at gmail.com> Make BPF/LAS work with PointContext changes. (16:55:41)
+ * Howard Butler <howard at hobu.co> Merge pull request #352 from PDAL/issues/352-silence-run_shell_command (12:28:12)
+
+2014-05-08
+ * Andrew Bell <andrew.bellia at gmail.com> Replace public: initialize() with prepare(). (20:25:16)
+ * Howard Butler <hobu.inc at gmail.com> fix doc complaint listed in #353 (20:36:19)
+
+2014-05-07
+ * Andrew Bell <andrew.bellia at gmail.com> Rename Init() to Construct() (15:14:24)
+ * Andrew Bell <andrew.bellia at gmail.com> Don't use delegating constructors. (13:07:54)
+ * Andrew Bell <andrew.bellia at gmail.com> Modify initialization sequence. (09:37:24)
+
+2014-05-06
+ * Andrew Bell <andrew.bellia at gmail.com> Don't use delegating contrustors. (13:19:25)
+ * Howard Butler <hobu.inc at gmail.com> Fix #352 to shut up CPL_DEBUG (14:32:03)
+ * Howard Butler <howard at hobu.co> Merge pull request #340 from gadomski/feature/remove-two-arg-infer-reader (13:28:51)
+ * Howard Butler <hobu.inc at gmail.com> add hdf5 to my config (13:27:54)
+ * Howard Butler <hobu.inc at gmail.com> fix up sqlite driver after m_options update #346 (13:27:44)
+ * Howard Butler <howard at hobu.co> Merge pull request #350 from connormanning/hdf5 (13:09:23)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #348 from chambbj/issues/346-nitf-error (13:08:48)
+ * Howard Butler <howard at hobu.co> Merge pull request #351 from gadomski/issue/277-inval-file-sig (13:08:33)
+ * Pete Gadomski <pete.gadomski at gmail.com> Improve the las reader's file signature error (11:51:43)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'master' into feature/remove-two-arg-infer-reader (10:39:07)
+ * Howard Butler <howard at hobu.co> Merge pull request #336 from gadomski/issue/278-infer-reader-type (10:21:00)
+
+2014-05-02
+ * Andrew Bell <andrew.bellia at gmail.com> Add point context stuff. Modify stage ctor to take PointContext. (09:29:12)
+ * Bradley J Chambers <brad.chambers at gmail.com> a more straightforward way of setting the nitf writer options (15:20:35)
+ * Howard Butler <howard at hobu.co> Merge pull request #342 from PDAL/issues/342-no-more-top-level-config.sh (12:15:56)
+ * Howard Butler <hobu.inc at gmail.com> remove user-specific config scripts into cmake/examples to clean up root directory #342 (11:45:45)
+ * Howard Butler <howard at hobu.co> Merge pull request #345 from chambbj/issues/43-pdal-translate-decimation (10:10:44)
+ * Bradley J Chambers <brad.chambers at gmail.com> add decimation option to pdal translate (09:48:23)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #344 from PDAL/no-stage-base (09:26:36)
+ * Andrew Bell <andrew.bellia at gmail.com> Merge StageBase into Stage. (09:05:31)
+
+2014-05-05
+ * Connor Manning <connor at hobu.co> Remove todo (16:46:22)
+ * Connor Manning <connor at hobu.co> Added an HDF5 include guard around an icebridge include. (16:26:00)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'master' into feature/remove-two-arg-infer-reader (11:55:30)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'master' into issue/278-infer-reader-type (11:46:59)
+
+2014-05-04
+ * Connor Manning <connor at hobu.co> Updates for changes concurrent with this branch. (15:16:52)
+ * Connor Manning <connor at hobu.co> Merge remote-tracking branch 'upstream/master' into hdf5 (14:49:40)
+
+2014-04-30
+ * Connor Manning <connor at hobu.co> Add icebridge reader. (21:29:37)
+ * Howard Butler <howard at hobu.co> Merge pull request #328 from gadomski/feature/faux-reader-unknown-point-count (14:38:07)
+ * Howard Butler <howard at hobu.co> Merge pull request #324 from gadomski/sbet-writer (14:37:50)
+ * Howard Butler <hobu.inc at gmail.com> add a shell script to cleanup cmake junk (10:08:31)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (10:07:20)
+
+2014-04-29
+ * Pete Gadomski <pete.gadomski at gmail.com> Allow faux::Reader to report 0 for getNumPoints (10:35:38)
+ * Howard Butler <howard at hobu.co> Merge pull request #330 from gadomski/issue/329-remove-pointcounttype (14:25:52)
+ * Howard Butler <howard at hobu.co> Merge pull request #331 from gadomski/issue/doc-warnings (14:03:51)
+ * Pete Gadomski <pete.gadomski at gmail.com> Fix some warnings during doc building (13:40:27)
+ * Howard Butler <hobu.inc at gmail.com> add --detail to 'pdal delta' doc (13:33:44)
+ * Pete Gadomski <pete.gadomski at gmail.com> Remove m_pointCountType and references (11:54:23)
+ * Pete Gadomski <pete.gadomski at gmail.com> Update doxygen.conf (10:59:26)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #327 from PDAL/issues/326-missing-case (09:24:04)
+
+2014-04-23
+ * Pete Gadomski <pete.gadomski at gmail.com> Add a sbet writer (16:49:50)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #322 from PDAL/issues/317-naive-skip (16:36:00)
+
+2014-04-28
+ * Howard Butler <hobu.inc at gmail.com> use RPATH on OSX by default now (16:49:44)
+ * Howard Butler <hobu.inc at gmail.com> update my config (16:49:26)
+ * Howard Butler <hobu.inc at gmail.com> don't link to ourselves for libpdalcpp.so (16:49:04)
+ * Howard Butler <hobu.inc at gmail.com> ignore ./lib directory (16:48:42)
+ * Howard Butler <hobu.inc at gmail.com> clean up some cast warnings that gcc 4.8 found (16:46:25)
+ * Andrew Bell <andrew.bellia at gmail.com> Add default statement to fix busted GCC implementation. (14:10:03)
+ * Howard Butler <howard at hobu.co> Merge pull request #325 from PDAL/issues/325-stage-enabled-status (10:33:51)
+ * Howard Butler <hobu.inc at gmail.com> implement an enabled static flag for Stage:: #325 (10:03:09)
+
+2014-04-25
+ * Howard Butler <hobu.inc at gmail.com> put bakc c++0x flag for gcc (15:53:43)
+ * Howard Butler <hobu.inc at gmail.com> point to PCL (15:47:55)
+ * Howard Butler <hobu.inc at gmail.com> step back to allowing boost 1.52, force a re-find_package of boost when PCL is enabled (its CMake mucks up the components (15:47:42)
+ * Howard Butler <howard at hobu.co> Merge pull request #323 from gadomski/contributing (11:08:40)
+ * Pete Gadomski <pete.gadomski at gmail.com> Add CONTRIBUTING.md (10:56:33)
+
+2014-04-17
+ * Andrew Bell <andrew.bellia at gmail.com> Don't use naiveSkipImpl. (13:50:27)
+
+2014-04-22
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #320 from PDAL/format (13:02:35)
+ * Andrew Bell <andrew.bellia at gmail.com> Formatting. No functional changes. (11:28:21)
+
+2014-04-16
+ * Howard Butler <howard at hobu.co> Merge pull request #315 from gadomski/sbet-reader-random-iterator (15:55:10)
+ * Howard Butler <howard at hobu.co> Merge pull request #314 from PDAL/issues/314-las-writer-pointformat (15:55:03)
+ * Howard Butler <howard at hobu.co> Merge pull request #316 from PDAL/issues/296-las-write (15:54:43)
+ * Howard Butler <hobu.inc at gmail.com> fix #314 -- respecting 'format' option instead of forwarding metadata if set (14:02:12)
+ * Andrew Bell <andrew.bellia at gmail.com> Use getFieldAs to properly convert values from a PointBuffer when writing output. (12:31:31)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (12:39:06)
+ * Howard Butler <hobu.inc at gmail.com> point to my local PCL install (12:38:57)
+ * Howard Butler <howard at hobu.co> Merge pull request #313 from PDAL/issues/311-configure-vagrant-with-envvars (12:20:53)
+ * Pete Gadomski <pete.gadomski at gmail.com> Customize Vagrantfile with environment variables (10:04:57)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #309 from PDAL/bpf (10:06:05)
+ * Howard Butler <howard at hobu.co> Merge pull request #312 from PDAL/pointlist (10:02:34)
+
+2014-04-15
+ * Pete Gadomski <pete.gadomski at gmail.com> Add a random iterator for the sbet reader (15:39:59)
+ * Andrew Bell <andrew.bellia at gmail.com> More flexible point list parsing for "pdal info" (21:02:25)
+ * Andrew Bell <andrew.bellia at gmail.com> Fix seek for compressed BPF files. (15:54:49)
+ * Howard Butler <howard at hobu.co> Merge pull request #308 from gadomski/vagrant-ssh-forward-agent (15:35:17)
+ * Pete Gadomski <pete.gadomski at gmail.com> Provide switch to turn on Vagrant's ssh forwarding (15:26:18)
+
+2014-04-14
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #305 from abellgithub/bpftest (20:22:37)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #304 from abellgithub/bpf (17:17:06)
+ * Andrew Bell <andrew.bellia at gmail.com> A little more testing. (17:16:02)
+ * Andrew Bell <andrew.bellia at gmail.com> Merge branch 'bpf' into bpftest (16:35:12)
+ * Andrew Bell <andrew.bellia at gmail.com> Add working BPF test and test files. (11:56:20)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #301 from abellgithub/skip-sequential (15:16:58)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #298 from PDAL/add-pcl-kernel (09:45:53)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #300 from abellgithub/scaling (09:44:17)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #303 from PDAL/alt-way-to-get-field (09:42:19)
+
+2014-04-13
+ * Andrew Bell <andrew.bellia at gmail.com> Fix overfull dimension array. Always write points starting at index 0. (15:18:48)
+ * Andrew Bell <andrew.bellia at gmail.com> Allow point dump with sequential iterators. (12:26:56)
+
+2014-04-11
+ * Bradley J Chambers <brad.chambers at gmail.com> add getFieldAs method to PointBuffer to allow retrieval of properly cast and scaled data (11:14:44)
+ * Andrew Bell <andrew.bellia at gmail.com> Format cleanup and so on for scaling filter. (15:42:51)
+
+2014-04-10
+ * Bradley J Chambers <brad.chambers at gmail.com> Add: PCL kernel for the PDAL app (17:38:28)
+ * Howard Butler <howard at hobu.co> Merge pull request #297 from PDAL/issues/264-pdal-linkage (11:42:56)
+ * Howard Butler <howard at hobu.co> Merge pull request #294 from gadomski/sbet-reader (11:40:30)
+ * Howard Butler <howard at hobu.co> Merge pull request #295 from abellgithub/dimension (11:27:54)
+ * Howard Butler <hobu.inc at gmail.com> turn off clang builds for now (10:04:33)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #293 from abellgithub/bpf (08:12:14)
+
+2014-04-09
+ * Andrew Bell <andrew.bellia at gmail.com> Simplify some code in dimension. Make things fit in 80 columns. (17:55:28)
+
+2014-04-07
+ * Pete Gadomski <pete.gadomski at gmail.com> Add a sbet reader (13:56:29)
+ * Howard Butler <hobu.inc at gmail.com> upgrade Vagrant to use boost 1.55 too (17:36:36)
+ * Howard Butler <hobu.inc at gmail.com> use boost-latest ppa's to upgrade travis config (17:19:52)
+ * Howard Butler <howard at hobu.co> Merge pull request #275 from gadomski/exclude-pcl-test-cpp (16:57:11)
+ * Howard Butler <hobu.inc at gmail.com> some more cleanups related to #285 (16:22:56)
+ * Andrew Bell <andrew.bellia at gmail.com> Add BPF files. (14:19:37)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #286 from abellgithub/iostream (14:16:46)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #285 from abellgithub/schema-ref (13:28:36)
+ * Howard Butler <hobu.inc at gmail.com> add an example LAS file with one missing point and incorrect header count (13:15:29)
+ * Andrew Bell <andrew.bellia at gmail.com> Add binary byte-ordering streams. (12:48:44)
+ * Howard Butler <hobu.inc at gmail.com> tweak 'pdal delta' output a little, clean up docs (12:06:31)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into issues/264-pdal-linkage (11:26:41)
+ * Howard Butler <howard at hobu.co> Merge pull request #284 from gadomski/typo-fixes (10:47:36)
+ * Andrew Bell <andrew.bellia at gmail.com> Make stage's m_schema protected. (10:11:03)
+
+2014-04-08
+ * Andrew Bell <andrew.bellia at gmail.com> Very simple decompression for BPF. (10:26:46)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #287 from abellgithub/bpf (09:02:33)
+
+2014-04-01
+ * Pete Gadomski <pete.gadomski at gmail.com> Fix small comment typo (15:27:03)
+ * Andrew Bell <andrew.bellia at gmail.com> Turn on C++11 support. (18:01:58)
+
+2014-04-06
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #283 from abellgithub/getfield (12:32:36)
+
+2014-04-03
+ * Andrew Bell <andrew.bellia at gmail.com> Add word expansion (shell syntax handling) for filenames in pipelines on non-Windows systems. Use some C++11 and use the boost::property_tree namespace to simplify code in Options.* (17:04:33)
+ * Howard Butler <hobu.inc at gmail.com> Rename 'pdal query' to 'pdal diff' and add some simple XYZ delta statistics for default output #273 (15:00:28)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:59:46)
+ * Howard Butler <hobu.inc at gmail.com> more fixups to filters.hexbin for 24828059066a77f56be6bec002a605c5d95af266 (14:59:40)
+ * Howard Butler <hobu.inc at gmail.com> more cleanups for 24828059066a77f56be6bec002a605c5d95af266 for filters.hexbin (14:51:55)
+ * Howard Butler <hobu.inc at gmail.com> fixups related to the big change in acbellgithub's 24828059066a77f56be6bec002a605c5d95af266 (14:30:04)
+ * Pete Gadomski <pete.gadomski at gmail.com> Exclude PCLBlockFilterTest when building w/o PCL (12:02:00)
+ * Pete Gadomski <pete.gadomski at gmail.com> Exclude pipeline_mosaic test when built w/o Python (11:38:06)
+ * Bradley J Chambers <brad.chambers at gmail.com> only use PUBLIC in PDAL_LINKAGE if CMake supports it, otherwise stick with LINK_PUBLIC (08:23:14)
+
+2014-04-02
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #269 from abellgithub/cpp11 (08:17:12)
+
+2014-03-26
+ * Bradley J Chambers <brad.chambers at gmail.com> Begin using 'option' rather than 'set' for PDAL options (12:18:40)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #258 from PDAL/filter-create-tiles-alt2 (09:18:52)
+
+2014-03-14
+ * Bradley J Chambers <brad.chambers at gmail.com> Add: splitter filter to generate spatially contiguous point buffers of fixed size (09:28:43)
+ * Carl Simonson <simonsonc at gmail.com> CMake: Fix case sensitivity of SWIG package (22:53:23)
+ * Carl Simonson <simonsonc at gmail.com> CMake: make sure python library is in 2.x series (22:34:41)
+
+2014-03-24
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #257 from PDAL/no-supports-iter (15:18:12)
+ * Andrew Bell <acbell at blaze.hobu.biz> Remove supportsIterator(). Never called. (15:10:59)
+
+2014-03-21
+ * Howard Butler <hobu.inc at gmail.com> Support reading PointBuffers that have no XYZ on them #123 (10:48:55)
+
+2014-03-20
+ * Bradley J Chambers <brad.chambers at gmail.com> numPointsNeeded in PCLBlock should be updated by the number of points read, not the number remaining after filtering (18:04:13)
+ * Howard Butler <hobu.inc at gmail.com> Add 'pdal diff' utility #255 (16:16:16)
+ * Howard Butler <hobu.inc at gmail.com> Implement Python 3 support #256 (16:08:13)
+
+2014-03-16
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge pull request #254 from simonsonc/separate-build-dir (13:56:35)
+ * Carl Simonson <simonsonc at gmail.com> CMake: Fix building with separate build dir (12:29:27)
+ * Andrew Bell <acbell at blaze.hobu.biz> Make more stuff fit in 80 columns. Remove dead code. (11:46:47)
+ * Howard Butler <howard at hobu.co> Merge pull request #252 from simonsonc/python-ver (08:54:17)
+
+2014-03-13
+ * Andrew Bell <acbell at blaze.hobu.biz> Make lots of stuff fit in 80 columns, since we're almost there already. Remove the silly "const" in front of native types. Use the std namespace in some cpp files. Remove NOOP return statements at the end of functions. Consolidate code where it make sense. (12:23:31)
+ * Andrew Bell <acbell at blaze.hobu.biz> Find absolute path for test binary. (09:52:20)
+
+2014-03-15
+ * Howard Butler <hobu.inc at gmail.com> make sure to pass in chunk_size argument to writer (17:51:00)
+ * Howard Butler <hobu.inc at gmail.com> make sure to pass in chunk_size argument to writer (17:50:13)
+ * Howard Butler <howard at hobu.co> Merge pull request #253 from simonsonc/swig-casing (10:40:35)
+
+2014-03-10
+ * Howard Butler <hobu.inc at gmail.com> add BPF example data (11:26:30)
+
+2014-02-26
+ * chambbj <brad.chambers at gmail.com> Merge pull request #251 from PDAL/issue/250-no-pcd-offsets (14:40:27)
+ * Bradley J Chambers <brad.chambers at gmail.com> adding more PCL block examples and updating paths in tutorial (14:20:28)
+ * Bradley J Chambers <brad.chambers at gmail.com> as referenced in #250, do not apply offsets in conversion to PCD, but pass them along to the PCL Pipeline (13:58:30)
+
+2014-02-24
+ * Howard Butler <howard at hobu.co> Merge pull request #249 from PDAL/issue/248-pcl-block-improvements (16:16:06)
+ * Bradley J Chambers <brad.chambers at gmail.com> improving PCLBlock filter for #248 (12:00:37)
+
+2014-02-21
+ * Bradley J Chambers <brad.chambers at gmail.com> move the PCL Block XML files to the filter folder, create subfolder for the JSON files, remove some deprecated PCL Block examples (15:48:18)
+ * Bradley J Chambers <brad.chambers at gmail.com> updating PCL-related documentation (15:23:55)
+ * Bradley J Chambers <brad.chambers at gmail.com> adding test pipeline and pcl block for grid minimum (15:22:28)
+
+2014-02-20
+ * Bradley J Chambers <brad.chambers at gmail.com> back off the default VM requirements (23:05:15)
+
+2014-02-19
+ * Howard Butler <howard at hobu.co> Merge pull request #247 from PDAL/feature/pcl-block (14:19:32)
+ * Bradley J Chambers <brad.chambers at gmail.com> Merge branch 'master' into feature/pcl-block (13:46:26)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #246 from PDAL/issue/245-pdal-translate (12:59:22)
+ * Bradley J Chambers <brad.chambers at gmail.com> resolve #245, pdal translate recognizes PCD format by extension (12:50:11)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #244 from PDAL/issue/243-pcd-writer (12:37:42)
+ * Bradley J Chambers <brad.chambers at gmail.com> resolve #243, missing PCD header (12:14:36)
+
+2014-02-14
+ * Howard Butler <hobu.inc at gmail.com> add missing data (12:01:15)
+ * Howard Butler <hobu.inc at gmail.com> make filters.mosaic work more better. Provide an example of a mosaic that creates new dimensions, filters data, and updates one leg of the filters.mosaic with Python (11:48:32)
+ * Howard Butler <hobu.inc at gmail.com> beef up error detection in cases where Python array types don't match PDAL dimension types (11:41:55)
+ * Howard Butler <hobu.inc at gmail.com> use BOOST_CHECK_CLOSE so we can get some output when failures happen (11:38:59)
+ * Howard Butler <hobu.inc at gmail.com> fix up exception throwing to actually throw useful exceptions (11:38:17)
+ * Howard Butler <hobu.inc at gmail.com> throw exceptions when random iterators are not found for filters.programmable and filters.predicate (11:37:28)
+
+2014-02-12
+ * Bradley J Chambers <brad.chambers at gmail.com> Initial implementation of the PCL Filter Block with sample pipelines, draft documentation, and representative unit tests. Vagrantfile is updated to also load and build PCL (required). (11:48:31)
+
+2014-02-10
+ * Howard Butler <hobu.inc at gmail.com> clean up a bunch of leaks (12:23:19)
+
+2014-02-08
+ * Howard Butler <hobu.inc at gmail.com> clean up cast alignment warnings by reinterpret_cast'ing the pointers to the appropriate type (21:56:52)
+ * Howard Butler <hobu.inc at gmail.com> fixup hexer define (21:28:51)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into issues/227-rest-for-pdal-schema-metadata (21:13:39)
+ * Howard Butler <hobu.inc at gmail.com> update hexer detection code (21:13:24)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into issues/227-rest-for-pdal-schema-metadata (21:02:18)
+ * Howard Butler <hobu.inc at gmail.com> more drivers.oci.writer testing (20:55:24)
+
+2014-02-05
+ * Howard Butler <hobu.inc at gmail.com> add more filters.chipper test (17:38:34)
+ * Howard Butler <hobu.inc at gmail.com> use std::stable_sort intead of std::sort to attempt to preserve ordering (17:37:50)
+ * Howard Butler <hobu.inc at gmail.com> forward getNumPoints() from previous stage for filters.chipper (17:35:34)
+ * Howard Butler <hobu.inc at gmail.com> clean up sign comparison warnings shown by external boost build (09:57:47)
+ * Howard Butler <hobu.inc at gmail.com> put PDAL_EMBED_BOOST ahead of pdal_options so it can be used to determine boost linkage #242 (09:20:59)
+
+2014-02-04
+ * Howard Butler <hobu.inc at gmail.com> do LINK_PUBLIC in situations where PDAL_EMBED_BOOST isn't on (11:20:43)
+
+2014-02-03
+ * Howard Butler <howard at hobu.co> Merge pull request #241 from PDAL/issues/241-fixup-mrsid (16:28:51)
+ * Howard Butler <hobu.inc at gmail.com> fixup drivers.mrsid.reader for #241 -- don't know if actually works though, no tests (15:15:21)
+ * Howard Butler <hobu.inc at gmail.com> put back 23dbaf to silence annoying warnings (15:14:45)
+
+2014-01-31
+ * Howard Butler <howard at hobu.co> Merge pull request #239 from dakcarto/swig-fix (10:45:44)
+ * Howard Butler <hobu.inc at gmail.com> rename EPS variable to prevent a name collision (08:37:35)
+
+2014-01-30
+ * Larry Shaffer <larrys at dakotacarto.com> Fix swig module naming and include path (16:46:10)
+ * Howard Butler <hobu.inc at gmail.com> wtf is with the ` at the beginning and end of the file? -- fixed (14:06:40)
+ * Howard Butler <hobu.inc at gmail.com> update to latest nanoflan (13:57:01)
+
+2014-01-28
+ * Howard Butler <hobu.inc at gmail.com> add crop and hole example (12:37:29)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into issues/227-rest-for-pdal-schema-metadata (10:22:18)
+ * Howard Butler <howard at hobu.co> Merge pull request #238 from PDAL/issues/238-pkg-config-for-pdal (10:21:49)
+
+2014-01-27
+ * Howard Butler <hobu.inc at gmail.com> a passable pgk-config for PDAL #238 (15:44:09)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into issues/227-rest-for-pdal-schema-metadata (13:32:17)
+ * Howard Butler <howard at hobu.co> Merge pull request #228 from PDAL/issues/228-common-include (13:31:46)
+ * Howard Butler <hobu.inc at gmail.com> only include base stuff in <pdal/pdal.hpp>, not Drivers, Filters, and Kernel, which a user can include separately as needed (13:29:38)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into issues/228-common-include (12:52:10)
+ * Howard Butler <howard at hobu.co> Merge pull request #237 from PDAL/tweaking-cmake-files (12:35:25)
+ * Bradley J Chambers <brad.chambers at gmail.com> linking PDAL_UTILITY against Boost appears to have been the source of all the havoc (11:52:17)
+ * Bradley J Chambers <brad.chambers at gmail.com> if (NOT PDAL_BUILD_STATIC) seemed a little confusing; also seeing if the boost linkage is the problem with the build (10:44:01)
+ * Bradley J Chambers <brad.chambers at gmail.com> tests don't fail locally, perhaps this has something to do with the unit tests being installed, or linked with boost libraries multiple times, let's try without the macro (09:56:14)
+ * Bradley J Chambers <brad.chambers at gmail.com> related to #234 and #235, CMake "improvements" (09:10:43)
+
+2014-01-26
+ * Howard Butler <hobu.inc at gmail.com> don't alloc a new std::string copy of the patch's hex data (22:23:30)
+ * Howard Butler <hobu.inc at gmail.com> fix up vector resize() to 0 so that we can push_back the new bytes as we decode them (21:38:21)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into issues/228-common-include (11:26:28)
+ * Howard Butler <hobu.inc at gmail.com> don't do as much work when copying hex data from pg (11:21:58)
+ * Howard Butler <hobu.inc at gmail.com> memoize the encoded offset vector into schema::DimensionMap so it is updated every time a pair is inserted rather than every time copyLikeDimensions is called (10:31:52)
+
+2014-01-25
+ * Uday Verma <uday.karan at gmail.com> Get rid of std::vector in copyLikeDimenions, use a local array instead (14:10:35)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (13:27:58)
+ * Howard Butler <howard at hobu.co> Merge pull request #236 from verma/master (13:27:50)
+ * Howard Butler <hobu.inc at gmail.com> Merge remote-tracking branch 'verma/master' (13:20:30)
+ * Uday Verma <uday.karan at gmail.com> copyLikeDimension fast paths and special cases with elaborate unit tests (13:08:28)
+
+2014-01-24
+ * Howard Butler <howard at hobu.co> Merge pull request #235 from PDAL/issues/234-missing-lib-directory (15:39:37)
+ * Bradley J Chambers <brad.chambers at gmail.com> build/install directories are still a bit of mess, but should be working on windows now (15:30:56)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:55:02)
+ * Howard Butler <hobu.inc at gmail.com> use boost::shared_array to back PointBuffer (14:54:53)
+ * Bradley J Chambers <brad.chambers at gmail.com> make CMake aware of possible OSGeo4W64 installation path (14:35:05)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #233 from PDAL/issues/231-conditional-linkage (14:32:45)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #232 from PDAL/issues/230-missing-export (14:32:18)
+ * Bradley J Chambers <brad.chambers at gmail.com> only link LASzip and python when selected #231 (12:44:55)
+ * Bradley J Chambers <brad.chambers at gmail.com> add PDAL_DLL to Query and IndexedPointBuffer #230 (12:39:04)
+ * Howard Butler <hobu.inc at gmail.com> output correct number in error reporting in descaling ops (10:27:28)
+
+2014-01-23
+ * Howard Butler <hobu.inc at gmail.com> use static PointBuffer::pack method and reuse buffer so as to not keep alloc'ing it over and over (17:26:07)
+ * Howard Butler <hobu.inc at gmail.com> provide new static implementation of PointBuffer::pack that doesn't always create a new PointBuffer, use that for class method call (17:25:43)
+ * Paul Ramsey <pramsey at cleverelephant.ca> Syntax error (13:47:29)
+
+2014-01-21
+ * Howard Butler <hobu.inc at gmail.com> cleanup #229 to output correct hex and always construct insert statement in the same string (13:30:10)
+ * Howard Butler <hobu.inc at gmail.com> update 'make publish' target of docs (11:56:39)
+ * Paul Ramsey <pramsey at cleverelephant.ca> Merge branch 'master' of github.com:PDAL/PDAL (11:50:57)
+
+2014-01-20
+ * Paul Ramsey <pramsey at cleverelephant.ca> Merge pull request #229 from PDAL/issues/229-speedup-pgpointcloud (23:06:58)
+ * Howard Butler <hobu.inc at gmail.com> optimize pgpointcloud insert #229 (22:53:35)
+ * Howard Butler <hobu.inc at gmail.com> remove unnecessary includes (17:05:05)
+ * Howard Butler <hobu.inc at gmail.com> start on a common #include <pdal/pdal.hpp> for external usage #228 (17:02:16)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into issues/227-rest-for-pdal-schema-metadata (11:49:08)
+ * Howard Butler <hobu.inc at gmail.com> publish to gh-pages instead of master for pdal.github.io (11:26:52)
+ * Howard Butler <hobu.inc at gmail.com> doc update to writer tutorial (09:06:37)
+
+2014-01-19
+ * Howard Butler <hobu.inc at gmail.com> attempt to go back to publishing to pdal.github.io.git repo (12:20:46)
+
+2014-01-18
+ * Howard Butler <hobu.inc at gmail.com> another publish attempt (18:50:33)
+ * Howard Butler <hobu.inc at gmail.com> another attempt at getting a gh-pages workflow working on a cron (17:22:29)
+ * Howard Butler <hobu.inc at gmail.com> Revert "checkout as orphan for gh-pages" (17:17:00)
+ * Howard Butler <hobu.inc at gmail.com> Revert "put checkout on clone target for doc building" (17:16:51)
+ * Howard Butler <hobu.inc at gmail.com> put checkout on clone target for doc building (16:42:57)
+ * Howard Butler <hobu.inc at gmail.com> checkout as orphan for gh-pages (16:31:35)
+ * Howard Butler <hobu.inc at gmail.com> fix copy/paste error in 1e64d3fcef78c8f3fbd0cd9aa8aeaa7d3d5385d4 (16:28:40)
+ * Howard Butler <hobu.inc at gmail.com> throw an error about finding pcid==0 (10:30:59)
+ * Howard Butler <hobu.inc at gmail.com> support RGB values that have dimension sizes other than uint16_t (10:30:35)
+ * Howard Butler <hobu.inc at gmail.com> fix typo in 88b0666c6823b70ea9f32119f4611106d7a91627 (08:22:08)
+ * Howard Butler <hobu.inc at gmail.com> add Dimension::getInterpretationName() test (08:20:57)
+
+2014-01-14
+ * Howard Butler <hobu.inc at gmail.com> update testoutput (16:51:08)
+ * Howard Butler <hobu.inc at gmail.com> ::toRST() tweaks (16:39:28)
+ * Howard Butler <hobu.inc at gmail.com> use Schema::toRST to output the --schema information (16:31:50)
+ * Howard Butler <hobu.inc at gmail.com> implement pdal::Schema::toRST() to output the Schema object as reStructuredText (16:31:20)
+ * Howard Butler <hobu.inc at gmail.com> whitespace normalization (16:30:48)
+ * Howard Butler <hobu.inc at gmail.com> doc updates (10:32:17)
+ * Howard Butler <hobu.inc at gmail.com> select time as 2, 4, or 8 byte value in drivers.las.writer (09:34:12)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (09:08:43)
+ * Howard Butler <hobu.inc at gmail.com> provide do_normalize_xyz option, on by default, to normalize drivers.oci.reader xyz data when the scales are changing (09:08:31)
+
+2014-01-13
+ * Howard Butler <hobu.inc at gmail.com> attempt to silence #pragma warnings for gcc < 4.6 (22:59:24)
+
+2014-01-12
+ * Howard Butler <hobu.inc at gmail.com> set namespace for any dimensions created by filters.selector (23:10:05)
+ * Howard Butler <hobu.inc at gmail.com> update doc publishing for pdal.github.io (14:31:59)
+
+2014-01-10
+ * Howard Butler <hobu.inc at gmail.com> turn off localse support in boost::filesystem due to https://svn.boost.org/trac/boost/ticket/9131 (10:43:04)
+ * Howard Butler <hobu.inc at gmail.com> add a more rigorous drivers.oci.reader/writer test (08:50:37)
+ * Howard Butler <hobu.inc at gmail.com> manage schema::DimensionMap* as a boost::shared_ptr (08:50:20)
+ * Howard Butler <hobu.inc at gmail.com> select correct data type in filters.scaling test (08:49:42)
+ * Howard Butler <hobu.inc at gmail.com> select appropriate data types from nitf file in test (08:48:54)
+ * Howard Butler <hobu.inc at gmail.com> if requested data type is greater than the Dimension::getByteSize(), throw an error for setField (08:48:25)
+ * Howard Butler <hobu.inc at gmail.com> add GEOS C++ headers to install list (08:47:38)
+
+2014-01-09
+ * Howard Butler <hobu.inc at gmail.com> use a shared_ptr to keep track of DimensionMap stuff (17:11:09)
+ * Howard Butler <hobu.inc at gmail.com> clean up dimension maps in drivers.oci.reader (17:05:37)
+ * Howard Butler <hobu.inc at gmail.com> force destruction of iterator (17:01:10)
+ * Howard Butler <hobu.inc at gmail.com> clean up some memory leaks in drivers.oci (16:55:31)
+ * Howard Butler <hobu.inc at gmail.com> use pdal::GlobalEnvironment GDAL object for logging instead of custom one in stage (16:33:46)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (16:17:23)
+ * Howard Butler <hobu.inc at gmail.com> First phase of #224 reST for PDAL (16:16:30)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into issues/224-rest-for-pdal-info (16:11:24)
+ * Howard Butler <hobu.inc at gmail.com> upgrade to boost 1.55 #226 clean up warnings related to boost upgrade fix up CMake PUBLIC/PRIVATE linkage (16:07:37)
+ * Howard Butler <hobu.inc at gmail.com> more oracle example (09:45:15)
+ * Howard Butler <hobu.inc at gmail.com> trap descaling overflow errors (09:45:01)
+ * Howard Butler <hobu.inc at gmail.com> whitespace normalization (09:44:47)
+
+2014-01-08
+ * Howard Butler <hobu.inc at gmail.com> update f470bf81eb736e68d88bb8e250bcf5bce83b6daa to put inside a if statement (13:01:15)
+ * Howard Butler <hobu.inc at gmail.com> throw an exception if we might overflow capacity. Set PointSourceId to uint16_t or uint32_t depending on the dimension's size (11:22:59)
+ * Howard Butler <hobu.inc at gmail.com> don't setField with T's that don't match the dim.getByteSize() (11:22:06)
+ * Howard Butler <hobu.inc at gmail.com> whitespace normalization (11:21:40)
+ * Howard Butler <hobu.inc at gmail.com> set the PointBuffer's point count when reading data in the filters.chipper (08:50:40)
+
+2014-01-07
+ * Howard Butler <hobu.inc at gmail.com> add start of tutorial doc (16:58:24)
+ * Howard Butler <hobu.inc at gmail.com> default to 0.001 for the scale for drivers.qfit.reader.Z and apply the scaling appropriately when setting values in the reader (16:48:12)
+ * Howard Butler <hobu.inc at gmail.com> don't trust the PointBuffer's point count, as some stages may not have it set yet (14:40:04)
+ * Howard Butler <hobu.inc at gmail.com> try updating befor fetching packages (12:38:50)
+ * Howard Butler <hobu.inc at gmail.com> add software-properties-common before python ones (12:35:10)
+ * Howard Butler <hobu.inc at gmail.com> add filters.stats to read example (11:33:58)
+ * Howard Butler <hobu.inc at gmail.com> clean up exact count vs explicit dimension stuff a little bit and fix what was broken in 14ffc86132f09a375d01d216513f6793827fd9f7 (11:33:46)
+ * Howard Butler <hobu.inc at gmail.com> update to point at http://pdal.io (09:55:28)
+
+2014-01-06
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:15:02)
+ * Howard Butler <hobu.inc at gmail.com> set global_encoding to 0 if the data.size() is 0 too (14:14:53)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL into issues/224-rest-for-pdal-info (08:43:46)
+ * Howard Butler <hobu.inc at gmail.com> don't segfault when a pcid cannot be selected in drivers.pgpointcloud.reader (08:08:36)
+
+2014-01-03
+ * Howard Butler <hobu.inc at gmail.com> drivers/options doesn't hang on main app (13:59:50)
+ * Howard Butler <hobu.inc at gmail.com> output to stream, not std::cout (13:59:30)
+ * Howard Butler <hobu.inc at gmail.com> update stage links (13:59:13)
+ * Howard Butler <hobu.inc at gmail.com> reorganize --options and --drivers output (13:24:28)
+ * Howard Butler <hobu.inc at gmail.com> add libgeos++-dev to travis (09:20:10)
+
+2014-01-02
+ * Howard Butler <hobu.inc at gmail.com> add libgeos to travis (20:15:18)
+ * Howard Butler <hobu.inc at gmail.com> use different GEOS include location (20:09:53)
+ * Howard Butler <hobu.inc at gmail.com> make filters.stats use dimension::applyScaling like everything else (20:06:12)
+ * Howard Butler <hobu.inc at gmail.com> beef up --report-debug info to include all linked libraries and some of their version information (20:00:43)
+ * Howard Butler <hobu.inc at gmail.com> update test output (18:50:27)
+ * Howard Butler <hobu.inc at gmail.com> provide reST output for point summaries -- pdal info myfile.las -p 10-20 (16:40:14)
+ * Howard Butler <hobu.inc at gmail.com> move wordWrap into Utils:: (16:39:43)
+ * Howard Butler <hobu.inc at gmail.com> forward the prevStage random iterator for filters.stats (16:38:51)
+ * Howard Butler <hobu.inc at gmail.com> don't do copyPointFast for DIMENSION_INTERLEAVED data (16:38:28)
+ * Howard Butler <hobu.inc at gmail.com> support setting integer global_encoding values for #218 (09:05:20)
+
+2014-01-01
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into issues/207-1.0.0-doc-updates (10:01:29)
+
+2013-12-31
+ * Howard Butler <hobu.inc at gmail.com> update (c) date (15:26:54)
+ * Howard Butler <hobu.inc at gmail.com> add CMake configuration to find MessagePack library (13:29:24)
+ * Howard Butler <hobu.inc at gmail.com> add publish method for publishing website to pdal.github.io (12:24:17)
+
+2013-12-30
+ * Howard Butler <hobu.inc at gmail.com> fix up filters.stats to do selection of dimensions upon first buffer read rather than at initialize() time (14:10:11)
+
+2013-12-29
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'issues/216-flip-orientation' (14:20:42)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:20:33)
+ * Howard Butler <hobu.inc at gmail.com> fix up vagrant configuration a bit to protect my machine-specific and osx-specific stuff (14:20:28)
+ * Howard Butler <howard at hobu.co> Merge pull request #223 from tigerfoot/master (14:02:07)
+ * Bruno Friedmann <bruno at ioda-net.ch> Update conf.py fix issue 222 (13:44:25)
+ * Howard Butler <howard at hobu.co> Merge pull request #221 from tigerfoot/master (11:53:18)
+ * Bruno Friedmann <bruno at ioda-net.ch> Update pdal-config.in (11:51:29)
+
+2013-12-22
+ * Howard Butler <hobu.inc at gmail.com> use namespace-aware lookups for mapDimensions (15:06:46)
+ * Howard Butler <hobu.inc at gmail.com> add selector filters to drivers.oci examples (15:06:22)
+ * Howard Butler <hobu.inc at gmail.com> remove lint (15:05:31)
+ * Howard Butler <hobu.inc at gmail.com> use boost type_traits instead of std:: which requires c++11 (15:05:03)
+
+2013-12-20
+ * Howard Butler <hobu.inc at gmail.com> filters.inplacereprojection reorganization (22:40:30)
+ * Howard Butler <hobu.inc at gmail.com> clean up asserts for getField/setField (22:40:03)
+ * Howard Butler <hobu.inc at gmail.com> clean up formatting (11:06:00)
+ * Howard Butler <hobu.inc at gmail.com> throw std::out_of_range error when removeScaling causes a value that's out of bounds for the given data type (09:44:29)
+
+2013-12-18
+ * Howard Butler <hobu.inc at gmail.com> properly calculate blob length for oracle's internal PointBuffer when data are DIMENSION_INTERLEAVED (11:22:13)
+ * Howard Butler <hobu.inc at gmail.com> use correct dimensions when testing flipping (11:19:10)
+ * Howard Butler <hobu.inc at gmail.com> use correct buffer when calculating point_data_length in non-packing scenario (11:18:52)
+ * Howard Butler <hobu.inc at gmail.com> add populate_pointsourceid to drivers.oci.reader example (11:17:33)
+ * Howard Butler <hobu.inc at gmail.com> properly pack/ignore dimensions in pack() (10:59:52)
+ * Howard Butler <hobu.inc at gmail.com> provide method to return raw starting point of m_data buffer (10:59:10)
+ * Howard Butler <hobu.inc at gmail.com> clean up filters.chipper to not require BlockID and PointID dimensions, respect the requested number of points read, and streamline GetIDs/GetBuffer (10:58:42)
+
+2013-12-17
+ * Howard Butler <hobu.inc at gmail.com> ByteSwap doesn't need chipper (13:32:34)
+
+2013-12-16
+ * Howard Butler <hobu.inc at gmail.com> update queries for drivers.oci tests (15:11:25)
+ * Howard Butler <hobu.inc at gmail.com> more filters.chipper test update for new chipper code (15:11:11)
+ * Howard Butler <hobu.inc at gmail.com> significant cleanups in filters.chipper (15:07:53)
+ * Howard Butler <hobu.inc at gmail.com> pack() method optionally removes ignored dimensions by default (15:07:35)
+ * Howard Butler <hobu.inc at gmail.com> assert we're not outside the buffer's bounds in setDataStride (10:19:10)
+
+2013-12-13
+ * Howard Butler <hobu.inc at gmail.com> more filters.chipper cleanups (19:29:50)
+ * Howard Butler <hobu.inc at gmail.com> resize the internal buffer if it isn't big enough. cleanups and use copyLikeDimensions (18:15:18)
+ * Howard Butler <hobu.inc at gmail.com> filters.chipper cleanups (18:04:00)
+ * Howard Butler <hobu.inc at gmail.com> support writing non-chipped data, use the appropriate blob length for DIMENSION_INTERLEAVED data in all scenarios (13:48:56)
+ * Howard Butler <hobu.inc at gmail.com> assert same orientations for copyPoint*Fast methods (12:55:34)
+
+2013-12-12
+ * Howard Butler <hobu.inc at gmail.com> more test of copyLikeDimensions (11:14:59)
+
+2013-12-11
+ * Howard Butler <hobu.inc at gmail.com> more testing of flipping (17:18:04)
+
+2013-12-10
+ * Paul Ramsey <pramsey at cleverelephant.ca> Minor config changes (11:37:29)
+ * Paul Ramsey <pramsey at cleverelephant.ca> Merge branch 'master' of github.com:PDAL/PDAL (10:25:52)
+
+2013-12-09
+ * Howard Butler <hobu.inc at gmail.com> because of DIMENSION_INTERLEAVED data, we must read the whole blob into the m_oracle_buffer #216 (14:18:43)
+
+2013-12-06
+ * Howard Butler <hobu.inc at gmail.com> provide implementation of drivers.oci.reader that can read DIMENSION_INTERLEAVED data #216 (23:28:53)
+ * Howard Butler <hobu.inc at gmail.com> test all values in flipped dimension example (23:27:01)
+ * Howard Butler <hobu.inc at gmail.com> properly calculate positions when doing setDataStride and copyLikeDimensions (23:25:22)
+ * Howard Butler <hobu.inc at gmail.com> add option to ignore namespace when doing dimension matching #216 (23:24:50)
+ * Howard Butler <hobu.inc at gmail.com> make cleanup.sql actually wipe sdo_geom_metadata entry (11:02:50)
+ * Howard Butler <hobu.inc at gmail.com> more thorough test of copyLikeDimensions to include orientation (09:54:42)
+ * Howard Butler <hobu.inc at gmail.com> fix up setDataStride to do the right thing in the face of differing orientations. Make copyLikeDimensions agnostic to the PointBuffer's orientation (09:54:20)
+
+2013-12-05
+ * Howard Butler <hobu.inc at gmail.com> add dimension flipping to drivers.oci.writer #216 (16:22:27)
+ * Howard Butler <hobu.inc at gmail.com> write orientation into XML for #216 (13:55:17)
+ * Howard Butler <hobu.inc at gmail.com> provide implemention for #216 to flip the orientation of both dimension- and point-interleaved data (11:47:18)
+
+2013-12-04
+ * Howard Butler <hobu.inc at gmail.com> used PointBuffer::pack instead of custom packing stuff (12:13:16)
+ * Howard Butler <hobu.inc at gmail.com> PointBuffer::pack returns heap-allocated buffer now (12:12:50)
+ * Howard Butler <hobu.inc at gmail.com> use scoped_ptr to manage packed buffer lifetime (12:12:30)
+ * Howard Butler <hobu.inc at gmail.com> PointBuffer::pack() should return heap-allocated buffer so multiple copies aren't made (10:56:05)
+
+2013-12-03
+ * Howard Butler <hobu.inc at gmail.com> provide patch for #217 to set the dimension count for the schema appropriately (22:41:34)
+
+2013-12-02
+ * Howard Butler <hobu.inc at gmail.com> put copyLikeDimensions behavior back to not updating point count #215 (17:03:05)
+ * Howard Butler <hobu.inc at gmail.com> code de-crufting (17:02:12)
+ * Howard Butler <hobu.inc at gmail.com> typo in pgpointcloud reader (16:34:43)
+ * Howard Butler <hobu.inc at gmail.com> Pack out ignored dimensions when inserting data into pgpointcloud. Turn down debugging lint on drivers.pgpointcloud.reader PointBuffer::pack() packs down to the getNumPoints of a PointBuffer (15:51:53)
+
+2013-11-27
+ * Howard Butler <hobu.inc at gmail.com> attempt to resolve #214, where override offsets are not being used (12:54:55)
+
+2013-11-25
+ * Howard Butler <hobu.inc at gmail.com> copyLikeDimensions updates the dest_buffer getNumPoints #209 (14:37:28)
+ * Howard Butler <hobu.inc at gmail.com> warning fixes (14:29:18)
+ * Howard Butler <hobu.inc at gmail.com> more vagrant fixes for #212 (14:29:03)
+ * Howard Butler <howard at hobu.co> Merge pull request #212 from PDAL/issues/212-vert-datum-vagrant (13:47:25)
+ * Howard Butler <hobu.inc at gmail.com> Add support for fetching vertical datum information for proj #212 (13:19:19)
+
+2013-11-24
+ * Howard Butler <howard at hobu.co> Merge pull request #210 from PDAL/issues/210-drivers.oci.reader-OCILobRead2 (14:39:33)
+ * Howard Butler <hobu.inc at gmail.com> move CompressionType into pdal::schema rather than in the pgpointcloud driver by itself #211 (14:39:14)
+ * Howard Butler <hobu.inc at gmail.com> Implement proper call for OCILobRead2 #210 (14:11:45)
+
+2013-11-22
+ * Howard Butler <hobu.inc at gmail.com> PointBuffer/Schema orientation #209. A PointBuffer may be POINT_INTERLEAVED or DIMENSION_INTERLEAVED with the default being POINT_INTERLEAVED. (18:58:33)
+ * Howard Butler <howard at hobu.co> Merge pull request #208 from PDAL/issues/208-stats-sample-suppression (12:42:59)
+
+2013-11-18
+ * Howard Butler <hobu.inc at gmail.com> --sample needed to get a sample for stats #208 (15:53:21)
+ * Howard Butler <hobu.inc at gmail.com> add a --sample option to 'pdal info', which is off by default for data output #208 (15:44:23)
+ * Howard Butler <hobu.inc at gmail.com> clang'ify warning suppression (15:34:53)
+ * Howard Butler <hobu.inc at gmail.com> update AUTHORS with current listing (15:34:38)
+ * Howard Butler <hobu.inc at gmail.com> try to silence some more warnings in prep for 1.0.0 (14:37:55)
+ * Howard Butler <hobu.inc at gmail.com> big warning cleanup in preparation for 1.0.0 (14:14:18)
+ * Howard Butler <hobu.inc at gmail.com> remove unused variable, initialize xyz values outside the loop (11:52:00)
+ * Howard Butler <hobu.inc at gmail.com> remove unused variable (11:45:31)
+ * Howard Butler <hobu.inc at gmail.com> Documentation updates in prep for 1.0.0 #207 (11:02:50)
+ * Howard Butler <hobu.inc at gmail.com> add laszip note to dependencies (10:19:18)
+
+2013-11-15
+ * Howard Butler <hobu.inc at gmail.com> doc updates for #207 (23:28:00)
+ * Howard Butler <howard at hobu.co> Merge pull request #196 from PDAL/issues/196-las-global_encoding (15:42:17)
+ * Howard Butler <hobu.inc at gmail.com> provide implementation to resolve #196 by using binary encoding instead of integers for global_encoding (15:34:32)
+ * Howard Butler <howard at hobu.co> Merge pull request #206 from PDAL/issues/206-libgeotiff-cpl_serv (14:37:36)
+ * Howard Butler <hobu.inc at gmail.com> #define CPL_SERV_H_INCLUDED before including geotiff headers to make #206 work (14:20:16)
+ * Howard Butler <hobu.inc at gmail.com> Implement #205 to turn on most common options by default (09:46:40)
+
+2013-11-13
+ * Howard Butler <howard at hobu.co> Merge pull request #204 from PDAL/issues/204-cpack-configuration (14:05:13)
+ * Howard Butler <hobu.inc at gmail.com> fix up cpack configuration to have a 'make dist' command after configuration #204 (13:47:39)
+ * Howard Butler <howard at hobu.co> Merge pull request #203 from PDAL/issues/203-pipeline-serialization-info (10:02:42)
+ * Howard Butler <hobu.inc at gmail.com> make pdal info --stats myfile.xml --pipeline-serialization work #203 (09:09:23)
+ * Howard Butler <hobu.inc at gmail.com> make registerPluginIfExists private (09:07:45)
+
+2013-11-12
+ * Paul Ramsey <pramsey at opengeo.org> Merge branch 'master' of github.com:PDAL/PDAL (17:57:56)
+ * Howard Butler <howard at hobu.co> Merge pull request #202 from PDAL/issues/202-add-md5ing (08:42:35)
+ * Howard Butler <hobu.inc at gmail.com> add md5'ing algorithm for #202 (08:33:15)
+
+2013-11-10
+ * Howard Butler <howard at hobu.co> Merge pull request #201 from PDAL/issues/201-rename-soci-driver (11:26:30)
+ * Howard Butler <hobu.inc at gmail.com> move drivers.soci.* to drivers.sqlite for #201 (10:56:02)
+
+2013-11-08
+ * Howard Butler <hobu.inc at gmail.com> just pass in argv with a count instead of our own copy of arguments (11:19:08)
+
+2013-11-07
+ * Howard Butler <hobu.inc at gmail.com> #ifdef libxml2 stuff for when we don't have it (16:14:19)
+ * Howard Butler <hobu.inc at gmail.com> fetch as vagrant user too (13:04:43)
+ * Howard Butler <hobu.inc at gmail.com> fix up pdal::drivers::las::SummaryData (13:01:08)
+ * Howard Butler <hobu.inc at gmail.com> run load command as vagrant user (13:00:48)
+ * Pete Gadomski <pete.gadomski at gmail.com> Add test case for subtle bounds change (09:34:16)
+
+2013-11-06
+ * Howard Butler <hobu.inc at gmail.com> create extension as vagrant user for vagrant install (15:22:07)
+ * Howard Butler <hobu.inc at gmail.com> more vagrant updates (14:55:56)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (11:08:55)
+
+2013-11-05
+ * Howard Butler <hobu.inc at gmail.com> more doc updates (16:57:23)
+
+2013-11-04
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (16:50:31)
+ * Howard Butler <hobu.inc at gmail.com> output first read point (16:50:20)
+ * Howard Butler <hobu.inc at gmail.com> vagrant doc tweaks (15:46:39)
+ * Howard Butler <hobu.inc at gmail.com> fix up pgpointcloud build, add read xml example (15:25:16)
+ * Howard Butler <hobu.inc at gmail.com> add doc about Vagrant (15:25:03)
+ * Howard Butler <hobu.inc at gmail.com> add pgpointcloud to Vagrant config (14:45:59)
+ * Howard Butler <hobu.inc at gmail.com> fix Vagrantfile typo (14:11:37)
+ * Howard Butler <hobu.inc at gmail.com> add pgpointcloud to vagrant buildout (14:00:00)
+
+2013-10-30
+ * Paul Ramsey <pramsey at opengeo.org> Clean up example config a little (11:52:32)
+
+2013-10-24
+ * Howard Butler <howard at hobu.co> Merge pull request #199 from PDAL/issues/199-las-version (15:33:59)
+ * Howard Butler <hobu.inc at gmail.com> increment version to 0.9.9 (15:23:42)
+ * Howard Butler <hobu.inc at gmail.com> output a proper PDAL version number with git sha by default for software id (15:23:34)
+
+2013-10-21
+ * Howard Butler <hobu.inc at gmail.com> Add a Vagrant configuration and rename the 'pcinfo', 'pcpipeline', and 'pc2pc' applications into a single, git-style 'pdal' command #192 (16:01:52)
+
+2013-10-11
+ * Howard Butler <hobu.inc at gmail.com> filters.index is no more. Use the IndexedPointBuffer instead (15:22:16)
+ * Howard Butler <hobu.inc at gmail.com> fix up dimensionality so both 2d and 3d indexes work properly (14:58:28)
+ * Howard Butler <hobu.inc at gmail.com> make IndexedPointBuffer based on nanoflann instead of FLANN to remove external dependency #176 (14:08:48)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (09:56:25)
+ * Howard Butler <hobu.inc at gmail.com> update blocksize parameter (09:56:18)
+ * Howard Butler <hobu.inc at gmail.com> remove ticks (09:52:56)
+ * Howard Butler <hobu.inc at gmail.com> update nanoflann (09:52:13)
+
+2013-10-10
+ * Paul Ramsey <pramsey at opengeo.org> Merge branch 'master' of github.com:PDAL/PDAL (13:29:09)
+ * Paul Ramsey <pramsey at opengeo.org> drivers.text.writer (13:28:00)
+ * Howard Butler <hobu.inc at gmail.com> don't throw in filters.hexer's destructor (11:38:51)
+ * Howard Butler <hobu.inc at gmail.com> Fix #194, default to specified offsets instead of throwing an exception when their reprojection fails (11:30:26)
+ * Howard Butler <howard at hobu.co> Merge pull request #193 from PDAL/issues/193-populate-pointsourceid (11:50:32)
+ * Howard Butler <howard at hobu.co> Merge pull request #195 from PDAL/issues/195-reproject-offsets (11:39:19)
+ * Howard Butler <hobu.inc at gmail.com> don't throw in filters.hexer's destructor (11:38:51)
+ * Howard Butler <hobu.inc at gmail.com> Fix #194, default to specified offsets instead of throwing an exception when their reprojection fails (11:30:26)
+
+2013-10-09
+ * Paul Ramsey <pramsey at opengeo.org> drivers.qfit.reader (17:25:02)
+ * Paul Ramsey <pramsey at opengeo.org> p2g writer (17:12:57)
+ * Howard Butler <hobu.inc at gmail.com> do a proper check to find out of PointSourceId dimension is available for #193 (15:52:57)
+ * Paul Ramsey <pramsey at opengeo.org> drivers.qfit.reader (17:25:02)
+ * Paul Ramsey <pramsey at opengeo.org> p2g writer (17:12:57)
+ * Paul Ramsey <pramsey at opengeo.org> OCI writer (16:40:32)
+ * Howard Butler <hobu.inc at gmail.com> do a proper check to find out of PointSourceId dimension is available for #193 (15:52:57)
+ * Paul Ramsey <pramsey at opengeo.org> OCI reader (15:49:57)
+ * Paul Ramsey <pramsey at opengeo.org> NITF reader/writer (15:35:02)
+ * Paul Ramsey <pramsey at opengeo.org> Faux reader/writer (15:02:26)
+ * Paul Ramsey <pramsey at opengeo.org> CARIS readers (14:46:09)
+ * Paul Ramsey <pramsey at opengeo.org> Hexbin and pics for colorization (14:30:35)
+ * Paul Ramsey <pramsey at opengeo.org> Format programmable (14:03:09)
+ * Paul Ramsey <pramsey at opengeo.org> Splng error (13:42:09)
+ * Paul Ramsey <pramsey at opengeo.org> Note on chipper/cache combo (13:38:44)
+ * Paul Ramsey <pramsey at opengeo.org> Formatting fixes (13:37:01)
+ * Paul Ramsey <pramsey at opengeo.org> Add filters.scaling (13:14:40)
+ * Paul Ramsey <pramsey at opengeo.org> Add filters.colorization (12:51:09)
+
+2013-10-08
+ * Paul Ramsey <pramsey at cleverelephant.ca> Merge branch 'docs' (23:31:41)
+ * Paul Ramsey <pramsey at cleverelephant.ca> Add filters.color (16:27:48)
+ * Paul Ramsey <pramsey at cleverelephant.ca> Add Cache filter (16:16:14)
+ * Howard Butler <howard at hobu.co> Merge pull request #191 from PDAL/issues/191-remove-pcquery (15:48:32)
+ * Howard Butler <howard at hobu.co> move pcquery capability into pcinfo, remove pcquery for #191 (13:41:32)
+ * Howard Butler <howard at hobu.co> move pcquery capability into pcinfo, remove pcquery for #191 (13:32:24)
+ * Howard Butler <howard at hobu.co> Merge pull request #190 from PDAL/issues/190-rename-pcinfo (11:41:38)
+ * Howard Butler <howard at hobu.co> rename pcinfo to pdalinfo #190 (11:34:30)
+ * Howard Butler <howard at hobu.co> Merge pull request #189 from PDAL/issues/189-move-dimensionmap (11:29:14)
+ * Howard Butler <howard at hobu.co> remove cruft (11:11:00)
+ * Howard Butler <howard at hobu.co> missed a mapDimensions call (11:07:48)
+ * Howard Butler <howard at hobu.co> move mapDimensions to pdal::Schema #189 (11:01:59)
+ * Howard Butler <howard at hobu.co> put FLANN stuff inside the guard to fix #188 (08:56:10)
+
+2013-10-07
+ * Howard Butler <howard at hobu.co> more dox (17:59:28)
+ * Howard Butler <howard at hobu.co> doc churn (17:59:20)
+ * Howard Butler <howard at hobu.co> support --2d method for pcequal #176 (14:25:03)
+ * Howard Butler <howard at hobu.co> use the IndexedPointBuffer to provide indexing to pcequal #176 (14:09:31)
+ * Howard Butler <howard at hobu.co> make sure to initialize IndexPointBuffer constructors to 0 (13:41:21)
+ * Howard Butler <howard at hobu.co> Cleanup destructor issues described in #183 (13:09:10)
+ * Howard Butler <howard at hobu.co> remove Stage::toPTree(). Not really used, and it is a ton of redundant fluff throughout the codebase (13:00:54)
+ * Howard Butler <howard at hobu.co> dox work (12:20:47)
+ * Howard Butler <howard at hobu.co> const& normalization (12:20:39)
+ * Howard Butler <howard at hobu.co> more dox work (12:20:12)
+ * Howard Butler <howard at hobu.co> pdal::Writer documentation and cleanups (10:45:35)
+ * Howard Butler <howard at hobu.co> whitespace normalization, documentation, and cleanups of pdal::Writer (10:24:49)
+ * Howard Butler <howard at hobu.co> whitespace normalization (09:59:05)
+ * Howard Butler <howard at hobu.co> return a const& instead of a copy of the pdal::Schema for Reader::getSchema (09:37:19)
+ * Howard Butler <howard at hobu.co> turn off debug noise in soci test (09:08:21)
+ * Howard Butler <howard at hobu.co> turn off indexing test for now (09:08:08)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' into issues/176-PointBuffer-index (08:38:13)
+
+2013-10-05
+ * Howard Butler <howard at hobu.co> ifdef guard FLANN stuff for #185 (15:51:23)
+
+2013-10-04
+ * Howard Butler <howard at hobu.co> turn off flann test for now because travis isn't up to date yet (10:24:08)
+ * Howard Butler <howard at hobu.co> clean up destructor (10:15:36)
+ * Howard Butler <howard at hobu.co> ifdef guard FLANN, add destructor to PointBuffer (10:07:15)
+
+2013-10-03
+ * Howard Butler <howard at hobu.co> Merge branch 'master' into issues/176-PointBuffer-index (15:55:56)
+ * Howard Butler <howard at hobu.co> Merge pull request #184 from PDAL/issues/184-required-numpy (13:07:10)
+ * Howard Butler <howard at hobu.co> make numpy required when WITH_PYTHON is selected #184 (11:38:34)
+ * Howard Butler <howard at hobu.co> lingering sqlite writer fixups (11:17:38)
+ * Howard Butler <howard at hobu.co> Merge pull request #180 from PDAL/issues/180-sqlite-driver (11:16:44)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' into issues/180-sqlite-driver (10:49:42)
+ * Howard Butler <howard at hobu.co> Merge pull request #182 from PDAL/issues/182-cmake-cleanup (10:24:37)
+
+2013-10-02
+ * Howard Butler <howard at hobu.co> typo'd 08fbaf4d839c6a52014e3b12d8823a41922e737f (16:58:41)
+ * Howard Butler <howard at hobu.co> fix pdal::poitncloud::DimensionMap member variable for rename in #181 (16:40:59)
+ * Howard Butler <howard at hobu.co> include_directories can't have empty strings, so unquote those for now (16:30:21)
+ * Howard Butler <howard at hobu.co> quote path names for #182 (13:24:39)
+ * Howard Butler <howard at hobu.co> a map to keep track of globally allocated memory segments (11:51:13)
+
+2013-10-01
+ * Howard Butler <howard at hobu.co> put DimensionMap and PointBufferByteSize into a pointbuffer:: namespace (16:01:40)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' into issues/181-boost-interprocess-pointbuffer (13:42:54)
+ * Howard Butler <howard at hobu.co> make sure to use 64bit math for calculating buffer position when reading data (13:05:24)
+ * Howard Butler <howard at hobu.co> tighten up the 64bit calculations for PointBuffer offsets (13:04:57)
+
+2013-09-27
+ * Howard Butler <howard at hobu.co> never add to cache from random iterator (14:58:38)
+ * Howard Butler <howard at hobu.co> some interprocess scaffolding, nothing done yet (08:36:15)
+
+2013-09-29
+ * Mateusz Loskot <mateusz at loskot.net> Do not ignore non-existent variables (17:01:17)
+
+2013-09-26
+ * Howard Butler <howard at hobu.co> Merge branch 'master' into issues/180-sqlite-driver (15:26:12)
+ * Howard Butler <howard at hobu.co> add large cache example (but mostly turned off for now due to the memory allocation taking forever (14:39:18)
+ * Howard Butler <howard at hobu.co> turn off radiusSearch because it is causing Travis to fail (14:33:59)
+
+2013-09-23
+ * Howard Butler <howard at hobu.co> can't call methods until we're actually constructed (19:18:49)
+ * Howard Butler <howard at hobu.co> clean up PointBuffer's byte size calculations to be more clear (08:59:47)
+ * Howard Butler <howard at hobu.co> turn off return number data checks for now (08:53:03)
+ * Howard Butler <howard at hobu.co> clean up dimension maps when destructing filters.cache iterator (08:52:37)
+
+2013-06-14
+ * Howard Butler <hobu.inc at gmail.com> merge 01c84eb5ebc2314c3afbae66e6c7db01a85b2c74 into master make sure to writeBufferBegin, even if we're not writing any points, so we can write 0-point files (15:39:24)
+ * Paul Ramsey <pramsey at opengeo.org> try to leak less on exception (18:55:20)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (16:31:33)
+ * Howard Butler <hobu.inc at gmail.com> return with what we've read if we read a new cloud (16:30:26)
+ * Paul Ramsey <pramsey at opengeo.org> Throw error messages using session (15:39:46)
+ * Howard Butler <hobu.inc at gmail.com> make sure to writeBufferBegin, even if we're not writing any points, so we can write 0-point files (15:39:24)
+
+2013-09-20
+ * Howard Butler <howard at hobu.co> clean up definition of buffer's byte sizes to use a single typedef instead of uint64_t's (11:50:56)
+
+2013-09-19
+ * Howard Butler <howard at hobu.co> Merge branch 'issues/177-scaling-filter' (12:01:36)
+
+2013-09-03
+ * Howard Butler <howard at hobu.co> silence annoying warning now that boost is not a SYSTEM include again (15:05:38)
+ * Howard Butler <howard at hobu.co> silence annoying warning now that boost is not a SYSTEM include again (15:05:38)
+ * Howard Butler <howard at hobu.co> some scaffolding for IndexedPointBuffer, including adding PointBuffer::applyScaling method to bring up from filters (15:06:14)
+ * Howard Butler <howard at hobu.co> silence annoying warning now that boost is not a SYSTEM include again (15:05:38)
+ * Howard Butler <howard at hobu.co> default to *not* doing sample for filters.stats -- too noisy and not useful for everyone (13:29:31)
+ * Howard Butler <howard at hobu.co> undo SYSTEM mark of boost include directories from #158 (13:00:36)
+ * Howard Butler <howard at hobu.co> undo SYSTEM mark of boost include directories from #158 (11:48:20)
+
+2013-09-17
+ * Howard Butler <hobu.inc at gmail.com> don't run soci test if no soci around (16:40:36)
+ * Howard Butler <hobu.inc at gmail.com> working drivers.soci.writer for #180 (16:29:43)
+
+2013-09-16
+ * Howard Butler <howard at hobu.co> properly size buffer when point count is large #123 (12:08:09)
+ * Howard Butler <howard at hobu.co> clean up used memory (12:07:23)
+
+2013-09-11
+ * Howard Butler <howard at hobu.co> Merge pull request #178 from klassenjs/master (13:56:05)
+ * James Klassen <klas0037 at umn.edu> Fix schema operator== comparing self with self and always returning true. (13:44:25)
+
+2013-09-06
+ * Howard Butler <howard at hobu.co> working radiusSearch implementation #176 (14:04:55)
+ * Howard Butler <howard at hobu.co> add note for #177 (13:25:34)
+ * Howard Butler <howard at hobu.co> FLANN-based index for nearest, not yet radius (13:16:34)
+
+2013-09-04
+ * Howard Butler <howard at hobu.co> remove dead getScaledValue code that has been put into PointBuffer::applyScaling so as to not copy it all over the place (07:53:07)
+
+2013-08-28
+ * Howard Butler <howard at hobu.co> turn off the sample if we explicitly list dimensions (12:31:35)
+ * Howard Butler <howard at hobu.co> support turning off the sample (12:31:25)
+ * Howard Butler <howard at hobu.co> support explicitly setting dimensions for stat filter (12:11:01)
+
+2013-08-27
+ * Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (09:24:18)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' into issues/124-p2g-intensity-interpolate (09:07:27)
+
+2013-08-26
+ * Howard Butler <howard at hobu.co> Merge pull request #173 from PDAL/issues/173-embed-string_ref (14:22:08)
+ * Howard Butler <howard at hobu.co> Use a pdal-namespaced string_ref instead of the one from system boost which is in flux right now #173 (12:00:13)
+
+2013-08-22
+ * Howard Butler <howard at hobu.co> fix up bad merge (15:23:23)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' of github.com:PDAL/PDAL (14:19:44)
+ * Howard Butler <howard at hobu.co> put hex generation in destructor of iterator -- it has to happen after we've read all the points, and then it will update the metadata of the PointBuffer that was used to instantiate the interator (14:18:49)
+
+2013-08-21
+ * Howard Butler <howard at hobu.co> Merge pull request #171 from gadomski/astyle (14:52:22)
+ * Howard Butler <howard at hobu.co> Merge pull request #172 from gadomski/update-boost-version (14:34:19)
+ * Pete Gadomski <pete.gadomski at gmail.com> Update required boost version to 1.53 (14:05:33)
+
+2013-08-20
+ * Pete Gadomski <pete.gadomski at gmail.com> Run astyle on src/ and include/ files (15:40:25)
+
+2013-08-09
+ * Howard Butler <howard at hobu.co> don't pollute stdout (20:19:03)
+ * Howard Butler <howard at hobu.co> cumulate the entire bounds as we go through for the whole SDO_PC (19:39:06)
+
+2013-08-07
+ * Howard Butler <howard at hobu.co> optionally support chunk streaming -- inconclusive whether or not it is actually faster (09:21:47)
+ * Howard Butler <howard at hobu.co> remove cruft (08:45:03)
+ * Howard Butler <howard at hobu.co> move oracle_array example into test/unit/drivers/oci for safe (unused) keeping (08:43:34)
+
+2013-08-05
+ * Howard Butler <howard at hobu.co> Merge branch 'master' into issues/167-fixups-for-chipper (16:27:07)
+ * Howard Butler <hobu.inc at gmail.com> don't do conninfo parse if we don't have it (old libpq's). Fixes #169 (15:48:23)
+ * Howard Butler <hobu.inc at gmail.com> use PGPOINTCLOUD=ON in my default configuration (based on OSGeo4W (15:47:47)
+ * Howard Butler <hobu.inc at gmail.com> don't do perf tests on windows, some includes not available yet it seems (15:47:24)
+ * Howard Butler <hobu.inc at gmail.com> switch off gzip/zlib iostreams for now -- we're not using it (15:46:39)
+
+2013-08-01
+ * Howard Butler <howard at hobu.co> add blob_chunk_count option to drivers.oci.writer (13:24:44)
+ * Howard Butler <howard at hobu.co> Merge branch 'master' into issues/167-fixups-for-chipper (09:06:17)
+ * Howard Butler <howard at hobu.co> support chunk-based stream writing (09:06:01)
+
+2013-07-31
+ * Chris Foster <chris42f at gmail.com> Merge pull request #168 from c42f/pdal-static-build (23:26:52)
+ * Chris Foster <chris.foster at roames.com.au> Build system option for static PDAL build (21:58:50)
+ * Howard Butler <howard at hobu.co> try streaming-based LOB writing (15:26:30)
+ * Howard Butler <howard at hobu.co> include stdlib.h for exit() (13:29:30)
+
+2013-07-30
+ * Howard Butler <howard at hobu.co> put back writing to ONE_PIECE method (11:00:12)
+ * Howard Butler <howard at hobu.co> add oracle_array test util (10:59:56)
+
+2013-07-29
+ * Howard Butler <howard at hobu.co> start callback-based streaming method -- not yet implemented (21:11:02)
+ * Howard Butler <howard at hobu.co> clean up lint (21:10:32)
+ * Howard Butler <howard at hobu.co> write using OCILocator instead of data bind (19:53:35)
+ * Howard Butler <howard at hobu.co> add ability to control whether or not to create indices with 'create_index' option, allow user to turn on tracing with 'do_trace' option (15:20:20)
+
+2013-07-27
+ * Howard Butler <howard at hobu.co> revert to only supporting selecting the view and drop support for QUERY_SDO_PC query types (21:36:47)
+ * Howard Butler <howard at hobu.co> clean up binds (21:10:42)
+ * Howard Butler <howard at hobu.co> use OpenBlob/CloseBlob methods to reduce round-tripping to db (21:10:09)
+ * Howard Butler <howard at hobu.co> add OpenBlob/CloseBlob methods (21:09:45)
+
+2013-07-25
+ * Howard Butler <howard at hobu.co> don't allocate a vector for every point added to the loop in calculateBounds (21:05:43)
+ * Howard Butler <howard at hobu.co> use PointBuffer::calculateBounds instead of driver's version (20:57:16)
+ * Howard Butler <howard at hobu.co> oracle cleanup script tweak (19:50:39)
+ * Howard Butler <hobu.inc at gmail.com> allow specifying the 'Z' dimension name with an option for interpolation #124 (17:00:55)
+
+2013-07-08
+ * Howard Butler <hobu.inc at gmail.com> #ifdef the log output for filters.cache. This ends up being touched per-point and is expensive if you don't want it (16:32:39)
+
+2013-07-24
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'c42f-getDimension_optimization' (13:54:01)
+
+2013-07-22
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #165 from PDAL/issues/165-remove-chunk-size (10:04:45)
+
+2013-07-19
+ * Chris Foster <chris42f at gmail.com> Minor naming cleanups for clarity and consistency (21:41:01)
+ * Chris Foster <chris42f at gmail.com> Use string_ref in getDimensionOptional() for consistency (20:43:57)
+
+2013-07-18
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #166 from PDAL/issues/166-removeScaling-check (19:18:19)
+ * Howard Butler <hobu.inc at gmail.com> Turn off overflow checks in Dimension::removeScaling for now #166 (19:10:23)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into issues/165-remove-chunk-size (15:41:25)
+ * Howard Butler <hobu.inc at gmail.com> remove dead code (15:41:05)
+ * Howard Butler <hobu.inc at gmail.com> remove dead code (09:21:52)
+ * Mateusz Loskot <mateusz at loskot.net> Enable Travis CI for pull requests (09:14:59)
+
+2013-07-17
+ * Howard Butler <hobu.inc at gmail.com> First attempt at removing Writer::chunk_size and instead making it a default argument to Writer::write() #146 @gadomski (18:55:00)
+ * Mateusz Loskot <mateusz at loskot.net> Invoke Travis scripts with bash -e (17:47:29)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (11:16:08)
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #163 from gadomski/clean-up-after-geojson-test (11:15:52)
+ * Howard Butler <hobu.inc at gmail.com> remove bzip2 (unused) to fix #164 (11:15:25)
+ * Pete Gadomski <pete.gadomski at gmail.com> Delete temporary test file after use (10:46:21)
+ * Chris Foster <chris42f at gmail.com> Optimization: remove getDimension("<uuid-string>") (09:35:26)
+ * Chris Foster <chris42f at gmail.com> Fix bug which crept in when refactoring getDimension() (09:22:45)
+
+2013-07-16
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #161 from gadomski/remove-dup-cmake-code (12:37:24)
+ * Pete Gadomski <pete.gadomski at gmail.com> Remove duplicate lines from src/CMakeLists (12:27:19)
+
+2013-07-15
+ * Chris Foster <chris42f at gmail.com> getDimension perf tests + use string_ref for dimension names (10:35:18)
+
+2013-07-14
+ * Howard Butler <hobu.inc at gmail.com> remove ununsed ptr to environment, we can get this from the GlobalEnvironment anyway (09:07:31)
+ * Howard Butler <hobu.inc at gmail.com> point at local FLANN so warnings are gone (09:07:00)
+
+2013-07-13
+ * Chris Foster <chris42f at gmail.com> Merge remote-tracking branch 'upstream/master' into getDimension_optimization (20:07:04)
+
+2013-07-11
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #160 from PDAL/issues/160-upgrade-boost-154 (14:51:05)
+ * Howard Butler <hobu.inc at gmail.com> compile new additions for 1.54 (14:16:30)
+ * Howard Butler <hobu.inc at gmail.com> update script for bcp'ing 1.54 (13:03:21)
+ * Howard Butler <hobu.inc at gmail.com> increment boost to 1.54, add asio, string_ref, and regex (13:02:50)
+ * Chris Foster <chris42f at gmail.com> WIP optimizations to getDimension() (09:38:22)
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #158 from c42f/cjf-warnings-fix (08:49:42)
+ * Chris Foster <chris42f at gmail.com> Avoid unnecessarily formatting in getDimension (08:49:22)
+ * Chris Foster <chris42f at gmail.com> Performance tests for chipper with & without cache (08:25:16)
+
+2013-07-04
+ * Chris Foster <chris42f at gmail.com> Fix various compiler warnings (07:50:42)
+
+2013-06-29
+ * Chris Foster <chris42f at gmail.com> Fix minor memory leak of stage factory (09:34:42)
+ * Chris Foster <chris42f at gmail.com> Allow SRS to be ignored in Mosaic filter (08:08:34)
+ * Chris Foster <chris42f at gmail.com> Fix segfault when reading from las into multiple buffers (00:35:50)
+
+2013-07-07
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #156 from gadomski/doc-fix (16:00:21)
+
+2013-07-06
+ * Pete Gadomski <pete.gadomski at gmail.com> Remove note about pdal.hpp from docs — DNE (14:46:42)
+
+2013-07-05
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #155 from PDAL/issues/154-plugin-versioning (12:46:33)
+ * Howard Butler <hobu.inc at gmail.com> provide implementation for plugin versioning #154 (11:43:22)
+
+2013-07-03
+ * Mateusz Loskot <mateusz at loskot.net> Disable Travis CI notifications by e-mail (16:05:17)
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #152 from PDAL/issues/152-is-embed-boost (15:52:37)
+ * Howard Butler <hobu.inc at gmail.com> Implement #152, denoting whether or not boost is built embedded (15:42:55)
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #149 from pramsey/master (11:31:10)
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #150 from PDAL/issues/150-RawByte (11:26:41)
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #151 from gadomski/duplicate-lines-in-test-cmake (09:52:55)
+ * Howard Butler <hobu.inc at gmail.com> remove dimension::UnsignedByte and dimension::SignedByte and replace with dimension::RawByte (09:40:45)
+ * Pete Gadomski <pete.gadomski at gmail.com> Remove duplicate lines from test CMakeLists (09:37:13)
+ * Howard Butler <hobu.inc at gmail.com> register driver info when we register Stages to factory (09:08:22)
+
+2013-07-02
+ * Paul Ramsey <pramsey at opengeo.org> In reprojection, sometimes the bounds dont follow min/max rules after the transform... (18:40:37)
+ * Howard Butler <hobu.inc at gmail.com> implement support for listing options/drivers from commandline #148 (14:11:24)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (11:11:48)
+ * Howard Butler <hobu.inc at gmail.com> remove unneeded includes (11:11:21)
+
+2013-07-01
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #146 from c42f/las_reader_cache_dim_fix (10:19:55)
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #147 from c42f/mosaic_srs_ignore (09:48:00)
+
+2013-06-28
+ * Mateusz Loskot <mateusz at loskot.net> Always notify #pdal on successful build (17:22:59)
+ * Mateusz Loskot <mateusz at loskot.net> Update FindPostgreSQL.cmake definition (16:50:57)
+ * Mateusz Loskot <mateusz at loskot.net> Build with PostgreSQL Point Cloud support (16:07:04)
+ * Mateusz Loskot <mateusz at loskot.net> Build with FLANN support (14:06:48)
+ * Mateusz Loskot <mateusz at loskot.net> Replace deprecated command make_directory (13:59:43)
+
+2013-06-27
+ * Mateusz Loskot <mateusz at loskot.net> Create README.md (19:59:14)
+ * Mateusz Loskot <mateusz at loskot.net> Build libgeotiff from sources (19:33:41)
+ * Mateusz Loskot <mateusz at loskot.net> Test libtiff version (09:24:42)
+ * Mateusz Loskot <mateusz at loskot.net> Install libtiff4-dev (09:09:02)
+ * Mateusz Loskot <mateusz at loskot.net> Build only master (05:07:43)
+
+2013-06-26
+ * Mateusz Loskot <mateusz at loskot.net> Replace return 1 with exit 1 (19:37:10)
+ * Mateusz Loskot <mateusz at loskot.net> Return correct exit code on command failure (19:31:41)
+ * Mateusz Loskot <mateusz at loskot.net> Fix invalid find_path() option PATH_PREFIXES (19:26:00)
+ * Mateusz Loskot <mateusz at loskot.net> Install libgeotiff-dev (19:19:13)
+ * Mateusz Loskot <mateusz at loskot.net> Add missing value in -DWITH_LIBXML2=ON (19:14:31)
+ * Mateusz Loskot <mateusz at loskot.net> Call CMake with explicit dependencies (19:12:11)
+ * Mateusz Loskot <mateusz at loskot.net> Try libgdal from ubuntugis/ppa (18:25:54)
+ * Mateusz Loskot <mateusz at loskot.net> Enable verbose apt-get (17:18:01)
+ * Mateusz Loskot <mateusz at loskot.net> Install GDAL, PROJ.4 and libxml2 on Travis CI (17:04:39)
+ * Mateusz Loskot <mateusz at loskot.net> Disable timestamp echo. (15:50:20)
+ * Mateusz Loskot <mateusz at loskot.net> Enable make -j N (15:41:07)
+ * Mateusz Loskot <mateusz at loskot.net> Configure Travis CI for PDAL (14:45:14)
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #144 from pramsey/offsetsrep (14:34:40)
+ * Mateusz Loskot <mateusz at loskot.net> Ignore mloskot's _build subdirectory (14:16:35)
+
+2013-06-25
+ * Paul Ramsey <pramsey at opengeo.org> Merge branch 'pipelinedocs' (13:47:38)
+ * Paul Ramsey <pramsey at opengeo.org> Typo in filter name (13:46:15)
+ * Paul Ramsey <pramsey at opengeo.org> filters.byteswap (13:45:14)
+ * Paul Ramsey <pramsey at opengeo.org> Add filters.selector (13:29:26)
+ * Paul Ramsey <pramsey at opengeo.org> Merge branch 'master' of github.com:PDAL/PDAL into pipelinedocs (11:05:12)
+ * Howard Butler <hobu.inc at gmail.com> declare buffer as const (09:49:24)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (08:47:44)
+
+2013-06-24
+ * Paul Ramsey <pramsey at opengeo.org> Merge branch 'master' of github.com:PDAL/PDAL into pipelinedocs (18:58:48)
+ * Paul Ramsey <pramsey at opengeo.org> Predicate and programmable filters (18:58:34)
+ * Paul Ramsey <pramsey at opengeo.org> Fix for #142, actually use the z_offset reference if requested (16:18:53)
+ * Paul Ramsey <pramsey at opengeo.org> Update options information for LAS writer (16:11:58)
+ * Paul Ramsey <pramsey at opengeo.org> Accept user offsets in the *output* SRS (15:47:37)
+ * Paul Ramsey <pramsey at opengeo.org> Merge branch 'offsets' (15:48:01)
+ * Paul Ramsey <pramsey at opengeo.org> Accept user offsets in the *output* SRS (15:47:37)
+ * Paul Ramsey <pramsey at opengeo.org> Fix reference names (15:42:35)
+ * Paul Ramsey <pramsey at opengeo.org> Merge branch 'master' of github.com:PDAL/PDAL (14:18:47)
+ * Paul Ramsey <pramsey at opengeo.org> Bind reference into docs toc (14:18:13)
+ * Pete Gadomski <pete.gadomski at gmail.com> Add notes about building the documentation (10:33:26)
+
+2013-06-21
+ * Paul Ramsey <pramsey at opengeo.org> Las format pages (18:33:32)
+
+2013-06-20
+ * Paul Ramsey <pramsey at opengeo.org> Add cropping (16:42:51)
+ * Paul Ramsey <pramsey at opengeo.org> Add decimation filter (16:32:39)
+ * Paul Ramsey <pramsey at opengeo.org> document pg reader (16:26:37)
+
+2013-06-19
+ * Paul Ramsey <pramsey at opengeo.org> Add in place reprojection filter (23:26:48)
+ * Paul Ramsey <pramsey at opengeo.org> Merge branch 'master' into pipelinedocs (23:07:54)
+ * Paul Ramsey <pramsey at opengeo.org> Chipper default size is 5000, not 0 (zero?) (23:06:45)
+ * Paul Ramsey <pramsey at opengeo.org> Update the chipper entry (23:05:13)
+ * Paul Ramsey <pramsey at opengeo.org> stage name as header? (18:12:20)
+ * Paul Ramsey <pramsey at opengeo.org> Cross referencing (18:07:35)
+ * Paul Ramsey <pramsey at opengeo.org> First new pipeline docs (18:03:44)
+ * Howard Butler <hobu.inc at gmail.com> add src/gitsha.cpp (16:55:16)
+ * Howard Butler <hobu.inc at gmail.com> try to remove gitsha.cpp (16:54:31)
+ * Howard Butler <hobu.inc at gmail.com> remove generated gitsha.cpp (16:47:23)
+ * Howard Butler <hobu.inc at gmail.com> increment sha (16:16:53)
+ * Howard Butler <hobu.inc at gmail.com> --drivers is only available in long form (16:16:43)
+ * Howard Butler <hobu.inc at gmail.com> make addDriver method public (16:16:26)
+ * Paul Ramsey <pramsey at opengeo.org> Read version string from un-split string version (15:54:46)
+
+2013-06-17
+ * Howard Butler <hobu.inc at gmail.com> support outputing registered driver list with --drivers for all apps (19:54:59)
+ * Howard Butler <hobu.inc at gmail.com> increment SHA (12:55:58)
+ * Howard Butler <hobu.inc at gmail.com> increment version to 0.9.8, add nitro defn's (12:54:45)
+ * Howard Butler <hobu.inc at gmail.com> remove unused warning (12:54:21)
+ * Howard Butler <hobu.inc at gmail.com> add nitro (12:54:04)
+ * Howard Butler <hobu.inc at gmail.com> link OCI (12:53:35)
+ * Howard Butler <hobu.inc at gmail.com> make sure to import NITRO API (12:53:19)
+ * Howard Butler <hobu.inc at gmail.com> clean up unused var warning (12:52:42)
+ * Howard Butler <hobu.inc at gmail.com> clean up assignment operator warning (12:52:09)
+ * Howard Butler <hobu.inc at gmail.com> remove chipper-specific nonsense from ByteSwap (11:40:35)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (10:49:09)
+ * Howard Butler <hobu.inc at gmail.com> don't version the include/ installation (10:48:41)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (10:42:18)
+
+2013-06-13
+ * Paul Ramsey <pramsey at opengeo.org> Update for pgpointcloud (18:11:42)
+ * Paul Ramsey <pramsey at opengeo.org> Merge from pdal/master Merge branch 'master' of github.com:PDAL/PDAL (18:03:55)
+ * Paul Ramsey <pramsey at opengeo.org> Merge branch 'libpq' (15:58:48)
+ * Paul Ramsey <pramsey at opengeo.org> Remove SOCI requirement for PgPointCloud (15:58:27)
+
+2013-06-12
+ * Paul Ramsey <pramsey at opengeo.org> Remove orphaned build fragment (15:49:03)
+ * Paul Ramsey <pramsey at opengeo.org> Update built to find PgSQL (15:48:01)
+ * Howard Butler <hobu.inc at gmail.com> clean up unused vars (15:27:16)
+ * Howard Butler <hobu.inc at gmail.com> initialize variables (15:17:11)
+ * Howard Butler <hobu.inc at gmail.com> don't write an exmaple file (14:50:52)
+
+2013-06-11
+ * Paul Ramsey <pramsey at opengeo.org> Change from soci prepared statement to one-time execution in block insertion (18:52:58)
+
+2013-06-10
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'chambbj-buffer-reader' (16:03:42)
+ * Howard Butler <hobu.inc at gmail.com> silence debug output (16:02:52)
+ * Howard Butler <hobu.inc at gmail.com> clean up json file (15:03:11)
+ * Howard Butler <hobu.inc at gmail.com> use mapDimensions and copyLikeDimensions to copy over buffer data instead of explicitly copying only X, Y, Z float dimensions (15:00:04)
+ * Howard Butler <hobu.inc at gmail.com> silence debug output (14:59:25)
+ * Paul Ramsey <pramsey at opengeo.org> Grammatical error message (12:12:55)
+
+2013-06-07
+ * Bradley J Chambers <brad.chambers at gmail.com> adding a buffer reader (11:35:21)
+ * chambbj <brad.chambers at gmail.com> Merge pull request #137 from chambbj/static-runtime-bug (11:30:33)
+
+2013-06-06
+ * Bradley J Chambers <brad.chambers at gmail.com> optional use of static runtime will be more helpful if it is tested (10:28:15)
+
+2013-06-03
+ * Howard Butler <hobu.inc at gmail.com> clean up some warnings (16:17:31)
+ * Howard Butler <hobu.inc at gmail.com> hobu config (14:00:53)
+ * Howard Butler <hobu.inc at gmail.com> clean warnings (14:00:36)
+ * Howard Butler <hobu.inc at gmail.com> build with embedded boost by default (14:00:10)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (13:29:50)
+ * Howard Butler <hobu.inc at gmail.com> link oracle libs to tests (13:29:37)
+ * Howard Butler <hobu.inc at gmail.com> hobu stuff (13:29:11)
+ * Bradley J Chambers <brad.chambers at gmail.com> NitfWriter can now only be tested if WITH_NITRO is true (07:15:11)
+
+2013-05-31
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into chambbj-add-mp-support-for-msvc (09:19:32)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'chambbj-use-static-runtime' (09:18:18)
+ * Howard Butler <hobu.inc at gmail.com> start using nanoflann for the soci loader to reorganize within-patch points as a kdtree (09:08:31)
+ * Bradley J Chambers <brad.chambers at gmail.com> compile time improved on MSVC with /MP flag (08:12:58)
+ * Bradley J Chambers <brad.chambers at gmail.com> add option to build PDAL using static runtime libraries on Windows (07:18:37)
+
+2013-05-29
+ * Howard Butler <hobu.inc at gmail.com> git sha reporting in version strings (09:31:40)
+
+2013-05-28
+ * Howard Butler <hobu.inc at gmail.com> remove *nix includes, not used apparantly #133 (12:29:38)
+
+2013-05-17
+ * Howard Butler <hobu.inc at gmail.com> use indicators for situations where we return nulls (16:16:41)
+
+2013-05-16
+ * Howard Butler <hobu.inc at gmail.com> 'binary' soci reader improvements to provide parity with the postgis-only soci writer. This could all go away now due to pramsey's efforts though (16:10:03)
+
+2013-05-15
+ * Howard Butler <hobu.inc at gmail.com> cleanups (15:20:39)
+ * Howard Butler <hobu.inc at gmail.com> fix up soci writer (15:20:35)
+
+2013-05-13
+ * Paul Ramsey <pramsey at opengeo.org> Remove patch count from metadata (18:15:31)
+ * Paul Ramsey <pramsey at opengeo.org> Merge branch 'pgnative' of github.com:pramsey/PDAL into pgnative (15:00:59)
+ * Paul Ramsey <pramsey at opengeo.org> Update (c) (14:02:19)
+ * Paul Ramsey <pramsey at opengeo.org> Fix readBuffer log msg to be clearer (13:17:11)
+ * Paul Ramsey <pramsey at opengeo.org> Merge branch 'master' of github.com:PDAL/PDAL into pgnative (14:33:54)
+ * Howard Butler <hobu.inc at gmail.com> guard nitf writer test for nitro availability (14:32:53)
+ * Paul Ramsey <pramsey at opengeo.org> Update to master Merge branch 'master' of github.com:PDAL/PDAL into pgnative (14:23:20)
+ * Paul Ramsey <pramsey at opengeo.org> Update (c) (14:02:19)
+ * Paul Ramsey <pramsey at opengeo.org> Fix readBuffer log msg to be clearer (13:17:11)
+ * Howard Butler <hobu.inc at gmail.com> revert (10:38:33)
+ * Howard Butler <hobu.inc at gmail.com> fixes to support compiling w/o GDAL (10:37:32)
+ * Howard Butler <hobu.inc at gmail.com> Fixups for situations where there's no libxml2 (09:39:44)
+
+2013-05-11
+ * Paul Ramsey <pramsey at opengeo.org> Remove old file (21:49:56)
+ * Paul Ramsey <pramsey at opengeo.org> Merge branch 'master' of github.com:PDAL/PDAL into pgnative (21:50:21)
+ * Paul Ramsey <pramsey at opengeo.org> Remove old file (21:49:56)
+
+2013-05-10
+ * Paul Ramsey <pramsey at opengeo.org> Remove some old code and comments (17:44:14)
+ * Paul Ramsey <pramsey at opengeo.org> Complete reader draft! (17:39:25)
+ * Paul Ramsey <pramsey at opengeo.org> Remove some old code and comments (17:44:14)
+ * Paul Ramsey <pramsey at opengeo.org> Complete reader draft! (17:39:25)
+ * Howard Butler <hobu.inc at gmail.com> add example options (09:47:03)
+ * Howard Butler <hobu.inc at gmail.com> register drivers.nitf.writer, add pipeline example (09:42:22)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'nitf-write-support' (09:12:31)
+
+2013-05-09
+ * Paul Ramsey <pramsey at opengeo.org> Fix SQL query for getNumPoints (19:13:43)
+ * Paul Ramsey <pramsey at opengeo.org> Add reader to registry (19:11:13)
+ * Paul Ramsey <pramsey at opengeo.org> Building zero-functionality reader class (18:51:34)
+ * Paul Ramsey <pramsey at opengeo.org> Working writer for pgpointcloud (08:36:11)
+ * Paul Ramsey <pramsey at opengeo.org> Fix SQL query for getNumPoints (19:13:43)
+ * Paul Ramsey <pramsey at opengeo.org> Add reader to registry (19:11:13)
+ * Paul Ramsey <pramsey at opengeo.org> Building zero-functionality reader class (18:51:34)
+ * Howard Butler <hobu.inc at gmail.com> nitro configuration (18:19:47)
+ * Howard Butler <hobu.inc at gmail.com> set some metadata (15:06:31)
+ * Paul Ramsey <pramsey at opengeo.org> Working writer for pgpointcloud (08:36:11)
+
+2013-05-08
+ * Paul Ramsey <pramsey at opengeo.org> Copy soci driver into independent pgpointcloud driver (08:11:38)
+ * Howard Butler <hobu.inc at gmail.com> cleanups and set metadata (13:47:00)
+ * Paul Ramsey <pramsey at opengeo.org> Copy soci driver into independent pgpointcloud driver (08:11:38)
+
+2013-05-06
+ * Howard Butler <hobu.inc at gmail.com> write out dummy IM segment (15:10:18)
+ * Howard Butler <hobu.inc at gmail.com> throw an exception if IM segment isn't named (15:09:49)
+ * Howard Butler <hobu.inc at gmail.com> minimally functioning writer (12:23:14)
+
+2013-05-02
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #127 from chambbj/with_apps (09:08:00)
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #128 from chambbj/pdal_defines_rebase (09:06:43)
+
+2013-04-26
+ * Bradley J Chambers <brad.chambers at gmail.com> Clearing up some of the issues with pdal_defines.h (11:53:03)
+ * Bradley J Chambers <brad.chambers at gmail.com> conditionally include tests for apps (11:50:37)
+
+2013-04-24
+ * Howard Butler <hobu.inc at gmail.com> more soci work (14:42:13)
+ * Bradley J Chambers <brad.chambers at gmail.com> now testing WITH_APPS prior to add_subdirectory(apps) (09:44:27)
+
+2013-04-23
+ * Howard Butler <hobu.inc at gmail.com> fixup defines for when no hexbin (13:54:13)
+
+2013-04-22
+ * Howard Butler <hobu.inc at gmail.com> register filters.hexbin (10:48:36)
+ * Howard Butler <hobu.inc at gmail.com> add working filters.hexbin implementation (10:48:24)
+
+2013-04-19
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (16:44:21)
+ * Howard Butler <hobu.inc at gmail.com> more soci writer stuff (16:44:03)
+ * Howard Butler <hobu.inc at gmail.com> add a binary_to_hex_stream method (16:43:51)
+ * Howard Butler <hobu.inc at gmail.com> try reprojecting with the old Z values if we failed with the current Z values (16:43:17)
+ * Howard Butler <hobu.inc at gmail.com> only ever output 2D WKT from Bounds (16:41:41)
+ * Howard Butler <hobu.inc at gmail.com> We can't toWKT 3D bounds, so you only get 2D. Add a toBox() method that creates a PostGIS-compatible BOX or BOX3D (16:28:04)
+ * Howard Butler <hobu.inc at gmail.com> XYZ isn't optional to calculateBounds (16:26:08)
+
+2013-04-18
+ * Howard Butler <hobu.inc at gmail.com> remove old hexer code from PDAL tree, now in its own thing at http://github.com/hobu/hexer (16:44:08)
+ * Howard Butler <hobu.inc at gmail.com> fixups for hexer (09:01:32)
+
+2013-04-17
+ * Howard Butler <hobu.inc at gmail.com> add reproject/crop example (10:36:52)
+ * Howard Butler <hobu.inc at gmail.com> add some more example metadata (10:31:41)
+ * Howard Butler <hobu.inc at gmail.com> add my script for setting up oracle env (10:27:32)
+ * Howard Butler <hobu.inc at gmail.com> clean up example file (10:17:10)
+ * Howard Butler <hobu.inc at gmail.com> add chipper example (09:52:48)
+
+2013-04-16
+ * Howard Butler <hobu.inc at gmail.com> fix up const_cast warning (14:44:51)
+ * Howard Butler <hobu.inc at gmail.com> fix up cast (14:37:52)
+ * Howard Butler <hobu.inc at gmail.com> fixup (14:27:26)
+ * Howard Butler <hobu.inc at gmail.com> add FindHexer module (13:18:25)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (12:30:25)
+ * Howard Butler <hobu.inc at gmail.com> add hexbin filter scaffolding http://github.com/hobu/hexer (12:30:11)
+ * Howard Butler <hobu.inc at gmail.com> add hexbin filter scaffolding http://github.com/hobu/hexer (12:29:44)
+
+2013-04-11
+ * Howard Butler <hobu.inc at gmail.com> what braindead microsoft idiot decided that min() and max() were good ideas for macro names? (16:08:32)
+ * Howard Butler <hobu.inc at gmail.com> silence warning about unreferenced parameter (16:00:19)
+ * Howard Butler <hobu.inc at gmail.com> fix up embedded boost on windows (15:59:59)
+ * Howard Butler <hobu.inc at gmail.com> Revert "use GDAL's NITFGetField instead of our own" (15:59:19)
+ * Howard Butler <hobu.inc at gmail.com> silence warning see https://svn.boost.org/trac/boost/ticket/7663 (15:42:10)
+ * Howard Butler <hobu.inc at gmail.com> usge a giant number for capacity to silence warning about truncation, not that this means anything anyway (15:32:31)
+ * Howard Butler <hobu.inc at gmail.com> boost:: prefix types (15:31:41)
+ * Howard Butler <hobu.inc at gmail.com> throw an exception if the capacity given for a PointBuffer is going to end up being larger than boost::uint32_t::max() (15:26:43)
+ * Howard Butler <hobu.inc at gmail.com> silence warning initializing rng (15:26:11)
+ * Howard Butler <hobu.inc at gmail.com> make OracleDriver PDAL_DLL exported because it is subclassed (15:25:50)
+ * Howard Butler <hobu.inc at gmail.com> silence bool conversion warning (15:18:16)
+ * Howard Butler <hobu.inc at gmail.com> silence uint64_t->size_t warnings with casts to appropriate types (15:14:01)
+ * Howard Butler <hobu.inc at gmail.com> cast the VSI stream offset to a std::streamoff (15:06:04)
+ * Howard Butler <hobu.inc at gmail.com> shut up int/unsigned warning complaint (15:04:55)
+ * Howard Butler <hobu.inc at gmail.com> turn off extra instant client libs for win32 (I build using OSGeo4W's copy (15:00:37)
+ * Howard Butler <hobu.inc at gmail.com> add my example OSGeo4W-themed windows config (14:58:22)
+ * Howard Butler <hobu.inc at gmail.com> Find the Python interpreter before the libs, bump the numpy version down to 1.5 to catch OSGeo4W's numpy (14:57:20)
+
+2013-04-09
+ * Howard Butler <hobu.inc at gmail.com> make sure to write Metadata correctly if set (11:46:57)
+
+2013-04-05
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of git://github.com/abellgithub/PDAL (08:43:36)
+
+2013-04-04
+ * Andrew Bell <andrew.bell.ia at gmail.com> Separate driver from library as such. (21:19:23)
+
+2013-04-01
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of git://github.com/abellgithub/PDAL (10:32:15)
+
+2013-03-29
+ * Howard Butler <hobu.inc at gmail.com> fix up scaling for DD example (13:26:56)
+
+2013-03-27
+ * Howard Butler <hobu.inc at gmail.com> output 14 decimals for printing scale factors to stdout (13:03:15)
+ * Howard Butler <hobu.inc at gmail.com> use a very large value (14) for the number of decimals to output for scale factors when written into XML (13:00:25)
+ * Howard Butler <hobu.inc at gmail.com> more debug noise (12:58:11)
+
+2013-03-25
+ * Howard Butler <hobu.inc at gmail.com> a correct SRS WKT of the Autzen data (12:02:49)
+ * Howard Butler <hobu.inc at gmail.com> fix autzen-dd file (12:02:26)
+
+2013-03-22
+ * Howard Butler <hobu.inc at gmail.com> add cache stats metadata to sequential filter (11:29:46)
+
+2013-03-21
+ * Howard Butler <hobu.inc at gmail.com> fix up test (13:28:59)
+ * Howard Butler <hobu.inc at gmail.com> provide correct stat (13:01:22)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'std-vector-PointBuffer' into vectorize-lasreader (12:54:43)
+ * Howard Butler <hobu.inc at gmail.com> build my debug config by default (11:00:24)
+ * Howard Butler <hobu.inc at gmail.com> Pass down a reference to the user's buffer when we Chip() the data so that when pulled through a cache, things actually get cached in a way that we want to use further down the road. (10:59:25)
+ * Howard Butler <hobu.inc at gmail.com> fix up quoting (10:58:01)
+ * Howard Butler <hobu.inc at gmail.com> Use copyPointsFast for situations where the schema size of the cache's blocks are the same size as the users's buffer. (10:56:24)
+ * Howard Butler <hobu.inc at gmail.com> don't request more cached blocks than necessary. random iterator can never reset the cache, only sequential (08:33:21)
+
+2013-03-20
+ * Howard Butler <hobu.inc at gmail.com> seek() needs to ask if cached, but not allocate and return a vector of blocks (15:49:41)
+ * Howard Butler <hobu.inc at gmail.com> keep track of currently used schema (15:49:12)
+ * Howard Butler <hobu.inc at gmail.com> keep a map of dimension maps for per-cached block lookups (14:14:16)
+ * Howard Butler <hobu.inc at gmail.com> reset dimension map every read() (14:13:44)
+ * Howard Butler <hobu.inc at gmail.com> fix up chpper to not create one_point every time through (11:04:59)
+ * Howard Butler <hobu.inc at gmail.com> nuke the map every block read -- will make a map of these for inserts (09:10:11)
+ * Howard Butler <hobu.inc at gmail.com> fix up table name (09:09:48)
+ * Howard Butler <hobu.inc at gmail.com> don't create the one_point PointBuffer for every point, initialize RandomIterator with it (09:09:30)
+
+2013-03-19
+ * Howard Butler <hobu.inc at gmail.com> stop here, cache filter tests pass at least (16:54:51)
+ * Howard Butler <hobu.inc at gmail.com> account for situations where you're requesting the very first point (14:26:59)
+ * Howard Butler <hobu.inc at gmail.com> random iterator mostly working (13:48:18)
+ * Howard Butler <hobu.inc at gmail.com> make IteratorBase class to contain common methods for filters.cache iterators (12:30:14)
+ * Howard Butler <hobu.inc at gmail.com> sequential filters.cache working for block-based reads (11:15:54)
+ * Howard Butler <hobu.inc at gmail.com> force a resize of the PointBuffer's capacity to the chipper's threshold when constructing the sequential filter (09:44:46)
+ * Howard Butler <hobu.inc at gmail.com> move cache testing into CacheFilterTeset (09:44:02)
+ * Howard Butler <hobu.inc at gmail.com> add method to return number of objects in cache (09:43:20)
+
+2013-03-17
+ * Howard Butler <hobu.inc at gmail.com> method to return chipper threshold (19:37:23)
+ * Howard Butler <hobu.inc at gmail.com> provide a defaulted optional 'exact' switch to resize to force a resize of the PointBuffer even if current capcity is larger than the requested capacity (18:40:19)
+ * Howard Butler <hobu.inc at gmail.com> use BOOST_CHECK_CLOSE instead of our own Compare function (13:31:17)
+ * Howard Butler <hobu.inc at gmail.com> use BOOST_CHECK_EQUAL (13:30:59)
+ * Howard Butler <hobu.inc at gmail.com> use BOOST_CHECK_EQUAL for checking in tests (13:24:57)
+
+2013-03-15
+ * Howard Butler <hobu.inc at gmail.com> move dimension comparision up a level (17:01:44)
+ * Howard Butler <hobu.inc at gmail.com> cache dimension positions before copying data form one PointBuffer to another (16:50:04)
+ * Howard Butler <hobu.inc at gmail.com> copy into the correct location (16:03:43)
+ * Howard Butler <hobu.inc at gmail.com> cleanup source/dest confusion (15:14:44)
+ * Howard Butler <hobu.inc at gmail.com> test cache with random iterator (14:52:34)
+ * Howard Butler <hobu.inc at gmail.com> If we have a cache it, copy its data into our buffer (14:52:21)
+ * Howard Butler <hobu.inc at gmail.com> test likewise copy (14:49:03)
+ * Howard Butler <hobu.inc at gmail.com> provide a method to copy like- dimensions from one PointBuffer to another (static) (14:48:07)
+ * Howard Butler <hobu.inc at gmail.com> make sure to purge (14:45:45)
+ * Howard Butler <hobu.inc at gmail.com> don't reset the cache upon iterator creation (09:32:35)
+ * Howard Butler <hobu.inc at gmail.com> reuse the buffer that reads point data out of the LAS file (09:32:17)
+
+2013-03-14
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add support to fetch paths and hexes with density. Add support for hex centers. (21:56:21)
+ * Howard Butler <hobu.inc at gmail.com> don't allocate a vector every time through the loop (17:21:27)
+ * Howard Butler <hobu.inc at gmail.com> use stack-allocated std::vector<boost::uint8_t> instead of a heap allocated naked array to read data into (17:19:34)
+
+2013-03-13
+ * Howard Butler <hobu.inc at gmail.com> use std::vector as storage for PointBuffer instead of boost::scoped_array (16:43:31)
+ * Howard Butler <hobu.inc at gmail.com> fix up DD selection polygon for autzen. was misprojected (12:01:48)
+ * Howard Butler <hobu.inc at gmail.com> clean up dead code, remove unneeded test (12:00:36)
+ * Howard Butler <hobu.inc at gmail.com> cleanup dead code (12:00:18)
+ * Howard Butler <hobu.inc at gmail.com> clean up big buffer when we're done (11:10:42)
+ * Howard Butler <hobu.inc at gmail.com> trap test when we can't make a giant allocation (11:08:14)
+ * Howard Butler <hobu.inc at gmail.com> keep track of the PointBuffer's array separately from its capacity/count (10:40:28)
+ * Howard Butler <hobu.inc at gmail.com> make sure PointBuffer's data array doesn't overflow by using uint64_t instead of size_t to define its size (09:01:16)
+ * Howard Butler <hobu.inc at gmail.com> make sure PointBuffer's data array doesn't overflow by using uint64_t instead of size_t to define its size (09:00:57)
+
+2013-03-12
+ * Howard Butler <hobu.inc at gmail.com> PointSourceId setting was working incorrectly (16:48:47)
+ * Howard Butler <hobu.inc at gmail.com> some attempts at cleaning up filters.crop (14:44:24)
+ * Howard Butler <hobu.inc at gmail.com> clean up print statement (14:41:25)
+ * Howard Butler <hobu.inc at gmail.com> assert schema byte sizes are the same when copying a single point (11:42:38)
+ * Howard Butler <hobu.inc at gmail.com> use copy constructor (11:42:20)
+ * Howard Butler <hobu.inc at gmail.com> :reset() was using old schema bytesize instead of new one -- don't reset if they're the same anyway (10:28:18)
+
+2013-03-11
+ * Howard Butler <hobu.inc at gmail.com> turn off gcc pragmas for now (14:14:55)
+ * Howard Butler <hobu.inc at gmail.com> use scoped_array::reset to make sure previous buffer actually gets free'd (13:33:45)
+ * Howard Butler <hobu.inc at gmail.com> increase log noise (13:33:20)
+
+2013-02-27
+ * Howard Butler <hobu.inc at gmail.com> Revert "undo #115 again. Automatic regen with make is still busted for me when this lives in the top of the source tree" (09:55:25)
+ * Howard Butler <hobu.inc at gmail.com> more complete view query example for oracle (09:23:21)
+ * Howard Butler <hobu.inc at gmail.com> turn up the precision when doing debug log (09:22:46)
+ * Howard Butler <hobu.inc at gmail.com> undo #115 again. Automatic regen with make is still busted for me when this lives in the top of the source tree (09:21:54)
+ * Howard Butler <hobu.inc at gmail.com> fix up Define(long long*) (09:17:27)
+
+2013-02-26
+ * Howard Butler <hobu.inc at gmail.com> oracle is available in my default config now (13:09:04)
+ * Howard Butler <hobu.inc at gmail.com> PURGE to ensure that dumped tables don't end up in the recycling bin (13:08:48)
+ * Howard Butler <hobu.inc at gmail.com> dial up the ostream precision for high-noise debug (13:08:22)
+ * Howard Butler <hobu.inc at gmail.com> default the chipper threshold to the getNumPoints() available to the stage if none is specified as an option (13:07:12)
+ * Howard Butler <hobu.inc at gmail.com> default the capacity to the getNumPoints() available to the stage if none is specified (13:06:40)
+ * Howard Butler <hobu.inc at gmail.com> add oracle to test compilation (13:06:01)
+
+2013-02-25
+ * Howard Butler <hobu.inc at gmail.com> fix up cleanup script for oci driver (16:06:30)
+ * Howard Butler <hobu.inc at gmail.com> remove redundant declaration (14:23:19)
+ * Howard Butler <hobu.inc at gmail.com> libociei on OSX is no longer needed for the 11+ instant client (14:07:47)
+
+2013-02-22
+ * Howard Butler <hobu.inc at gmail.com> use the given statement, not m_initialQueryStatement for fetching the pc_id, etc in fetchSchema (16:28:58)
+ * Howard Butler <hobu.inc at gmail.com> update FindOracle.cmake to mloskot's latest (16:01:29)
+ * Howard Butler <hobu.inc at gmail.com> fix up debug info for filters.crop (15:53:58)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'branch-0.9.6' (15:43:46)
+ * Howard Butler <hobu.inc at gmail.com> make sure to use correct point count for setting pointsourceid (15:43:31)
+ * Howard Butler <hobu.inc at gmail.com> attempt to get the correct dimension for drivers.oci.reader (15:26:20)
+ * Howard Butler <hobu.inc at gmail.com> oracle compilation on osx (15:28:53)
+ * Howard Butler <hobu.inc at gmail.com> attempt to get the correct dimension for drivers.oci.reader (15:26:20)
+ * Howard Butler <hobu.inc at gmail.com> get point count correct for writing PointSourceId from oracle id (09:25:04)
+
+2013-02-20
+ * Howard Butler <hobu.inc at gmail.com> if no options are given to filters.cache, use the stage's entire point count as the cache (11:28:16)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (11:22:51)
+ * Howard Butler <hobu.inc at gmail.com> whitespace normalization (11:22:38)
+ * Howard Butler <hobu.inc at gmail.com> silence comparison warning (11:22:05)
+ * Howard Butler <hobu.inc at gmail.com> make pshape switchable for now (11:06:42)
+
+2013-02-19
+ * Andrew Bell <andrew.bell.ia at gmail.com> Merge branch 'master' of git://github.com/PDAL/PDAL (21:36:48)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Remove debug. (21:36:30)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Fix code to calculate path parents. Add code to build tree of rings. Remove code to try to determine path orientation at creation time (can't be done). (21:25:57)
+
+2013-02-12
+ * Howard Butler <hobu.inc at gmail.com> basic filters.hexbin implementation based on existing codebase (17:31:43)
+ * Howard Butler <hobu.inc at gmail.com> scaffolding for HexBin filter (16:45:52)
+ * Howard Butler <hobu.inc at gmail.com> hobu's cleanups to support rendering SVG via cairo (16:17:17)
+
+2013-02-11
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (10:42:32)
+ * Howard Butler <hobu.inc at gmail.com> note about where FindCairo.cmake came from (10:42:23)
+ * Howard Butler <hobu.inc at gmail.com> silence an annoying boost warning (10:42:14)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (09:58:11)
+ * Howard Butler <hobu.inc at gmail.com> add a FindCairo cmake macro (09:57:05)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of git://github.com/abellgithub/PDAL (09:51:26)
+
+2013-02-07
+ * Andrew Bell <andrew.bell.ia at gmail.com> We now find all shapes and holes. (22:00:03)
+ * Howard Butler <hobu.inc at gmail.com> Merge #117, upgrade embedded boost to 1.53 with unordered_map and some others (20:21:20)
+ * Howard Butler <hobu.inc at gmail.com> add new soci writing example (16:50:22)
+ * Howard Butler <hobu.inc at gmail.com> whitespace normalization (16:46:45)
+
+2013-02-06
+ * Andrew Bell <andrew.bell.ia at gmail.com> Make path following work again. (22:20:02)
+ * Howard Butler <hobu.inc at gmail.com> Merge remote-tracking branch 'main/issues/117-upgrade-boost-153' (16:55:09)
+
+2013-02-05
+ * Howard Butler <hobu.inc at gmail.com> add new 1.53 boost libs (16:41:31)
+ * Howard Butler <hobu.inc at gmail.com> updates to import script (16:40:37)
+ * Howard Butler <hobu.inc at gmail.com> first attempt to upgrade to boost 1.53 (15:39:56)
+ * Howard Butler <hobu.inc at gmail.com> fix up ifdef (14:30:08)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:20:33)
+
+2013-02-04
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add code to mark surrounded hexes. (20:30:45)
+
+2013-02-03
+ * Andrew Bell <andrew.bell.ia at gmail.com> Working hexbinning and traversal. (12:44:52)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add small build change. (12:28:54)
+ * Andrew Bell <andrew.bell.ia at gmail.com> Working hexbinning and outer path. (11:30:21)
+
+2013-02-01
+ * Howard Butler <hobu.inc at gmail.com> getNumPoints caches the previous stage's point count if it is expected to forward it instead of asking the entire pipeline every time for the point count (15:40:35)
+ * Howard Butler <hobu.inc at gmail.com> Don't resize the buffer for every chunk if its capacity is != the number of points to read per chunk (just make sure it is big enough. Allocate the size of the Writer's buffer to be the min(num_to_write, def_chunk_size) if num_to_write is not 0 (15:32:57)
+
+2013-01-31
+ * Howard Butler <hobu.inc at gmail.com> Attempt to resolve #116 by selecting dimensions with both the same name *and* namespace (21:07:35)
+
+2013-01-29
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #115 from PDAL/pdal_defines (09:32:44)
+
+2013-01-22
+ * Bradley J Chambers <brad.chambers at gmail.com> pdal_defines.h is added from PROJECT_BINARY_DIR and installed (#108) (11:50:07)
+
+2013-01-21
+ * Howard Butler <hobu.inc at gmail.com> more pdal_defines fixups (16:52:28)
+ * Howard Butler <hobu.inc at gmail.com> put back pdal_defines generation into ./include/pdal #108 (16:10:29)
+ * Howard Butler <hobu.inc at gmail.com> turn off 723ed9207c4447b043229e73c4f3fde1f0a6a1da (15:49:55)
+ * Howard Butler <hobu.inc at gmail.com> add p2g as a default config (15:27:01)
+ * Howard Butler <hobu.inc at gmail.com> Fix #108 by adding pdal_defines to the clean target (15:26:51)
+
+2013-01-20
+ * Andrew Bell <andrew.bell.ia at gmail.com> Add support for traversing single shape. (13:21:29)
+
+2013-01-18
+ * Howard Butler <hobu.inc at gmail.com> report an error message if the stream is unable to be opened or created when it is a filesystem stream (09:43:19)
+ * Howard Butler <hobu.inc at gmail.com> write_n and read_n should return error messages that reflect PDAL, not liblas (08:32:00)
+
+2013-01-15
+ * Howard Butler <hobu.inc at gmail.com> turn off gdal 1.10 check in colorization test (15:52:45)
+ * Howard Butler <hobu.inc at gmail.com> silence decimation random iterator test (13:35:48)
+
+2013-01-10
+ * Howard Butler <hobu.inc at gmail.com> turn of GDAL 1.10 check for now (10:13:12)
+ * Howard Butler <hobu.inc at gmail.com> playing around with nitf writer (09:45:41)
+ * Howard Butler <hobu.inc at gmail.com> ::reset actually does reset, even if schema sizes are the same (09:43:28)
+
+2013-01-07
+ * Howard Butler <hobu.inc at gmail.com> use GDAL's NITFGetField instead of our own (11:49:28)
+ * Howard Butler <hobu.inc at gmail.com> more drivers.nitf.writer tweaking (10:50:50)
+
+2012-12-28
+ * Andrew <abell at abell-OptiPlex-GX620.(none)> First working version of point placement in hexagons. (20:20:32)
+ * Andrew <abell at abell-OptiPlex-GX620.(none)> First working version of point placement in hexagons. (20:20:32)
+
+2013-01-06
+ * Andrew <abell at abell-OptiPlex-GX620.(none)> Modifications for build without GDAL. (11:46:26)
+
+2013-01-04
+ * Howard Butler <hobu.inc at gmail.com> test that GDAL == 1.10 and error if we don't for NITF driver (10:42:34)
+ * Howard Butler <hobu.inc at gmail.com> remove mpg-copied nitf stuff, we'll depend on gdal 1.10+ to provide it to us with our own header (10:33:40)
+ * Howard Butler <hobu.inc at gmail.com> decommission all local nitf-related stuff that mpg had copied over -- we'll depend on gdal 1.10+ to provide it with our own header (10:29:20)
+
+2013-01-03
+ * Howard Butler <hobu.inc at gmail.com> partially working random iterator for filters.decimation (12:56:01)
+ * Howard Butler <hobu.inc at gmail.com> start tweaking nitf stuff (12:55:43)
+ * Howard Butler <hobu.inc at gmail.com> find threads libraries because some platforms don't link them by default (10:53:47)
+ * Howard Butler <hobu.inc at gmail.com> fix up building in non-GDAL situations (10:53:25)
+ * Howard Butler <hobu.inc at gmail.com> don't explicitly link to Boost_LIBRARIES, because when we embed, we don't have that defined (10:10:10)
+
+2012-12-18
+ * Howard Butler <hobu.inc at gmail.com> random iterator implementation for filters.selector (15:53:20)
+ * Howard Butler <hobu.inc at gmail.com> random iterator implementation for filters.inplacereprojection (15:31:24)
+ * Howard Butler <hobu.inc at gmail.com> IteratorBase needs to life in ::scaling, not ::pdal :) (15:31:01)
+ * Howard Butler <hobu.inc at gmail.com> seeking off the end should throw an exception. (15:13:33)
+ * Howard Butler <hobu.inc at gmail.com> filters.scaling now supports random interator (10:52:30)
+ * Howard Butler <hobu.inc at gmail.com> use epsilon compares instead of direct == for floats (10:23:53)
+ * Howard Butler <hobu.inc at gmail.com> add random iterator implementation for filters.scaling (10:23:33)
+
+2012-12-17
+ * Howard Butler <hobu.inc at gmail.com> tweak configuration script (17:05:14)
+ * Howard Butler <hobu.inc at gmail.com> if the count for a cloud is > 32bit int, we'll overflow and get an error. if we use a int64_t here, in 32-bit land, the bind doesn't work properly (16:57:50)
+
+2012-12-10
+ * Howard Butler <hobu.inc at gmail.com> SQLT_NUM, not SQLT_INT (14:41:20)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of /Users/hobu/dev/git/pdal (09:10:17)
+ * Howard Butler <hobu.inc at gmail.com> fixups to support 32-bit compilation of PDAL (09:05:41)
+
+2012-12-06
+ * Howard Butler <hobu.inc at gmail.com> turn dimension overflow checking back on for filters.scaling and PointBuffer (17:17:45)
+
+2012-11-29
+ * Howard Butler <hobu.inc at gmail.com> don't allocate new buffers if resizing or resetting if we're not actually changing (16:06:09)
+ * Howard Butler <hobu.inc at gmail.com> account for changes in jpeg reading in GDAL 1.10 (16:05:28)
+ * Howard Butler <hobu.inc at gmail.com> cast byte-sized dims to ints before passing on to string output (15:37:34)
+ * Howard Butler <hobu.inc at gmail.com> shortcut to use integer output when we don't have scaling (15:27:00)
+ * Howard Butler <hobu.inc at gmail.com> make drivers.text.writer significantly faster for geojson (14:55:31)
+
+2012-11-26
+ * Howard Butler <hobu.inc at gmail.com> don't link to OSGeo4W (17:23:01)
+ * Howard Butler <hobu.inc at gmail.com> don't write extra commas at end of properties list for GeoJSON/csv to account for ignored dimensions (13:21:34)
+ * Howard Butler <hobu.inc at gmail.com> remove pcd driver from StageFactory (12:38:41)
+ * Howard Butler <hobu.inc at gmail.com> fix up terrasolid scaling/offset reading per https://github.com/libLAS/libLAS/pull/15 (10:33:08)
+
+2012-11-19
+ * Howard Butler <hobu.inc at gmail.com> merge the PCD writer in to drivers.text.writer, as it's just another output type, to eliminate a bunch of code duplication (11:33:22)
+
+2012-11-16
+ * Howard Butler <hobu.inc at gmail.com> comment out plugin, not used (15:03:35)
+
+2012-11-15
+ * Howard Butler <hobu.inc at gmail.com> make sure to include StageFactory (14:58:41)
+ * Howard Butler <hobu.inc at gmail.com> make sure to include StageFactory (14:57:06)
+ * Howard Butler <hobu.inc at gmail.com> reader, not writer for plugin (14:56:30)
+ * Howard Butler <hobu.inc at gmail.com> fix #113 (14:35:25)
+
+2012-11-13
+ * Howard Butler <hobu.inc at gmail.com> don't include for OCI driver when building plugin (17:10:23)
+ * Howard Butler <hobu.inc at gmail.com> don't use StageFactory for OCI driver when building plugin (17:08:02)
+ * Howard Butler <hobu.inc at gmail.com> fixups for Oracle plugin building (17:05:59)
+ * Howard Butler <hobu.inc at gmail.com> clean up macro warning (15:42:08)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'load-plugin-from-pipeline' (15:30:53)
+ * Howard Butler <hobu.inc at gmail.com> switches for plugins (15:30:38)
+ * Howard Butler <hobu.inc at gmail.com> provide example to demonstrate how to dynamically load plugin (15:30:15)
+ * Howard Butler <hobu.inc at gmail.com> add other plugin creation macros (15:09:31)
+ * Howard Butler <hobu.inc at gmail.com> macro'ize plugin function creation (14:44:50)
+ * Howard Butler <hobu.inc at gmail.com> there shouldn't be a global StageFactory (08:21:41)
+ * Howard Butler <hobu.inc at gmail.com> support loading stage plugin as it is read via PipelineReader (08:15:37)
+
+2012-11-12
+ * Howard Butler <hobu.inc at gmail.com> don't build tests for text driver if in plugin mode (19:07:11)
+ * Howard Butler <hobu.inc at gmail.com> don't link in text writer if we're building as a plugin (19:06:53)
+ * Howard Butler <hobu.inc at gmail.com> fix PCD plugin mode (19:06:30)
+ * Howard Butler <hobu.inc at gmail.com> get PCD and SOCI plugin modes working (19:06:17)
+ * Howard Butler <hobu.inc at gmail.com> pdal::StageFactory now lives in a per-ThreadEnvironment and can be gotten from the GlobalEnvironment. Use the global StageFactory for stage creation operations in apps (15:00:38)
+
+2012-11-09
+ * Howard Butler <hobu.inc at gmail.com> more plugin work (13:49:00)
+ * Howard Butler <hobu.inc at gmail.com> do a dummy read of the data when --validate is called (13:11:46)
+ * Howard Butler <hobu.inc at gmail.com> more plugin work (11:37:29)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into load-plugin-from-pipeline (09:59:17)
+ * Howard Butler <hobu.inc at gmail.com> Fix #112, support reporting build debug status via commandline apps (09:49:25)
+ * Howard Butler <hobu.inc at gmail.com> make the actual loading of the plugin #112 (09:30:35)
+
+2012-11-08
+ * Howard Butler <hobu.inc at gmail.com> getDefaultOptions is now a static method of pdal::StageBase. It defaults to returning a single pdal::Options instance describing the relevant options to the pdal::Stage. It is now possible to get a candidate list of Options from a stage without implementing the Stage itself (15:12:30)
+ * Howard Butler <hobu.inc at gmail.com> getDefaultDimensions() is now a static method of all pdal::Stage. It defaults to returning an empty vector unless implemented. It is now possible to get a candidate list of dimensions from a stage without implementing it (13:53:09)
+ * Howard Butler <hobu.inc at gmail.com> more doc'ing (11:27:57)
+ * Howard Butler <hobu.inc at gmail.com> more docs (10:57:33)
+ * Howard Butler <hobu.inc at gmail.com> remove ::dump() method (10:57:22)
+
+2012-11-07
+ * Howard Butler <hobu.inc at gmail.com> update (c) to 2012 (16:52:37)
+ * Howard Butler <hobu.inc at gmail.com> test the actual count value (16:52:31)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (10:36:48)
+ * Howard Butler <hobu.inc at gmail.com> add a 'exact_dimensions' option that allows you to specify a comma-separated list of dimensions that should be used to cumulate exact histogram information for (10:36:43)
+
+2012-11-06
+ * Howard Butler <hobu.inc at gmail.com> scope the iterator pointer so it cleans up in cases where we throw an exception because the user interrupted (12:00:35)
+ * Howard Butler <hobu.inc at gmail.com> INCREF the compiled script so we can properly DECREF it when we cleanup (11:24:11)
+ * Howard Butler <hobu.inc at gmail.com> remember to free dataset if created (10:13:11)
+ * Howard Butler <hobu.inc at gmail.com> fix crash bug in filters.index (09:58:35)
+
+2012-11-05
+ * Howard Butler <hobu.inc at gmail.com> always initialize the uuid for a dimension to something random -- can be reset using setUUID() later (20:51:07)
+ * Howard Butler <hobu.inc at gmail.com> throw pdal::duplicate_dimension_id if appendDimension is called with a non-unique dimension::id (20:05:57)
+ * Howard Butler <hobu.inc at gmail.com> check for duplicate uuids (19:51:59)
+ * Howard Butler <hobu.inc at gmail.com> make sure uuids are different for both dimensions in the testt (18:25:08)
+ * Howard Butler <hobu.inc at gmail.com> test for uuid collission with global RNG (16:29:39)
+ * Howard Butler <hobu.inc at gmail.com> *really* turn off index tests (16:09:53)
+ * Howard Butler <hobu.inc at gmail.com> use global RNG for dimension uuid creation (14:30:21)
+ * Howard Butler <hobu.inc at gmail.com> try to use more randomer seed for global RNG (14:29:10)
+ * Howard Butler <hobu.inc at gmail.com> switch off indexfilter tests for now (14:28:53)
+ * Howard Butler <hobu.inc at gmail.com> switch off indexfilter tests for now (14:27:14)
+ * Howard Butler <hobu.inc at gmail.com> add (14:25:51)
+ * Howard Butler <hobu.inc at gmail.com> clean up some leaks (14:20:18)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (13:04:49)
+ * Howard Butler <hobu.inc at gmail.com> add example of LAS file with no points in it (13:04:43)
+ * Howard Butler <hobu.inc at gmail.com> flip back to old RNG initialization (12:08:43)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (11:59:42)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (11:39:04)
+ * Howard Butler <hobu.inc at gmail.com> add new example for colorization with multiple rasters (09:26:22)
+ * Howard Butler <hobu.inc at gmail.com> some deck chair rearranging of the test suite data (09:25:53)
+
+2012-11-02
+ * Howard Butler <hobu.inc at gmail.com> keep a reference around to the bytecode so we can decref it later (17:45:38)
+ * Howard Butler <hobu.inc at gmail.com> whitespace norm (17:45:21)
+ * Howard Butler <hobu.inc at gmail.com> consolidate a getPythonTraceback function that imports traceback and does the work to fetch the error message (17:24:55)
+ * Howard Butler <hobu.inc at gmail.com> make getNumDimensions return a reference (17:23:52)
+ * Howard Butler <hobu.inc at gmail.com> turn off test that is supposed to fail as an example of what not to do (16:24:14)
+ * Howard Butler <hobu.inc at gmail.com> comment out unused date_time stuff (16:23:57)
+ * Howard Butler <hobu.inc at gmail.com> import fusion, date_time (16:20:34)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'import-boost-datetime-151' of github.com:PDAL/PDAL (16:09:10)
+ * Howard Butler <hobu.inc at gmail.com> make sure to initialize the RNG (16:08:55)
+ * Howard Butler <hobu.inc at gmail.com> more rng testing (16:07:55)
+ * Howard Butler <hobu.inc at gmail.com> check that the RNG being returned exists (16:07:33)
+ * Howard Butler <hobu.inc at gmail.com> use the global RNG (16:07:13)
+ * Howard Butler <hobu.inc at gmail.com> more boost libs, including a full date_time (16:06:29)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (15:47:21)
+ * Howard Butler <hobu.inc at gmail.com> normalize line endings (15:47:17)
+ * Howard Butler <hobu.inc at gmail.com> add uuid rng test (13:17:21)
+ * Howard Butler <hobu.inc at gmail.com> Fix #110 and add a test example of GeoJSON output (11:15:39)
+
+2012-11-01
+ * Howard Butler <hobu.inc at gmail.com> go back to old way which valgrind complains about uninitialized (15:28:06)
+ * Howard Butler <hobu.inc at gmail.com> support a 'dimensions' option, which is a comma/space-separated list of explicit dimensions to generate stats for #102 (10:34:12)
+ * Howard Butler <hobu.inc at gmail.com> remove unused include (10:17:59)
+ * Howard Butler <hobu.inc at gmail.com> add more completeness to the dimension test (10:17:38)
+ * Howard Butler <hobu.inc at gmail.com> attempt to use the global RNG again (10:10:22)
+ * Howard Butler <hobu.inc at gmail.com> move random uuid generation back into pdal::Dimension, don't do it ourselves (10:09:58)
+ * Howard Butler <hobu.inc at gmail.com> add parent/child fetching schema test (09:27:43)
+
+2012-10-31
+ * Howard Butler <hobu.inc at gmail.com> turn tests back on (14:10:43)
+ * Howard Butler <hobu.inc at gmail.com> cumulate stats for all filters, including those that are ignored. add namespace as a metadata item to the summary so you can discriminate between different X's #102 (14:04:13)
+
+2012-10-30
+ * Howard Butler <hobu.inc at gmail.com> make sure to shutdown libxml when we're done (06:44:49)
+ * Howard Butler <hobu.inc at gmail.com> make sure to initialize m_numPointsWritten (06:13:15)
+ * Howard Butler <hobu.inc at gmail.com> use new PointBuffer::reset() method (05:32:15)
+ * Howard Butler <hobu.inc at gmail.com> clean up formatting of test (05:31:35)
+ * Howard Butler <hobu.inc at gmail.com> make sure to clean up iterator when we're done with it (05:30:55)
+ * Howard Butler <hobu.inc at gmail.com> add reset(schema) method to allow you to reset the PointBuffer instance. Make sure to initialize data arrays before we use them (05:06:55)
+ * Howard Butler <hobu.inc at gmail.com> trap for the condition when the number of points in the block is larger than the capacity of the oracle buffer we are reading it into is -- ie, the SDO_PC's attributes are smaller than the number of points actually in the block (02:26:47)
+ * Howard Butler <hobu.inc at gmail.com> rename m_buffer to m_writer_buffer for clarity (02:26:00)
+ * Howard Butler <hobu.inc at gmail.com> Revert "Revert "make the PointBuffer that the pdal::Writer uses heap-allocated and owned by the pdal::Writer instance. Add a public method to fetch it so that others may get the properties of the writer's PointBuffer"" (01:29:44)
+ * Howard Butler <hobu.inc at gmail.com> Revert "make the PointBuffer that the pdal::Writer uses heap-allocated and owned by the pdal::Writer instance. Add a public method to fetch it so that others may get the properties of the writer's PointBuffer" (01:27:48)
+ * Howard Butler <hobu.inc at gmail.com> put the hardworking bits into the iterator instead of holding them on the stage (00:13:10)
+ * Howard Butler <hobu.inc at gmail.com> reverse the tear down order so the GDAL error handler gets popped before the gdal env is tore down (10:30:51)
+ * Howard Butler <hobu.inc at gmail.com> use full constructor for random_uuid generator, as the shortcut seems to use something uninitalized (10:29:21)
+
+2012-10-29
+ * Howard Butler <hobu.inc at gmail.com> clean up some memory leaks (14:07:44)
+
+2012-10-25
+ * Howard Butler <hobu.inc at gmail.com> guard against returning null iterators (14:29:51)
+ * Howard Butler <hobu.inc at gmail.com> test random iterator for stats filter (09:18:30)
+
+2012-10-24
+ * Howard Butler <hobu.inc at gmail.com> add random iterator implementation for filters.stats -- need a default impl for a lot more drivers #101 (14:34:24)
+ * Howard Butler <hobu.inc at gmail.com> typo (14:10:17)
+ * Howard Butler <hobu.inc at gmail.com> only put GDAL debug in a single log per-stream (14:07:39)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (13:28:55)
+ * Howard Butler <hobu.inc at gmail.com> a rather dumb implementation of gdal::GlobalDebug, which supports adding pdal::Log instances to the global GDAL logger (13:28:47)
+ * Bradley J Chambers <brad.chambers at gmail.com> fix #108 (11:03:38)
+
+2012-10-23
+ * Bradley J Chambers <brad.chambers at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (22:15:19)
+ * Bradley J Chambers <brad.chambers at gmail.com> fix #103, #106, #107 (22:14:29)
+ * Bradley J Chambers <brad.chambers at gmail.com> fix #106 (21:50:18)
+ * Howard Butler <hobu.inc at gmail.com> remember to delete debug object for gdal (20:05:57)
+ * Howard Butler <hobu.inc at gmail.com> one more GDAL debug cleanup attempt (18:14:28)
+ * Howard Butler <hobu.inc at gmail.com> another attempt and organizing GDAL debug (17:57:27)
+ * Howard Butler <hobu.inc at gmail.com> only output closing braces if we're outputting geojson (15:53:28)
+ * Howard Butler <hobu.inc at gmail.com> try to test for log's existence before hitting callback (15:18:39)
+ * Bradley J Chambers <brad.chambers at gmail.com> fix #104, fix #105 (13:43:46)
+ * Bradley J Chambers <brad.chambers at gmail.com> testing for LIBXML2_FOUND rather than WITH_LIBXML2 to project against the case of the library just not being found (13:40:58)
+ * Howard Butler <hobu.inc at gmail.com> try to trap conditions where Debug* is no longer available (12:59:56)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'import-boost-151' (11:38:05)
+ * Howard Butler <hobu.inc at gmail.com> linefeeds (11:38:01)
+ * Howard Butler <hobu.inc at gmail.com> be able to provide generator via argument (11:27:03)
+ * Howard Butler <hobu.inc at gmail.com> tweaks to boost import script (11:25:34)
+
+2012-10-22
+ * Howard Butler <hobu.inc at gmail.com> tweaks of import boost script (19:33:25)
+ * Howard Butler <hobu.inc at gmail.com> import boost 1.51 (19:32:41)
+ * Howard Butler <hobu.inc at gmail.com> tweaks for 1.51 (18:50:42)
+ * Howard Butler <hobu.inc at gmail.com> support writing GeoJSON as a 'format' of the text writer (14:02:04)
+ * Howard Butler <hobu.inc at gmail.com> use the Writer's chunk_size option in preference to using the count if it was set by the user (14:01:35)
+ * Howard Butler <hobu.inc at gmail.com> no need for GDAL include guards, this file should not be included without GDAL being available (08:54:48)
+ * Howard Butler <hobu.inc at gmail.com> don't include GDAL stuff in soci driver (08:53:43)
+
+2012-10-20
+ * Howard Butler <hobu.inc at gmail.com> default to using a chunk size of the getNumPoints() if available for all apps/ unless otherwise specified. (15:40:58)
+ * Howard Butler <hobu.inc at gmail.com> flip around eca9e2ade9fe010ea12177a04df8175f23703987 so that --single-buffer is the default, and the user can provide a specified --buffer-capacity if they wish (11:14:11)
+
+2012-10-19
+ * Howard Butler <hobu.inc at gmail.com> add --single-buffer switch, which attempts to process the pipeline using the count in a single buffer instead of piecewise. (12:54:55)
+ * Howard Butler <hobu.inc at gmail.com> delete the debug instance before the GDALClose. This still isn't kosher, but the GDALClose won't issue a debug message to nowhere land if the debug is gone because it pops the current error handler. The whole GDAL debug thing needs to be cleaned up and put into global scope and filters need to fetch it from there (12:39:48)
+
+2012-10-18
+ * Howard Butler <hobu.inc at gmail.com> provide getGDALEnvironment to wake up GDAL on-demand for things that need it while still preventing it from being tore down while others might still depend on it (10:22:45)
+ * Howard Butler <hobu.inc at gmail.com> update GDAL debug to work in cases where GDAL_MAJOR_VERSION >= 2 (10:21:58)
+
+2012-10-17
+ * Howard Butler <hobu.inc at gmail.com> GDAL wakeup/shutdown should be in GlobalEnvironment, not individual filters, because we can't know the startup/shutdown order (19:48:09)
+ * Howard Butler <hobu.inc at gmail.com> cruft cleanup (14:16:54)
+ * Howard Butler <hobu.inc at gmail.com> write JSON Metadata instead of custom format for stas (11:54:57)
+ * Howard Butler <hobu.inc at gmail.com> support writing PointBuffer Metadata for pipeline-serialization (11:54:42)
+ * Howard Butler <hobu.inc at gmail.com> update with new output (11:54:10)
+ * Howard Butler <hobu.inc at gmail.com> toMetadata() method, to support making pdal::Metadata instances out of stats (11:53:50)
+ * Howard Butler <hobu.inc at gmail.com> support writing information from a PointBuffer (like pdal::Metadata) into the PipelineXML (11:53:05)
+ * Howard Butler <hobu.inc at gmail.com> make the PointBuffer that the pdal::Writer uses heap-allocated and owned by the pdal::Writer instance. Add a public method to fetch it so that others may get the properties of the writer's PointBuffer (11:52:23)
+ * Howard Butler <hobu.inc at gmail.com> add setMetadata method, which overwrites an existing one with the same properties using deleteMetadata and addMetadata (11:45:19)
+
+2012-10-15
+ * Howard Butler <hobu.inc at gmail.com> histogram stuff is way slooooooooooooowwwwwww, and we'll turn it off for now (11:08:32)
+ * Howard Butler <hobu.inc at gmail.com> more soci reader (10:32:44)
+
+2012-10-05
+ * Howard Butler <hobu.inc at gmail.com> more soci reader (14:55:31)
+ * Howard Butler <hobu.inc at gmail.com> hex i/o utilities (14:55:03)
+
+2012-10-03
+ * Howard Butler <hobu.inc at gmail.com> srs fetching for soci driver (17:00:07)
+ * Howard Butler <hobu.inc at gmail.com> more soci (13:26:44)
+
+2012-10-01
+ * Howard Butler <hobu.inc at gmail.com> attempt to get a full traceback when numpy fails to import (22:34:22)
+ * Howard Butler <hobu.inc at gmail.com> more soci cleanups (15:44:34)
+ * Howard Butler <hobu.inc at gmail.com> make required numpy version be at least 1.6+ (12:37:19)
+ * Howard Butler <hobu.inc at gmail.com> attempt to fix current compilation issue in #72 (10:08:47)
+
+2012-09-28
+ * Howard Butler <hobu.inc at gmail.com> drivers.soci.reader scaffolding (16:13:36)
+ * Howard Butler <hobu.inc at gmail.com> fix ups for #72 because PDAL won't compile if GDAL not enabled (14:47:01)
+ * Howard Butler <hobu.inc at gmail.com> more soci (14:39:58)
+ * Howard Butler <hobu.inc at gmail.com> don't put ignored dimensions on the dimension list when order is not specified (14:22:04)
+
+2012-09-27
+ * Howard Butler <hobu.inc at gmail.com> more soci (17:30:43)
+ * Howard Butler <hobu.inc at gmail.com> have calculateBounds switch based on whether or not the user wants a 3d bbox (17:30:36)
+ * Howard Butler <hobu.inc at gmail.com> make toWKT actually return a proper POLYGON (17:29:50)
+ * Howard Butler <hobu.inc at gmail.com> more soci writer (09:34:35)
+ * Howard Butler <hobu.inc at gmail.com> more fix for #100 (09:34:26)
+
+2012-09-25
+ * Howard Butler <hobu.inc at gmail.com> cloud table creation/index creation for pg (17:07:58)
+ * Howard Butler <hobu.inc at gmail.com> a better fix for #100 (15:50:46)
+ * Howard Butler <hobu.inc at gmail.com> fix #100 -- drivers.text.writer seeing multiple dimensions of the same name (14:51:24)
+ * Howard Butler <hobu.inc at gmail.com> add toWKT() method to export bounds as WKT when requested (12:02:14)
+ * Howard Butler <hobu.inc at gmail.com> more drivers.soci.writer (11:09:29)
+
+2012-09-24
+ * Howard Butler <hobu.inc at gmail.com> fix up primary key creation (15:54:21)
+ * Howard Butler <hobu.inc at gmail.com> clean up filters.decimation a bit more (12:14:25)
+
+2012-09-23
+ * Howard Butler <hobu.inc at gmail.com> fix #99, add offset option to allow the user to specify a shift to go along with the step (17:09:13)
+
+2012-09-20
+ * Howard Butler <hobu.inc at gmail.com> add a calculateBounds method to PointBuffer for convenience of looping through and fetching a bounds of the buffer (16:40:19)
+ * Howard Butler <hobu.inc at gmail.com> add basic block table creation to drivers.soci.writer (16:23:20)
+ * Bradley J Chambers <brad.chambers at gmail.com> PCINFO was failing with WITH_LIBXML2 = FALSE (default). (12:50:53)
+ * Bradley J Chambers <brad.chambers at gmail.com> add a note about how to run tests (12:50:11)
+ * Howard Butler <hobu.inc at gmail.com> update test output (11:36:33)
+ * Howard Butler <hobu.inc at gmail.com> link pg plugin if there (11:33:38)
+ * Howard Butler <hobu.inc at gmail.com> add readFileAsString method to FileUtils to bring back from drivers.oci.reader (11:33:22)
+ * Howard Butler <hobu.inc at gmail.com> try to return exception information when numpy fails to import (11:32:48)
+
+2012-09-19
+ * Howard Butler <hobu.inc at gmail.com> scaffolding for drivers.soci.reader/drivers.soci.writer (16:08:47)
+ * Howard Butler <hobu.inc at gmail.com> Fix #98 -- add the ability to drivers.text.writer to specify column order, and whether or not to write unspecified dimensions (11:10:09)
+
+2012-07-25
+ * Howard Butler <hobu.inc at gmail.com> fix up for 8b40fd79162efd6b9fe609e3c0ee8ec79641f95d so it actually compiles (21:19:56)
+ * Howard Butler <hobu.inc at gmail.com> start refactoring the reader a little bit, add naiveSkipImpl support (21:19:27)
+ * Howard Butler <hobu.inc at gmail.com> use BOOST_CHECK_EQUAL where we can to get a report on the difference in values (21:18:54)
+ * Howard Butler <hobu.inc at gmail.com> tweak tests to point at local instance for oracle read/write (13:04:10)
+ * Howard Butler <hobu.inc at gmail.com> basic getNumPoints working for drivers.oci.reader #91 -- something's not quite right yet though (13:03:55)
+ * Howard Butler <hobu.inc at gmail.com> add example of fetching a specific dimension (16:33:11)
+ * Howard Butler <hobu.inc at gmail.com> add x_dim, y_dim, and z_dim options to filters.crop to be able to specifiy *which* dimension should be read and used for each (16:32:49)
+ * Howard Butler <hobu.inc at gmail.com> getDimension now supports asking for dotted names in the name variable, ie, 'drivers.las.reader.X', and it will separate the name and namespace on the last . that's found if .'s exist in the name argument (16:32:07)
+
+2012-09-17
+ * Howard Butler <hobu.inc at gmail.com> undo d4edf3e39507085e3e41e9d4e3ff4d7b61544076 (11:40:22)
+ * Howard Butler <hobu.inc at gmail.com> add a stats pipeline example (11:23:41)
+ * Howard Butler <hobu.inc at gmail.com> drivers.pipeline.reader needs to serialize the stage it owns, not itself (11:23:28)
+ * Howard Butler <hobu.inc at gmail.com> add a primary key unique constraint to obj_id,blk_id instead of simply creating a composite index on them (11:23:04)
+ * Howard Butler <hobu.inc at gmail.com> consolidate metadata-setting code together (11:12:20)
+ * Howard Butler <hobu.inc at gmail.com> use copy constructor for metadata creation (11:11:48)
+
+2012-09-12
+ * Howard Butler <hobu.inc at gmail.com> stubs for drivers.oci.reader::getNumPoints -- no implementation yet though (15:37:07)
+ * Howard Butler <hobu.inc at gmail.com> fix file location (15:36:44)
+ * Howard Butler <hobu.inc at gmail.com> trap errors better, add example that has decimation and reprojection filters in the mix with colorization (14:17:54)
+ * Howard Butler <hobu.inc at gmail.com> provide a parent/child example xml doc for testing (13:29:18)
+ * Howard Butler <hobu.inc at gmail.com> support writing metadata in Schema::to_xml, add --sdo_pc option to pcinfo to output the pc_other_attrs XML with metadata. Still need to do read side of the fence yet (10:26:52)
+ * Howard Butler <hobu.inc at gmail.com> update PointCloudSchema to 1.1, add arbitrary metadata entry with xs:anyType (10:24:33)
+
+2012-09-11
+ * Howard Butler <hobu.inc at gmail.com> add overwrite_existing_dimesions option to filters.selector to specify whether or not to create a new dimension when one of the same name exists. add parent/child integrity when we do add a same-named dimension. (12:43:47)
+
+2012-09-10
+ * Howard Butler <hobu.inc at gmail.com> decruft filters.selector (13:37:12)
+ * Howard Butler <hobu.inc at gmail.com> get create option for filters.selector working properly, with test (13:20:19)
+ * Howard Butler <hobu.inc at gmail.com> initial 'create' dimension mode added to filters.selector which is likely to be renamed to filters.schema and be the clearinghouse filter for schema manipulation (12:02:35)
+ * Howard Butler <hobu.inc at gmail.com> move method for creating a dimension interpretation from the C-style definition to static pdal::Dimension method (12:01:37)
+
+2012-09-07
+ * Howard Butler <hobu.inc at gmail.com> tweak layout (11:08:31)
+ * Howard Butler <hobu.inc at gmail.com> fix #95 so it actually works (10:29:15)
+ * Howard Butler <hobu.inc at gmail.com> comment out drivers.oci.reader tweak for now (09:19:35)
+ * Howard Butler <hobu.inc at gmail.com> throw error if we can't open the GDAL datasource (09:18:30)
+
+2012-09-06
+ * Howard Butler <hobu.inc at gmail.com> attempt to control when GDAL is cleaned up better (16:39:52)
+ * Howard Butler <hobu.inc at gmail.com> attempt to shutdown GDAL debugging at the begininning of the stage's constructor (16:02:57)
+ * Howard Butler <hobu.inc at gmail.com> start on implementation for #95 (15:31:44)
+ * Howard Butler <hobu.inc at gmail.com> tweak progress output (15:28:03)
+ * Howard Butler <hobu.inc at gmail.com> add progress reporting to pcpipeline (14:11:27)
+ * Howard Butler <hobu.inc at gmail.com> add percentage updates to ShellScriptCallback (14:11:16)
+ * Howard Butler <hobu.inc at gmail.com> the default getNumPoints method should forward the count from the previous stage until there isn't a previous stage anymore. If a Stage:: has its own getNumPoints method, it would be explicitly called, of course (14:10:53)
+ * Howard Butler <hobu.inc at gmail.com> append percentage to the shell command as the last argument (12:59:39)
+ * Howard Butler <hobu.inc at gmail.com> rename variables (12:22:56)
+ * Howard Butler <hobu.inc at gmail.com> tweak braces (12:02:02)
+ * Howard Butler <hobu.inc at gmail.com> default to using the current day/year for those header entries instead of 0/0 (11:47:37)
+ * Howard Butler <hobu.inc at gmail.com> add ShellScriptCallback class to support calling a shell script during the major progress heartbeat. The output/outcome of the shell script is ignored, but it is invoked at every major percentage (11:36:46)
+ * Howard Butler <hobu.inc at gmail.com> include stdio.h (11:18:02)
+ * Howard Butler <hobu.inc at gmail.com> move shell utilities into pdal::Utils for more general use (10:07:38)
+ * Howard Butler <hobu.inc at gmail.com> initialize values (10:07:15)
+
+2012-09-05
+ * Howard Butler <hobu.inc at gmail.com> remove goog +1 thingy (13:07:09)
+ * Howard Butler <hobu.inc at gmail.com> add breathe.css (13:05:36)
+ * Howard Butler <hobu.inc at gmail.com> update disqus url (11:14:31)
+ * Howard Butler <hobu.inc at gmail.com> consolidate pipeline creation (10:43:56)
+ * Howard Butler <hobu.inc at gmail.com> whitespace normalization (10:37:23)
+ * Howard Butler <hobu.inc at gmail.com> tweak layout (10:36:56)
+ * Howard Butler <hobu.inc at gmail.com> start working on sphinx-bootstrap conversion for pointcloud.org (10:20:25)
+
+2012-08-24
+ * Howard Butler <hobu.inc at gmail.com> add LocationTech presentation (15:48:14)
+
+2012-08-22
+ * Bradley J Chambers <brad.chambers at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (09:58:06)
+ * Bradley J Chambers <brad.chambers at gmail.com> but the text files need to be lf (09:55:35)
+ * Bradley J Chambers <brad.chambers at gmail.com> add .gitattributes file (09:51:33)
+
+2012-08-21
+ * Bradley J Chambers <brad.chambers at gmail.com> moving inferReaderDriver and inferWriterDriver to public static member functions within StageFactory (14:08:48)
+ * Howard Butler <hobu.inc at gmail.com> update ignores and add a few example pipelines (16:02:51)
+ * Howard Butler <hobu.inc at gmail.com> update ignores and add a few example pipelines (16:02:51)
+
+2012-08-20
+ * Howard Butler <hobu.inc at gmail.com> don't make setting VLRs contingent on having metadata -- they can come from options too (16:14:52)
+ * Howard Butler <hobu.inc at gmail.com> hop out of setting metadata if we have no metadata entries to set (15:49:24)
+ * Howard Butler <hobu.inc at gmail.com> only set vlrs if metadata option exists (15:30:13)
+ * Howard Butler <hobu.inc at gmail.com> fix up test (15:09:01)
+ * Howard Butler <hobu.inc at gmail.com> always set any vlr metadata entries if they were set in the options (15:08:07)
+ * Howard Butler <hobu.inc at gmail.com> FORWARD option for metadata wasn't working properly -- it was 0'ing out the actual data (14:51:48)
+ * Howard Butler <hobu.inc at gmail.com> VLR options can just start with 'vlr' instead of only be equal to it for setting metadata (13:02:34)
+ * Howard Butler <hobu.inc at gmail.com> try to trigger a jenkins build (10:57:55)
+ * Howard Butler <hobu.inc at gmail.com> try to trigger a jenkins build (10:52:17)
+ * Howard Butler <hobu.inc at gmail.com> OCTTransform cannot take null Z's, default to using a dummpy value unless the do_offset_z option is set on the filter to take in and transform the real z value (08:57:08)
+
+2012-08-18
+ * Howard Butler <hobu.inc at gmail.com> let's remove CMakeCache.txt and make clean in a build step instead of as part of the script (09:57:03)
+
+2012-08-17
+ * Howard Butler <hobu.inc at gmail.com> classification & 31 <-- there's only 31 classification values (16:28:59)
+ * Howard Butler <hobu.inc at gmail.com> force a clean build (15:03:55)
+ * Howard Butler <hobu.inc at gmail.com> fix non-flann filters.index (15:03:00)
+ * Howard Butler <hobu.inc at gmail.com> cleanup pc2pc tests (14:48:12)
+ * Howard Butler <hobu.inc at gmail.com> add filters.predicate to reprojection example (14:19:22)
+ * Howard Butler <hobu.inc at gmail.com> filters.index cleanups (14:18:55)
+ * Howard Butler <hobu.inc at gmail.com> turn off boost::test system error capture (14:18:33)
+
+2012-08-16
+ * Howard Butler <hobu.inc at gmail.com> make sure to wipe the CMakeCache.txt (17:11:20)
+ * Howard Butler <hobu.inc at gmail.com> turn off ORACLE testing for now (17:07:41)
+ * Howard Butler <hobu.inc at gmail.com> tweak jenkins config to try and get it going again (17:03:41)
+ * Howard Butler <hobu.inc at gmail.com> trap when index is not initialized (11:17:35)
+ * Howard Butler <hobu.inc at gmail.com> support writing to specified output, make sure to actually build index (11:17:21)
+ * Howard Butler <hobu.inc at gmail.com> don't throw exception for point counts not being equal (10:02:14)
+
+2012-08-14
+ * Howard Butler <hobu.inc at gmail.com> go back to the slow way for uuid generation (14:26:09)
+ * Howard Butler <hobu.inc at gmail.com> more noise (14:19:09)
+ * Howard Butler <hobu.inc at gmail.com> more filters.inplacereprojection (14:08:31)
+ * Howard Butler <hobu.inc at gmail.com> try to manually copy dimension (11:54:56)
+ * Howard Butler <hobu.inc at gmail.com> try clearing uuid first (11:43:19)
+ * Howard Butler <hobu.inc at gmail.com> more lint (11:37:25)
+ * Howard Butler <hobu.inc at gmail.com> more debug log (11:22:49)
+ * Howard Butler <hobu.inc at gmail.com> wipe off parent/child relationships when packing dimensions (09:54:53)
+ * Howard Butler <hobu.inc at gmail.com> filters.scaling needs the ignore_old_dimensions default switch (09:11:40)
+
+2012-08-13
+ * Howard Butler <hobu.inc at gmail.com> default to dimension's scale if not set (16:02:20)
+ * Howard Butler <hobu.inc at gmail.com> use the dimension's numerical offset as the default instead of 0.0 (15:30:42)
+ * Howard Butler <hobu.inc at gmail.com> make filters.scaling work more like (and with) filters.inplacereprojection (15:10:32)
+ * Howard Butler <hobu.inc at gmail.com> filters.inplacereprojection shouldn't be setting guids for old dimensions, it should forward what was there (15:07:47)
+ * Howard Butler <hobu.inc at gmail.com> if we don't find a dimension with an explicit namespace, we should throw an exception (14:57:02)
+ * Howard Butler <hobu.inc at gmail.com> add uuid and parent uuid to Dimension ostream<< (14:56:42)
+
+2012-08-11
+ * Howard Butler <hobu.inc at gmail.com> more log noise, denote that we've written the log in the case where we don't care to write it (16:01:17)
+ * Howard Butler <hobu.inc at gmail.com> look for STDIN or STDOUT for special filenames, not *exactly* this names (16:00:50)
+ * Howard Butler <hobu.inc at gmail.com> STDOUT is a now a magical filename which should behave as expected (15:12:15)
+ * Howard Butler <hobu.inc at gmail.com> progress should be written to stderr, not stdout. STDOUT is a now a magical filename which should behave as expected (15:12:01)
+ * Howard Butler <hobu.inc at gmail.com> we have to manually build the index instead of automatically building it at readEndImpl, because readEndImpl is called every buffer read (12:08:27)
+
+2012-08-09
+ * Howard Butler <hobu.inc at gmail.com> get pcquery working for a single point query (17:19:52)
+ * Howard Butler <hobu.inc at gmail.com> fix up test (17:19:40)
+ * Howard Butler <hobu.inc at gmail.com> use SingleIndex, rename to {set|get}NumDimensions to clarify what it returns (17:19:32)
+ * Howard Butler <hobu.inc at gmail.com> default chunksize to 2**20 (17:18:43)
+ * Howard Butler <hobu.inc at gmail.com> default to taking in the offset x/y in the *source* coordinate system and automatically reprojecting it into the target coordinate system (12:23:17)
+ * Howard Butler <hobu.inc at gmail.com> support setting --scale and --offset for reprojection (12:22:23)
+
+2012-08-08
+ * Howard Butler <hobu.inc at gmail.com> don't have space inbetween header names (15:21:30)
+
+2012-08-06
+ * Howard Butler <hobu.inc at gmail.com> remove unused function (15:06:49)
+ * Howard Butler <hobu.inc at gmail.com> isGeographic should return a value (13:12:44)
+ * Howard Butler <hobu.inc at gmail.com> add noise examples (10:40:08)
+ * Howard Butler <hobu.inc at gmail.com> pcequal now working -- outputs a simple delta{X|Y|Z} file per-point. (08:52:03)
+
+2012-08-03
+ * Howard Butler <hobu.inc at gmail.com> add scaffolding for pcequal utility (10:50:39)
+ * Howard Butler <hobu.inc at gmail.com> remember to close our reference to the wkt stream (10:50:23)
+ * Howard Butler <hobu.inc at gmail.com> use FLANN_LIBRARIES for linkage (10:43:40)
+
+2012-08-01
+ * Howard Butler <hobu.inc at gmail.com> fix case-sensitive include (21:20:22)
+ * Howard Butler <hobu.inc at gmail.com> add --t_srs, --a_srs, --bounds, and --polygon options to pc2pc #40 (13:52:09)
+ * Howard Butler <hobu.inc at gmail.com> a few cleanups (13:51:02)
+ * Howard Butler <hobu.inc at gmail.com> add isGeographic call (13:49:09)
+ * Howard Butler <hobu.inc at gmail.com> Fix #85, crop.cpp lint (10:19:36)
+ * Howard Butler <hobu.inc at gmail.com> update expected test output (09:19:32)
+ * Howard Butler <hobu.inc at gmail.com> make --schema return valid xml (08:22:58)
+
+2012-07-30
+ * Michael P. Gerlek <mpg at flaxen.com> CSAR reader contributed by CARIS (not yet working) (18:14:00)
+ * Michael P. Gerlek <mpg at flaxen.com> fix mem leaks (14:28:57)
+ * Michael P. Gerlek <mpg at flaxen.com> test runner helper script thing (14:27:11)
+ * Michael P. Gerlek <mpg at flaxen.com> remove dead test files (14:26:09)
+ * Michael P. Gerlek <mpg at flaxen.com> updated tests for win32 runs (11:38:19)
+
+2012-07-29
+ * Howard Butler <hobu.inc at gmail.com> another attempt to fix #84 (22:23:54)
+ * Howard Butler <hobu.inc at gmail.com> missing semicolon (09:44:04)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (09:42:05)
+ * Howard Butler <hobu.inc at gmail.com> setNamespace for dimensions that do not have namespaces and UUIDs from the drivers.oracle.reader (09:39:48)
+ * Howard Butler <hobu.inc at gmail.com> Fix #84, setVLRsFromMetadata passing null pointer into VLR constructor (09:22:24)
+ * Howard Butler <hobu.inc at gmail.com> test requesting dotted names (09:20:55)
+ * Howard Butler <hobu.inc at gmail.com> example crop with reprojection (09:20:16)
+
+2012-07-28
+ * Michael P. Gerlek <mpg at flaxen.com> make filename match test name (17:50:01)
+ * Michael P. Gerlek <mpg at flaxen.com> make test suite name match filename (17:44:37)
+ * Michael P. Gerlek <mpg at flaxen.com> fix mem leaks (17:41:52)
+ * Michael P. Gerlek <mpg at flaxen.com> fix mem leaks (17:40:27)
+ * Michael P. Gerlek <mpg at flaxen.com> vs2010 lint (17:25:54)
+ * Michael P. Gerlek <mpg at flaxen.com> untabify; vs2010 lint (17:24:44)
+ * Michael P. Gerlek <mpg at flaxen.com> moved FLANN guards, for vs2010 lint (17:24:03)
+ * Michael P. Gerlek <mpg at flaxen.com> vs2010 lint (17:23:26)
+ * Michael P. Gerlek <mpg at flaxen.com> vs2010 lint (17:23:11)
+ * Michael P. Gerlek <mpg at flaxen.com> vs2010 lint; add PDAL_HAVE_FLANN guards (17:22:36)
+
+2012-07-27
+ * Howard Butler <hobu.inc at gmail.com> even better debug output (14:29:19)
+ * Howard Butler <hobu.inc at gmail.com> more debug noise (14:26:11)
+ * Howard Butler <hobu.inc at gmail.com> silence unused warning (13:38:11)
+ * Howard Butler <hobu.inc at gmail.com> fix #83 -- potential clipping of intensity in las writer (13:35:34)
+ * Howard Butler <hobu.inc at gmail.com> include guard for GEOS stuff (12:11:20)
+ * Howard Butler <hobu.inc at gmail.com> NITF contingent on GDAL being around (11:40:46)
+
+2012-07-23
+ * Howard Butler <hobu.inc at gmail.com> don't test entire buffers for now (13:30:13)
+ * Howard Butler <hobu.inc at gmail.com> wkt validation was dumb (11:04:05)
+ * Howard Butler <hobu.inc at gmail.com> increase debug level of whole-buffer not intersecting (10:58:00)
+ * Howard Butler <hobu.inc at gmail.com> validate the GEOS geometry, put WKT that was exported out of GEOS into the log as extra validation of what might be coming through (10:18:55)
+
+2012-07-21
+ * Howard Butler <hobu.inc at gmail.com> increase precision of log output (21:52:09)
+ * Howard Butler <hobu.inc at gmail.com> add some super noisy logging (17:32:38)
+
+2012-07-20
+ * Howard Butler <hobu.inc at gmail.com> whoops. also guard against copying when we have no points to copy (21:18:53)
+ * Howard Butler <hobu.inc at gmail.com> attempt to fix accounting of buffer reading in filters.crop (12:16:03)
+
+2012-07-19
+ * Howard Butler <hobu.inc at gmail.com> missing include (10:49:21)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (10:41:50)
+ * Howard Butler <hobu.inc at gmail.com> add pcquery scaffolding (10:41:39)
+ * Howard Butler <hobu.inc at gmail.com> make filters.crop respect 2d WKT if given (10:41:31)
+
+2012-07-18
+ * Howard Butler <hobu.inc at gmail.com> make the filter be able to optionally do 2d vs 3d indexes (19:59:06)
+
+2012-07-17
+ * Bradley J Chambers <brad.chambers at gmail.com> for those of us not compiling with python (14:40:37)
+ * Howard Butler <hobu.inc at gmail.com> basic implementation of filters.index now working, can query for k nearest, or k nearest with a distance (09:51:04)
+ * Howard Butler <hobu.inc at gmail.com> typo'd metadata entry (09:50:42)
+
+2012-06-06
+ * Bradley J Chambers <brad.chambers at gmail.com> FindPoints2Grid was not finding the library in /usr/local (14:36:16)
+ * Howard Butler <hobu.inc at gmail.com> update the header *before* initialize (09:37:51)
+
+2012-07-16
+ * Howard Butler <hobu.inc at gmail.com> increase default sample size quite a bit (14:09:55)
+ * Howard Butler <hobu.inc at gmail.com> make filters.stats ignore ignored dimensions (14:00:00)
+ * Howard Butler <hobu.inc at gmail.com> make chunk_size available to all applications (13:59:39)
+
+2012-07-13
+ * Howard Butler <hobu.inc at gmail.com> update test output to reflect newline addition to pcinfo output in 9a0c5c9294cff1a21d8acd55b20b953765817bdb (10:46:15)
+ * Howard Butler <hobu.inc at gmail.com> drivers.pipeline.reader will strip off the writer on a pipeline if it exists rather than complain about not being able to use the pipeline. This fixes #82 and adds the ability of pcinfo to info'ize any pipeline file without manual modification (10:44:31)
+ * Howard Butler <hobu.inc at gmail.com> add a newline to final output (10:40:47)
+ * Howard Butler <hobu.inc at gmail.com> default to taking options' metadata if no drivers.las.reader metadata are available (10:11:47)
+
+2012-07-12
+ * Howard Butler <hobu.inc at gmail.com> update pcinfo tests now that --output is no longer supported -- use > for just dumping to stdout as you need (11:26:02)
+ * Howard Butler <hobu.inc at gmail.com> don't catch system errors for invocation (10:55:35)
+ * Howard Butler <hobu.inc at gmail.com> note aboute catch_system_errors (10:54:26)
+
+2012-07-11
+ * Howard Butler <hobu.inc at gmail.com> fix #76 to add exact count information for ReturnNumber and NumberOfReturns (14:52:24)
+ * Howard Butler <hobu.inc at gmail.com> --stdin is now available to both pcpipeline and pcinfo, and if they are set, they are used as the filename (14:43:34)
+ * Howard Butler <hobu.inc at gmail.com> STDIN is a special filename for pipeline xml and we'll return as such (14:42:46)
+ * Howard Butler <hobu.inc at gmail.com> STDIN is a special filename, and we'll accept it as valid and existing if someone wants to check or open it (14:42:06)
+ * Howard Butler <hobu.inc at gmail.com> fix up test to reflect keeping srs in metadata (11:33:32)
+ * Howard Butler <hobu.inc at gmail.com> include guard again (11:33:20)
+ * Howard Butler <hobu.inc at gmail.com> have setSpatialReference also update the srs entry in the metadata, where this should probably be by default instead as a special data member (11:33:11)
+ * Howard Butler <hobu.inc at gmail.com> make getMetadata throw a proper error if it can't find an entry with the requested path. add a deleteMetadata method to remove a requested entry (11:32:15)
+ * Howard Butler <hobu.inc at gmail.com> make Stage a friend of StageBase so they can interact with StageBase private data members (11:31:30)
+ * Howard Butler <hobu.inc at gmail.com> put --stage in a <stage> element so the output is valid xml (08:52:51)
+
+2012-07-10
+ * Howard Butler <hobu.inc at gmail.com> #ifdef PDAL_HAVE_FLANN guards around flann stuff so we can build without it (09:41:55)
+ * Howard Butler <hobu.inc at gmail.com> turn FLANN on by default for builds that hobu makes (09:14:19)
+ * Howard Butler <hobu.inc at gmail.com> add WITH_FLANN guard so FLANN is no longer a required dependency (09:14:06)
+
+2012-07-03
+ * Howard Butler <hobu.inc at gmail.com> more filters.index development (11:55:47)
+
+2012-06-29
+ * Howard Butler <hobu.inc at gmail.com> add stubs for FLANN-based spatial index (14:31:03)
+ * Howard Butler <hobu.inc at gmail.com> add detection of FLANN (14:16:16)
+ * Howard Butler <hobu.inc at gmail.com> cleanup file after done writing (14:16:06)
+ * Howard Butler <hobu.inc at gmail.com> add a chipper example test which exercises random iterators #81 (10:20:12)
+ * Howard Butler <hobu.inc at gmail.com> drivers.nitf.reader needs to forward random iterator from the las driver #81 (10:15:43)
+ * Howard Butler <hobu.inc at gmail.com> chipper should report an error if unable to create a random iterator from a previous stage #81 (10:14:54)
+
+2012-06-25
+ * Howard Butler <hobu.inc at gmail.com> import cstdarg for va_list, etc (12:14:43)
+ * Howard Butler <hobu.inc at gmail.com> whoops, nuke the point count (11:45:40)
+ * Howard Butler <hobu.inc at gmail.com> algebra is cool -- support 'outside' parameter to get anything *but* what's inside the clip polygon (11:36:57)
+ * Howard Butler <hobu.inc at gmail.com> add crop example (11:11:19)
+ * Howard Butler <hobu.inc at gmail.com> filters.crop now can take in a 'polygon' option as WKT and use GEOS (if available) to do precise-bounds clipping based on the geometry (10:58:39)
+ * Howard Butler <hobu.inc at gmail.com> fix up GEOS detection to make it completely optional (10:57:52)
+ * Howard Butler <hobu.inc at gmail.com> fix up includes for getPythonEnvironment (10:57:30)
+
+2012-06-21
+ * Howard Butler <hobu.inc at gmail.com> more GEOS (13:49:06)
+ * Howard Butler <hobu.inc at gmail.com> collect the PointBuffer's bounds as we read it in drivers.las.reader (12:13:11)
+ * Howard Butler <hobu.inc at gmail.com> add GEOS-finding machinery (12:12:29)
+ * Howard Butler <hobu.inc at gmail.com> remove unnecessary include (12:11:47)
+
+2012-06-14
+ * Howard Butler <hobu.inc at gmail.com> clean up some const_cast'able warnings (12:53:41)
+ * Howard Butler <hobu.inc at gmail.com> tell which function was not found in error for compile (12:53:24)
+ * Howard Butler <hobu.inc at gmail.com> don't make getPythonEnvironment method contingent on WITH_PYTHON being there -- throw an error instead when we can't initialize (11:45:10)
+ * Howard Butler <hobu.inc at gmail.com> because PointBuffer only allows a boost::uint32_t-sized array anyway, we should take this is as our position instead of std::size_t. (10:27:24)
+
+2012-06-13
+ * Howard Butler <hobu.inc at gmail.com> rename 'reserved' metadata for LAS to global_encoding to close #75 (21:59:33)
+ * Howard Butler <hobu.inc at gmail.com> fix up logging after #73 cleanup (21:58:43)
+ * Howard Butler <hobu.inc at gmail.com> apply pdal::Log fix for #73 (20:38:57)
+ * Howard Butler <hobu.inc at gmail.com> apply variations on fixes for #73 (16:08:48)
+ * Howard Butler <hobu.inc at gmail.com> add colorize example (15:36:38)
+ * Howard Butler <hobu.inc at gmail.com> add colorization pipeline example (14:25:07)
+ * Howard Butler <hobu.inc at gmail.com> support compiling GlobalEnvironment without -DWITH_PYTHON on (13:57:02)
+ * Howard Butler <hobu.inc at gmail.com> return const& for getField requests instead of copies for performance win (11:56:23)
+ * Howard Butler <hobu.inc at gmail.com> look for name+ns for all dimensions, not just xyz (11:55:52)
+ * Howard Butler <hobu.inc at gmail.com> move convert from PointBuffer to Dimension: (11:55:08)
+ * Howard Butler <hobu.inc at gmail.com> move saturation_cast out of PointBuffer into Utils:: (11:54:50)
+ * Howard Butler <hobu.inc at gmail.com> move convertDimension out to Dimension::, make getField return a const& instead of a copy for performance win (11:54:33)
+
+2012-06-12
+ * Howard Butler <hobu.inc at gmail.com> clean up warning (16:34:46)
+ * Howard Butler <hobu.inc at gmail.com> whitespace normalization (15:38:56)
+ * Howard Butler <hobu.inc at gmail.com> get PointBuffer::getField out of the coversion business -- too slow to do checks inside the critical path here anyway. (14:34:49)
+ * Howard Butler <hobu.inc at gmail.com> add a startingPosition default argument to Writer::write to set the starting point (used in pc2pc and pcpipeline as the --skip argument (14:34:10)
+ * Howard Butler <hobu.inc at gmail.com> only test if the stream is .good(), don't entirely cast to bool to check stream state (14:33:31)
+ * Howard Butler <hobu.inc at gmail.com> add skip parameter to pc2pc and pcpipeline to allow you to position where to start reading (14:24:58)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (09:45:37)
+ * Howard Butler <hobu.inc at gmail.com> don't do strcmp, instead just check the ordinal value of the character returned by typeid (09:45:16)
+
+2012-06-11
+ * Howard Butler <hobu.inc at gmail.com> add Z dimension to filtered text output example (07:34:22)
+
+2012-06-08
+ * Howard Butler <hobu.inc at gmail.com> add --count option to pcpipeline and pc2pc to specify how many points to write out for the given invocation (13:45:07)
+ * Howard Butler <hobu.inc at gmail.com> add text writing with dimension selection example (13:18:47)
+ * Howard Butler <hobu.inc at gmail.com> if the delimiter is nothing, use spaces by default. add option to skip writing the header (13:18:06)
+ * Howard Butler <hobu.inc at gmail.com> fix up bug where text writer wasn't handling ignored fields properly (13:11:27)
+ * Howard Butler <hobu.inc at gmail.com> support both packed and unpacked rgb values for PCD (09:10:48)
+ * Howard Butler <hobu.inc at gmail.com> write out color as individual fields (08:50:11)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (08:21:54)
+ * Howard Butler <hobu.inc at gmail.com> add a bigger autzen example (08:21:34)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (08:15:47)
+ * Howard Butler <hobu.inc at gmail.com> attempt to write RGB (wrongly) to PCD writer (08:15:20)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (08:13:18)
+
+2012-06-07
+ * Howard Butler <hobu.inc at gmail.com> add a rudimentary PCL PCD ASCII writer (13:37:15)
+
+2012-06-05
+ * Howard Butler <hobu.inc at gmail.com> update output (11:16:57)
+ * Howard Butler <hobu.inc at gmail.com> note to support selective scaling/descaling some day in text writer (11:00:06)
+ * Howard Butler <hobu.inc at gmail.com> more tutorial doc (10:59:41)
+ * Howard Butler <hobu.inc at gmail.com> more tutorial doc work (10:08:25)
+ * Howard Butler <hobu.inc at gmail.com> if we're returning data with scaling applied, we shouldn't truncate the output to an integer (10:08:12)
+ * Howard Butler <hobu.inc at gmail.com> whitespace normalization (09:07:34)
+ * Howard Butler <hobu.inc at gmail.com> fix up ..seealso:: formatting (09:07:15)
+ * Howard Butler <hobu.inc at gmail.com> add positional arguments support for input/output (09:06:57)
+ * Howard Butler <hobu.inc at gmail.com> assume .txt is the drivers.text.writer output (09:06:43)
+
+2012-06-04
+ * Michael P. Gerlek <mpg at flaxen.com> switch to just assume a filename option (23:43:14)
+ * Howard Butler <hobu.inc at gmail.com> fix up record_id warnings (22:56:36)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (22:52:55)
+ * Howard Butler <hobu.inc at gmail.com> clean up a few truncation warnings (22:43:11)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (22:39:19)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (22:33:50)
+ * Michael P. Gerlek <mpg at flaxen.com> more blunt-force-nitf work (22:33:40)
+ * Howard Butler <hobu.inc at gmail.com> clean up character literal comparison that didn't have tight enough parentheses to even work anyway (22:32:15)
+ * Michael P. Gerlek <mpg at flaxen.com> start of blunt-force-trauma approach to NITF writing via GDAL (21:57:49)
+ * Howard Butler <hobu.inc at gmail.com> add xml output to the pcinfo example (15:13:13)
+ * Howard Butler <hobu.inc at gmail.com> more tutorial (15:05:57)
+ * Howard Butler <hobu.inc at gmail.com> put the XML output of -p into a 'point' object so the xml is valid (15:05:48)
+ * Howard Butler <hobu.inc at gmail.com> note about multiple options (14:21:27)
+ * Howard Butler <hobu.inc at gmail.com> fix up the las writer to respect the ignored flag and add a test to the las writer test that uses it (13:47:01)
+ * Howard Butler <hobu.inc at gmail.com> update test (12:27:06)
+ * Howard Butler <hobu.inc at gmail.com> split apart metadata for reader/writer scenarios (12:26:57)
+ * Howard Butler <hobu.inc at gmail.com> regularize option/metadata names (12:26:33)
+ * Howard Butler <hobu.inc at gmail.com> support setting VLR metadata entries from 'metadata' option also -- provide a complete example of how to actually do so (11:17:00)
+ * Howard Butler <hobu.inc at gmail.com> add copyright/license notice (08:51:48)
+ * Howard Butler <hobu.inc at gmail.com> doc updates (08:19:18)
+
+2012-06-01
+ * Howard Butler <hobu.inc at gmail.com> remove unused variable (16:35:02)
+ * Howard Butler <hobu.inc at gmail.com> update the scaling filter to cache the dimensions themselves instead of only ids so that we don't have to do a dimension lookup per-point (16:31:53)
+ * Howard Butler <hobu.inc at gmail.com> the buffer size for the raw bytes for a single point doesn't need to be 1m big (15:01:49)
+ * Howard Butler <hobu.inc at gmail.com> gah, don't use iequals for testing inside the critical path -- it was acquiring locks for the locale (14:59:05)
+ * Howard Butler <hobu.inc at gmail.com> cache some variables so we don't have to look them up every point (14:33:57)
+ * Howard Butler <hobu.inc at gmail.com> we cache the schema's bytesize -- use it (14:04:53)
+ * Howard Butler <hobu.inc at gmail.com> dont create the Python environment until we actually ask for it the first time (14:04:29)
+ * Howard Butler <hobu.inc at gmail.com> no need to look up data record length after the header is written -- use our header's value instead (13:40:57)
+ * Howard Butler <hobu.inc at gmail.com> use BOOST_CHECK_EQUAL for better feedback when things fail (13:17:03)
+ * Howard Butler <hobu.inc at gmail.com> resize the PointBuffer instead of creating a new one for the last little bit (13:15:26)
+ * Howard Butler <hobu.inc at gmail.com> give PointBuffer the ability to be resized (13:15:10)
+ * Howard Butler <hobu.inc at gmail.com> no need to create a new buffer for the last little bit (12:10:12)
+ * Howard Butler <hobu.inc at gmail.com> more documentation reorganization and fleshing out of Pipeline docs into their own, high-level file (10:28:20)
+
+2012-05-31
+ * Howard Butler <hobu.inc at gmail.com> start documenting Pipeline (16:01:05)
+ * Howard Butler <hobu.inc at gmail.com> update metadata tests to use interesting.las which has more vlrs and header values set (14:34:38)
+ * Howard Butler <hobu.inc at gmail.com> metadata docs (14:34:12)
+ * Howard Butler <hobu.inc at gmail.com> add metadata descriptions from the LAS specification (14:34:04)
+ * Howard Butler <hobu.inc at gmail.com> use Metadata instead of Entry for XML sub-elements (14:33:42)
+ * Howard Butler <hobu.inc at gmail.com> metadata sub-entries should be under the 'metadata' lable, not 'entries' (12:20:48)
+
+2012-05-30
+ * Howard Butler <hobu.inc at gmail.com> start on a little metadata documentation (16:04:05)
+ * Howard Butler <hobu.inc at gmail.com> more pdal::Metadata cleanup, including documentation and removal of the integer-based type that instances were carrying (15:46:29)
+ * Howard Butler <hobu.inc at gmail.com> use new metadata fetching methods for cleaner code (13:16:50)
+ * Howard Butler <hobu.inc at gmail.com> a method for fetching a default or specified metadata option value -- this maybe should be on Options:: too (13:16:30)
+ * Howard Butler <hobu.inc at gmail.com> don't return optional to temporary reference (can I have these two hours back please?) (13:15:41)
+
+2012-05-29
+ * Howard Butler <hobu.inc at gmail.com> use new pdal::Options::getMetadataOption for dataformatid (16:36:47)
+ * Howard Butler <hobu.inc at gmail.com> shortcut method for asking Options whether or not it has entries for setting/getting Metadata (16:36:21)
+ * Howard Butler <hobu.inc at gmail.com> eliminate a copy in the option-fetching code to look up whether or not to forward metadata (15:42:22)
+ * Howard Butler <hobu.inc at gmail.com> StageBase::collectMetadata will put all of the stage's pdal::Metadata entries into a single Metadata instance in prefixed by their StageBase::getName(). You can then address individual pdal::Metadata entries using this name (a simple property_tree lookup) as shown in the LAS writer (15:17:08)
+ * Howard Butler <hobu.inc at gmail.com> have predicate filter copy in-place rather than creating a new PointBuffer and swapping it out (15:03:46)
+ * Howard Butler <hobu.inc at gmail.com> we can add the ptree directly when adding a metadata to a metadata (13:01:33)
+
+2012-05-26
+ * Howard Butler <hobu.inc at gmail.com> support copying specified VLR entries from metadata (13:33:21)
+ * Howard Butler <hobu.inc at gmail.com> we could have already set VLRs on the Writer's header, so we should use them (13:32:39)
+
+2012-05-25
+ * Howard Butler <hobu.inc at gmail.com> much metadata forwarding now working, VLRs almost done (16:10:27)
+ * Howard Butler <hobu.inc at gmail.com> needs to return const& for toPTree() (16:10:04)
+ * Howard Butler <hobu.inc at gmail.com> add a LAS with interesting header attributes for metadata testing (14:08:50)
+ * Michael P. Gerlek <mpg at flaxen.com> minor error checks (13:27:30)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (12:27:19)
+ * Michael P. Gerlek <mpg at flaxen.com> incremental (12:27:10)
+ * Howard Butler <hobu.inc at gmail.com> remove lint (11:55:24)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (11:54:44)
+ * Howard Butler <hobu.inc at gmail.com> support writing Metadata from a 'forward' Metadata option (only works for software_id right now (11:54:41)
+ * Howard Butler <hobu.inc at gmail.com> whitespace normalization (11:54:11)
+ * Howard Butler <hobu.inc at gmail.com> add getValueOptional that reaches through the 'entries' tree to get entries with a given path (11:53:49)
+ * Michael P. Gerlek <mpg at flaxen.com> added first lock (11:48:39)
+ * Michael P. Gerlek <mpg at flaxen.com> Python env is global, not per-thread (11:31:49)
+ * Michael P. Gerlek <mpg at flaxen.com> somehow windows max() defn crept in again (10:22:20)
+ * Howard Butler <hobu.inc at gmail.com> discriminate between read and write modes when opening a LASzip instance so we don't accidentally apply a created LASzip VLR to an as-read file (09:31:02)
+ * Howard Butler <hobu.inc at gmail.com> whitespace normalization (09:30:37)
+ * Howard Butler <hobu.inc at gmail.com> we were not using the right test to determine whether or not a LASzip VLR was valid. It should be userid+recordid, not userid+description (08:17:18)
+
+2012-05-24
+ * Howard Butler <hobu.inc at gmail.com> put back some deck chairs from trying to investigate LASzip issue (16:16:54)
+ * Howard Butler <hobu.inc at gmail.com> better error message (16:15:27)
+ * Howard Butler <hobu.inc at gmail.com> clean up methods of drivers.las.reader that merely expose items in the LasHeader -- instead just expect the user to deal with the LasHeader themselves directly (14:45:40)
+ * Howard Butler <hobu.inc at gmail.com> fix up broken test (13:57:41)
+ * Howard Butler <hobu.inc at gmail.com> namespace the NITF metdata (13:31:32)
+ * Howard Butler <hobu.inc at gmail.com> replace .'s with _'s when doing add_child for addMetdata so as to not get hugely deep trees that require lots of walking (13:31:14)
+ * Howard Butler <hobu.inc at gmail.com> decruft (13:30:08)
+ * Howard Butler <hobu.inc at gmail.com> another big whack at pdal::Metadata -- now *backed* by a boost::property_rather than driving from one, and it now supports arbitrary depth entries (12:45:11)
+
+2012-05-21
+ * Howard Butler <hobu.inc at gmail.com> make pdal::ByteArray i/o through boost::property_tree and friends by providing istream and ostream methods (15:00:35)
+ * Howard Butler <hobu.inc at gmail.com> pdal::metadata::Entry is now a lightly-wrapped subclass of boost::property_tree (14:09:29)
+
+2012-05-18
+ * Howard Butler <hobu.inc at gmail.com> put stats inside a node to fix #77 (15:58:11)
+ * Howard Butler <hobu.inc at gmail.com> make pdal::metadata::Entry subclass from boost::property_tree (15:38:42)
+
+2012-05-16
+ * Howard Butler <hobu.inc at gmail.com> turn off pdal::Object for now (16:42:19)
+ * Howard Butler <hobu.inc at gmail.com> pdal::Object not used right now (16:30:10)
+ * Howard Butler <hobu.inc at gmail.com> more clean up of ByteArray (16:25:13)
+ * Howard Butler <hobu.inc at gmail.com> undo ByteArray subbing from Object for now (16:08:53)
+ * Howard Butler <hobu.inc at gmail.com> initialize metadata to blank (16:01:07)
+ * Howard Butler <hobu.inc at gmail.com> update metadata tests (15:56:11)
+ * Howard Butler <hobu.inc at gmail.com> use default variant assignment (15:56:00)
+ * Howard Butler <hobu.inc at gmail.com> make sure to set/addEntry (15:45:35)
+ * Howard Butler <hobu.inc at gmail.com> protect against shutdown() being called multiple times (15:30:40)
+ * Howard Butler <hobu.inc at gmail.com> explictly copy string of specified size (15:30:26)
+ * Howard Butler <hobu.inc at gmail.com> nullify member variables (15:30:05)
+ * Howard Butler <hobu.inc at gmail.com> make sure to add blank if we threw an exception (13:08:06)
+ * Howard Butler <hobu.inc at gmail.com> make sure to initialize our arrays (12:54:25)
+ * Howard Butler <hobu.inc at gmail.com> clean up comments (12:37:21)
+ * Howard Butler <hobu.inc at gmail.com> set las.header.uuid to nil_uuid by default instead of manually memset'ing the values to 0 (12:36:01)
+ * Howard Butler <hobu.inc at gmail.com> trap any exceptions that might happen when trying to add/set an entry so that they set blank values (12:30:18)
+ * Howard Butler <hobu.inc at gmail.com> the user might call shutdown multiple times (11:59:41)
+
+2012-05-15
+ * Michael P. Gerlek <mpg at flaxen.com> lint (17:57:07)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of https://github.com/PDAL/PDAL (17:39:46)
+ * Michael P. Gerlek <mpg at flaxen.com> adding thread test - checkpoint (17:39:28)
+ * Michael P. Gerlek <mpg at flaxen.com> fixed logging-by-stages (17:13:25)
+ * Bradley J Chambers <brad.chambers at gmail.com> python_env did not exist for those of us compiling without python (14:36:17)
+ * Bradley J Chambers <brad.chambers at gmail.com> Merge branch 'master', remote-tracking branch 'origin/master' (14:10:02)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (13:43:59)
+ * Howard Butler <hobu.inc at gmail.com> clean up metadata::Entry a bit (13:43:49)
+ * Michael P. Gerlek <mpg at flaxen.com> removed Singleton.hpp (13:37:30)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (13:22:44)
+ * Michael P. Gerlek <mpg at flaxen.com> fixed the singleton GlobalEnv issue (13:21:55)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (13:03:52)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of https://github.com/PDAL/PDAL (13:02:58)
+ * Michael P. Gerlek <mpg at flaxen.com> remopved Singlton<>, now fails to link (13:02:40)
+ * Howard Butler <hobu.inc at gmail.com> add type for pdal::Metadata (12:58:17)
+ * Howard Butler <hobu.inc at gmail.com> add recursive_wrapper<Metadata> to Variant type to be stored inside of Metadata instances (12:56:20)
+ * Howard Butler <hobu.inc at gmail.com> increment version to closer reflect our current tag (12:26:08)
+ * Howard Butler <hobu.inc at gmail.com> static_cast instead of c-style casts (11:48:21)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of https://github.com/PDAL/PDAL (11:22:27)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (11:22:05)
+ * Howard Butler <hobu.inc at gmail.com> clean up type warning with a cast (11:06:25)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of https://github.com/PDAL/PDAL (10:57:45)
+ * Michael P. Gerlek <mpg at flaxen.com> singleton Environment (10:57:36)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (10:45:25)
+ * Howard Butler <hobu.inc at gmail.com> update test output (10:26:21)
+
+2012-05-14
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint, working on ThreadEnvironment and friends (20:05:18)
+ * Howard Butler <hobu.inc at gmail.com> exact counts for Classication (and other specified Dimension names if added to the options (19:57:33)
+ * Howard Butler <hobu.inc at gmail.com> overflow test would never be tripped (18:55:31)
+ * Howard Butler <hobu.inc at gmail.com> copy VLRs and add assignment operator (18:50:08)
+ * Howard Butler <hobu.inc at gmail.com> more tweaking of LAS stuff (18:42:42)
+ * Howard Butler <hobu.inc at gmail.com> turn off unused warnings for gcc (13:49:22)
+ * Howard Butler <hobu.inc at gmail.com> fix up reordering (13:49:07)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (11:35:39)
+ * Howard Butler <hobu.inc at gmail.com> back out 04cb7b05df0b7eae4c5505fa7342c20ed1e8cc0e because it breaks stuff on windows (11:35:28)
+ * Michael P. Gerlek <mpg at flaxen.com> testing (11:13:26)
+
+2012-05-13
+ * Howard Butler <hobu.inc at gmail.com> whitespace normalization (17:00:17)
+
+2012-05-11
+ * Howard Butler <hobu.inc at gmail.com> test for options that define whether or not a metadata item is to be forwarded into the header (15:28:21)
+ * Howard Butler <hobu.inc at gmail.com> set values on header directly in preparation for removing public methods of driver.las.Writer that deal with the header in favor of giving user the ability to manipulate the header directly themselves (11:28:24)
+ * Howard Butler <hobu.inc at gmail.com> put back copy constructor, start reworking a bit to prep for LAS 1.4 (11:27:21)
+ * Bradley J Chambers <brad.chambers at gmail.com> Merge branch 'master', remote-tracking branch 'origin/master' (11:18:06)
+
+2012-05-10
+ * Howard Butler <hobu.inc at gmail.com> support setting data record lengths for LAS that are not just the fixed set defined by the point formats (14:01:25)
+ * Howard Butler <hobu.inc at gmail.com> make sure to read the metadata (12:59:53)
+ * Howard Butler <hobu.inc at gmail.com> increase default chunk size to 2^20 instead of 2^15 (12:39:04)
+ * Howard Butler <hobu.inc at gmail.com> rename collectMetadata to not clash with StageBase::collectMetadata (12:38:13)
+ * Howard Butler <hobu.inc at gmail.com> default to clang for me (12:37:44)
+ * Howard Butler <hobu.inc at gmail.com> clean up const warning (12:37:30)
+ * Howard Butler <hobu.inc at gmail.com> silence unused warnings (12:37:11)
+ * Howard Butler <hobu.inc at gmail.com> add missing initializers (12:13:54)
+ * Howard Butler <hobu.inc at gmail.com> set project_id and reserved flag from metadata if asked (08:58:46)
+ * Howard Butler <hobu.inc at gmail.com> constructors shouldn't throw (08:46:34)
+
+2012-05-09
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (17:09:25)
+ * Howard Butler <hobu.inc at gmail.com> set defaults in constructor, not initialize() (17:09:20)
+ * Howard Butler <hobu.inc at gmail.com> move initialize() to after we set properties, not before (17:08:46)
+ * Howard Butler <hobu.inc at gmail.com> reorganize metadata setting a bit, add some log noise (16:55:13)
+ * Howard Butler <hobu.inc at gmail.com> default to 1.0 for scales rather than 0.01 (16:49:45)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of https://github.com/PDAL/PDAL (15:50:27)
+ * Michael P. Gerlek <mpg at flaxen.com> make Redirector be not static (15:50:09)
+ * Howard Butler <hobu.inc at gmail.com> we can't change properties of the writer after initialize() and expect to get what we want (14:57:12)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:40:41)
+ * Howard Butler <hobu.inc at gmail.com> test depends on python being around (13:27:15)
+ * Howard Butler <hobu.inc at gmail.com> return correct num points read (13:12:02)
+
+2012-05-08
+ * Michael P. Gerlek <mpg at flaxen.com> py redirection seems functional (22:36:32)
+ * Michael P. Gerlek <mpg at flaxen.com> getting ready to add python stdout redirection (21:58:42)
+ * Michael P. Gerlek <mpg at flaxen.com> fix leak in readPipeline logic (21:19:55)
+ * Michael P. Gerlek <mpg at flaxen.com> comment (20:28:47)
+ * Michael P. Gerlek <mpg at flaxen.com> make test name match file name (20:05:43)
+ * Michael P. Gerlek <mpg at flaxen.com> fix creeping lambda build issue; better name the Env classes; stub in ThreadEnv (20:00:50)
+ * Michael P. Gerlek <mpg at flaxen.com> gcc fix? (17:44:31)
+ * Michael P. Gerlek <mpg at flaxen.com> remove Python3 code; gratuitously refactor into a class (16:21:39)
+ * Michael P. Gerlek <mpg at flaxen.com> raw addition of Mateusz's redirector code (15:52:14)
+ * Howard Butler <hobu.inc at gmail.com> add a --validate option to pcpipeline that does initialize() of the pipeline but does not actually execute the write() of the points. This allows pipeline-serialization to fetch metadata and the user to check some things before running a big operation (15:44:37)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (15:36:04)
+ * Howard Butler <hobu.inc at gmail.com> a hacky forward_metadata option that sets metadata entries of some header values using the metadata that exists in the pipeline up to this stage (15:35:57)
+ * Howard Butler <hobu.inc at gmail.com> option to collectMetadata from all stages into a single pdal::Metadata instance (15:35:10)
+ * Michael P. Gerlek <mpg at flaxen.com> add multi-file option test (15:00:37)
+ * Michael P. Gerlek <mpg at flaxen.com> start staging in directed logging for py (13:54:56)
+ * Michael P. Gerlek <mpg at flaxen.com> lint, unused (13:52:35)
+ * Howard Butler <hobu.inc at gmail.com> shut off unused (13:33:02)
+
+2012-05-07
+ * Howard Butler <hobu.inc at gmail.com> update test to reflect current conditions (20:16:22)
+ * Howard Butler <hobu.inc at gmail.com> update to do operations on Stage creation, not buffer creation (20:15:57)
+ * Howard Butler <hobu.inc at gmail.com> switch off buffer copy shortcut for now (20:15:19)
+ * Howard Butler <hobu.inc at gmail.com> oracle test updates (16:20:40)
+ * Howard Butler <hobu.inc at gmail.com> try to make the data copying a little faster when packing the dimensions together by caching the dimension details rather than fetching them from the multi_index for each point (16:20:31)
+ * Howard Butler <hobu.inc at gmail.com> lint (16:18:55)
+ * Howard Butler <hobu.inc at gmail.com> alterSchema needs to happen at first read, not instantiation (16:18:24)
+ * Howard Butler <hobu.inc at gmail.com> a few small cleanups, tighten up a dimension equality test for copyOracleData (16:16:53)
+ * Howard Butler <hobu.inc at gmail.com> continue reading cloud instances until we are done if we have them (13:19:19)
+
+2012-05-05
+ * Howard Butler <hobu.inc at gmail.com> update drivers.oracle.reader to set data for dimensions that are requested through the PointBuffer rather than dictating the PointBuffer, which was wrong (08:22:15)
+ * Howard Butler <hobu.inc at gmail.com> pull data scaling in from filters.scaling to a static method of PointBuffer -- note that not all transformations are supported yet (08:20:56)
+ * Howard Butler <hobu.inc at gmail.com> decrufting (08:13:12)
+ * Howard Butler <hobu.inc at gmail.com> set a GUID for dimensions that end up having none (08:12:42)
+ * Howard Butler <hobu.inc at gmail.com> InPlaceReprojectionFilter will set guids for dimensions that it is reprojecting that have none (08:12:19)
+ * Howard Butler <hobu.inc at gmail.com> add reprojection to the big-read oracle example (08:11:35)
+
+2012-05-02
+ * Howard Butler <hobu.inc at gmail.com> update oci driver to use PointBuffer schema rather than Stage schema (15:01:58)
+ * Howard Butler <hobu.inc at gmail.com> more testing (15:00:37)
+ * Howard Butler <hobu.inc at gmail.com> update for new output (15:00:17)
+ * Howard Butler <hobu.inc at gmail.com> turn off for now (14:59:47)
+ * Howard Butler <hobu.inc at gmail.com> update for new test output (14:58:59)
+ * Howard Butler <hobu.inc at gmail.com> allow xml_schema_dump option of drivers.oci.reader to specify the filename (14:58:47)
+ * Howard Butler <hobu.inc at gmail.com> fix up inplacereprojection filter to set ignored dimensions if ignore_old_dimensions is passed (true by default) (14:58:12)
+ * Howard Butler <hobu.inc at gmail.com> ignored status has no say on whether or not we can set data for a dimension (14:56:39)
+ * Howard Butler <hobu.inc at gmail.com> put position and byteoffset in the ptree output (14:56:09)
+ * Howard Butler <hobu.inc at gmail.com> setDimension should try to use UUIDs before doing name/namespace searching (14:55:42)
+ * Howard Butler <hobu.inc at gmail.com> check for XYZ dimensions before reading data... use proper type for XYZ raw coordinate dimensions(was using uint32_t instead of int32_t) (14:54:52)
+ * Howard Butler <hobu.inc at gmail.com> do not intermingle ignored status into getDimension and friends (10:18:07)
+
+2012-05-01
+ * Howard Butler <hobu.inc at gmail.com> add parent uuid and uuid to xml schema representation of dimension (11:26:45)
+
+2012-04-30
+ * Howard Butler <hobu.inc at gmail.com> fix up filters.inplacereprojection to do its operations on the PointBuffer, not the Stage (21:13:19)
+ * Howard Butler <hobu.inc at gmail.com> prevent an overflow that was causing the character padding to be multi-gb in size -- there's a boost string algo to do this somewhere (20:58:04)
+ * Howard Butler <hobu.inc at gmail.com> provide a shitton of debugging noise for log level 7+ for reprojection filter (14:42:04)
+
+2012-04-23
+ * Howard Butler <hobu.inc at gmail.com> clean up filters.selector -- simply give it options for 'keep' or 'ignore' and a default whether to keep or drop unspecified dimensions and it will use that (14:28:38)
+ * Howard Butler <hobu.inc at gmail.com> whitespace normalization vi astyle (12:51:32)
+ * Howard Butler <hobu.inc at gmail.com> Get filters.selector working to actively ignore unwanted dimensions in output (12:51:15)
+
+2012-04-20
+ * Howard Butler <hobu.inc at gmail.com> new astyle options (12:10:57)
+ * Howard Butler <hobu.inc at gmail.com> clean up unused variables (11:46:00)
+ * Howard Butler <hobu.inc at gmail.com> oops, missed a file (11:45:48)
+ * Howard Butler <hobu.inc at gmail.com> use std::string instead of char* to back up source, function, and module (11:25:10)
+ * Howard Butler <hobu.inc at gmail.com> add -Wextra (11:12:46)
+ * Howard Butler <hobu.inc at gmail.com> ignore unused (11:12:21)
+ * Howard Butler <hobu.inc at gmail.com> remove -pedantic for now (11:02:13)
+
+2012-04-19
+ * Howard Butler <hobu.inc at gmail.com> remove the note to stdout about how many points are written. We want pcpipeline to take in stuff via stdin and write out pipeline serializations via stdout. notices should probably go to stderr (15:25:36)
+ * Howard Butler <hobu.inc at gmail.com> support writePipeline transparently writing to stdout via special filename (15:14:33)
+ * Howard Butler <hobu.inc at gmail.com> add stats filter to example (14:18:38)
+ * Howard Butler <hobu.inc at gmail.com> add metadata entries for stats filter options (14:18:28)
+ * Howard Butler <hobu.inc at gmail.com> add examples for filtering to keep last returns or specified return values (13:20:32)
+ * Howard Butler <hobu.inc at gmail.com> add an example predicate for keeping specified classifications (11:52:53)
+
+2012-04-18
+ * Howard Butler <hobu.inc at gmail.com> boost:: prefix for cstdint data types so we can compile on MSVC 2008 from Kevin Murphy (09:45:26)
+
+2012-04-13
+ * Michael P. Gerlek <mpg at flaxen.com> commentout busted test for now (14:56:38)
+ * Michael P. Gerlek <mpg at flaxen.com> handle missing option sensibly (14:26:49)
+ * Michael P. Gerlek <mpg at flaxen.com> recognize the XYZ writer driver (13:47:59)
+ * Howard Butler <hobu.inc at gmail.com> add a pdal::Object ultimate base class that all of our major objects will eventually derive from (10:05:32)
+
+2012-04-12
+ * Howard Butler <hobu.inc at gmail.com> add mersenne twister to the pdal::Environment so we can easily reuse it for uuid creation instead of having to create one for every uuid we create (08:52:39)
+ * Howard Butler <hobu.inc at gmail.com> to_json method for pdal::Metadata (08:30:05)
+
+2012-04-10
+ * Howard Butler <hobu.inc at gmail.com> add --xml switch to support XML output in addition to JSON (08:48:27)
+
+2012-04-08
+ * Howard Butler <hobu.inc at gmail.com> add a Metadata::to_xml method, this is duplication of the pipelinewriter static method of the same name, but I think these should probably be pulled closer to the objects themselves than out in some auxillary class (14:36:37)
+ * Howard Butler <hobu.inc at gmail.com> add ability to dump xml metadata for stage (14:35:49)
+ * Howard Butler <hobu.inc at gmail.com> add ntif as an open-able driver for pcinfo, etc (13:00:35)
+
+2012-04-07
+ * Howard Butler <hobu.inc at gmail.com> Metadata entries need not be unique (16:53:35)
+ * Howard Butler <hobu.inc at gmail.com> put back full linking of all PDAL dependencies for WIN32 case (16:53:24)
+
+2012-04-06
+ * Howard Butler <hobu.inc at gmail.com> rework pdal::Metadata to be constructed like pdal::Options is in preparation for their soon-to-be happy marriage (16:32:14)
+ * Howard Butler <hobu.inc at gmail.com> shut up silly warning described in https://svn.boost.org/trac/boost/ticket/5598 (15:51:16)
+ * Howard Butler <hobu.inc at gmail.com> move the bad pipeline test cases into their own directory (12:24:08)
+ * Howard Butler <hobu.inc at gmail.com> clean up comparison warning (09:34:00)
+
+2012-04-05
+ * Howard Butler <hobu.inc at gmail.com> make sure to initialize stdin var (16:29:34)
+ * Howard Butler <hobu.inc at gmail.com> add an example that embeds a predicate test in the pipeline xml (16:05:50)
+ * Howard Butler <hobu.inc at gmail.com> move plang pipeline test into predicate filter test, rearrange things a little bit (15:59:53)
+ * Howard Butler <hobu.inc at gmail.com> silence float comparison warnings (15:43:00)
+ * Howard Butler <hobu.inc at gmail.com> remove cruft (15:35:35)
+ * Howard Butler <hobu.inc at gmail.com> allow pcpipeline to use --stdin to read its XML -- note that relative filenames will not work in this case (14:20:32)
+ * Howard Butler <hobu.inc at gmail.com> give PipelineReader the ability to read its data from an istream (14:20:04)
+ * Howard Butler <hobu.inc at gmail.com> more housekeeping (13:27:32)
+ * Howard Butler <hobu.inc at gmail.com> add some doc stuff (12:42:53)
+ * Howard Butler <hobu.inc at gmail.com> a ton of housekeeping for the tests directory (12:41:31)
+ * Howard Butler <hobu.inc at gmail.com> test metadata fetching from stages (10:41:06)
+ * Howard Butler <hobu.inc at gmail.com> forward metadata from the stage (10:40:51)
+ * Howard Butler <hobu.inc at gmail.com> fix up broken test (10:40:31)
+
+2012-04-04
+ * Howard Butler <hobu.inc at gmail.com> square up nitf metadata a little bit for #71 (16:13:01)
+ * Howard Butler <hobu.inc at gmail.com> operator+ forgot to add half of the items (16:12:42)
+ * Howard Butler <hobu.inc at gmail.com> stage-specific pdal::Metadata now written for --pipeline-serialization option of pcpipeline (12:49:25)
+
+2012-04-02
+ * Howard Butler <hobu.inc at gmail.com> remove uuid and namespace junk from pdal::Metadata (13:22:52)
+
+2012-03-30
+ * Michael P. Gerlek <mpg at flaxen.com> cleanup of global headers: delete empty one, rename a couple others for consistency (22:31:51)
+ * Michael P. Gerlek <mpg at flaxen.com> use STL containers, like the big boys do (21:36:57)
+ * Howard Butler <hobu.inc at gmail.com> cast to void* to turn of alignment warnings (15:36:45)
+ * Michael P. Gerlek <mpg at flaxen.com> missing file (15:31:22)
+ * Michael P. Gerlek <mpg at flaxen.com> now writing out stubs around an actual nitf file (15:13:15)
+ * Michael P. Gerlek <mpg at flaxen.com> added ability to start stream from a given offset (15:12:38)
+ * Michael P. Gerlek <mpg at flaxen.com> firstPos() not used (13:57:43)
+ * Michael P. Gerlek <mpg at flaxen.com> added firstPos() function, refactored a bit (13:28:24)
+
+2012-03-29
+ * Michael P. Gerlek <mpg at flaxen.com> incremental (21:23:04)
+ * Michael P. Gerlek <mpg at flaxen.com> tweak it to make it derivation-friendly (21:21:45)
+ * Michael P. Gerlek <mpg at flaxen.com> fix IDE reference for TEXT driver (21:16:55)
+ * Michael P. Gerlek <mpg at flaxen.com> incremental (21:02:44)
+ * Michael P. Gerlek <mpg at flaxen.com> this might need to be virtual (21:02:26)
+ * Michael P. Gerlek <mpg at flaxen.com> comment (21:02:08)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (13:44:40)
+ * Howard Butler <hobu.inc at gmail.com> fix up test output to reflect reality (13:41:36)
+ * Michael P. Gerlek <mpg at flaxen.com> more comments (13:37:27)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (13:34:46)
+ * Michael P. Gerlek <mpg at flaxen.com> updated comments; metadata tweaks (13:34:36)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (13:20:40)
+ * Howard Butler <hobu.inc at gmail.com> typo (13:20:23)
+ * Bradley J Chambers <brad.chambers at gmail.com> Merge remote-tracking branch 'upstream/master' (12:17:26)
+ * Bradley J Chambers <brad.chambers at gmail.com> Fixing some madness with scaling floats to signed ints, there may be issues with other conversions as well... (12:00:08)
+ * Howard Butler <hobu.inc at gmail.com> register NITF reader for StageFactory (11:03:39)
+ * Howard Butler <hobu.inc at gmail.com> add method to fetch the number of keys that exist for a given namespace (11:03:26)
+ * Howard Butler <hobu.inc at gmail.com> get the nitf reader with the metadata program (09:41:09)
+
+2012-03-28
+ * Howard Butler <hobu.inc at gmail.com> more pdal::Metadata work -- metadata added to Stage, toPTree methods, operator<< (19:27:21)
+ * Howard Butler <hobu.inc at gmail.com> remove getCurrentOptions, which seems poorly named and little used (14:53:36)
+ * Howard Butler <hobu.inc at gmail.com> rename pdal::Metadatas -> pdal::Metadata (14:13:07)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (11:52:45)
+ * Howard Butler <hobu.inc at gmail.com> rename pdal::Metadata to pdal::metadata::Entry (11:52:24)
+ * Michael P. Gerlek <mpg at flaxen.com> missing const (10:23:07)
+ * Howard Butler <hobu.inc at gmail.com> Metadata::getValue should be const (10:12:06)
+
+2012-03-27
+ * Michael P. Gerlek <mpg at flaxen.com> comment out failing test (18:03:56)
+ * Michael P. Gerlek <mpg at flaxen.com> comments (17:45:54)
+ * Michael P. Gerlek <mpg at flaxen.com> comments, removed dead code (17:40:34)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (17:39:49)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (17:29:57)
+ * Michael P. Gerlek <mpg at flaxen.com> now storing all the metadata (17:29:45)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (16:32:11)
+ * Howard Butler <hobu.inc at gmail.com> refactor to pdal::Metadatas as a container to hold Metadata instances for PointBuffer and Stage (16:31:48)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (16:19:06)
+ * Michael P. Gerlek <mpg at flaxen.com> rename StreamManager.* to StreamFactory.* (15:00:23)
+ * Michael P. Gerlek <mpg at flaxen.com> access metadata (14:51:48)
+ * Michael P. Gerlek <mpg at flaxen.com> removed old IStreamManager (14:19:47)
+ * Michael P. Gerlek <mpg at flaxen.com> use streamFactory to avoid temp files (13:59:33)
+ * Michael P. Gerlek <mpg at flaxen.com> use new StreamFactory system (13:07:36)
+ * Michael P. Gerlek <mpg at flaxen.com> added StreamFactory system (13:07:10)
+ * Michael P. Gerlek <mpg at flaxen.com> improve restriction idiom (13:06:37)
+
+2012-03-26
+ * Michael P. Gerlek <mpg at flaxen.com> just playing (20:24:28)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (16:41:51)
+ * Michael P. Gerlek <mpg at flaxen.com> add test showing use of restricted stream (16:41:36)
+ * Howard Butler <hobu.inc at gmail.com> add cherry picks of our own specific boost patches to our import script (16:30:50)
+ * Howard Butler <hobu.inc at gmail.com> Revert "this is the only way to get all the VS2010 warnings to shtop - they won't turn off locally within our own sources" (16:19:16)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (16:10:37)
+ * Howard Butler <hobu.inc at gmail.com> add back #pragma (15:54:47)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (15:47:32)
+ * Howard Butler <hobu.inc at gmail.com> add missing files (15:41:57)
+ * Howard Butler <hobu.inc at gmail.com> update boost (15:36:11)
+ * Howard Butler <hobu.inc at gmail.com> add namespace and setup for running on jenkins machine (15:35:59)
+ * Michael P. Gerlek <mpg at flaxen.com> added comment for building non-embedded (15:16:31)
+ * Howard Butler <hobu.inc at gmail.com> add boost::iostreams::restrict (15:11:41)
+ * Howard Butler <hobu.inc at gmail.com> the latest import-boost script (14:16:29)
+ * Bradley J Chambers <brad.chambers at gmail.com> Merge remote-tracking branch 'upstream/master' (13:21:50)
+ * Bradley J Chambers <brad.chambers at gmail.com> now ignoring .DS_Store (OS X) and build directory (13:21:14)
+ * Bradley J Chambers <brad.chambers at gmail.com> GDAL and NITF unit tests would not compile if WITH_GDAL was FALSE, so we now let CMake check for WITH_GDAL to be TRUE before adding the tests (13:19:24)
+ * Bradley J Chambers <brad.chambers at gmail.com> find_package shouldn't be needed when using embedded boost, we now set the variables manually (13:17:04)
+ * Michael P. Gerlek <mpg at flaxen.com> turn runtime checking into compile-time specialization (12:32:38)
+ * Michael P. Gerlek <mpg at flaxen.com> fix bothced #ifdef (12:31:37)
+ * Bradley J Chambers <brad.chambers at gmail.com> Fixes error that occurs if GDAL is not enabled. (12:12:05)
+ * Michael P. Gerlek <mpg at flaxen.com> #ifdef out python code (11:40:31)
+ * Michael P. Gerlek <mpg at flaxen.com> remove NITF from LAS driver (11:28:18)
+ * Michael P. Gerlek <mpg at flaxen.com> enable Nitf reader (still via LAS), added test (10:53:55)
+ * Michael P. Gerlek <mpg at flaxen.com> zero out the nitf writer stubs (10:51:29)
+ * Michael P. Gerlek <mpg at flaxen.com> include/pdal/drivers/nitf/Writer.hpp (10:51:11)
+ * Michael P. Gerlek <mpg at flaxen.com> added Python note (10:42:00)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (10:34:58)
+ * Michael P. Gerlek <mpg at flaxen.com> added explicit copyctor, oper=, dtor, etc (10:30:32)
+ * Howard Butler <hobu.inc at gmail.com> use the pad=true option of SoftwareId and SystemId to avoid null byte issues (09:01:31)
+
+2012-03-13
+ * Michael P. Gerlek <mpg at flaxen.com> this is the only way to get all the VS2010 warnings to shtop - they won't turn off locally within our own sources (12:20:39)
+ * Michael P. Gerlek <mpg at flaxen.com> this is the only way to get all the VS2010 warnings to shtop - they won't turn off locally within our own sources (12:20:39)
+ * Michael P. Gerlek <mpg at flaxen.com> predicates working (20:06:35)
+ * Michael P. Gerlek <mpg at flaxen.com> working on predicate support; added more unit tests; added return value support (18:23:13)
+ * Michael P. Gerlek <mpg at flaxen.com> vs2010 lint (15:42:05)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (15:33:15)
+ * Michael P. Gerlek <mpg at flaxen.com> leakfix (15:33:04)
+ * Michael P. Gerlek <mpg at flaxen.com> added unit tests for errors, data access modes (15:29:56)
+ * Howard Butler <hobu.inc at gmail.com> add sample size option (15:23:32)
+ * Howard Butler <hobu.inc at gmail.com> bumpthe default stats_cache_size*100 (15:22:14)
+ * Howard Butler <hobu.inc at gmail.com> push dimension position caching into the iterators::Base instead of duplicating it for each iterator type (14:17:58)
+ * Michael P. Gerlek <mpg at flaxen.com> split out Method function to base and buffer versions (13:53:41)
+ * Howard Butler <hobu.inc at gmail.com> return empty srs if no srid is available for the SDO_PC (13:32:15)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (13:21:04)
+ * Michael P. Gerlek <mpg at flaxen.com> incremental (13:20:54)
+ * Howard Butler <hobu.inc at gmail.com> create UUIDs when creating Dimension instances to add to the schema (13:14:53)
+ * Howard Butler <hobu.inc at gmail.com> make sure UUIDs are created when creating dimension entries for faux reader (13:14:30)
+ * Howard Butler <hobu.inc at gmail.com> use GDAL's import of the SRID instead of Oracle's for fetching WKT/GeoTIFF keys (13:14:08)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (12:37:42)
+ * Howard Butler <hobu.inc at gmail.com> fix up bounds setting for oci reader (12:37:32)
+ * Michael P. Gerlek <mpg at flaxen.com> add bounds check (12:24:14)
+ * Michael P. Gerlek <mpg at flaxen.com> this is the only way to get all the VS2010 warnings to shtop - they won't turn off locally within our own sources (12:20:39)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (11:08:35)
+ * Michael P. Gerlek <mpg at flaxen.com> untabify (11:08:27)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (11:00:21)
+ * Howard Butler <hobu.inc at gmail.com> FindNumPy added and used (11:00:18)
+ * Howard Butler <hobu.inc at gmail.com> fix up casts and use <numpy/arrayobject.h> include statement (10:59:57)
+ * Michael P. Gerlek <mpg at flaxen.com> initialize the uuid (10:52:13)
+ * Howard Butler <hobu.inc at gmail.com> fix up debug lint so that it uses std debug (08:52:46)
+ * Howard Butler <hobu.inc at gmail.com> merge (08:48:41)
+ * Howard Butler <hobu.inc at gmail.com> more debugging lint (08:47:16)
+
+2012-03-23
+ * Howard Butler <hobu.inc at gmail.com> LASzip compression info metadata as well as VLR metadata for LAS files (13:33:34)
+ * Howard Butler <hobu.inc at gmail.com> addMetadata and setMetadata convenience methods for pdal::PointBuffer (12:35:36)
+
+2012-03-22
+ * Howard Butler <hobu.inc at gmail.com> add a nitf example based on the already existing autzen.las file in the test/data directory (19:32:51)
+ * Howard Butler <hobu.inc at gmail.com> start setting metadata on the PointBuffer from the LAS reader (16:09:11)
+ * Howard Butler <hobu.inc at gmail.com> add a compression info string to the header (16:08:41)
+ * Howard Butler <hobu.inc at gmail.com> remove dead code (16:08:06)
+ * Howard Butler <hobu.inc at gmail.com> getLasHeader() can be public to be able to expose metadata to iterators (15:52:53)
+ * Howard Butler <hobu.inc at gmail.com> allow boost::uuids::uuid to live in a pdal::Metadata too (15:52:21)
+ * Howard Butler <hobu.inc at gmail.com> createUUID is expensive (15:51:55)
+ * Howard Butler <hobu.inc at gmail.com> tighten up test. maybe it will pass now (14:54:07)
+ * Howard Butler <hobu.inc at gmail.com> tests to demonstrate how to use metadata fetching/setting on PointBuffer (14:16:09)
+ * Howard Butler <hobu.inc at gmail.com> default argument for namespace for searching via PointBuffer::getMetadata() (14:15:50)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (11:16:10)
+ * Howard Butler <hobu.inc at gmail.com> methods to get the entire metadata::MetadataMap from a pdal::PointBuffer (11:15:54)
+ * Michael P. Gerlek <mpg at flaxen.com> added error test case (10:44:31)
+ * Michael P. Gerlek <mpg at flaxen.com> stubs for NITF drivers (cloned from Faux) (10:37:57)
+ * Michael P. Gerlek <mpg at flaxen.com> fix for FreeGLUT cmake (10:19:12)
+
+2012-03-21
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (17:16:14)
+ * Howard Butler <hobu.inc at gmail.com> boost::optional getMetadata methods and friends copied over from pdal::Schema's pdal::Dimension handling (15:56:56)
+ * Howard Butler <hobu.inc at gmail.com> add Metadata boost::multi_index to pdal::PointBuffer to carry pdal::Metadata entries (15:23:33)
+ * Howard Butler <hobu.inc at gmail.com> add id and parent to pdal::Metadata (15:23:07)
+ * Howard Butler <hobu.inc at gmail.com> add errors about metadata (15:22:32)
+ * Michael P. Gerlek <mpg at flaxen.com> pcview works again (15:14:22)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (14:41:26)
+ * Howard Butler <hobu.inc at gmail.com> Metadata multi_index for PointBuffer to carry Metadata around (14:31:46)
+ * Howard Butler <hobu.inc at gmail.com> whitespace normalization (14:30:44)
+ * Howard Butler <hobu.inc at gmail.com> hide OptionPtr and map_t in the pdal::options namespace (14:30:32)
+ * Howard Butler <hobu.inc at gmail.com> more tweaks to pdal::Metadata (14:29:58)
+ * Howard Butler <hobu.inc at gmail.com> silence signed vs. unsigned warning (14:08:32)
+ * Michael P. Gerlek <mpg at flaxen.com> added global startup/shutdown; refactored to improve status checking (13:02:01)
+ * Michael P. Gerlek <mpg at flaxen.com> untabify (12:41:33)
+ * Michael P. Gerlek <mpg at flaxen.com> added global environment class for startup/shutdown; could eventually be a 'register' mechanism, though (12:40:11)
+ * Michael P. Gerlek <mpg at flaxen.com> updated (12:39:19)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (11:37:12)
+ * Howard Butler <hobu.inc at gmail.com> start pdal::Options documentation (11:17:53)
+ * Howard Butler <hobu.inc at gmail.com> documentation and a little cleanup of pdal::Option (11:07:24)
+ * Howard Butler <hobu.inc at gmail.com> remove global static empty_ptree which was being copied anyways (10:00:31)
+
+2012-03-20
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (16:58:58)
+ * Howard Butler <hobu.inc at gmail.com> tighten up and document pdal::Schema (16:58:41)
+ * Michael P. Gerlek <mpg at flaxen.com> added write tests (16:45:14)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (16:26:14)
+ * Michael P. Gerlek <mpg at flaxen.com> added VSILFileBuffer class (16:25:29)
+ * Howard Butler <hobu.inc at gmail.com> more better documentation and cleanups for pdal::Dimension (16:01:01)
+ * Howard Butler <hobu.inc at gmail.com> patch for boost bug #6535 to allow compilation of boost::accumulators::droppable on msvc (15:08:50)
+ * Howard Butler <hobu.inc at gmail.com> documentation and cleanups for pdal::PointBuffer (14:45:03)
+ * Michael P. Gerlek <mpg at flaxen.com> a bit of win32 lint (11:20:58)
+ * Howard Butler <hobu.inc at gmail.com> docs for pdal::Metadata (10:43:15)
+ * Howard Butler <hobu.inc at gmail.com> Revert "patch for boost bug #6535 to allow compilation of boost::accumulators::droppable on msvc" (08:40:35)
+ * Howard Butler <hobu.inc at gmail.com> patch for boost bug #6535 to allow compilation of boost::accumulators::droppable on msvc (08:02:44)
+
+2012-03-19
+ * Howard Butler <hobu.inc at gmail.com> obsolete doc (16:33:42)
+ * Howard Butler <hobu.inc at gmail.com> more doc reorg (16:28:49)
+ * Howard Butler <hobu.inc at gmail.com> turn on python by default (16:13:38)
+ * Howard Butler <hobu.inc at gmail.com> more doc work (16:13:06)
+ * Howard Butler <hobu.inc at gmail.com> add more info to dependencies (15:21:05)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:20:27)
+ * Howard Butler <hobu.inc at gmail.com> tweaking (14:20:08)
+ * Howard Butler <hobu.inc at gmail.com> formatting (14:19:53)
+ * Howard Butler <hobu.inc at gmail.com> update dependency doc (14:19:38)
+ * Howard Butler <hobu.inc at gmail.com> fix up formatting, add more linkage (13:33:12)
+ * Howard Butler <hobu.inc at gmail.com> there is no C API for PDAL (13:33:00)
+ * Michael P. Gerlek <mpg at flaxen.com> added predicate hits counter; added two-python-filters test case (13:26:45)
+
+2012-03-16
+ * Howard Butler <hobu.inc at gmail.com> merge (14:10:29)
+ * Howard Butler <hobu.inc at gmail.com> ByteArray belongs in pdal:: namespace (12:46:08)
+ * Michael P. Gerlek <mpg at flaxen.com> win32 linkage fixes (12:43:05)
+ * Howard Butler <hobu.inc at gmail.com> type of metadata entry is set for you when setValue is called, fix up tests to be more thorough (12:32:31)
+ * Howard Butler <hobu.inc at gmail.com> add arbitrary attributes to metadata entries (08:00:32)
+
+2012-03-15
+ * Howard Butler <hobu.inc at gmail.com> more metadata silliness (16:37:31)
+ * Howard Butler <hobu.inc at gmail.com> fix up base64 encode/decode error (14:39:11)
+ * Howard Butler <hobu.inc at gmail.com> wrong test output (11:24:50)
+ * Howard Butler <hobu.inc at gmail.com> add base64 encode/decode to Utils:: (10:58:52)
+
+2012-03-14
+ * Michael P. Gerlek <mpg at flaxen.com> build fix for hobu (17:06:24)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (16:38:08)
+ * Michael P. Gerlek <mpg at flaxen.com> add name-aliasing tests; improve outs variable finding (16:37:57)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (16:31:59)
+ * Howard Butler <hobu.inc at gmail.com> scaffolding for pdal::Metadata (16:31:46)
+ * Michael P. Gerlek <mpg at flaxen.com> rename the predicate variable from Result to Mask (15:28:39)
+ * Michael P. Gerlek <mpg at flaxen.com> remove debug prints (14:59:04)
+ * Michael P. Gerlek <mpg at flaxen.com> plang filtering via pipeline xml works (14:57:32)
+ * Michael P. Gerlek <mpg at flaxen.com> test for FileUtils::readFileIntoString() helper (14:33:37)
+ * Michael P. Gerlek <mpg at flaxen.com> added FileUtils::readFileIntoString() helper (14:32:40)
+ * Michael P. Gerlek <mpg at flaxen.com> cleanups; factored out common Script object (13:47:19)
+ * Michael P. Gerlek <mpg at flaxen.com> cleanups; factored out common Script object (13:45:49)
+ * Howard Butler <hobu.inc at gmail.com> extraneous ; (07:31:22)
+ * Michael P. Gerlek <mpg at flaxen.com> icomments, whitespace (00:41:27)
+ * Michael P. Gerlek <mpg at flaxen.com> including the numpy header in two places causes problems, evewn with #define NO_IMPORT... (00:25:36)
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint - debugging static linkage issue (00:11:21)
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint - renaming plang classes (00:00:49)
+
+2012-03-12
+ * Michael P. Gerlek <mpg at flaxen.com> reduce exposure of Python.h (20:03:43)
+ * Michael P. Gerlek <mpg at flaxen.com> vs20100 lint (19:46:37)
+ * Michael P. Gerlek <mpg at flaxen.com> vs20100 lint (19:46:23)
+ * Michael P. Gerlek <mpg at flaxen.com> debugging code for scale filter problem (19:32:08)
+ * Michael P. Gerlek <mpg at flaxen.com> fix for Jenks, again (19:05:41)
+ * Michael P. Gerlek <mpg at flaxen.com> fix for Jenks, again (19:05:13)
+ * Michael P. Gerlek <mpg at flaxen.com> fix for Jenks (18:52:35)
+ * Michael P. Gerlek <mpg at flaxen.com> remove Qi parser, good riddance; fix some build issues for Mr Jenkins (18:47:22)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (18:23:00)
+ * Michael P. Gerlek <mpg at flaxen.com> python-based plang starting to work (18:22:52)
+ * Michael P. Gerlek <mpg at flaxen.com> incremental (18:13:39)
+ * Michael P. Gerlek <mpg at flaxen.com> incremental (17:10:00)
+ * Michael P. Gerlek <mpg at flaxen.com> incremental (15:55:41)
+ * Howard Butler <hobu.inc at gmail.com> Readers need to make sure that they only fill in the dimensions they are providing -- there might be other dimensions of the same name in the schema (15:11:50)
+ * Michael P. Gerlek <mpg at flaxen.com> incremental (13:55:16)
+ * Michael P. Gerlek <mpg at flaxen.com> incremental (13:32:24)
+
+2012-03-11
+ * Howard Butler <hobu.inc at gmail.com> fix typo (08:57:14)
+ * Michael P. Gerlek <mpg at flaxen.com> add infrastructure for embedded python support (w00t) (00:39:08)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (00:04:00)
+ * Michael P. Gerlek <mpg at flaxen.com> use better variable (00:03:36)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (00:00:17)
+
+2012-03-09
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (15:37:58)
+ * Howard Butler <hobu.inc at gmail.com> fix up test output (15:37:39)
+ * Howard Butler <hobu.inc at gmail.com> only allow certain scaling conversions, fix up scaling operations for conversions we support (15:37:20)
+ * Howard Butler <hobu.inc at gmail.com> turn float->int conversion back on (15:34:43)
+ * Howard Butler <hobu.inc at gmail.com> initialize the LAS header at the start of the first PointBuffer write, not at writeBegin (15:31:48)
+ * Michael P. Gerlek <mpg at flaxen.com> make plang doc visible (12:54:14)
+ * Michael P. Gerlek <mpg at flaxen.com> need to do laszip manually for now (10:25:58)
+
+2012-03-08
+ * Howard Butler <hobu.inc at gmail.com> a convenience size() method that returns the number of dimensions in the schema (14:41:58)
+ * Howard Butler <hobu.inc at gmail.com> tighten clamping test to report more information when there's a failure -- only fail if we're < or >, not =. inline removeScaling and applyScaling (14:41:25)
+ * Howard Butler <hobu.inc at gmail.com> tighten clamping test to report more information when there's a failure -- only fail if we're < or >, not = (14:40:43)
+ * Michael P. Gerlek <mpg at flaxen.com> typO (12:17:41)
+ * Michael P. Gerlek <mpg at flaxen.com> update req'd CMAKE version, for us windows noobs (12:11:23)
+ * Michael P. Gerlek <mpg at flaxen.com> minor additions (12:03:55)
+ * Michael P. Gerlek <mpg at flaxen.com> #ifdef out tricky test (11:34:24)
+ * Howard Butler <hobu.inc at gmail.com> make sure to get drivers.reader.faux dimensions when setting values (11:10:18)
+ * Howard Butler <hobu.inc at gmail.com> removeScaling should only do bounds checks for exact-precisions types (11:09:07)
+
+2012-03-06
+ * Howard Butler <hobu.inc at gmail.com> support single-inheritance child/parent relationships based on uuids for pdal::Dimension (13:38:14)
+
+2012-03-03
+ * Howard Butler <hobu.inc at gmail.com> clean up some warnings for embedded boost (08:58:24)
+
+2012-03-02
+ * Michael P. Gerlek <mpg at flaxen.com> handle win32 FP differences (15:08:30)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (14:28:04)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (14:00:43)
+ * Michael P. Gerlek <mpg at flaxen.com> fix various issues with embeddedboost on windows (13:59:21)
+
+2012-03-01
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (18:38:16)
+ * Howard Butler <hobu.inc at gmail.com> use readBeginImpl instead of readBufferBeginImpl now that the iterator has a buffer being given to it (18:38:02)
+ * Howard Butler <hobu.inc at gmail.com> use BOOST_CHECK_EQUAL to get report about the difference in values in test output (18:37:18)
+ * Howard Butler <hobu.inc at gmail.com> clean up test (18:35:57)
+ * Howard Butler <hobu.inc at gmail.com> clean up warnings (18:31:27)
+ * Howard Butler <hobu.inc at gmail.com> provide access to the PointBuffer& via getBuffer() method (18:31:03)
+ * Michael P. Gerlek <mpg at flaxen.com> lint and untabify (14:57:45)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (14:51:58)
+ * Michael P. Gerlek <mpg at flaxen.com> comment out off casting code for now (14:38:48)
+ * Michael P. Gerlek <mpg at flaxen.com> the classical (max)() issue (14:37:25)
+ * Michael P. Gerlek <mpg at flaxen.com> lint - arg not used (14:35:05)
+ * Michael P. Gerlek <mpg at flaxen.com> untabify (14:34:29)
+ * Michael P. Gerlek <mpg at flaxen.com> lint - arg unused (14:32:34)
+ * Michael P. Gerlek <mpg at flaxen.com> boosty lint (14:32:09)
+ * Michael P. Gerlek <mpg at flaxen.com> update win32 buildd info (14:31:23)
+ * Michael P. Gerlek <mpg at flaxen.com> fix comments (14:30:22)
+ * Michael P. Gerlek <mpg at flaxen.com> lint and untabify (14:29:51)
+ * Michael P. Gerlek <mpg at flaxen.com> lint - unusged arg (14:29:17)
+ * Howard Butler <hobu.inc at gmail.com> ReaderIterator did not seem to be used. removing dead code (13:35:17)
+ * Howard Butler <hobu.inc at gmail.com> typo (13:34:19)
+ * Howard Butler <hobu.inc at gmail.com> whitespace normalization (13:29:41)
+ * Michael P. Gerlek <mpg at flaxen.com> lint w/ cmake 2.8.3 (12:50:55)
+ * Howard Butler <hobu.inc at gmail.com> make random iterator take in PointBuffer& at instantiation (12:06:40)
+
+2012-02-29
+ * Howard Butler <hobu.inc at gmail.com> require that a PointBuffer& be passed in to create a sequential iterator -- random will be updated next (19:22:22)
+ * Howard Butler <hobu.inc at gmail.com> treat int8_t and uint8_t as 32-bit ints for string printing purposes (19:21:22)
+ * Howard Butler <hobu.inc at gmail.com> try to do something when float vs int requests come into getField, separate out the conversion part of the function from the rest, add a default PointBuffer size of 65536 to try to start doing away with default chunk size (19:20:29)
+
+2012-02-28
+ * Howard Butler <hobu.inc at gmail.com> use numeric_cast instead of lexical_cast for STRINGIFY to get proper numeric conversions -- let the ostream of ptree do the conversion to string after that (16:33:59)
+ * Howard Butler <hobu.inc at gmail.com> mark float options as floats (16:33:13)
+ * Howard Butler <hobu.inc at gmail.com> increase the default chunk size to 65536 (16:32:46)
+ * Howard Butler <hobu.inc at gmail.com> fix up comparision (16:31:39)
+
+2012-02-24
+ * Howard Butler <hobu.inc at gmail.com> we want to apply scaling for float data too if it is scaled (11:45:21)
+ * Howard Butler <hobu.inc at gmail.com> remove dead code (10:55:18)
+ * Howard Butler <hobu.inc at gmail.com> generate a random name for using time.h and rand() for dimensions that have no given name in the constructor. bad things happen if we can't address dimensions by names (10:55:04)
+
+2012-02-23
+ * Howard Butler <hobu.inc at gmail.com> basic BPF test (13:39:41)
+ * Howard Butler <hobu.inc at gmail.com> generate a random name for dimensions that have none (13:39:17)
+ * Howard Butler <hobu.inc at gmail.com> trap execute() in the case where the manager doesn't have a writer on it (11:47:29)
+
+2012-02-22
+ * Howard Butler <hobu.inc at gmail.com> whitespace normalization (16:52:18)
+ * Howard Butler <hobu.inc at gmail.com> clean up error message (16:52:08)
+ * Howard Butler <hobu.inc at gmail.com> add BPF test skeleton -- not used by default. The BPF reader is closed source for now (16:51:56)
+ * Howard Butler <hobu.inc at gmail.com> enable drivers.text.writer by default now that the example plugin using it has been demonstrated (10:48:44)
+
+2012-02-21
+ * Howard Butler <hobu.inc at gmail.com> make drivers.text.writer a dynamically loaded plugin that is controlled by PDAL_DRIVER_PATH -- note that this is merely the instructive case for now, and we should probably have both an example and a real drivers.text.writer in the near future (11:53:07)
+ * Howard Butler <hobu.inc at gmail.com> add a string-fetching getenv and make getDLLSymbol be static (11:51:44)
+
+2012-02-17
+ * Howard Butler <hobu.inc at gmail.com> typo (09:19:36)
+
+2012-02-16
+ * Howard Butler <hobu.inc at gmail.com> adjust configuration for LINK_PRIVATE to be WIN32-only when cmake version > 2.8.7 (10:44:36)
+ * Howard Butler <hobu.inc at gmail.com> merge (08:36:59)
+ * Howard Butler <hobu.inc at gmail.com> begin and end variables aren't being used anymore because the pdal las writer doesn't append (08:35:21)
+ * Howard Butler <hobu.inc at gmail.com> shut up GCC for float-equal because this was being thrown nearly every single file :( (08:35:00)
+
+2012-02-15
+ * Kirk McKelvey <kmckelvey at lizardtech.com> windows build of embedded boost; still linkage problems on pdal_test (13:34:53)
+
+2012-02-14
+ * Howard Butler <hobu.inc at gmail.com> remove Utils::trim in favor of boost::algorithm::trim (21:33:08)
+ * Howard Butler <hobu.inc at gmail.com> port GDAL's getSymbol method from CPLSymbol (21:27:18)
+ * Howard Butler <hobu.inc at gmail.com> stubs for getSymbol (20:29:16)
+ * Howard Butler <hobu.inc at gmail.com> attempt to check for pdalboost:: vs boost:: namespace on the first-compiled file so that in situations we get an error right away in situations where things aren't right (20:28:59)
+ * Howard Butler <hobu.inc at gmail.com> define BOOST_SYSTEM_NO_DEPRECATED to shut off warnings about stuff that no longer exists in boost::system (20:28:16)
+ * Howard Butler <hobu.inc at gmail.com> variable for embed or no embed (20:27:37)
+ * Howard Butler <hobu.inc at gmail.com> more BOOST_TEST_DYN_LINK silliness (20:27:21)
+ * Howard Butler <hobu.inc at gmail.com> don't BEFORE the include of embedded boost (20:26:38)
+ * Howard Butler <hobu.inc at gmail.com> GDAL version needs to be 1.9.0+ because of the userdata error stuff in GDAL 1.9 (14:44:31)
+ * Howard Butler <hobu.inc at gmail.com> add shell script for my config (14:42:09)
+ * Howard Butler <hobu.inc at gmail.com> make sure GDAL is 1.8.0+ (14:41:54)
+ * Howard Butler <hobu.inc at gmail.com> add Kirk (14:40:01)
+ * Howard Butler <hobu.inc at gmail.com> Parser_qi needs to be updated for unsigned long long support for this test to work (13:35:26)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into import-boost (13:22:21)
+ * Howard Butler <hobu.inc at gmail.com> turn off 64bit integer types for plang for now (11:37:07)
+ * Howard Butler <hobu.inc at gmail.com> don't use -isystem because it gets searched last and if a system boost is in the way it will end up being used (10:36:22)
+ * Howard Butler <hobu.inc at gmail.com> PDAL_EMBED_BOOST is a BOOL not a STRING (10:24:09)
+ * Howard Butler <hobu.inc at gmail.com> more boost embed stuff (10:14:05)
+
+2012-02-11
+ * Howard Butler <hobu.inc at gmail.com> this didn't do anything (14:15:37)
+ * Howard Butler <hobu.inc at gmail.com> tweak embed build option some more (14:00:35)
+ * Howard Butler <hobu.inc at gmail.com> use BOOL instead of STRING for PDAL_EMBED_BOOST option (13:38:12)
+ * Howard Butler <hobu.inc at gmail.com> tweak BOOST_TEST_DYN_LINK scenario for static embed boost (13:31:35)
+
+2012-02-10
+ * Howard Butler <hobu.inc at gmail.com> put PDAL_EMBED_BOOST in the cmake cache (16:52:55)
+ * Howard Butler <hobu.inc at gmail.com> pick up definitions (16:37:50)
+ * Howard Butler <hobu.inc at gmail.com> add boost embeded with bjam support (17:30:44)
+ * Howard Butler <hobu.inc at gmail.com> remove current embed in favor of one that is based explicitly on bjam (17:27:34)
+ * Howard Butler <hobu.inc at gmail.com> we are going to use bjam in a command to staticly build boost instead of cmake. pick up the .a files it creates as Boost_LIBRARIES (17:26:55)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'import-boost' of https://github.com/PDAL/PDAL into import-boost (17:22:32)
+ * Howard Butler <hobu.inc at gmail.com> if we are embedding boost, we do not add dyn_link definition (17:19:06)
+ * Howard Butler <hobu.inc at gmail.com> don't always BOOST_HAS_LONG_LONG (16:18:43)
+
+2012-02-09
+ * Michael Rosen <michael.rosen at gmail.com> cosmetic (17:57:02)
+ * Michael Rosen <michael.rosen at gmail.com> cosmetic (15:55:05)
+ * Michael Rosen <michael.rosen at gmail.com> boost build notes for windows (12:40:02)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'master' into import-boost (00:41:00)
+ * Pete Gadomski <pete.gadomski at gmail.com> Shebang 'bash' in our jenkins test script (00:33:40)
+ * Pete Gadomski <pete.gadomski at gmail.com> Use the simple bash test for the jenkins script (00:30:51)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'master' into import-boost (00:05:27)
+
+2012-02-08
+ * Pete Gadomski <pete.gadomski at gmail.com> Add a 'PDAL-embed-boost' option to test/jenkins.sh (22:53:19)
+ * Kirk McKelvey <kmckelvey at lizardtech.com> instructions and model script to import new boost sources (19:30:38)
+ * Michael Rosen <michael.rosen at gmail.com> Windows work around for Boost issue 6535 (18:40:08)
+ * Kirk McKelvey <kmckelvey at lizardtech.com> phoenix namespace difference if boost is embedded (18:38:55)
+ * Michael Rosen <michael.rosen at gmail.com> renamed mpg-config.bat to config.bat (18:22:08)
+ * Michael Rosen <michael.rosen at gmail.com> new changes prior to rename (18:20:51)
+ * Michael Rosen <michael.rosen at gmail.com> update (17:34:20)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL into import-boost (17:05:13)
+ * Michael P. Gerlek <mpg at flaxen.com> fix filename (16:54:40)
+ * Howard Butler <hobu.inc at gmail.com> use -DBOOST_EMBED=ON to use local boost source tree instead of your own system 1.48+ boost installation (16:28:16)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:/PDAL/PDAL (15:48:19)
+ * Michael P. Gerlek <mpg at flaxen.com> made separater apps topic (15:48:12)
+ * Kirk McKelvey <kmckelvey at lizardtech.com> change inner-boost namespace; purge external/uuid (15:44:23)
+ * Michael Rosen <michael.rosen at gmail.com> updates (15:43:56)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'import-boost' of github.com:PDAL/PDAL into import-boost (14:23:17)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into import-boost (14:22:43)
+ * Howard Butler <hobu.inc at gmail.com> add stubs for filters.selector (14:21:33)
+ * Michael P. Gerlek <mpg at flaxen.com> fix header (13:54:56)
+ * Michael P. Gerlek <mpg at flaxen.com> fix titles (13:54:46)
+ * Michael P. Gerlek <mpg at flaxen.com> clean up sidebar links (13:45:40)
+ * Kirk McKelvey <kmckelvey at lizardtech.com> build inner-boost with BOOST_TEST_DYN_LIB (13:19:13)
+ * Howard Butler <hobu.inc at gmail.com> remove temppath option. you can change this with the TMPDIR environment variable anyway (12:00:10)
+ * Michael P. Gerlek <mpg at flaxen.com> starting to clean up docs (11:46:50)
+ * Howard Butler <hobu.inc at gmail.com> add tempdir option to LAS reader for it to use as scratch space when unspooling NITF files (11:45:10)
+ * Howard Butler <hobu.inc at gmail.com> add temp filename and temp filepath methods (11:44:45)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into import-boost (10:29:45)
+
+2012-02-07
+ * Kirk McKelvey <kmckelvey at lizardtech.com> first import of our boost subset, building on mac os x (17:55:21)
+ * Michael Rosen <michael.rosen at gmail.com> windows build instructions (17:42:15)
+ * Howard Butler <hobu.inc at gmail.com> add missing file (16:55:10)
+ * Howard Butler <hobu.inc at gmail.com> add drivers.text.Writer (with tests\!) (16:48:28)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:/PDAL/PDAL (15:33:13)
+ * Michael P. Gerlek <mpg at flaxen.com> add support for direct PDF generation (15:32:43)
+ * Howard Butler <hobu.inc at gmail.com> stub in drivers.text.writer (13:44:30)
+ * Howard Butler <hobu.inc at gmail.com> remove liblas references (13:41:48)
+ * Michael P. Gerlek <mpg at flaxen.com> dead file (12:43:47)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:/PDAL/PDAL (12:39:40)
+ * Michael P. Gerlek <mpg at flaxen.com> start some new docs (12:39:21)
+ * Michael P. Gerlek <mpg at flaxen.com> start some new docs (12:39:16)
+ * Michael P. Gerlek <mpg at flaxen.com> fix laszip name, update for laptop work (12:19:17)
+ * Howard Butler <hobu.inc at gmail.com> use a std::vector to preserve dimension position instead of iterating a multimap which does not for pdal.filter.stats (12:09:48)
+ * Howard Butler <hobu.inc at gmail.com> don't reset seed every time we begin to read a buffer (11:19:50)
+ * Howard Butler <hobu.inc at gmail.com> a few operators for pdal::Options to make combination easier (11:07:16)
+ * Howard Butler <hobu.inc at gmail.com> more logging for stats filter (11:06:53)
+ * Howard Butler <hobu.inc at gmail.com> add a seed option for the stats option (11:06:29)
+
+2012-02-06
+ * Howard Butler <hobu.inc at gmail.com> logging of which dimensions we're sampling (17:43:12)
+ * Howard Butler <hobu.inc at gmail.com> repeatable data in test output is useful.. provide a seed value to the stats filter and use for test output (16:43:32)
+ * Howard Butler <hobu.inc at gmail.com> add missing test file (16:09:54)
+ * Howard Butler <hobu.inc at gmail.com> tweak geotiff lib location (15:53:44)
+ * Howard Butler <hobu.inc at gmail.com> try tweaking again for boost detection (15:49:31)
+ * Howard Butler <hobu.inc at gmail.com> tweak variable for boost finding (15:34:23)
+ * Howard Butler <hobu.inc at gmail.com> use local geotiff instead of system (15:32:52)
+ * Howard Butler <hobu.inc at gmail.com> clobber path for jenkins (15:30:37)
+ * Howard Butler <hobu.inc at gmail.com> more accurate gdal config for jenkins (15:21:10)
+ * Pete Gadomski <pete.gadomski at gmail.com> Fix missing 'local' in cmake paths (14:28:27)
+ * Pete Gadomski <pete.gadomski at gmail.com> Add ORACLE_HOME to jenkins test script (14:22:58)
+ * Howard Butler <hobu.inc at gmail.com> more random data :) (14:09:27)
+ * Howard Butler <hobu.inc at gmail.com> update jenkins build config (14:05:31)
+ * Pete Gadomski <pete.gadomski at gmail.com> Add BuildSetup.jenkins (13:40:40)
+ * Pete Gadomski <pete.gadomski at gmail.com> Add a script to run the tests on Jenkins (13:06:23)
+ * Howard Butler <hobu.inc at gmail.com> undo last commit to be better (12:21:16)
+ * Howard Butler <hobu.inc at gmail.com> pipeline reader needs to return the spatial reference of its stage, not of itself (12:17:43)
+
+2012-02-01
+ * Michael P. Gerlek <mpg at flaxen.com> added docs here, for now (10:22:28)
+
+2012-01-31
+ * Michael P. Gerlek <mpg at flaxen.com> use PLANG by default (17:19:37)
+ * Howard Butler <hobu.inc at gmail.com> add raster overlay filter called Colorization that can query GDAL-based rasters and fill in specified dimensions (with user-configurable scale factors (16:21:09)
+ * Howard Butler <hobu.inc at gmail.com> clean up warning (16:19:06)
+
+2012-01-30
+ * Howard Butler <hobu.inc at gmail.com> support .ntf and .nitf extensions (18:57:43)
+ * Howard Butler <hobu.inc at gmail.com> add dimension position to summary so things could be sorted if necessary (15:45:02)
+ * Howard Butler <hobu.inc at gmail.com> destrctors shouldn't throw (15:44:02)
+ * Howard Butler <hobu.inc at gmail.com> add NITF-reading capability -no test files though. (15:43:23)
+ * Howard Butler <hobu.inc at gmail.com> add temp filename-fetching util (15:41:28)
+
+2012-01-26
+ * Howard Butler <hobu.inc at gmail.com> fix up block fetching for SDO_PC queries (21:26:13)
+ * Howard Butler <hobu.inc at gmail.com> put back old OCI reader approach (20:21:53)
+ * Howard Butler <hobu.inc at gmail.com> keep oci reader experimentation (15:47:25)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (10:02:16)
+ * Howard Butler <hobu.inc at gmail.com> add a random sample of option-specified size to the stats output (10:02:02)
+ * Howard Butler <hobu.inc at gmail.com> add in stubs for fetching color from GDAL datasources (09:08:31)
+
+2012-01-24
+ * Howard Butler <hobu.inc at gmail.com> add histogram binning to stats output (15:10:52)
+
+2012-01-21
+ * Howard Butler <hobu.inc at gmail.com> remove extraneous fetch that was causing exception when reading clould-only data (09:11:30)
+ * Howard Butler <hobu.inc at gmail.com> more better OCI test that doesn't seem to fail. Test all three reader scenarios -- view, single cloud selection, multi-cloud selection (09:11:04)
+
+2012-01-20
+ * Howard Butler <hobu.inc at gmail.com> some fix ups of OCITest to get it working with new code (21:26:59)
+ * Howard Butler <hobu.inc at gmail.com> fix up disable_cloud_trigger option to work if manually set to true. clobber index names to 29 characters to fit within the oracle tablename limit (20:55:38)
+
+2012-01-19
+ * Howard Butler <hobu.inc at gmail.com> merge cleanups (10:17:32)
+ * Howard Butler <hobu.inc at gmail.com> merge (10:10:45)
+ * Howard Butler <hobu.inc at gmail.com> fix up pcinfo tests to keep their data around when they fail for easy manual comparison (10:09:46)
+
+2012-01-17
+ * Howard Butler <hobu.inc at gmail.com> add histogram cumulation based on boost::accumulators::density to Summary object (16:08:42)
+ * Howard Butler <hobu.inc at gmail.com> add histogram cumulation based on boost::accumulators::density to Summary object (16:08:42)
+ * Howard Butler <hobu.inc at gmail.com> fix up merge (14:14:35)
+ * Howard Butler <hobu.inc at gmail.com> merge (14:08:49)
+ * Howard Butler <hobu.inc at gmail.com> use boost::accumulators instead of our own home-grown stuff for statistics generation (14:08:01)
+
+2012-01-12
+ * Howard Butler <hobu.inc at gmail.com> make PLANG contingent on an explict cmake variable (17:07:23)
+ * Howard Butler <hobu.inc at gmail.com> make PLANG contingent on an explict cmake variable (17:07:23)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into iterators (11:05:45)
+ * Howard Butler <hobu.inc at gmail.com> update test output (11:05:27)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into iterators (10:15:30)
+ * Howard Butler <hobu.inc at gmail.com> add a qfit pipeline example (10:15:11)
+ * Howard Butler <hobu.inc at gmail.com> use a saturation_cast instead of a lexical_cast to clip the numerics in getField. We should probably do the same for setField too (10:14:39)
+ * Howard Butler <hobu.inc at gmail.com> add -fPIC to CXX_FLAGS (08:46:33)
+
+2012-01-11
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' into iterators (10:13:03)
+ * Howard Butler <hobu.inc at gmail.com> manually pull forward d82c6236a9a2d68bc204e51b965e6da2e950f2e3 (10:12:08)
+ * Howard Butler <hobu.inc at gmail.com> add PDAL_HAVE_PLANG based on boost's minor version > 45 so we can still run in situations with older boost (10:06:52)
+
+2012-01-10
+ * Howard Butler <hobu.inc at gmail.com> (optionally) put back the trigger stuff because not every one is patched up (17:06:42)
+ * Howard Butler <hobu.inc at gmail.com> clean up the logic for fetching additional point clouds so it doesn't interfere with not being done reading the current block (17:03:06)
+
+2011-12-22
+ * Howard Butler <hobu.inc at gmail.com> collaps iterator for terrasolid into reader (14:28:02)
+ * Howard Butler <hobu.inc at gmail.com> collapse iterator for qfit into reader (14:19:38)
+ * Howard Butler <hobu.inc at gmail.com> collapse oci iterator into reader code (14:08:45)
+ * Howard Butler <hobu.inc at gmail.com> update mrsid driver to work with new dimension/schema arrangements (13:14:52)
+ * Howard Butler <hobu.inc at gmail.com> update expected output (13:14:29)
+ * Howard Butler <hobu.inc at gmail.com> remove the libLAS-based reader and writer. Unnecessary duplication (10:51:32)
+ * Howard Butler <hobu.inc at gmail.com> decruft (10:18:57)
+ * Howard Butler <hobu.inc at gmail.com> tweak drivers.las.reader to interact with LASzip a little better. still not complete (10:17:33)
+
+2011-12-21
+ * Howard Butler <hobu.inc at gmail.com> collaps iterators for reader into las::Reader header (16:28:01)
+ * Howard Butler <hobu.inc at gmail.com> move safeconvert64to32 to Utils (16:27:33)
+ * Howard Butler <hobu.inc at gmail.com> collapse iterators for reader into faux::Reader header (15:59:12)
+ * Howard Butler <hobu.inc at gmail.com> make sure to export iterators into the DLL (15:40:26)
+ * Howard Butler <hobu.inc at gmail.com> fix up Dimension.hpp location (15:21:10)
+ * Howard Butler <hobu.inc at gmail.com> make sure to return in setField if we're not going to cast (14:06:37)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (13:45:45)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (13:45:25)
+ * Howard Butler <hobu.inc at gmail.com> prune dead code that can't be reached (13:42:29)
+ * Howard Butler <hobu.inc at gmail.com> processBuffer on the Stats stage is no longer relevant (13:39:33)
+ * Howard Butler <hobu.inc at gmail.com> export stats iterator because pcinfo uses it (11:45:03)
+ * Howard Butler <hobu.inc at gmail.com> we can link against PDAL_LIB instead of all libraries for apps (11:44:25)
+ * Howard Butler <hobu.inc at gmail.com> clean up a few warnings (11:08:10)
+ * Howard Butler <hobu.inc at gmail.com> export stats collector (11:07:54)
+ * Howard Butler <hobu.inc at gmail.com> move my_visitor outside the method to allow the templating to work on gcc (10:59:13)
+
+2011-12-20
+ * Howard Butler <hobu.inc at gmail.com> Merge branches 'dimension_types' and 'master' of github.com:PDAL/PDAL into dimension_types (13:40:07)
+ * Howard Butler <hobu.inc at gmail.com> update tests for the last slug of commits related to Dimension rework to remove Dimension::Id and Dimension::DataType (13:39:55)
+ * Howard Butler <hobu.inc at gmail.com> no longer need this (13:39:30)
+ * Howard Butler <hobu.inc at gmail.com> updates to remove Dimension::Id and Dimension::DataType (13:39:18)
+ * Howard Butler <hobu.inc at gmail.com> remove Dimension::Id and Dimension::DataType from Dimension (13:38:42)
+ * Howard Butler <hobu.inc at gmail.com> update filters.color to use default dimensions approach and remove Dimension::Id and Dimension::DataType (13:37:42)
+ * Howard Butler <hobu.inc at gmail.com> update to remove Dimension::Id and Dimension::DataType (13:36:35)
+ * Howard Butler <hobu.inc at gmail.com> remove all getField/setField methods that do not take in a Dimension, update to remove Dimension::Id and Dimension::DataType (13:35:24)
+ * Howard Butler <hobu.inc at gmail.com> update pdal::Schema to remove Dimension::Id and Dimension::DataType (13:25:25)
+
+2011-12-19
+ * Howard Butler <hobu.inc at gmail.com> make DimensionTest more robust and reflective of how things are currently working (14:49:43)
+ * Howard Butler <hobu.inc at gmail.com> put uuid in ptree and always put scale, offset, max, and min in ptree (14:49:24)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master', remote-tracking branch 'origin' (14:12:57)
+ * Howard Butler <hobu.inc at gmail.com> filters.scaling mostly working now -- need an option to ignore overflows (14:08:43)
+ * Howard Butler <hobu.inc at gmail.com> make XYZ fetching namespace aware (14:08:12)
+ * Howard Butler <hobu.inc at gmail.com> don't use old getDimension methods (14:06:56)
+ * Howard Butler <hobu.inc at gmail.com> reorganize case statement to use Interpretation/Size rather than old Dimension::Type stuff (14:06:28)
+ * Howard Butler <hobu.inc at gmail.com> support fetching namespace (14:05:55)
+ * Howard Butler <hobu.inc at gmail.com> add namespace to ptree output (14:05:27)
+ * Howard Butler <hobu.inc at gmail.com> make getDimension namespace-aware (14:04:46)
+ * Howard Butler <hobu.inc at gmail.com> whitespace normalization (14:04:11)
+
+2011-12-15
+ * Howard Butler <hobu.inc at gmail.com> more filter.Scaling work (19:36:01)
+ * Howard Butler <hobu.inc at gmail.com> merge (19:33:16)
+ * Michael P. Gerlek <mpg at flaxen.com> programmable filter works (16:56:40)
+ * Michael P. Gerlek <mpg at flaxen.com> predicate filter works (16:40:20)
+ * Michael P. Gerlek <mpg at flaxen.com> fix type of bool operators (16:40:04)
+ * Michael P. Gerlek <mpg at flaxen.com> infrastructure for plang filters (15:33:11)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL into dimension_types (14:10:41)
+ * Howard Butler <hobu.inc at gmail.com> more scaling filter rework (14:10:07)
+ * Howard Butler <hobu.inc at gmail.com> use inplacereprojection filter (14:06:42)
+ * Michael P. Gerlek <mpg at flaxen.com> fix memleak (thanks, boost::unit_test\!) (14:00:14)
+ * Michael P. Gerlek <mpg at flaxen.com> imported PLang code into PDAL; tests passing, but mem leaks (13:31:30)
+ * Howard Butler <hobu.inc at gmail.com> add getDimension methods that return boost::optional containers for convenience (09:33:22)
+
+2011-12-14
+ * Howard Butler <hobu.inc at gmail.com> preliminary scalingfilter refactor -- we need to address iterator creation before we can finish this (21:01:30)
+ * Howard Butler <hobu.inc at gmail.com> cruft cleanup (21:00:31)
+ * Howard Butler <hobu.inc at gmail.com> minor cleanups (09:21:30)
+ * Howard Butler <hobu.inc at gmail.com> text of exception changed (09:21:11)
+ * Howard Butler <hobu.inc at gmail.com> Option now supports its own Options (to indefinite depth) (09:11:37)
+ * Howard Butler <hobu.inc at gmail.com> allow fetching a copy of the stage's current options with getCurrentOptions method (09:09:42)
+
+2011-12-12
+ * Howard Butler <hobu.inc at gmail.com> rejigger the getDimension method to fall through to try the uuid if it doesn't find a dimension with the given name (17:41:47)
+ * Howard Butler <hobu.inc at gmail.com> fix up uuid support so it is based on our internal copy of the boost::uuid library so we can support boost back to 1.41 (16:35:37)
+
+2011-12-08
+ * Howard Butler <hobu.inc at gmail.com> remove unused variables (19:52:40)
+
+2011-12-06
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL into dimension_types (19:08:23)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (13:14:58)
+ * Michael P. Gerlek <mpg at flaxen.com> disable tests if PDAL not configured for them (13:12:44)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (13:05:58)
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #62 from gadomski/remove-trigger-dml (10:03:30)
+
+2011-12-05
+ * Pete Gadomski <pete.gadomski at gmail.com> Remove all oci trigger code (16:58:04)
+ * Howard Butler <hobu.inc at gmail.com> get InPlaceReprojection filter with the program (15:43:45)
+ * Howard Butler <hobu.inc at gmail.com> beef up filters.stats to work for all dimension types and use the new schema/dimension arrangement (15:26:10)
+ * Howard Butler <hobu.inc at gmail.com> only cache dimension positions in the case of a random iterator, not a sequential one (13:47:02)
+ * Howard Butler <hobu.inc at gmail.com> pass in iterator for new GetBlock function signature (13:46:38)
+ * Howard Butler <hobu.inc at gmail.com> don't create a random iterator for every single point (11:38:26)
+ * Howard Butler <hobu.inc at gmail.com> fix a doh (11:36:08)
+
+2011-12-03
+ * Howard Butler <hobu.inc at gmail.com> carry along a pointer to the Buffer's Schema so that if it changes, we can't recompute the pointers to dimensions we care about (16:07:48)
+ * Howard Butler <hobu.inc at gmail.com> de-clutter the invocation of the PointDimensions struct (16:06:54)
+ * Howard Butler <hobu.inc at gmail.com> don't create a PointBuffer every time through the loop (16:06:11)
+
+2011-12-02
+ * Howard Butler <hobu.inc at gmail.com> short-circuit looking up dimension positions for every readBufferBeginImpl call, pass these schema positions into the processBuffer call (14:20:13)
+ * Howard Butler <hobu.inc at gmail.com> use new getDimension call for fetching the BlockID dimension from the PointBuffer (14:19:07)
+ * Howard Butler <hobu.inc at gmail.com> get filters.chipper with the new dimension/schema program (12:06:26)
+ * Howard Butler <hobu.inc at gmail.com> whitespace normalization (12:06:15)
+ * Howard Butler <hobu.inc at gmail.com> whitespace normalization, merge fix (12:05:49)
+ * Howard Butler <hobu.inc at gmail.com> merge (11:23:40)
+ * Howard Butler <hobu.inc at gmail.com> get filters.chipper with the program (11:21:33)
+ * Howard Butler <hobu.inc at gmail.com> whitespace normalization (11:21:20)
+ * Howard Butler <hobu.inc at gmail.com> clean up addDefaultDimensions methods to make sure they do not depend on having anything opened to produce results (11:20:54)
+
+2011-12-01
+ * Michael P. Gerlek <mpg at flaxen.com> mingw patch from Roland S. (18:57:56)
+ * Michael P. Gerlek <mpg at flaxen.com> mingw patch from Roland S. (18:41:50)
+
+2011-11-30
+ * Howard Butler <hobu.inc at gmail.com> get TerraSolid with the program (11:27:47)
+ * Howard Butler <hobu.inc at gmail.com> update TerraSolid reader to use the new Schema/Dimension stuff (10:32:00)
+ * Howard Butler <hobu.inc at gmail.com> add a getDimension(boost::guids::guid const&) method (10:31:39)
+ * Howard Butler <hobu.inc at gmail.com> fix up QFIT reader to use new Dimension/Schema scheme (09:17:11)
+ * Howard Butler <hobu.inc at gmail.com> update for new output (07:33:45)
+ * Howard Butler <hobu.inc at gmail.com> make it easier to be able to see the command output in cases where things fail (07:33:36)
+ * Howard Butler <hobu.inc at gmail.com> return Undefined for names we don't recognize (07:32:40)
+ * Howard Butler <hobu.inc at gmail.com> byte offset defaults to -1 (07:32:26)
+ * Howard Butler <hobu.inc at gmail.com> registerFields needs stage to get its default dimensions list from (07:32:08)
+
+2011-11-29
+ * Howard Butler <hobu.inc at gmail.com> put back caching of m_byteSize for the Schema::getByteSize. This was showing up as being expensive to fetch in the profiler for some reason (12:29:47)
+ * Howard Butler <hobu.inc at gmail.com> be able to discriminate big and little-endian qfit data (11:57:25)
+ * Howard Butler <hobu.inc at gmail.com> be able to discriminate big and little-endian qfit data (11:57:25)
+ * Howard Butler <hobu.inc at gmail.com> use new getField/setField methods that take in actual dimesions. This is faster because we cut down on map lookups for finding dimension positions. (10:21:52)
+ * Howard Butler <hobu.inc at gmail.com> use the setField that takes in the Dimension to write data into the PointBuffer (08:14:02)
+ * Howard Butler <hobu.inc at gmail.com> add a setField method that takes in the Dimension (08:13:46)
+
+2011-11-28
+ * Howard Butler <hobu.inc at gmail.com> typedef a schema::size_type and set it to boost::uint32_t so it can't be <0 -- we can change this later if we need to (10:41:06)
+ * Howard Butler <hobu.inc at gmail.com> remove extra m_pointSize field from pdal::PointBuffer... we will always fetch it as a const& from the Schema::getByteSize() in case the PointBuffer's schema were to ever change (10:40:29)
+ * Howard Butler <hobu.inc at gmail.com> reformatting (10:24:10)
+ * Howard Butler <hobu.inc at gmail.com> have dimension::size_type be a boost::int32_t to support negative indices -- add a createUUID() convenience method (10:23:57)
+
+2011-11-26
+ * Howard Butler <hobu.inc at gmail.com> don't create random uuid for every dimension by creating a random generator for every dimension (21:12:51)
+
+2011-11-25
+ * Howard Butler <hobu.inc at gmail.com> add virtual addDefaultDimensions() method to Stage and Readers (for now) (14:47:19)
+ * Howard Butler <hobu.inc at gmail.com> add error for PointBuffer errors (14:46:22)
+ * Howard Butler <hobu.inc at gmail.com> add uuid and namespace elements to pdal::Dimension (14:45:57)
+ * Howard Butler <hobu.inc at gmail.com> add lexical_cast-enabled getField method to PointBuffer (14:45:26)
+
+2011-11-23
+ * Howard Butler <hobu.inc at gmail.com> finish removing the std::map and std::vector that were being used to manage the dimensions for the pdal::Schema and fully replace with a boost::multi_index (18:31:44)
+ * Howard Butler <hobu.inc at gmail.com> make multi_index non-unique to support schemas with multiple dimensions of the same name (16:05:07)
+ * Howard Butler <hobu.inc at gmail.com> deal with being unable to fetch modifiable Dimension from Schema (13:55:38)
+ * Howard Butler <hobu.inc at gmail.com> back pdal::Schema by a boost::multi_index and start to incorporate that into pdal::Schema's inner workings (10:32:07)
+
+2011-11-22
+ * Howard Butler <hobu.inc at gmail.com> start bolting in new dimension stuff into FauxReader (16:44:24)
+ * Howard Butler <hobu.inc at gmail.com> fix up flags (14:44:08)
+ * Howard Butler <hobu.inc at gmail.com> more pdal::Dimension churn (14:31:18)
+ * Howard Butler <hobu.inc at gmail.com> start reorganizing pdal::Dimension and friends (13:05:56)
+ * Howard Butler <hobu.inc at gmail.com> AttributeFilter does nothing right now, no-op the readBuffer method (12:40:13)
+ * Michael P. Gerlek <mpg at flaxen.com> remove liblas dependency (12:33:22)
+ * Howard Butler <hobu.inc at gmail.com> msvc9 can't do default arguments for templates for some reason (11:27:19)
+ * Howard Butler <hobu.inc at gmail.com> need proper namespacing on cstdint for vc9 (11:26:50)
+ * Howard Butler <hobu.inc at gmail.com> specializations should be for all MSVCs (11:26:34)
+ * Howard Butler <hobu.inc at gmail.com> specializations should be for all MSVCs (11:26:16)
+ * Howard Butler <hobu.inc at gmail.com> need proper namespacing on cstdint for vc9 (11:25:46)
+
+2011-11-21
+ * Howard Butler <hobu.inc at gmail.com> move trigger enable/disable code near sdo_pc.init() invocation (19:08:40)
+ * Howard Butler <hobu.inc at gmail.com> cast to void* to silence alignment warnings. please review mpgerlek (17:13:51)
+ * Howard Butler <hobu.inc at gmail.com> -ansi only works on gcc, not clang (17:13:24)
+ * Howard Butler <hobu.inc at gmail.com> fix prototype so we are not hiding StageBase::getNumPoints (16:47:29)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (15:37:06)
+ * Howard Butler <hobu.inc at gmail.com> we can no longer instantiate invalid bounds. Bounds for the header must be given in their entirety instead of SetMax and SetMin individually (15:36:56)
+ * Howard Butler <hobu.inc at gmail.com> Bounds::clip can produce invalid bounds. we can no longer instantiate invalid bounds (15:36:21)
+ * Howard Butler <hobu.inc at gmail.com> report the min and max values when bounds is flipped (15:35:51)
+ * Michael P. Gerlek <mpg at flaxen.com> add new pdal_internal.h to IDE (12:02:51)
+ * Michael P. Gerlek <mpg at flaxen.com> pdal.h fallout (12:02:28)
+ * Michael P. Gerlek <mpg at flaxen.com> comments (11:49:34)
+ * Howard Butler <hobu.inc at gmail.com> Revert "add base_trigger_reenable bool option to control whether or not to adjust the trigger created by sdo_pc.init()" (11:10:07)
+ * Howard Butler <hobu.inc at gmail.com> add base_trigger_reenable bool option to control whether or not to adjust the trigger created by sdo_pc.init() (10:18:33)
+
+2011-11-20
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (07:26:46)
+ * Howard Butler <hobu.inc at gmail.com> do not build SWIG C# by default on windows. I don't have swig.exe in my path, which this now requires (07:26:22)
+
+2011-11-18
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:39:54)
+ * Howard Butler <hobu.inc at gmail.com> add Option for reading little-endian written QFIT files... not that we have a frickin way to know if they were written that way :( (14:39:31)
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #59 from mloskot/pdal-mloskot-fixes (09:08:38)
+
+2011-11-17
+ * Mateusz Loskot <mateusz at loskot.net> Fix boost::bind compilation error by removing CPL_STDCALL from Debug bindable callbacks. (17:26:47)
+ * Mateusz Loskot <mateusz at loskot.net> Recognise MSVC11 in root CMakeLists.txt (17:24:59)
+ * Mateusz Loskot <mateusz at loskot.net> Perform CMake configuration for SWIG only if SWIG_FOUND to avoid CMake Error at CMakeLists.txt:271 (include) (16:48:48)
+
+2011-11-16
+ * Howard Butler <hobu.inc at gmail.com> basic points2grid interpolation works -- see pipeline_interpolate.xml for an example (16:34:41)
+ * Howard Butler <hobu.inc at gmail.com> link points2grid library if it is there (16:34:06)
+ * Howard Butler <hobu.inc at gmail.com> add method to adjust the floating point output precision (and turn it off) (16:33:48)
+ * Howard Butler <hobu.inc at gmail.com> more points2grid work (15:38:46)
+ * Howard Butler <hobu.inc at gmail.com> allow +inf, -inf bounds instances for cumulators (15:38:23)
+ * Howard Butler <hobu.inc at gmail.com> points2grid scaffolding (13:32:36)
+ * Howard Butler <hobu.inc at gmail.com> add Points2Grid-finding infrastructure (12:05:24)
+
+2011-11-15
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (19:25:02)
+ * Howard Butler <hobu.inc at gmail.com> rename pdal.hpp to pdal_interal.hpp to reserve pdal.hpp for the go-to public header for the library (19:24:52)
+
+2011-11-14
+ * Michael P. Gerlek <mpg at flaxen.com> lint (19:22:21)
+ * Michael P. Gerlek <mpg at flaxen.com> rm temp file (19:21:39)
+ * Michael P. Gerlek <mpg at flaxen.com> updated for filter renamings (19:09:56)
+ * Michael P. Gerlek <mpg at flaxen.com> win32 linkage fixes (19:08:37)
+ * Michael P. Gerlek <mpg at flaxen.com> fixups for Filter renaming (18:32:49)
+ * Michael P. Gerlek <mpg at flaxen.com> fixups for Filter renaming (18:06:20)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (17:53:31)
+ * Michael P. Gerlek <mpg at flaxen.com> added MosaicFilter and Bounds tests (17:53:22)
+ * Michael P. Gerlek <mpg at flaxen.com> added MosaicFilter and Bounds tests (17:50:40)
+ * Howard Butler <hobu.inc at gmail.com> rename pdal::filters::MosaicFilter -> pdal::filters::Mosaic (16:38:45)
+ * Howard Butler <hobu.inc at gmail.com> rename pdal::filters::MosaicFilter -> pdal::filters::Mosaic (16:37:29)
+ * Howard Butler <hobu.inc at gmail.com> rename pdal::filters::StatsFilter -> pdal::filters::Stats (16:27:45)
+ * Howard Butler <hobu.inc at gmail.com> rename pdal::filters::ReprojectionFilter -> pdal::filters::Reprojection (16:19:19)
+ * Howard Butler <hobu.inc at gmail.com> rename pdal::filters::ReprojectionFilter -> pdal::filters::Reprojection (16:18:53)
+ * Howard Butler <hobu.inc at gmail.com> rename pdal::filters::ScalingFilter to pdal::filters::Scaling (16:11:45)
+ * Howard Butler <hobu.inc at gmail.com> rename pdal::filters::InPlaceReprojectionFilter -> pdal::filters::InPlaceReprojection (16:03:12)
+ * Howard Butler <hobu.inc at gmail.com> rename pdal::filters::DecimationFilter -> pdal::filters::Decimation (15:54:44)
+ * Howard Butler <hobu.inc at gmail.com> rename pdal::filters::CropFilter -> pdal::filters::Crop (15:45:50)
+ * Howard Butler <hobu.inc at gmail.com> pdal::filters::ColorFilter -> pdal::filters::Color (15:35:56)
+ * Howard Butler <hobu.inc at gmail.com> consolidate pdal::filters::Chipper (15:28:55)
+ * Howard Butler <hobu.inc at gmail.com> rename CacheFilter source files to Cache (15:21:38)
+ * Howard Butler <hobu.inc at gmail.com> rename pdal::filters::CacheFilter -> pdal::filters::Cache (15:15:52)
+ * Howard Butler <hobu.inc at gmail.com> more filter/iterator rearranging -- file renaming (15:03:58)
+ * Howard Butler <hobu.inc at gmail.com> rearrange ByteSwapFilter to new regime (15:00:56)
+ * Howard Butler <hobu.inc at gmail.com> more pdal::filters::Attribute deckchairing (14:52:16)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:47:17)
+ * Howard Butler <hobu.inc at gmail.com> reorganize pdal::filters::Attribute and pdal::filters::iterators::sequential::Attribute (14:47:08)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (14:21:55)
+ * Michael P. Gerlek <mpg at flaxen.com> updated (14:21:41)
+ * Michael P. Gerlek <mpg at flaxen.com> quick fix for missing LogPtr defn (14:21:23)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:21:12)
+ * Howard Butler <hobu.inc at gmail.com> stubs for pdal::filters::AttributeFilter (14:21:03)
+ * Michael P. Gerlek <mpg at flaxen.com> win32 linkage fix (14:20:32)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (13:52:08)
+ * Michael P. Gerlek <mpg at flaxen.com> undo mrosen changes (13:51:18)
+ * Howard Butler <hobu.inc at gmail.com> back pdal::Options by a multimap so we can have multiple same-named options (13:20:42)
+ * Howard Butler <hobu.inc at gmail.com> add default options for CacheFilter (10:51:37)
+
+2011-11-12
+ * Michael Rosen <michael.rosen at gmail.com> Merge branch 'master' of https://github.com/PDAL/PDAL (21:24:17)
+
+2011-11-11
+ * Michael Rosen <michael.rosen at gmail.com> SWIG bindings from .hpp files instead of hand-rolled duplicates. Director and GC-proofing work. (14:09:46)
+ * Howard Butler <hobu.inc at gmail.com> tweak pdal::gdal::Debug to only be active when PDAL_HAVE_GDAL is true (13:01:38)
+ * Howard Butler <hobu.inc at gmail.com> add pdal::gdal::Debug support to ReprojectionFilter too (11:46:39)
+ * Howard Butler <hobu.inc at gmail.com> add some debugging options for reprojection example (11:38:52)
+ * Howard Butler <hobu.inc at gmail.com> pop the error handler when we go away (11:38:38)
+ * Howard Butler <hobu.inc at gmail.com> don't pop GDAL's error handlers... the pdal::gdal::Debug object handles all that now (11:38:18)
+ * Howard Butler <hobu.inc at gmail.com> add support for the GDAL debug object for InPlaceReprojectionFilter (11:37:54)
+ * Howard Butler <hobu.inc at gmail.com> consolidate GDAL logging operations into a helper class and utilize for drivers.oci.reader and drivers.oci.writer (10:51:38)
+ * Howard Butler <hobu.inc at gmail.com> only ->flush() if we have the file (10:51:02)
+ * Howard Butler <hobu.inc at gmail.com> move LogPtr into Log.hpp (10:50:22)
+ * Howard Butler <hobu.inc at gmail.com> more ignores (09:28:09)
+
+2011-11-10
+ * Howard Butler <hobu.inc at gmail.com> tweak logging output (13:49:00)
+ * Howard Butler <hobu.inc at gmail.com> the string might not contain a null, use fixed-length constructor (13:48:49)
+
+2011-11-09
+ * Howard Butler <hobu.inc at gmail.com> more Mississippi example stuff including reverse reprojection example (15:07:06)
+ * Howard Butler <hobu.inc at gmail.com> add Mississippi example for vertical reprojection of ft data (14:56:46)
+ * Howard Butler <hobu.inc at gmail.com> make sure to flush the log before we exit (13:54:09)
+ * Howard Butler <hobu.inc at gmail.com> support overriding coordinate system with an option (12:44:48)
+ * Howard Butler <hobu.inc at gmail.com> use ESRI WKT for the .prj file instead of OGC (12:15:13)
+ * Howard Butler <hobu.inc at gmail.com> add inplace reprojection example (12:14:46)
+ * Howard Butler <hobu.inc at gmail.com> add WKT description of the coordinate system for Autzen data (11:42:16)
+ * Howard Butler <hobu.inc at gmail.com> skip the LASzip VLR entirely for file comparison testing. This is still fragile if Martin changes the encoding format, however (10:55:13)
+ * Howard Butler <hobu.inc at gmail.com> dur, copy/paste error by hobu (10:42:30)
+ * Howard Butler <hobu.inc at gmail.com> more tweaking of pdal::Log for #26 -- now with some docs too (09:57:37)
+ * Howard Butler <hobu.inc at gmail.com> move another logging statement (09:56:58)
+ * Howard Butler <hobu.inc at gmail.com> fix #57 and add some logging (08:38:12)
+
+2011-11-08
+ * Howard Butler <hobu.inc at gmail.com> more fixups related to #26 (11:03:34)
+ * Howard Butler <hobu.inc at gmail.com> more fixups related to #26 (10:35:08)
+ * Howard Butler <hobu.inc at gmail.com> redo the logging system #26 (10:08:22)
+
+2011-11-07
+ * Howard Butler <hobu.inc at gmail.com> update for new reader (11:11:13)
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #55 from gadomski/master (09:33:48)
+
+2011-11-05
+ * Howard Butler <hobu.inc at gmail.com> support SELECT CLOUD FROM TABLE to return a list of clouds and export them in addition to the {BLOCK_FIELDS, CLOUD} view scenario that is currently supported. (21:00:24)
+ * Howard Butler <hobu.inc at gmail.com> add read_error to throw when encountering read problems (20:58:48)
+ * Howard Butler <hobu.inc at gmail.com> flip test to correct direction for verbosity (15:42:40)
+
+2011-11-04
+ * Howard Butler <hobu.inc at gmail.com> consolidate fetching the cloud statement from the reader (13:40:05)
+ * Howard Butler <hobu.inc at gmail.com> get rid of CloudPtr stuff -- no need anymore (13:00:56)
+ * Howard Butler <hobu.inc at gmail.com> start separating block fetching (12:42:19)
+ * Howard Butler <hobu.inc at gmail.com> add logging for query type (10:34:19)
+
+2011-11-02
+ * Howard Butler <hobu.inc at gmail.com> support querying for BLK_TABLE+SDO_PC view for drivers.oci.reader (21:04:53)
+ * Howard Butler <hobu.inc at gmail.com> use the Schema from the PointBuffer, not the stage, for writing (20:49:07)
+ * Howard Butler <hobu.inc at gmail.com> use the PointBuffers schema for creating new PointBuffers in case someone changed it (20:48:36)
+ * Howard Butler <hobu.inc at gmail.com> start supporting multiple SDO_PC queries (14:01:15)
+
+2011-11-01
+ * Howard Butler <hobu.inc at gmail.com> back up 924e1348db76149d9f38aadeb7ee95e1d8efe1d8 a bit to make it a different method name so the compiler cant get confused (12:13:50)
+ * Howard Butler <hobu.inc at gmail.com> HeaderPtr changed (12:13:21)
+
+2011-10-31
+ * Pete Gadomski <pete.gadomski at gmail.com> require boost 1.41, not 1.44 (18:43:59)
+ * Howard Butler <hobu.inc at gmail.com> decruft (14:40:34)
+ * Howard Butler <hobu.inc at gmail.com> decruft (14:40:25)
+ * Howard Butler <hobu.inc at gmail.com> used cached byte positions to avoid per-point map lookup of positions for getField queries (14:40:00)
+ * Howard Butler <hobu.inc at gmail.com> use inplacereprojfilter because the scalingfilter combo doesnt work right now (14:39:03)
+ * Howard Butler <hobu.inc at gmail.com> use inplacereprojfilter because the scalingfilter combo doesnt work right now (14:38:18)
+ * Howard Butler <hobu.inc at gmail.com> add getField specialization for fetching based on a pointIndex and Schema::getByteOffset() output (14:36:06)
+ * Howard Butler <hobu.inc at gmail.com> no longer include tuple, not used (14:34:57)
+
+2011-10-27
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (18:29:28)
+ * Michael P. Gerlek <mpg at flaxen.com> update build instructions (18:28:46)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:24:24)
+ * Howard Butler <hobu.inc at gmail.com> initialize connection object (14:24:16)
+ * Howard Butler <hobu.inc at gmail.com> use proper reference to getOptions when setting up OracleDriver (14:23:13)
+ * Howard Butler <hobu.inc at gmail.com> put back Cloud impl (14:22:38)
+ * Michael P. Gerlek <mpg at flaxen.com> remove DimensionLayout (OBE) (13:25:11)
+ * Michael P. Gerlek <mpg at flaxen.com> win32 lint for boost (13:03:33)
+ * Michael P. Gerlek <mpg at flaxen.com> win32 lint (13:03:08)
+
+2011-10-26
+ * Howard Butler <hobu.inc at gmail.com> consolidate oracle connection code, and enable things to take advantage of new GDAL RFC 37 logging that should soon be in place (14:20:06)
+
+2011-10-25
+ * Howard Butler <hobu.inc at gmail.com> start using new RFC 37 GDAL logging facilities (13:56:06)
+ * Howard Butler <hobu.inc at gmail.com> add verbosity level to log output (13:55:30)
+
+2011-10-20
+ * Howard Butler <hobu.inc at gmail.com> return new Chipper dimension name for getIdFromName (08:44:30)
+ * Howard Butler <hobu.inc at gmail.com> fix typo for mapping old chipper field names to new :) (08:44:13)
+
+2011-10-18
+ * Howard Butler <hobu.inc at gmail.com> namespace the chipper's dimensions (10:37:44)
+ * Howard Butler <hobu.inc at gmail.com> need add() instead of put() to the tree (09:58:16)
+ * Howard Butler <hobu.inc at gmail.com> overwrite the serialization file if it already exists. (09:57:58)
+ * Howard Butler <hobu.inc at gmail.com> add method to remap old schema names into new ones (09:33:34)
+
+2011-10-17
+ * Howard Butler <hobu.inc at gmail.com> use new logging stuff (16:06:49)
+ * Howard Butler <hobu.inc at gmail.com> use verbosity level and isDebug to determine whether or not to log (16:06:41)
+ * Howard Butler <hobu.inc at gmail.com> start using our fancy new logging system (11:47:25)
+ * Howard Butler <hobu.inc at gmail.com> logging system for pipelines. Logging cannot currently happen in pipeline constructors, and can only happen after initialize() has started the log. Files or stderr/stdout/stdlog can be used in the <Option name="log"/> (11:47:05)
+
+2011-10-16
+ * Howard Butler <hobu.inc at gmail.com> add pc_id pdal::Option if it doesn't exist (11:12:09)
+ * Howard Butler <hobu.inc at gmail.com> rename convert_z_units option to scale_z, and allow the user to set it how they wish (09:54:10)
+ * Howard Butler <hobu.inc at gmail.com> put the pc_id into the options so it is written out when serialized (09:32:59)
+ * Howard Butler <hobu.inc at gmail.com> add pipeline-serialization option to allow the user to serialize the pipeline they created (or used, if some stage happened to modify it like the drivers.oracle.writer (09:32:42)
+
+2011-10-14
+ * Howard Butler <hobu.inc at gmail.com> just set the scale for the field if we're converting z's to 0.001 (15:00:20)
+ * Howard Butler <hobu.inc at gmail.com> millimiters -> m is 1000, not 100 (10:36:30)
+
+2011-10-13
+ * Howard Butler <hobu.inc at gmail.com> add sql script for wiping the test tables in the event that the test crashed for whatever reason. rename qfit example (14:46:54)
+ * Howard Butler <hobu.inc at gmail.com> a functional test scenario for Oracle :) (14:46:18)
+ * Howard Butler <hobu.inc at gmail.com> whitespace normalization (14:46:01)
+ * Howard Butler <hobu.inc at gmail.com> consolidate block buffer reading into a single function so we can (eventually) do it in a couple of different places (14:45:49)
+ * Howard Butler <hobu.inc at gmail.com> qfit pipelines (12:45:46)
+ * Howard Butler <hobu.inc at gmail.com> xyz values are int32_t, not uint32_t for LAS data. We should use a reference to the dimension when applying scaling for the summary data. Only throw exceptions when we don't have XYZ data. Otherwise, write 0's (12:44:38)
+ * Howard Butler <hobu.inc at gmail.com> Dimensions must have a default scale of 1.0, not 0.0 or they can't exist and we can't apply scaling/descaling to them (12:43:25)
+ * Howard Butler <hobu.inc at gmail.com> adjust the passive_z values if we are altering the regular z ones (12:42:15)
+ * Howard Butler <hobu.inc at gmail.com> Dimensions must have a default scale of 1.0, not 0.0 or they can't exist and we can't apply scaling/descaling to them (12:41:18)
+ * Howard Butler <hobu.inc at gmail.com> prefix QFIT dimensions with QFIT: name (12:40:42)
+
+2011-10-12
+ * Howard Butler <hobu.inc at gmail.com> a test that writes data (15:54:34)
+ * Howard Butler <hobu.inc at gmail.com> RunFileSQL does not need to throw if the option isn't there (15:52:00)
+ * Howard Butler <hobu.inc at gmail.com> clean up error message to use correct filter name (15:51:40)
+ * Howard Butler <hobu.inc at gmail.com> more decrufting (14:19:21)
+ * Howard Butler <hobu.inc at gmail.com> do the scaling dance before subtracting 180, or it doesn't mean so much :) (14:19:02)
+ * Howard Butler <hobu.inc at gmail.com> start to revive the oracle test (11:21:14)
+ * Howard Butler <hobu.inc at gmail.com> more decrufting of the drivers.oci.reader (11:21:00)
+ * Howard Butler <hobu.inc at gmail.com> remove dead defineBlock method - this is now on the iterator (10:58:50)
+ * Howard Butler <hobu.inc at gmail.com> compare_no_case does not belong here. we have boost, dammit! (yes, I was the proliferator of this monstrocity) (10:47:43)
+ * Howard Butler <hobu.inc at gmail.com> use boost's string algos instead of our own for comparing strings and uppercasing them (10:35:59)
+ * Howard Butler <hobu.inc at gmail.com> remove redundant Debug method (10:17:19)
+ * Howard Butler <hobu.inc at gmail.com> move GDAL/SQL debug setting into the ::Connect method to eliminate duplication (10:12:59)
+ * Howard Butler <hobu.inc at gmail.com> decruft OptionsOld stuff (09:09:07)
+ * Howard Butler <hobu.inc at gmail.com> decrufting (09:08:57)
+ * Howard Butler <hobu.inc at gmail.com> x and y's were flipped in qfit reader. make right (08:56:30)
+
+2011-10-11
+ * Howard Butler <hobu.inc at gmail.com> get rid of all of the old OptionsOld cruft (16:26:11)
+ * Howard Butler <hobu.inc at gmail.com> turn off doxygendiagram for now (16:15:03)
+ * Howard Butler <hobu.inc at gmail.com> doxygendiagram testing -- doesn't work yet though (16:13:23)
+
+2011-10-07
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (20:19:07)
+ * Howard Butler <hobu.inc at gmail.com> remove foss4g sign (20:18:58)
+
+2011-10-06
+ * Howard Butler <hobu.inc at gmail.com> add getDimensionOperationType to StageBase (11:38:46)
+
+2011-10-05
+ * Howard Butler <hobu.inc at gmail.com> get rid of magic numbers in VLR userid and description reading (15:15:31)
+ * Howard Butler <hobu.inc at gmail.com> cleanups (15:15:12)
+ * Howard Butler <hobu.inc at gmail.com> add StageOperationType enum (15:09:01)
+ * Howard Butler <hobu.inc at gmail.com> remove recalculateSizes and make calculateSizes private (12:29:33)
+
+2011-09-30
+ * Howard Butler <hobu.inc at gmail.com> Execute does an implicit Fetch() (10:42:36)
+ * Howard Butler <hobu.inc at gmail.com> more debug info on table-finding code (10:11:35)
+
+2011-09-29
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (17:11:51)
+ * Michael P. Gerlek <mpg at flaxen.com> remove DimensionLayout (16:42:29)
+ * Michael P. Gerlek <mpg at flaxen.com> refactor to remove DimensionLayout (16:34:07)
+ * Howard Butler <hobu.inc at gmail.com> merge (16:03:45)
+ * Michael P. Gerlek <mpg at flaxen.com> flip the try/catch pancakes (15:32:28)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (15:11:06)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:59:37)
+ * Howard Butler <hobu.inc at gmail.com> remove lint (14:59:29)
+ * Michael P. Gerlek <mpg at flaxen.com> remove unneeded by-ref accessor (14:54:36)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:45:17)
+ * Howard Butler <hobu.inc at gmail.com> oracle writer updates (14:45:08)
+ * Michael P. Gerlek <mpg at flaxen.com> set endianness bits at consturction time (14:33:11)
+ * Michael P. Gerlek <mpg at flaxen.com> make SchemaLayout go away; update swig (14:17:20)
+ * Michael P. Gerlek <mpg at flaxen.com> refactoring to make SchemaLayout go away (13:47:21)
+ * Michael P. Gerlek <mpg at flaxen.com> spelling (13:17:34)
+ * Michael P. Gerlek <mpg at flaxen.com> refactoring to continue to remove need for SchemaLayout (13:16:07)
+ * Michael P. Gerlek <mpg at flaxen.com> refactoring to start to remove need for SchemaLayout (12:56:59)
+ * Michael P. Gerlek <mpg at flaxen.com> move lookup system over to DimensionId (12:08:22)
+ * Michael P. Gerlek <mpg at flaxen.com> use a table to lookup the known dims (11:55:16)
+ * Michael P. Gerlek <mpg at flaxen.com> move name-based lookup into DimId class (11:46:45)
+ * Michael P. Gerlek <mpg at flaxen.com> refactor id enums into a separate, static class (11:14:16)
+
+2011-09-28
+ * Michael P. Gerlek <mpg at flaxen.com> spelling fix (19:20:05)
+ * Michael P. Gerlek <mpg at flaxen.com> remove awkward get& member (19:19:10)
+ * Michael P. Gerlek <mpg at flaxen.com> remove gratuitous typedefs for Dimension iterators (19:13:01)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (15:10:40)
+ * Michael P. Gerlek <mpg at flaxen.com> ingore messy path stuff in outputs (15:10:32)
+ * Michael P. Gerlek <mpg at flaxen.com> added ability to skip a line when diffing (15:10:19)
+ * Howard Butler <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (15:05:00)
+ * Howard Butler <hobu.inc at gmail.com> test equality instead of similarity for block table name -- being greedy here could bite us (15:04:50)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (14:38:41)
+ * Michael P. Gerlek <mpg at flaxen.com> removed unused include, which caused BOOLEAN type redef issues on windows (14:36:55)
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #53 from gadomski/master (12:05:24)
+ * Howard Butler <hobu.inc at gmail.com> don't write red, green, blue, time if the PointBuffer doesn't have it even though the PointFormat says it should (11:52:54)
+ * Howard Butler <hobu.inc at gmail.com> throw an out_of_range error if removeScaling causes the de-scaled value to be outside the bounds of the requested data type (10:53:24)
+
+2011-09-27
+ * Howard Butler <hobu.inc at gmail.com> update drivers.oci.reader to actually work. this was broken and never seemed to work right before :( (16:33:49)
+ * Howard Butler <hobu.inc at gmail.com> update to use FileUtils (16:33:16)
+ * Howard Butler <hobu.inc at gmail.com> add setDataStride method to support copying in chunks of raw PointBuffer data (16:30:35)
+ * Howard Butler <hobu.inc at gmail.com> InPlaceReprojectionFilter - hopes to do what it says :) (15:13:15)
+ * Howard Butler <hobu.inc at gmail.com> clearer name for chipper dimensions (15:12:42)
+ * Howard Butler <hobu.inc at gmail.com> getDimensions() method that returns a non-const& (15:11:45)
+ * Howard Butler <hobu.inc at gmail.com> be able to identify chipper dimension types (15:11:08)
+
+2011-09-23
+ * Howard Butler <hobu.inc at gmail.com> kick the test-no-passing-because-of-silly-file-path-comparisons can to mpg (12:20:51)
+ * Howard Butler <hobu.inc at gmail.com> point dump scales data now (11:14:12)
+ * Pete Gadomski <pete.gadomski at gmail.com> Fixed the LiblasWriterTest to match the changed uuid function def (11:08:46)
+ * Howard Butler <hobu.inc at gmail.com> point oracle pipeline examples to public server (11:01:41)
+ * Howard Butler <hobu.inc at gmail.com> catch the reference to the exception to eliminate a copy (08:56:37)
+ * Howard Butler <hobu.inc at gmail.com> modify getPTree to apply the Dimension's scaling before handing off the string to the property_tree (08:52:03)
+
+2011-09-22
+ * Howard Butler <hobu.inc at gmail.com> more error checking around stream handling (20:45:35)
+ * Howard Butler <hobu.inc at gmail.com> add default option for capacity, fix copy/paste error of dimension creation (20:45:19)
+ * Howard Butler <hobu.inc at gmail.com> tighten up error checking (20:44:35)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (15:32:00)
+ * Michael P. Gerlek <mpg at flaxen.com> moved Dimension 'index' access to SchemaLayout (15:31:49)
+ * Howard Butler <hobu.inc at gmail.com> add another check to make sure readBufferEnd is called before readEnd() (14:58:12)
+ * Howard Butler <hobu.inc at gmail.com> flip the logic around a bit so we don't rethrow exceptions (14:48:21)
+ * Howard Butler <hobu.inc at gmail.com> add qfit reader example (14:16:04)
+ * Howard Butler <hobu.inc at gmail.com> break up innerRun a little bit and add 'Hardcore Debug' which will not trap errors and instead throw exceptions all the way up to make it easier to debug things (14:15:14)
+ * Pete Gadomski <pete.gadomski at gmail.com> Include uuids from pdal::external::boost (12:59:47)
+ * Howard Butler <hobu.inc at gmail.com> do proper rounding when converting mm->m for z's (12:03:13)
+ * Howard Butler <hobu.inc at gmail.com> flip bytes first, then do math, not the other way (11:48:21)
+ * Howard Butler <hobu.inc at gmail.com> silence warning about comparing doubles (11:41:57)
+ * Michael P. Gerlek <mpg at flaxen.com> fix memleaks (11:11:36)
+ * Michael P. Gerlek <mpg at flaxen.com> comment (11:10:38)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (11:03:07)
+ * Michael P. Gerlek <mpg at flaxen.com> umm, need to actually set the schema (11:02:57)
+ * Michael P. Gerlek <mpg at flaxen.com> untabify (11:02:32)
+ * Howard Butler <hobu.inc at gmail.com> add options for flipping x coordinates and scaling z coords (10:58:20)
+ * Howard Butler <hobu.inc at gmail.com> remove extra ; (10:57:33)
+
+2011-09-20
+ * Howard Butler <hobu.inc at gmail.com> remove extra qualifications (15:32:36)
+ * hobu <hobu.inc at gmail.com> remove extra class qualification (15:02:03)
+ * hobu <hobu.inc at gmail.com> remove extra , (15:01:42)
+ * hobu <hobu.inc at gmail.com> handle Dimension::Pointer (15:00:39)
+
+2011-09-19
+ * Michael P. Gerlek <mpg at flaxen.com> fixed description field of Dimension (18:08:11)
+ * Michael P. Gerlek <mpg at flaxen.com> make the Dimension be a single enum, not an enum+datatype combination (17:24:54)
+ * Michael P. Gerlek <mpg at flaxen.com> win32 build notes, from Syncadd (11:51:06)
+ * Michael P. Gerlek <mpg at flaxen.com> cleaned up, with help from Syncadd (11:49:32)
+ * Michael P. Gerlek <mpg at flaxen.com> remove comment (11:48:36)
+ * Michael P. Gerlek <mpg at flaxen.com> only link with liblas if needed (11:43:44)
+
+2011-09-17
+ * Michael P. Gerlek <mpg at flaxen.com> obsolete (16:14:28)
+ * Michael P. Gerlek <mpg at flaxen.com> add IDE support for uuid files (11:02:24)
+
+2011-09-16
+ * Howard Butler <hobu.inc at gmail.com> add link to community page (18:54:26)
+
+2011-09-15
+ * Michael P. Gerlek <mpg at flaxen.com> fix windows paths issues (11:53:29)
+ * Michael P. Gerlek <mpg at flaxen.com> make repaceAll public (11:52:55)
+
+2011-09-09
+ * hobu <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (10:40:57)
+ * hobu <hobu.inc at gmail.com> properly namespace pdal::external::boost::uuid and use it throughout to get back to boost >1.41 compatibility (10:40:48)
+ * hobu <hobu.inc at gmail.com> more work for #51 (10:07:12)
+ * hobu <hobu.inc at gmail.com> more work for #51 (10:04:35)
+ * hobu <hobu.inc at gmail.com> use interal boost::uuid includes #51 (09:50:46)
+ * hobu <hobu.inc at gmail.com> more updates to boost::uuid to support PDAL-only copy (09:49:39)
+ * hobu <hobu.inc at gmail.com> updating boost::uuid to use PDAL-copied external includes so we can support back to boost 1.41 #51 (09:43:53)
+ * hobu <hobu.inc at gmail.com> add boost::uuid to external includes so we can support back to boost 1.41 #51 (09:41:29)
+
+2011-09-08
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (18:31:26)
+ * Michael P. Gerlek <mpg at flaxen.com> added writer example; added Options support (18:31:16)
+ * hobu <hobu.inc at gmail.com> throw correct error (15:33:47)
+ * hobu <hobu.inc at gmail.com> add oracle example pipelines (11:49:18)
+ * hobu <hobu.inc at gmail.com> add more logo stuff (09:56:18)
+
+2011-09-07
+ * Michael P. Gerlek <mpg at flaxen.com> updated (14:55:54)
+
+2011-09-01
+ * Howard Butler <hobu.inc at gmail.com> clean up more whitespace sensitivity in boost::property::write_xml test output (10:31:39)
+ * Howard Butler <hobu.inc at gmail.com> there's some whitespace sensitivity in boost::property_tree xml output for some versions (10:22:04)
+ * hobu <hobu.inc at gmail.com> don't include liblas header for OCI test -- use native (09:50:15)
+ * hobu <hobu.inc at gmail.com> don't include liblas header for OCI test -- use native (09:49:42)
+
+2011-08-31
+ * hobu <hobu.inc at gmail.com> more attempt to support older boost::filesystem... (19:42:41)
+ * hobu <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (19:39:06)
+ * hobu <hobu.inc at gmail.com> attempt to support older boost::filesystem... trying to get back to at least boost 1.42 if we can (19:38:57)
+ * Michael P. Gerlek <mpg at flaxen.com> renamed LiblasReader,LiblasWriter to Reader,Writer (19:31:05)
+ * Michael P. Gerlek <mpg at flaxen.com> renamed LasReader,LasWriter to Reader,Writer (19:01:09)
+ * Michael P. Gerlek <mpg at flaxen.com> Color class fallout (18:38:39)
+ * Michael P. Gerlek <mpg at flaxen.com> rename exceptions.hpp to pdal_error.hpp, and only include it where needed (18:30:37)
+ * Michael P. Gerlek <mpg at flaxen.com> remove Color class -- not used (18:08:53)
+ * Michael P. Gerlek <mpg at flaxen.com> vs2010 wants enums declared before use (18:06:13)
+ * hobu <hobu.inc at gmail.com> missing api docs (14:05:50)
+ * hobu <hobu.inc at gmail.com> more documentation with sphinx/breathe (14:04:32)
+ * hobu <hobu.inc at gmail.com> move doxygen output to ./doc/doxygen instead of api/ more breathe/doxygen work for pdal::Bounds (10:37:05)
+ * hobu <hobu.inc at gmail.com> more documentation for pdal::Bounds and use pdal::bounds_error for exceptions instead of std::runtime_error (10:36:29)
+ * hobu <hobu.inc at gmail.com> add bounds_error exception and #include <pdal/exceptions.hpp> directly in <pdal/pdal.hpp (10:35:52)
+ * hobu <hobu.inc at gmail.com> move doxygen stuff to doxygen directory instead of api directory (09:24:35)
+ * hobu <hobu.inc at gmail.com> move doxygen stuff to doxygen directory instead of api directory (09:24:23)
+
+2011-08-30
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:/PDAL/PDAL (21:28:01)
+ * Michael P. Gerlek <mpg at flaxen.com> lots of updating (20:08:50)
+ * Michael P. Gerlek <mpg at flaxen.com> moved PointBufferCache into filters/ (18:29:53)
+ * Michael P. Gerlek <mpg at flaxen.com> clarification (18:21:36)
+ * hobu <hobu.inc at gmail.com> implement support for breath from https://github.com/hobu/breathe to allow us to embed doxygen into the sphinx output (14:12:27)
+ * hobu <hobu.inc at gmail.com> we want to generate XML for breathe support for sphinx (13:04:13)
+
+2011-08-29
+ * Michael P. Gerlek <mpg at flaxen.com> obsolete (17:45:40)
+ * Michael P. Gerlek <mpg at flaxen.com> added doxy comments (17:05:09)
+ * Michael P. Gerlek <mpg at flaxen.com> fix for doxy (16:27:36)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (16:23:47)
+ * Michael P. Gerlek <mpg at flaxen.com> doxy lint (16:23:34)
+ * Michael P. Gerlek <mpg at flaxen.com> configured for PDAL usage (16:23:05)
+ * Michael P. Gerlek <mpg at flaxen.com> auto-updated to doxy ver 1.7.5.1 (15:59:40)
+ * Michael P. Gerlek <mpg at flaxen.com> doxy conf file from liblas (15:58:16)
+ * hobu <hobu.inc at gmail.com> add download link (14:23:47)
+ * hobu <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:09:53)
+ * hobu <hobu.inc at gmail.com> add logo files (14:09:49)
+ * Michael P. Gerlek <mpg at flaxen.com> fix default point number (14:02:33)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:/PDAL/PDAL (12:23:51)
+ * hobu <hobu.inc at gmail.com> move foss4g icon up (10:04:22)
+
+2011-08-26
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (23:43:30)
+ * Michael P. Gerlek <mpg at flaxen.com> noticed these lines were missing (23:43:06)
+ * hobu <hobu.inc at gmail.com> link to ASI for pointcloud.org domain (16:19:06)
+ * hobu <hobu.inc at gmail.com> more doc reorg (15:31:08)
+ * hobu <hobu.inc at gmail.com> more doc reorg (14:35:00)
+ * hobu <hobu.inc at gmail.com> doc reorg (14:32:34)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (12:45:26)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:/PDAL/PDAL (12:10:58)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:/PDAL/PDAL (12:10:46)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (12:10:03)
+ * Michael P. Gerlek <mpg at flaxen.com> always print trailing 100% (12:09:54)
+ * Michael P. Gerlek <mpg at flaxen.com> added progress reporting to pc2pc (12:02:57)
+ * Michael P. Gerlek <mpg at flaxen.com> added --chunk_size option (12:02:39)
+ * hobu <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (10:17:10)
+ * hobu <hobu.inc at gmail.com> fix ORA-01480 to add a trailing null (10:16:59)
+
+2011-08-25
+ * Michael P. Gerlek <mpg at flaxen.com> remove hack now that Options work better (18:30:20)
+ * Michael P. Gerlek <mpg at flaxen.com> turn on some Mosaic uses (17:38:53)
+ * Michael P. Gerlek <mpg at flaxen.com> fix all the MosaicFilter bugs (17:38:33)
+ * Michael P. Gerlek <mpg at flaxen.com> bug fix, not handling eof right (17:37:59)
+ * Michael P. Gerlek <mpg at flaxen.com> added equals(), oper!= (17:37:19)
+ * hobu <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:42:49)
+ * hobu <hobu.inc at gmail.com> forward the SRS from the getPrevStage() if the existing one on the writer is empty #5 (14:42:39)
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #6 from gadomski/master (14:17:06)
+ * Pete Gadomski <pete.gadomski at gmail.com> Added iostream to pdal.hpp (removed from Vector.hpp) (14:13:20)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (14:13:00)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (14:12:46)
+ * Michael P. Gerlek <mpg at flaxen.com> renamed Signaller to UserCallbacks; finally implemented within Writer (14:11:50)
+ * hobu <hobu.inc at gmail.com> include iostream for std::cout (13:58:08)
+ * hobu <hobu.inc at gmail.com> allow setting of native LAS writers options using the options mechanism before init #3 (11:07:22)
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #4 from gadomski/master (10:08:01)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'master' of git://github.com/PDAL/PDAL (10:01:54)
+
+2011-08-24
+ * Michael P. Gerlek <mpg at flaxen.com> pushed prevStage() functions up to StageBase; consolidated initialize() recursion in StageBase too (23:03:10)
+ * Michael P. Gerlek <mpg at flaxen.com> getPrevStage() now just use StageBase::getInputs() (21:58:56)
+ * Michael P. Gerlek <mpg at flaxen.com> added internal_error (21:36:49)
+ * Michael P. Gerlek <mpg at flaxen.com> prove new inputs/outputs lists work (20:20:50)
+ * Michael P. Gerlek <mpg at flaxen.com> added 'inputs' (prev stages) and 'outputs' (next stages) to StageBase; no one using them yet, but they are there and being set (18:28:50)
+ * Michael P. Gerlek <mpg at flaxen.com> stoopid min/max macro (18:21:07)
+ * Michael P. Gerlek <mpg at flaxen.com> test3 (17:25:13)
+ * Michael P. Gerlek <mpg at flaxen.com> testend (16:28:28)
+ * Michael P. Gerlek <mpg at flaxen.com> test2 (16:25:01)
+ * Michael P. Gerlek <mpg at flaxen.com> test (16:20:02)
+ * Michael P. Gerlek <mpg at flaxen.com> test (16:12:43)
+ * Michael P. Gerlek <mpg at flaxen.com> test (16:09:21)
+ * hobu <hobu.inc at gmail.com> Merge branch 'master' of github.com:PDAL/PDAL (14:35:38)
+ * hobu <hobu.inc at gmail.com> turn off SchemaLayout equality assertions. These are really expensive (14:35:29)
+ * hobu <hobu.inc at gmail.com> break out operator== test so that the tests that are easiest to calculate but be different happen first (14:34:40)
+ * hobu <hobu.inc at gmail.com> just munge raw data when copying block_id and pt_id to the new buffer (14:33:41)
+ * Michael P. Gerlek <mpg at flaxen.com> clean up example (13:09:23)
+ * Michael P. Gerlek <mpg at flaxen.com> .NET bindings working again (12:51:12)
+ * Michael P. Gerlek <mpg at flaxen.com> csharp work (10:59:28)
+ * Michael P. Gerlek <mpg at flaxen.com> csharp work (00:03:57)
+
+2011-08-23
+ * Michael P. Gerlek <mpg at flaxen.com> update for .net work (19:36:27)
+ * Michael P. Gerlek <mpg at flaxen.com> updating C\# world (19:33:30)
+ * Michael P. Gerlek <mpg at flaxen.com> merge fixups (18:29:31)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:/PDAL/PDAL (18:28:07)
+ * Michael P. Gerlek <mpg at flaxen.com> supporting Pipeline as root element, plus versioning (18:06:25)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (17:34:20)
+ * Michael P. Gerlek <mpg at flaxen.com> typo (17:34:03)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (17:30:48)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:/PDAL/PDAL (17:28:40)
+ * Michael P. Gerlek <mpg at flaxen.com> support configs without gdal, laszip, liblas (17:27:56)
+ * Pete Gadomski <pete.gadomski at gmail.com> A start on pipline xml generation in python (17:24:08)
+ * Michael P. Gerlek <mpg at flaxen.com> VS10 and gcc 4.5.2 have different notions about how to do template specializations, apparently (17:11:42)
+ * Michael P. Gerlek <mpg at flaxen.com> gcc include fix (16:43:49)
+ * Michael P. Gerlek <mpg at flaxen.com> gcc template fixes (16:43:39)
+ * Michael P. Gerlek <mpg at flaxen.com> gcc fixes (16:19:02)
+ * Michael P. Gerlek <mpg at flaxen.com> Merge branch 'master' of github.com:PDAL/PDAL (16:06:14)
+ * Michael P. Gerlek <mpg at flaxen.com> unit testing without laszip (16:04:59)
+ * Michael P. Gerlek <mpg at flaxen.com> gcc fix (15:56:23)
+ * Michael P. Gerlek <mpg at flaxen.com> gcc fix (15:55:10)
+ * Michael P. Gerlek <mpg at flaxen.com> build without laszip (15:53:30)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge branch 'master' of git://github.com/PDAL/PDAL (15:35:42)
+ * Pete Gadomski <pete.gadomski at gmail.com> Adds version attribute to Pipline element in pipeline xsd (15:34:36)
+ * Michael P. Gerlek <mpg at flaxen.com> remove temp file (13:26:30)
+ * Michael P. Gerlek <mpg at flaxen.com> changes to support attributes in pipeline schema (13:22:54)
+ * Michael P. Gerlek <mpg at flaxen.com> changes to support attributes in pipeline schema (13:22:34)
+
+2011-08-22
+ * Michael P. Gerlek <mpg at flaxen.com> update path to schemata (14:38:25)
+ * Michael P. Gerlek <mpg at flaxen.com> changed impl of Option/Options to be lessy buggy and ,uch morser-friendly; in particular, Option is no longer a templated class (yeah\!) (14:36:31)
+ * Michael P. Gerlek <mpg at flaxen.com> in some circumstances, we weren't parsing correctly (13:55:39)
+
+2011-08-19
+ * Michael P. Gerlek <mpg at flaxen.com> use hg's ignore settings (23:30:23)
+ * Michael P. Gerlek <mpg at flaxen.com> use hg's ignore settings (23:29:47)
+ * Michael P. Gerlek <mpg at flaxen.com> test3 (23:08:39)
+ * Michael P. Gerlek <mpg at flaxen.com> test (19:56:07)
+ * Michael P. Gerlek <mpg at flaxen.com> test (19:25:25)
+ * Howard Butler <hobu.inc at gmail.com> remove bunk file (15:13:21)
+ * Howard Butler <hobu.inc at gmail.com> Merge pull request #1 from quentonc/master (15:08:34)
+ * Pete Gadomski <pete.gadomski at gmail.com> Added pdal_pipeline.xsd (12:08:22)
+ * Pete Gadomski <pete.gadomski at gmail.com> Moved test/data/schemas to a TLD (12:07:56)
+ * Howard Butler <hobu.inc at gmail.com> merge (11:27:24)
+ * Howard Butler <hobu.inc at gmail.com> add readme for gitinit (11:15:06)
+
+2011-08-18
+ * Michael P. Gerlek <mpg at flaxen.com> added getId() to base class, for stage debugging (21:06:09)
+ * Michael P. Gerlek <mpg at flaxen.com> dump filename (21:05:42)
+ * Michael P. Gerlek <mpg at flaxen.com> rename, to avoid confusion with the -real- PTree routines (19:52:28)
+ * Michael P. Gerlek <mpg at flaxen.com> added stage-specific stage dumping to pcinfo (19:44:29)
+ * Michael P. Gerlek <mpg at flaxen.com> pcinfo work, now dumping stats (19:06:52)
+ * Michael P. Gerlek <mpg at flaxen.com> improved stats collection mechanism (19:06:27)
+ * Michael P. Gerlek <mpg at flaxen.com> pcinfo testing (15:33:19)
+ * Michael P. Gerlek <mpg at flaxen.com> cleanup temp files (15:09:11)
+ * Michael P. Gerlek <mpg at flaxen.com> pcinfo tests (15:07:59)
+ * Michael P. Gerlek <mpg at flaxen.com> comment (15:07:51)
+ * Michael P. Gerlek <mpg at flaxen.com> apps work, incl. hack for put/add Options issue and more tests (14:58:11)
+ * Michael P. Gerlek <mpg at flaxen.com> add test for empty() (14:57:26)
+ * Michael P. Gerlek <mpg at flaxen.com> add case showing bug (14:57:07)
+ * Michael P. Gerlek <mpg at flaxen.com> handle eof correctly (14:56:42)
+ * Michael P. Gerlek <mpg at flaxen.com> add an empty() checker (13:50:48)
+ * Michael P. Gerlek <mpg at flaxen.com> app work (12:49:02)
+ * Michael P. Gerlek <mpg at flaxen.com> call init() first (12:48:40)
+ * Michael P. Gerlek <mpg at flaxen.com> options work (12:48:26)
+ * Michael P. Gerlek <mpg at flaxen.com> added comment (12:47:38)
+
+2011-08-17
+ * Michael P. Gerlek <mpg at flaxen.com> pc2pc work (23:44:53)
+ * Michael P. Gerlek <mpg at flaxen.com> work on pc2pc (16:37:00)
+ * Michael P. Gerlek <mpg at flaxen.com> dead code (16:36:27)
+ * Michael P. Gerlek <mpg at flaxen.com> gcc fix (00:12:54)
+ * Michael P. Gerlek <mpg at flaxen.com> added --schema (00:03:58)
+ * Michael P. Gerlek <mpg at flaxen.com> okay to have no opts (00:03:38)
+ * Michael P. Gerlek <mpg at flaxen.com> tests for toPTree() (00:03:07)
+ * Michael P. Gerlek <mpg at flaxen.com> cleanups for oper<<, dump(), toPTree() (00:02:37)
+
+2011-08-16
+ * Michael P. Gerlek <mpg at flaxen.com> sync test with pg's fix (18:37:29)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (18:34:03)
+ * Michael P. Gerlek <mpg at flaxen.com> dump a point (18:33:56)
+ * Michael P. Gerlek <mpg at flaxen.com> added toPTree() (18:33:22)
+ * Pete Gadomski <pete.gadomski at gmail.com> Added 'input' as a positional option for pcpipeline (16:01:05)
+ * mpg <none at none> gcc lint (15:04:42)
+ * Michael P. Gerlek <mpg at flaxen.com> oops, put err mssg back in (14:15:18)
+ * Michael P. Gerlek <mpg at flaxen.com> use exceptions, not status codes, for simpler control flow (14:12:56)
+ * Michael P. Gerlek <mpg at flaxen.com> start to support --point and --points (13:47:54)
+ * Michael P. Gerlek <mpg at flaxen.com> added simple Stats filter (13:40:58)
+ * Michael P. Gerlek <mpg at flaxen.com> now supports .xml files cleanly (12:11:33)
+ * Michael P. Gerlek <mpg at flaxen.com> cleanup; added XML driver support (12:11:20)
+ * Michael P. Gerlek <mpg at flaxen.com> pipeline reader/stage now working (11:44:52)
+
+2011-08-15
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint for driver.pipeline.reader (20:56:50)
+ * Michael P. Gerlek <mpg at flaxen.com> use StageFactory now (20:14:01)
+ * Michael P. Gerlek <mpg at flaxen.com> move pipeline xml files into a subdir (19:21:47)
+ * Michael P. Gerlek <mpg at flaxen.com> start of for-real pcinfo app (16:02:39)
+ * Michael P. Gerlek <mpg at flaxen.com> handle unknown options (15:50:31)
+ * Michael P. Gerlek <mpg at flaxen.com> added copy ctor (15:22:06)
+ * Michael P. Gerlek <mpg at flaxen.com> turn compare_no_case into a safer function (15:07:02)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (14:57:12)
+ * Michael P. Gerlek <mpg at flaxen.com> added support class for the apps (14:34:52)
+ * mpg <none at none> add some app tests that actually work (14:21:54)
+ * Michael P. Gerlek <mpg at flaxen.com> patch for probably-not-to-be-fixed liblas writer test (14:15:08)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (14:08:59)
+ * mpg <none at none> turn off failing popen tests on unix (14:03:11)
+ * mpg <none at none> popen debugging (12:23:01)
+ * mpg <none at none> disable test unless gdal is around (11:27:47)
+ * mpg <none at none> lint (09:56:22)
+ * Michael P. Gerlek <mpg at flaxen.com> tighten up / dbeugging (09:53:58)
+ * mpg <none at none> debugging on linux (09:35:40)
+ * Michael P. Gerlek <mpg at flaxen.com> dumb fix for memleak (09:34:03)
+ * mpg <none at none> gcc lint (09:12:43)
+ * mpg <none at none> gcc 4.5.2 linker issue (08:43:50)
+
+2011-08-14
+ * Howard Butler <hobu.inc at gmail.com> excise the libLAS requirement from PDAL. No need to have libLAS to be able to build/use PDAL anymore (22:06:34)
+ * Howard Butler <hobu.inc at gmail.com> merge (09:47:06)
+ * Howard Butler <hobu.inc at gmail.com> remove lint (09:45:31)
+ * Howard Butler <hobu.inc at gmail.com> remove lint (09:39:01)
+
+2011-08-12
+ * Michael P. Gerlek <mpg at flaxen.com> merge (17:19:44)
+ * Michael P. Gerlek <mpg at flaxen.com> account for 32 bytes of difference in the VLR header (17:19:20)
+ * Michael P. Gerlek <mpg at flaxen.com> added simpler API for diffing (17:18:26)
+ * Pete Gadomski <pete.gadomski at gmail.com> Merge (17:04:23)
+ * Pete Gadomski <pete.gadomski at gmail.com> Reenable oci.Writer's loading w/o boundary column (17:04:13)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (16:44:07)
+ * Michael P. Gerlek <mpg at flaxen.com> removed static getDefaultOptions(); cleaned up impl of getName() nd getDescription() (16:27:42)
+ * Howard Butler <hobu.inc at gmail.com> fix up #37 to add better error handling for base_table_boundary_wkt (14:46:55)
+ * Howard Butler <hobu.inc at gmail.com> #ifdef the msvcisms (14:14:56)
+ * Howard Butler <hobu.inc at gmail.com> add WKT validation for boundary geometry #38 (14:14:13)
+ * Michael P. Gerlek <mpg at flaxen.com> default test for each of the apps (12:37:22)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (12:23:07)
+ * Michael P. Gerlek <mpg at flaxen.com> restore app-level catching (12:22:55)
+ * Michael P. Gerlek <mpg at flaxen.com> added binpath(); make sure paths end in trailing slash (12:22:14)
+ * Howard Butler <hobu.inc at gmail.com> merge (12:19:56)
+ * Howard Butler <hobu.inc at gmail.com> add compare_stage_data method for comparing data. Maybe we should add PointBuffer::operator==? (12:16:00)
+ * Howard Butler <hobu.inc at gmail.com> use setHeaderPadding methods (12:15:09)
+ * Howard Butler <hobu.inc at gmail.com> keep existing padding on the header and don't alter it when writing the header to file (12:14:29)
+ * Howard Butler <hobu.inc at gmail.com> convenience functions for determining byte current length and total byte length of the raw data buffer (12:13:55)
+ * Howard Butler <hobu.inc at gmail.com> support setting header padding (12:12:57)
+ * Howard Butler <hobu.inc at gmail.com> support setting header padding (12:12:29)
+ * Michael P. Gerlek <mpg at flaxen.com> fix comment (11:41:58)
+ * Michael P. Gerlek <mpg at flaxen.com> fix default option printing (11:40:55)
+
+2011-08-11
+ * Michael P. Gerlek <mpg at flaxen.com> attempt some degree of portability... (20:02:50)
+ * Michael P. Gerlek <mpg at flaxen.com> stubs for cmd line tests (20:00:15)
+ * Michael P. Gerlek <mpg at flaxen.com> added run_command(), for quick unit tests of cmd line apps (20:00:00)
+ * Michael P. Gerlek <mpg at flaxen.com> use the new Support::temppath feature (18:52:42)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (18:47:55)
+ * Michael P. Gerlek <mpg at flaxen.com> use the new Support::temppath feature (18:47:43)
+ * Michael P. Gerlek <mpg at flaxen.com> add special dir for unit test output files to live in (18:41:12)
+ * Michael P. Gerlek <mpg at flaxen.com> add ability to diff two files, but exclude certain regions of the file (18:22:36)
+ * Pete Gadomski <pete.gadomski at gmail.com> Silently discard comments in pipeline xml files (18:20:18)
+ * Michael P. Gerlek <mpg at flaxen.com> improve file diff functions (17:53:52)
+ * Howard Butler <hobu.inc at gmail.com> oops, missed one more filename (15:48:12)
+ * Howard Butler <hobu.inc at gmail.com> merge (15:44:45)
+ * Howard Butler <hobu.inc at gmail.com> more path tweaking to get things right (15:44:34)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (15:32:54)
+ * Michael P. Gerlek <mpg at flaxen.com> use proper comparator elsewhere too (15:32:41)
+ * Howard Butler <hobu.inc at gmail.com> merge (15:31:49)
+ * Howard Butler <hobu.inc at gmail.com> start catching up to new LASzip tests (15:31:41)
+ * Michael P. Gerlek <mpg at flaxen.com> fix test for unix (15:31:17)
+ * Howard Butler <hobu.inc at gmail.com> don't override srs from previous stage. sorry, I did that (15:31:12)
+ * Howard Butler <hobu.inc at gmail.com> set systemid back to TerraScan instead of martin. isenburg shouldn't change the systemid to keep things 'lossless' (15:30:32)
+ * Michael P. Gerlek <mpg at flaxen.com> added comment about comparators (15:29:33)
+ * Michael P. Gerlek <mpg at flaxen.com> use proper comparator (15:28:12)
+ * Howard Butler <hobu.inc at gmail.com> oops, actually use compressed files (15:05:37)
+ * Howard Butler <hobu.inc at gmail.com> separate the base file so we know which one has been used (14:44:36)
+ * Howard Butler <hobu.inc at gmail.com> remove the original laszip test file (14:36:13)
+ * Howard Butler <hobu.inc at gmail.com> add liblas- and lastools- generated zip files (14:30:44)
+ * Howard Butler <hobu.inc at gmail.com> move schema modification into initialize() method so that chipper-specific fields such as block_id and point_id are added (10:39:17)
+ * Howard Butler <hobu.inc at gmail.com> apply nicolas' patch for gcc 4.6 (08:52:06)
+
+2011-08-08
+ * Howard Butler <hobu.inc at gmail.com> support Options constructor for pipeline support (14:12:33)
+ * Howard Butler <hobu.inc at gmail.com> more tweaks to support pipelines (14:12:07)
+ * Howard Butler <hobu.inc at gmail.com> fix up test for r1028 (13:52:01)
+ * Howard Butler <hobu.inc at gmail.com> more descriptive exception (13:39:34)
+ * Howard Butler <hobu.inc at gmail.com> remove cruft (13:12:09)
+ * Howard Butler <hobu.inc at gmail.com> use ptree-based operator>> for SpatialReference (13:03:55)
+ * Howard Butler <hobu.inc at gmail.com> don't do endian swap for now (13:03:08)
+ * Howard Butler <hobu.inc at gmail.com> clean up after LASzip (13:02:49)
+ * Howard Butler <hobu.inc at gmail.com> don't set the SRS if it was already set (13:02:31)
+ * Howard Butler <hobu.inc at gmail.com> fetch the SpatialReference from options for the stage if it was set (13:02:02)
+ * Howard Butler <hobu.inc at gmail.com> set our identifier to PDAL so we know who wrote things (12:59:20)
+ * Howard Butler <hobu.inc at gmail.com> fix up operator<< and operator>> to take in SRSs via streams and inject them directly into SetFromUserInput (11:31:41)
+
+2011-08-05
+ * Howard Butler <hobu.inc at gmail.com> new compressed file to reflect current state of LASzip compression with native driver (15:56:11)
+ * Howard Butler <hobu.inc at gmail.com> bring PDAL's native driver in line with libLAS' for header handling. LASzip still not working for some reason yet (15:00:32)
+ * Howard Butler <hobu.inc at gmail.com> Optionsify drivers.oci.writer (15:00:06)
+ * Howard Butler <hobu.inc at gmail.com> turn off oracle-write (14:58:54)
+ * Howard Butler <hobu.inc at gmail.com> common Connect() method that uses the new Options stuff (13:33:03)
+ * Howard Butler <hobu.inc at gmail.com> scales need to default to 1.0, not 0.0 or bad things'll happen (10:51:49)
+ * Howard Butler <hobu.inc at gmail.com> bring the LASzip support up-to-snuff with LASzip 2.0.1+ (09:34:30)
+ * Howard Butler <hobu.inc at gmail.com> BOOST_CHECK_EQUAL tells us what the values were (09:34:08)
+
+2011-08-04
+ * Howard Butler <hobu.inc at gmail.com> add compression Option for drivers.las.writer, but it doesn't seem to work yet for some reason :( (16:21:00)
+ * Howard Butler <hobu.inc at gmail.com> enable drivers.oci.reader to use the new options stuff. nice work mpg. basic pcpipeline works with oracle reader (15:30:00)
+ * Howard Butler <hobu.inc at gmail.com> oracle-read is now a pipeline-enabled activity -- use pcpipeline (15:28:25)
+ * Howard Butler <hobu.inc at gmail.com> add new-style options for Reader (14:01:23)
+ * Howard Butler <hobu.inc at gmail.com> remove dead code (14:00:58)
+ * Howard Butler <hobu.inc at gmail.com> add some error checking for the case when findFirst returns NULL (14:00:48)
+ * Howard Butler <hobu.inc at gmail.com> remove dead code (11:02:16)
+ * Howard Butler <hobu.inc at gmail.com> touching SDO_PC.PC_EXTENT without disabling the trigger will nuke the cloud's blocks. Add code to temporarily shut this trigger off if enabled when updating the SDO_PC.PC_EXTENT (11:02:01)
+
+2011-08-03
+ * Howard Butler <hobu.inc at gmail.com> () is an empty bounds. so is nothing (13:52:24)
+ * Howard Butler <hobu.inc at gmail.com> add default options for drivers.oci.writer. Not using them yet (11:11:49)
+ * Howard Butler <hobu.inc at gmail.com> test new Bounds<double> option (08:50:45)
+ * Howard Butler <hobu.inc at gmail.com> leave the options static, but .add() new options to it. Use our Bounds<double> option here instead of std::string (08:50:33)
+
+2011-08-02
+ * Michael P. Gerlek <mpg at flaxen.com> now passing useful params to writeBegin/End; fixed main write code to only have one loop now (w00t) (19:17:46)
+ * Michael P. Gerlek <mpg at flaxen.com> clean up write-chunk loops, and try to reuse the same PointBuffer (18:48:13)
+ * Michael P. Gerlek <mpg at flaxen.com> add writeBufferBegin/End functions, like on the read side; added a bunch of error checking to make sure the begin/end sequences are obeyed (18:18:44)
+ * Michael P. Gerlek <mpg at flaxen.com> added readBegin..readEnd sequence; most of these changes are just renaming readImpl to readBufferImpl (17:43:51)
+ * Michael P. Gerlek <mpg at flaxen.com> add read-scale-reproj-descale-write test for hobu (15:49:18)
+ * Michael P. Gerlek <mpg at flaxen.com> clean up err mssg (15:48:51)
+ * Howard Butler <hobu.inc at gmail.com> make base_table_bounds optional, and if not provided in the options, use the cumulated block bounds (13:57:31)
+ * Howard Butler <hobu.inc at gmail.com> merge (13:43:25)
+ * Howard Butler <hobu.inc at gmail.com> merge (13:43:09)
+ * Michael P. Gerlek <mpg at flaxen.com> add ctor that infers input SRS (13:42:42)
+ * Michael P. Gerlek <mpg at flaxen.com> disallow multiple init() calls (13:42:17)
+ * Howard Butler <hobu.inc at gmail.com> remove reader.initialize(), we shouldn't do that (13:36:40)
+ * Howard Butler <hobu.inc at gmail.com> update the SDO_PC.PC_EXTENT with the cumulated bounds of all of the blocks if no base_table_bounds is set in the options (13:35:55)
+ * Howard Butler <hobu.inc at gmail.com> add testing for ingestion of empty bounds (13:35:13)
+ * Howard Butler <hobu.inc at gmail.com> short-circuit the parsing of empty bounds objects -- feel free to make this not suck so bad mpg (13:34:50)
+ * Howard Butler <hobu.inc at gmail.com> more descriptive error messages (13:34:00)
+ * Michael P. Gerlek <mpg at flaxen.com> remove temp file (13:25:52)
+ * Michael P. Gerlek <mpg at flaxen.com> disable file comparison, as no longer workable (13:23:05)
+ * Michael P. Gerlek <mpg at flaxen.com> added relative-path fixups (13:16:21)
+ * Michael P. Gerlek <mpg at flaxen.com> added isAbs(), getDir() (13:15:53)
+ * Michael P. Gerlek <mpg at flaxen.com> added FileUtils::getcwd, ::toAbsolutePath (12:31:31)
+ * Michael P. Gerlek <mpg at flaxen.com> split some code out of Utils.cpp into a new FileUtils.cpp (11:55:01)
+ * Howard Butler <hobu.inc at gmail.com> remove dead code and carry a bounds object to cumulate the extent of the PC as it is loaded (09:13:57)
+
+2011-08-01
+ * Michael P. Gerlek <mpg at flaxen.com> allow reader to be init'd early, so can snark its SRS (18:54:55)
+ * Michael P. Gerlek <mpg at flaxen.com> sync apps with new initialize() req'ment (18:49:15)
+ * Michael P. Gerlek <mpg at flaxen.com> added public initialize() method for all stages, which must be called before any stage operation is done - typically you will do this after the last pipeline stage is constructed (18:46:11)
+
+2011-07-30
+ * Pete Gadomski <pete.gadomski at gmail.com> Incorrect bounds initialization (18:53:37)
+ * Howard Butler <hobu.inc at gmail.com> apply Mike's fix for block bounds (14:20:56)
+
+2011-07-29
+ * Michael P. Gerlek <mpg at flaxen.com> enable Options-based ctors (15:18:43)
+ * Michael P. Gerlek <mpg at flaxen.com> enable Options-based ctors (15:11:02)
+ * Michael P. Gerlek <mpg at flaxen.com> refactored so we now have a ScalingFilter and a DescalingFilter -- no more mixing up the two ctors (14:58:53)
+ * Michael P. Gerlek <mpg at flaxen.com> enable Options-based ctors (14:20:31)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (14:14:00)
+ * Michael P. Gerlek <mpg at flaxen.com> enable Options-based ctors (14:13:41)
+ * Michael P. Gerlek <mpg at flaxen.com> enable Options-based ctors (13:44:22)
+ * Michael P. Gerlek <mpg at flaxen.com> enable Options-based ctor (13:31:43)
+ * Michael P. Gerlek <mpg at flaxen.com> added pcpipeline application (13:03:13)
+ * Michael P. Gerlek <mpg at flaxen.com> improved Options API, added support for debug/vebose opts (11:50:54)
+
+2011-07-28
+ * Michael P. Gerlek <mpg at flaxen.com> made root element ReaderPipeline or WriterPipeline (23:03:54)
+ * Michael P. Gerlek <mpg at flaxen.com> added generic verbose and debug options (23:03:27)
+
+2011-07-27
+ * Michael P. Gerlek <mpg at flaxen.com> added docs (19:28:00)
+ * Michael P. Gerlek <mpg at flaxen.com> factor PipelineManager into separate classes (16:33:15)
+ * Michael P. Gerlek <mpg at flaxen.com> clean up temp files (14:58:49)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (14:48:39)
+ * Michael P. Gerlek <mpg at flaxen.com> add error checking to pipeline reader (14:48:20)
+ * Howard Butler <hobu.inc at gmail.com> don't reproject if output and input srs are the same (11:19:45)
+ * Howard Butler <hobu.inc at gmail.com> memoize fetching the indexID and blockID for the block so we don't have to do this for every point for a good speed win (09:06:40)
+ * Howard Butler <hobu.inc at gmail.com> apply Will's patch for #38 to enable MSVC2008 building (08:36:22)
+ * Michael P. Gerlek <mpg at flaxen.com> turn on pipeline writer testing (04:45:47)
+
+2011-07-26
+ * Michael P. Gerlek <mpg at flaxen.com> pretty print xml (22:00:27)
+ * Michael P. Gerlek <mpg at flaxen.com> added stage dumping out to pipeline xml (20:15:04)
+ * Michael P. Gerlek <mpg at flaxen.com> improve pipeline testing (17:46:44)
+ * Michael P. Gerlek <mpg at flaxen.com> don't need icky strings (17:46:16)
+ * Michael P. Gerlek <mpg at flaxen.com> fix problem with writing zero points (17:45:34)
+ * Michael P. Gerlek <mpg at flaxen.com> added option-based ctors for Las reader/writer, crop; turned back on pipeline manager tests (17:14:02)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (16:23:26)
+ * Howard Butler <hobu.inc at gmail.com> reserved bytes should be set to 0xAABB by default (16:15:43)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (16:14:50)
+ * Howard Butler <hobu.inc at gmail.com> std::cin is in <iostream> (14:52:34)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (14:04:37)
+ * Michael P. Gerlek <mpg at flaxen.com> StreamOwner renamed to StreamManager because it doesn't actually, umm, own the stream (14:04:27)
+ * Michael P. Gerlek <mpg at flaxen.com> StreamOwner class work (14:00:24)
+ * Howard Butler <hobu.inc at gmail.com> implement a tuple-map for dimension lookup (12:10:18)
+ * Howard Butler <hobu.inc at gmail.com> turn off endianness Dimension setting for now (12:10:08)
+ * Howard Butler <hobu.inc at gmail.com> turn off OCI stuff if now Oracle enabled (11:52:01)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (09:55:34)
+ * Michael P. Gerlek <mpg at flaxen.com> StreamOwner class ready (09:55:22)
+ * Howard Butler <hobu.inc at gmail.com> merge (08:41:02)
+ * Howard Butler <hobu.inc at gmail.com> long int* isn't the same as int* for srid (08:40:52)
+
+2011-07-25
+ * Michael P. Gerlek <mpg at flaxen.com> replace INIT_OPTIONS with something more verbose, but more explicit and simpler (19:30:59)
+ * Howard Butler <hobu.inc at gmail.com> put the try/except globally for oracle-write and oracle-read (15:29:48)
+ * Howard Butler <hobu.inc at gmail.com> point_schema_override doesn't mean anything now (15:08:00)
+ * Howard Butler <hobu.inc at gmail.com> add try/catch around the .write methods to catch any std errors (14:46:58)
+ * Howard Butler <hobu.inc at gmail.com> turn off INIT_OPTIONS, doesn't work on unix (14:40:39)
+ * Howard Butler <hobu.inc at gmail.com> remove extra ;'s (13:04:50)
+ * Michael P. Gerlek <mpg at flaxen.com> start of StreamOwner class (12:38:50)
+ * Howard Butler <hobu.inc at gmail.com> merge (10:19:40)
+ * Howard Butler <hobu.inc at gmail.com> ByteSwapFilter should flip the endianness bit on its dimensions (10:18:05)
+ * Howard Butler <hobu.inc at gmail.com> add non-const getDimensions method (10:17:28)
+ * Howard Butler <hobu.inc at gmail.com> decruft and comment about how we loop through the non-XYZ dimensions to copy the data (09:32:06)
+
+2011-07-22
+ * Michael P. Gerlek <mpg at flaxen.com> start turning back on stage factory, pipeline mangler (23:03:36)
+ * Michael P. Gerlek <mpg at flaxen.com> include guard typo (17:12:30)
+ * Michael P. Gerlek <mpg at flaxen.com> stub in an Options-based ctor for every stage (17:09:33)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (15:41:19)
+ * Michael P. Gerlek <mpg at flaxen.com> split StageBase out into its own file (15:41:04)
+ * Michael P. Gerlek <mpg at flaxen.com> add a really ugly mechanism for static initializers (15:40:46)
+ * Howard Butler <hobu.inc at gmail.com> turn off pkgconfig pdal.pc for now (14:29:34)
+ * Michael P. Gerlek <mpg at flaxen.com> added StageBase class, for getName() and getOptions(); added macros for same (13:54:00)
+ * Howard Butler <hobu.inc at gmail.com> don't be so aggressive in capitalizing everything (10:24:11)
+
+2011-07-21
+ * Howard Butler <hobu.inc at gmail.com> memoize field look ups to get them out of the critical path (15:56:07)
+ * Howard Butler <hobu.inc at gmail.com> turn off byteswapping for now (14:23:27)
+ * Howard Butler <hobu.inc at gmail.com> merge (13:30:25)
+ * Howard Butler <hobu.inc at gmail.com> remove lint (13:28:46)
+ * Howard Butler <hobu.inc at gmail.com> remove lint (13:25:33)
+ * Howard Butler <hobu.inc at gmail.com> fix up ScalingFilter to copy non-XYZ data, appears to work now (13:25:24)
+ * Michael P. Gerlek <mpg at flaxen.com> typo (13:16:09)
+ * Howard Butler <hobu.inc at gmail.com> add typename qualification (11:45:36)
+ * Howard Butler <hobu.inc at gmail.com> merge (10:25:58)
+ * Howard Butler <hobu.inc at gmail.com> start on raw field copying -- doesn't work yet though (10:25:32)
+ * Howard Butler <hobu.inc at gmail.com> add setFieldData method for interacting with setting raw data (10:25:05)
+ * Howard Butler <hobu.inc at gmail.com> add start of ScalingFilter test (10:24:46)
+ * Michael P. Gerlek <mpg at flaxen.com> restore (much of) PipelineManager class (from big backed-out commit) (00:34:45)
+ * Michael P. Gerlek <mpg at flaxen.com> restore (much of) StageFactory class (from big backed-out commit) (00:18:54)
+
+2011-07-20
+ * Michael P. Gerlek <mpg at flaxen.com> improved Options class (from big backed-out commit) (23:41:16)
+ * Michael P. Gerlek <mpg at flaxen.com> typo in include guard (23:27:19)
+ * Michael P. Gerlek <mpg at flaxen.com> re-fix the liblas vs. native writer issue (15:29:32)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (14:20:10)
+ * Michael P. Gerlek <mpg at flaxen.com> stub in old StageFactory files, restore pipeline unit test file (14:19:43)
+ * Howard Butler <hobu.inc at gmail.com> cannot delete a const& from a Schema (14:04:21)
+ * Howard Butler <hobu.inc at gmail.com> oops, in/out flipped for srs (14:03:59)
+ * Howard Butler <hobu.inc at gmail.com> implement removeDimension (14:03:47)
+ * Howard Butler <hobu.inc at gmail.com> reapply 8b71a4ec238e (12:34:15)
+ * Howard Butler <hobu.inc at gmail.com> clean up oracle reader/writer processes (12:32:00)
+ * Howard Butler <hobu.inc at gmail.com> rollback to r847 sto start this mess over again :) (10:25:35)
+
+2011-07-19
+ * Howard Butler <hobu.inc at gmail.com> remove extraneous ; (14:54:44)
+ * Howard Butler <hobu.inc at gmail.com> oops (14:52:26)
+ * Howard Butler <hobu.inc at gmail.com> include xml_parser from property_tree (14:52:12)
+ * Howard Butler <hobu.inc at gmail.com> merge (14:45:38)
+ * Howard Butler <hobu.inc at gmail.com> an attempt at implementing removeDimension support (14:39:27)
+ * Howard Butler <hobu.inc at gmail.com> we can't delete a reference to the dimension or it will be invalid (14:39:15)
+ * Michael P. Gerlek <mpg at flaxen.com> remove libxml includes (14:18:19)
+ * Howard Butler <hobu.inc at gmail.com> some cleanup of oci stuff (13:08:52)
+ * Howard Butler <hobu.inc at gmail.com> add Bounds cumulation for block insertion (13:08:39)
+ * Michael P. Gerlek <mpg at flaxen.com> make the Iterators be shared ptrs now (13:02:17)
+ * Michael P. Gerlek <mpg at flaxen.com> LiblasWriter now uses options block for filename (01:24:42)
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint -- pipeline as ptree now working (01:16:10)
+
+2011-07-18
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint -- trying to debug Options::empty linking issue (23:46:18)
+ * Michael P. Gerlek <mpg at flaxen.com> converted xml-based pipeline manager to ptree (19:40:02)
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint -- pipeline manager work (18:37:12)
+ * Michael P. Gerlek <mpg at flaxen.com> botched merge (15:14:33)
+ * Michael P. Gerlek <mpg at flaxen.com> lots of pipeline stage builder and shared ptr work (15:07:43)
+ * Howard Butler <hobu.inc at gmail.com> >> is an operator and not so good for template discrimination on many compilers (14:54:01)
+
+2011-07-15
+ * Michael P. Gerlek <mpg at flaxen.com> more tests (01:35:27)
+ * Michael P. Gerlek <mpg at flaxen.com> syn with new ctor (01:34:58)
+ * Michael P. Gerlek <mpg at flaxen.com> typo (01:34:40)
+ * Michael P. Gerlek <mpg at flaxen.com> missing \#incl (01:34:23)
+ * Michael P. Gerlek <mpg at flaxen.com> turn on Options ctor (01:33:29)
+
+2011-07-14
+ * Michael P. Gerlek <mpg at flaxen.com> cleanups (15:11:40)
+ * Michael P. Gerlek <mpg at flaxen.com> added Options ctor support for LasReader, LasReader, Crop; had to make the Writer take a filename instead of a stream (14:24:37)
+
+2011-07-13
+ * Michael P. Gerlek <mpg at flaxen.com> piepline builder work (22:21:56)
+ * Michael P. Gerlek <mpg at flaxen.com> cut/paste error (22:21:34)
+ * Michael P. Gerlek <mpg at flaxen.com> stubbed in Option-based ctor for all Stages; added new StageBase class; work on StageFactory class (21:38:29)
+
+2011-07-12
+ * Michael P. Gerlek <mpg at flaxen.com> merge (22:38:59)
+ * Michael P. Gerlek <mpg at flaxen.com> playing around with pipeline builder (22:38:47)
+ * Howard Butler <hobu.inc at gmail.com> some riffing around with boost::multi_index to contain the pdal::Dimensions for the pdal::Schema (16:00:41)
+ * Howard Butler <hobu.inc at gmail.com> add qfit2las utility (to be removed when we have VRT pipeline working (09:29:29)
+ * Howard Butler <hobu.inc at gmail.com> set z scale to 1.0 (09:29:08)
+ * Howard Butler <hobu.inc at gmail.com> apply scaling for test (09:28:52)
+ * Howard Butler <hobu.inc at gmail.com> default the header's scale to 1.0 for xyz (09:28:35)
+
+2011-07-11
+ * Michael P. Gerlek <mpg at flaxen.com> update for latest (15:54:36)
+ * Michael P. Gerlek <mpg at flaxen.com> oops, put those back (15:51:18)
+ * Michael P. Gerlek <mpg at flaxen.com> update ref files to bring liblas and native back in sync (15:39:02)
+ * Howard Butler <hobu.inc at gmail.com> update the QFIT driver to use the new pdal::Options and pdal::Option class (11:37:13)
+ * Howard Butler <hobu.inc at gmail.com> attempt to return an empty value when an option with a given name is not found -- maybe we should throw our own exception here? (11:36:53)
+ * Howard Butler <hobu.inc at gmail.com> reorder initialization order (10:52:02)
+
+2011-07-03
+ * Howard Butler <hobu.inc at gmail.com> clean up initialization order (14:17:21)
+ * Howard Butler <hobu.inc at gmail.com> merge (14:14:07)
+ * Howard Butler <hobu.inc at gmail.com> start noodling around with boost::multi_index as the container for the Dimensions (14:14:00)
+ * Howard Butler <hobu.inc at gmail.com> typo (14:10:44)
+ * Howard Butler <hobu.inc at gmail.com> set the dimension to a fixed precision dimension if we've set an offset value (14:08:59)
+ * Howard Butler <hobu.inc at gmail.com> we should still apply scaling if the offset were set. (14:08:10)
+
+2011-07-02
+ * Michael P. Gerlek <mpg at flaxen.com> mpg (10:44:24)
+
+2011-07-01
+ * Howard Butler <hobu.inc at gmail.com> cut down precision of tolerance and output the schema to the current directory (23:39:30)
+ * Michael P. Gerlek <mpg at flaxen.com> added Options param up and down the Stage class hierarchy (20:01:56)
+ * Michael P. Gerlek <mpg at flaxen.com> fixing capitalization (19:12:15)
+ * Michael P. Gerlek <mpg at flaxen.com> fixing capitalization (19:11:12)
+ * Michael P. Gerlek <mpg at flaxen.com> renamed Hobo's old Options class to OptionsOld, and renamed my new OptionsNew class to Options (19:10:20)
+ * Michael P. Gerlek <mpg at flaxen.com> sync Stage changes to OCI classes (18:27:13)
+ * Michael P. Gerlek <mpg at flaxen.com> turned on multifilter (which doesn't really work) (15:30:01)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (14:34:42)
+
+2011-06-30
+ * Michael P. Gerlek <mpg at flaxen.com> moved Iterator to StageIterator; added Reader class, derived from Stage; add MultiFilter, but not used yet (19:33:15)
+ * Howard Butler <hobu.inc at gmail.com> merge (16:58:35)
+ * Howard Butler <hobu.inc at gmail.com> fix up boundary wkt insertion (16:58:15)
+ * Howard Butler <hobu.inc at gmail.com> in/out srs's were backwards (16:57:55)
+ * Michael P. Gerlek <mpg at flaxen.com> sync laszip ref files for 2.0 (16:22:26)
+ * Michael P. Gerlek <mpg at flaxen.com> sync with liblas/laszip (16:21:19)
+ * Howard Butler <hobu.inc at gmail.com> throw pdal_error so we can ignore it on ::transform (15:13:38)
+ * Howard Butler <hobu.inc at gmail.com> try to clean up bounds fetching from the options (14:52:40)
+ * Howard Butler <hobu.inc at gmail.com> bad bind position (14:43:32)
+ * Howard Butler <hobu.inc at gmail.com> bad bind position (14:42:52)
+ * Howard Butler <hobu.inc at gmail.com> more rearranging of deck chairs (14:38:19)
+ * Howard Butler <hobu.inc at gmail.com> use the LasReader for oracle-writing (14:29:13)
+
+2011-06-28
+ * Pete Gadomski <pete.gadomski at gmail.com> Fixed extra qualification ‘pdal::OptionsNew::’ on member ‘getOptionPTree’ (13:26:37)
+
+2011-06-27
+ * Michael P. Gerlek <mpg at flaxen.com> disable srs/reproj tess if not using GDAL (16:43:17)
+ * Michael P. Gerlek <mpg at flaxen.com> adding ICONV cmake support (16:22:34)
+ * Michael P. Gerlek <mpg at flaxen.com> lint, for builds without GDAL (14:56:41)
+ * Michael P. Gerlek <mpg at flaxen.com> mpg-specific file, trying to synchronize build configs (14:30:57)
+
+2011-06-24
+ * Michael P. Gerlek <mpg at flaxen.com> more ignorables (19:18:07)
+ * Michael P. Gerlek <mpg at flaxen.com> fix throw (18:47:57)
+ * Michael P. Gerlek <mpg at flaxen.com> comments (18:45:10)
+ * Michael P. Gerlek <mpg at flaxen.com> implemented further Options support (18:42:57)
+ * Michael P. Gerlek <mpg at flaxen.com> updated for laz 2.0 (11:42:35)
+ * Michael P. Gerlek <mpg at flaxen.com> start of pipeline creation support (11:02:06)
+
+2011-06-23
+ * Howard Butler <hobu.inc at gmail.com> merge (08:21:50)
+ * Howard Butler <hobu.inc at gmail.com> start using operator== for pdal::SpatialReference comparisons (08:21:41)
+ * Howard Butler <hobu.inc at gmail.com> throw an error if the CoordinateTransformation object is not created by GDAL (08:21:25)
+ * Howard Butler <hobu.inc at gmail.com> Use the new LASzip 2.0 errors when things go wrong and decrease the level of paranoia (08:20:23)
+
+2011-06-22
+ * Michael P. Gerlek <mpg at flaxen.com> vs2010 lint (13:28:02)
+ * Michael P. Gerlek <mpg at flaxen.com> vs2010 lint (12:34:57)
+ * Michael P. Gerlek <mpg at flaxen.com> pdal.org -> pointcloud.org (12:24:20)
+ * Michael P. Gerlek <mpg at flaxen.com> fix ambiguous resolution (vs2010) (12:06:56)
+ * Michael P. Gerlek <mpg at flaxen.com> vs2010 lint (12:03:07)
+ * Michael P. Gerlek <mpg at flaxen.com> vs2010 lint (11:40:54)
+ * Michael P. Gerlek <mpg at flaxen.com> rename to pdal (11:34:57)
+
+2011-06-21
+ * Howard Butler <hobu.inc at gmail.com> merge (12:49:00)
+ * Howard Butler <hobu.inc at gmail.com> more pc2pc oracle-writer refactoring (12:48:54)
+ * Howard Butler <hobu.inc at gmail.com> pdal.org doesn't exist, use pointcloud.org for schema location (12:48:26)
+
+2011-06-16
+ * Howard Butler <hobu.inc at gmail.com> merge (10:54:47)
+
+2011-06-15
+ * Howard Butler <hobu.inc at gmail.com> add a EPSG:4326 file to be able to test with (16:07:51)
+ * Howard Butler <hobu.inc at gmail.com> make sure to set the stages SpatialReference to the output SpatialReference (16:07:38)
+ * Howard Butler <hobu.inc at gmail.com> typo (15:55:12)
+ * Howard Butler <hobu.inc at gmail.com> support for fetching SRS from the SDO_PC's PC_GEOMETRY to set to stage's SRS (11:36:40)
+ * Howard Butler <hobu.inc at gmail.com> change path for srs ingestion so that multiple ones from a complex can be fetched without depending on an absolute path (10:16:11)
+
+2011-06-14
+ * Howard Butler <hobu.inc at gmail.com> support io through operator>> and operator<< for SpatialReference via boost::property_tree (16:04:34)
+ * Howard Butler <hobu.inc at gmail.com> return the proper type for getField (11:00:21)
+ * Howard Butler <hobu.inc at gmail.com> make it GDAL's problem to check for SRS equality instead of checking fragil WKT output (10:58:38)
+ * Howard Butler <hobu.inc at gmail.com> update to catch up to Martin's new error handling (10:39:52)
+ * Howard Butler <hobu.inc at gmail.com> eof endline (10:08:01)
+ * Howard Butler <hobu.inc at gmail.com> normalize includes (10:07:52)
+
+2011-06-09
+ * Howard Butler <hobu.inc at gmail.com> clean up CMakeLists a quite a bit (15:04:05)
+ * Howard Butler <hobu.inc at gmail.com> only wipe LASzip-related objects when we PDAL_HAVE_LASZIP (14:18:12)
+ * Howard Butler <hobu.inc at gmail.com> rename old libpc file. libPC is now dead. Long live PDAL (11:54:34)
+ * Howard Butler <hobu.inc at gmail.com> force the deletion order of LASzip objects before we close the stream (11:50:31)
+ * Howard Butler <hobu.inc at gmail.com> only support setSRSFromVLRs_geotiff when PDAL_SRS_ENABLED (11:21:09)
+ * Howard Butler <hobu.inc at gmail.com> conditionally compile XML schema test (11:20:52)
+ * Howard Butler <hobu.inc at gmail.com> support compiling without LASzip (11:11:45)
+ * Howard Butler <hobu.inc at gmail.com> LIBPC_ -> PDAL_ (10:36:28)
+ * Howard Butler <hobu.inc at gmail.com> start to conditionally compile LASzip stuff (10:36:10)
+ * Howard Butler <hobu.inc at gmail.com> use a boost::scoped_ptr to handle the LASzip stuff instead of naked pointer (10:35:35)
+ * Howard Butler <hobu.inc at gmail.com> support compiling native LAS driver when we don't have GDAL + GeoTIFF (09:35:40)
+ * Howard Butler <hobu.inc at gmail.com> LIBPC_DLL -> PDAL_DLL (09:35:15)
+ * Howard Butler <hobu.inc at gmail.com> LIBPC_DLL -> PDAL_DLL (09:35:01)
+ * Howard Butler <hobu.inc at gmail.com> LIBPC->PDAL and #include <boost/concept_check.hpp> for boost::ignore_unused_variable_warning (08:53:30)
+ * Howard Butler <hobu.inc at gmail.com> clean up behavior in situations where we don't have libxml2 (08:48:59)
+ * Howard Butler <hobu.inc at gmail.com> clean up unused variable warning (08:46:58)
+ * Howard Butler <hobu.inc at gmail.com> more libPC->PDAL renaming (08:45:58)
+ * Howard Butler <hobu.inc at gmail.com> start on PDAL rename (08:30:25)
+ * Howard Butler <hobu.inc at gmail.com> some support for QUERY_SDO_PC_BLK_TYPE queries, but it doesn't really work yet (08:27:21)
+
+2011-06-06
+ * Howard Butler <hobu.inc at gmail.com> comment out debugging lint for a day when we have a real debugging system (16:58:08)
+ * Howard Butler <hobu.inc at gmail.com> assert that the number of points we read is the number we've processed (16:57:37)
+ * Howard Butler <hobu.inc at gmail.com> add scale, offset, endianness information from the XML schema to the libpc::Schema when reading (16:56:44)
+ * Howard Butler <hobu.inc at gmail.com> add offset and scale to the operator<< output (16:56:10)
+ * Howard Butler <hobu.inc at gmail.com> add a getStreamPrecision method to take a scale value and turn it into a fixed precision value for setting on a std::ostream (16:55:27)
+ * Howard Butler <hobu.inc at gmail.com> mostly working full service reader/writer for Oracle (15:47:23)
+ * Howard Butler <hobu.inc at gmail.com> make the oracle reader/writer use the ByteSwapFilter (15:46:57)
+ * Howard Butler <hobu.inc at gmail.com> as a stage, the chipper has an unknown but fixed point count. This could be made smarter in the future to know what the point count is based on the previous stage, however (15:45:19)
+ * Howard Butler <hobu.inc at gmail.com> It is possible to use the XML without validation. If dimensions do not have a name, just start ticking them off from the first user-defined dimension number (15:42:19)
+ * Howard Butler <hobu.inc at gmail.com> add a setAllData method to allow the user to copy in an array of data directly (15:41:59)
+ * Howard Butler <hobu.inc at gmail.com> It is possible to use the XML without validation. If dimensions do not have a name, just start ticking them off from the first user-defined dimension number (15:41:04)
+ * Howard Butler <hobu.inc at gmail.com> tweak logic for ByteSwapFilter to do something special when a chipper is in front of it. I'm going to add another mode to the SequentialFilter to have it control the returned buffer size in addition to the fill-the-buffer-all-the-way-up mode (15:40:07)
+
+2011-05-26
+ * Howard Butler <hobu.inc at gmail.com> start reworking to be able to use the ByteSwapper filter (13:15:52)
+ * Howard Butler <hobu.inc at gmail.com> decrufting (13:15:17)
+ * Howard Butler <hobu.inc at gmail.com> return the actual number of points swapped instead of the capacity (13:14:53)
+ * Howard Butler <hobu.inc at gmail.com> add support for ByteSwapper filter (13:14:14)
+
+2011-05-25
+ * Howard Butler <hobu.inc at gmail.com> ByteSwapFilter now seems to work (with tests\!) (17:04:51)
+ * Howard Butler <hobu.inc at gmail.com> add the generic swap variants as well (17:04:16)
+ * Howard Butler <hobu.inc at gmail.com> add non-const getData method to all someone to fiddle with the data directly (like byte swapping it :) (17:03:20)
+ * Howard Butler <hobu.inc at gmail.com> use standard sequential iterator verbage (14:52:04)
+ * Howard Butler <hobu.inc at gmail.com> non-const fetches of SchemaLayout and Schema to support changing a PointBuffer's schema on-the-fly (14:51:25)
+ * Howard Butler <hobu.inc at gmail.com> consolidate endianness handling for ByteSwappingFilter's usage as well as Oracle's (13:58:37)
+ * Howard Butler <hobu.inc at gmail.com> add SWAP_LE_TO_BE_N method (13:52:55)
+ * Howard Butler <hobu.inc at gmail.com> add scaffolding for ByteSwapFilter (13:40:26)
+ * Howard Butler <hobu.inc at gmail.com> add SWAP_LE_TO_BE method. Note that this is exactly the same code as SWAP_BE_TO_LE which is merely just a byte swapping function. It is valuable to read which way we're actually going in source code, however (13:30:18)
+ * Howard Butler <hobu.inc at gmail.com> add a Get8DimensionFixedSchema method for our fixed-format schema that we currently write to Oracle (11:49:46)
+ * Howard Butler <hobu.inc at gmail.com> pointSourceID is uint16_t, not int16_t (11:49:15)
+ * Howard Butler <hobu.inc at gmail.com> turn off writing the task xml for now (11:48:59)
+ * Howard Butler <hobu.inc at gmail.com> add an endianness element for dimension (11:47:15)
+ * Howard Butler <hobu.inc at gmail.com> write the stage's xml schema if we weren't given an override (10:28:58)
+ * Howard Butler <hobu.inc at gmail.com> use new getXML() rename instead of write() (10:28:30)
+ * Howard Butler <hobu.inc at gmail.com> actually return the schema objects in from_xml (10:26:33)
+ * Howard Butler <hobu.inc at gmail.com> Schema::from_xml and Schema::to_xml static methods for ingesting and producing XML descriptions of Schema objects (10:00:54)
+ * Howard Butler <hobu.inc at gmail.com> rename write() method to getXML() (09:59:52)
+ * Howard Butler <hobu.inc at gmail.com> remove redundant definition for ORACLE (09:45:26)
+
+2011-05-24
+ * Howard Butler <hobu.inc at gmail.com> add simple i/o testing of the XML schema reader/writer (16:27:10)
+ * Howard Butler <hobu.inc at gmail.com> add a getSchema() method for the xml schema reader (16:26:52)
+ * Howard Butler <hobu.inc at gmail.com> add more cases for converting data type names into Dimension::Field enums (16:26:30)
+ * Howard Butler <hobu.inc at gmail.com> We can now serialize a libpc::Schema -> XML (12:47:21)
+
+2011-05-17
+ * Howard Butler <hobu.inc at gmail.com> don't upper case the point_schema_override (17:57:44)
+
+2011-05-12
+ * Howard Butler <hobu.inc at gmail.com> merge (14:01:47)
+ * Howard Butler <hobu.inc at gmail.com> push the XML schema stuff up into a more public area (14:01:37)
+
+2011-05-11
+ * Michael P. Gerlek <mpg at flaxen.com> strengthen seek/skip tests (19:05:37)
+ * Michael P. Gerlek <mpg at flaxen.com> turn on native zip reading (18:58:42)
+ * Michael P. Gerlek <mpg at flaxen.com> added more read/write laz tests (18:06:55)
+ * Michael P. Gerlek <mpg at flaxen.com> memleak (15:12:42)
+ * Michael P. Gerlek <mpg at flaxen.com> memleak (15:06:59)
+ * Michael P. Gerlek <mpg at flaxen.com> memleak (14:43:32)
+ * Michael P. Gerlek <mpg at flaxen.com> make zip tests pass (but still has memleak) (14:35:00)
+ * Michael P. Gerlek <mpg at flaxen.com> add qfit, terrasolid to vs2010 IDE (14:26:08)
+ * Michael P. Gerlek <mpg at flaxen.com> make build (but not yet run correctly) with laszip/liblas changes (14:19:54)
+ * Howard Butler <hobu.inc at gmail.com> TerraSolid reader now working (12:05:38)
+ * Howard Butler <hobu.inc at gmail.com> don't override getPointCout (12:04:33)
+ * Howard Butler <hobu.inc at gmail.com> add a (not yet working) TerraSolid reader (10:49:55)
+ * Howard Butler <hobu.inc at gmail.com> add Field_Alpha name (10:49:38)
+ * Howard Butler <hobu.inc at gmail.com> add Field_Alpha. Calls to setNumericScale that are not 0.0 imply the dimension is fixed precision (10:49:20)
+
+2011-05-06
+ * Howard Butler <hobu.inc at gmail.com> add functional QFIT reader with some tests and example files (15:42:22)
+ * Howard Butler <hobu.inc at gmail.com> fix up copyright (15:42:05)
+ * Howard Butler <hobu.inc at gmail.com> applyScaling should be a no-op in the case where the m_numericScale is 0.0 (15:14:42)
+ * Howard Butler <hobu.inc at gmail.com> construct schema for QFIT data based on the three possible formats and calculate a point count based on point format size and header offset information (10:59:44)
+ * Howard Butler <hobu.inc at gmail.com> add some more user fields (10:58:56)
+ * Howard Butler <hobu.inc at gmail.com> add scaffolding for QFIT reader (09:25:56)
+ * Howard Butler <hobu.inc at gmail.com> more schema writing (09:25:44)
+ * Howard Butler <hobu.inc at gmail.com> add endianness field to libpc::Dimension to denote layout of the dimension (09:25:22)
+
+2011-04-30
+ * Howard Butler <hobu.inc at gmail.com> start on serializing libpc::Schema to xml (08:31:52)
+
+2011-04-29
+ * Howard Butler <hobu.inc at gmail.com> support serializing a libpc::Schema to XML -- will move this into libpc::Schema proper soon (14:17:25)
+
+2011-04-28
+ * Michael P. Gerlek <mpg at flaxen.com> disable a couple tests as per #35 (12:23:21)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (11:57:12)
+ * Michael P. Gerlek <mpg at flaxen.com> reproj and scaling filters working (11:57:02)
+ * Michael P. Gerlek <mpg at flaxen.com> reproj and scaling filters now working (11:40:40)
+ * Howard Butler <hobu.inc at gmail.com> only compress if set to true (11:15:52)
+ * Michael P. Gerlek <mpg at flaxen.com> update the header's bounds (10:25:32)
+
+2011-04-27
+ * Michael P. Gerlek <mpg at flaxen.com> merge (18:21:56)
+ * Michael P. Gerlek <mpg at flaxen.com> comment out failing tests (18:21:10)
+ * Michael P. Gerlek <mpg at flaxen.com> reprojection and scaling filters almost working (18:13:27)
+ * Michael P. Gerlek <mpg at flaxen.com> added a removeDimension function (18:13:09)
+ * Howard Butler <hobu.inc at gmail.com> merge (14:32:02)
+ * Howard Butler <hobu.inc at gmail.com> only try to set the srs if we have one (14:31:54)
+ * Michael P. Gerlek <mpg at flaxen.com> start of scaling filter (14:13:02)
+ * Michael P. Gerlek <mpg at flaxen.com> harden (14:12:07)
+ * Michael P. Gerlek <mpg at flaxen.com> set buffer spatial bounds (13:51:08)
+ * Michael P. Gerlek <mpg at flaxen.com> added control of writer to emit compound wkts (13:48:14)
+ * Michael P. Gerlek <mpg at flaxen.com> turn on file-compare tests (13:15:35)
+ * Michael P. Gerlek <mpg at flaxen.com> dump wkt info (13:15:17)
+ * Michael P. Gerlek <mpg at flaxen.com> handle case where file missing (13:14:50)
+ * Michael P. Gerlek <mpg at flaxen.com> test now passing (12:54:30)
+ * Michael P. Gerlek <mpg at flaxen.com> SRS bugs all stomped out (12:51:18)
+ * Howard Butler <hobu.inc at gmail.com> fix up options so they actually work :) (10:58:33)
+ * Howard Butler <hobu.inc at gmail.com> add a_srs and compressed options for OCI writer (10:52:52)
+ * Howard Butler <hobu.inc at gmail.com> include cpl_conv.h for CPLFree (10:52:35)
+ * Howard Butler <hobu.inc at gmail.com> include cpl_conv.h for CPLFree (10:52:25)
+ * Howard Butler <hobu.inc at gmail.com> include string and stdexcept (10:41:41)
+
+2011-04-26
+ * Michael P. Gerlek <mpg at flaxen.com> isolated out geotiff stuff; 4 fails left (16:59:47)
+ * Michael P. Gerlek <mpg at flaxen.com> moved string trim function into Utils (16:37:02)
+ * Michael P. Gerlek <mpg at flaxen.com> I keep forgetting to delete the iters -- bad design? (16:31:12)
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint -- removing geotiff support inside srs class (16:24:47)
+ * Michael P. Gerlek <mpg at flaxen.com> minor SRS tweaking/debugging; lit up reproj filter (14:35:27)
+ * Michael P. Gerlek <mpg at flaxen.com> input tests passing (12:57:16)
+ * Michael P. Gerlek <mpg at flaxen.com> output tests passing (12:34:57)
+ * Michael P. Gerlek <mpg at flaxen.com> build fix (12:23:28)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (12:21:33)
+ * Michael P. Gerlek <mpg at flaxen.com> tests for Bounds, Range parsers -- currently doesn't build (12:21:21)
+ * Michael P. Gerlek <mpg at flaxen.com> start of Bounds oper>> parser (12:19:53)
+ * Michael P. Gerlek <mpg at flaxen.com> add some parser helpers (12:19:21)
+ * Howard Butler <hobu.inc at gmail.com> fix up schema override support (12:01:05)
+ * Howard Butler <hobu.inc at gmail.com> make drivers::oci::writer write the 8-dimension format we now use by default (11:33:26)
+ * Howard Butler <hobu.inc at gmail.com> start using our little XML thing for OCI i/o (11:08:16)
+ * Howard Butler <hobu.inc at gmail.com> return #'s that are 0 are legit(ish) (11:06:04)
+ * Howard Butler <hobu.inc at gmail.com> a little more work on Options (10:20:32)
+ * Howard Butler <hobu.inc at gmail.com> update comment about getName (10:20:08)
+ * Howard Butler <hobu.inc at gmail.com> remove OCI-specific stuff from libpc::Options (08:16:36)
+
+2011-04-25
+ * Howard Butler <hobu.inc at gmail.com> clean up uninitialized warning (21:12:51)
+ * Howard Butler <hobu.inc at gmail.com> silence warning about int comparison (21:11:24)
+ * Michael P. Gerlek <mpg at flaxen.com> starting reprojection filter (16:57:08)
+ * Michael P. Gerlek <mpg at flaxen.com> vs2010 lint (16:43:03)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (16:40:42)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (16:28:56)
+ * Michael P. Gerlek <mpg at flaxen.com> srs writing done, but with one unit test failure (16:28:43)
+ * Michael P. Gerlek <mpg at flaxen.com> still debugging VLR/SRS stuff (15:38:04)
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint - SRS/VLR work - split off from Metadata, change VLR ids to strings, etc (13:43:14)
+ * Howard Butler <hobu.inc at gmail.com> reset Stage::getName to be XPath-style stage name (13:41:02)
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint - SRS/VLR work (12:42:42)
+ * Howard Butler <hobu.inc at gmail.com> rename getName to getDescription in preparation for getName being the XPath-style name to the Stage. Remove extra getName() virtual on libpc::Writer (12:33:56)
+ * Howard Butler <hobu.inc at gmail.com> move OCI driver's Options thing up into a proper library-wide class (11:35:01)
+ * Howard Butler <hobu.inc at gmail.com> GDAL_DATA and PROJ_LIB aren't necessary on *nix (10:49:33)
+ * Howard Butler <hobu.inc at gmail.com> remove extra qualification (10:49:19)
+
+2011-04-22
+ * Michael P. Gerlek <mpg at flaxen.com> srs starting to work (18:34:38)
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint for srs work (18:01:35)
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint for srs work (17:54:50)
+ * Michael P. Gerlek <mpg at flaxen.com> tiff libs redirect (15:07:51)
+ * Michael P. Gerlek <mpg at flaxen.com> oops (15:06:35)
+ * Michael P. Gerlek <mpg at flaxen.com> now building against gdal 1.8 (14:30:36)
+ * Michael P. Gerlek <mpg at flaxen.com> dead code (14:29:25)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (13:12:12)
+ * Michael P. Gerlek <mpg at flaxen.com> incremental SRS work for las reader (13:12:04)
+ * Howard Butler <hobu.inc at gmail.com> merge (12:40:52)
+ * Howard Butler <hobu.inc at gmail.com> provide the ability to override the pc_other_attrs column with a point_schema_override option (12:40:43)
+ * Michael P. Gerlek <mpg at flaxen.com> srs round-tripping passing (12:21:05)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (12:04:35)
+ * Michael P. Gerlek <mpg at flaxen.com> incremental SRS work (12:04:22)
+ * Howard Butler <hobu.inc at gmail.com> typo (11:10:24)
+ * Michael P. Gerlek <mpg at flaxen.com> fix busted merge (10:58:19)
+ * Michael P. Gerlek <mpg at flaxen.com> move compare_no_case to Utils (10:47:39)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (10:46:29)
+ * Michael P. Gerlek <mpg at flaxen.com> start of srs work (10:43:47)
+ * Howard Butler <hobu.inc at gmail.com> remove extra qualifications (09:52:55)
+ * Howard Butler <hobu.inc at gmail.com> add new defn for compare_no_case (09:52:48)
+
+2011-04-21
+ * Michael P. Gerlek <mpg at flaxen.com> add C macros (16:28:58)
+ * Michael P. Gerlek <mpg at flaxen.com> missing file (16:28:39)
+ * Michael P. Gerlek <mpg at flaxen.com> VLR work, start of SRS support (15:41:10)
+ * Michael P. Gerlek <mpg at flaxen.com> add VLR support to liblas reader (15:03:56)
+ * Michael P. Gerlek <mpg at flaxen.com> start of VLR work (14:06:35)
+ * Michael P. Gerlek <mpg at flaxen.com> fix for gadomski (13:45:58)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (11:58:49)
+ * Michael P. Gerlek <mpg at flaxen.com> vs2010 fix (11:58:37)
+ * Howard Butler <hobu.inc at gmail.com> don't make overwrite on by default, this is bad :) (11:42:42)
+
+2011-04-20
+ * Howard Butler <hobu.inc at gmail.com> Read the new 8-dimension full layout that las2oci writes... libPC doesn't write this yet, however (13:53:53)
+ * Howard Butler <hobu.inc at gmail.com> revert to allowing 'select * from blk_table' for now (12:32:13)
+ * Howard Butler <hobu.inc at gmail.com> a return number that is 0 is legit (12:29:32)
+ * Howard Butler <hobu.inc at gmail.com> dumb mapping of name -> Dimension::Field for now (12:18:42)
+ * Howard Butler <hobu.inc at gmail.com> make sure to seek to end of file before reading data (11:07:20)
+ * Howard Butler <hobu.inc at gmail.com> xml parsing for generating libpc::Dimension entries (11:07:00)
+ * Howard Butler <hobu.inc at gmail.com> add operator < and > for sorting (09:42:15)
+ * Howard Butler <hobu.inc at gmail.com> start on some OCI schema stuff (08:27:59)
+
+2011-04-18
+ * Michael P. Gerlek <mpg at flaxen.com> add demo version (23:27:51)
+ * Michael P. Gerlek <mpg at flaxen.com> move to do parallel reads (oooh\!) (23:22:04)
+ * Michael P. Gerlek <mpg at flaxen.com> handle read-past-end nicely (23:21:07)
+ * Michael P. Gerlek <mpg at flaxen.com> support skipping (23:20:50)
+ * Michael P. Gerlek <mpg at flaxen.com> avoid small reads at all costs (16:27:50)
+ * Michael P. Gerlek <mpg at flaxen.com> switch to native las driver, some tuning (16:03:15)
+ * Michael P. Gerlek <mpg at flaxen.com> inlined some things; made color filter work with LAS schema (16:02:39)
+
+2011-04-15
+ * Michael P. Gerlek <mpg at flaxen.com> start to add native LAZ support (22:21:11)
+ * Michael P. Gerlek <mpg at flaxen.com> fix guid writing (19:45:28)
+ * Michael P. Gerlek <mpg at flaxen.com> win32 build fix (18:40:12)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (18:36:50)
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint - native las drivers almost to partiy with liblas drivers (18:36:12)
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint -- turning on native las tests (17:44:39)
+ * Howard Butler <hobu.inc at gmail.com> start on an OCI-Schema test (17:14:12)
+ * Howard Butler <hobu.inc at gmail.com> remove redundant call, we throw exceptions now (17:13:49)
+ * Howard Butler <hobu.inc at gmail.com> flips the modes around for createFile and openFile (17:13:15)
+ * Michael P. Gerlek <mpg at flaxen.com> add libxml2 (16:43:44)
+ * Howard Butler <hobu.inc at gmail.com> install custom error handlers for libxml2 (16:40:36)
+ * Howard Butler <hobu.inc at gmail.com> merge (16:21:31)
+ * Howard Butler <hobu.inc at gmail.com> turn off table creation/deletion for now (16:21:21)
+ * Howard Butler <hobu.inc at gmail.com> start adding Cloud object definition (16:21:04)
+ * Howard Butler <hobu.inc at gmail.com> start adding Cloud object definition (16:20:35)
+ * Howard Butler <hobu.inc at gmail.com> add more schema stuff (16:20:11)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (16:14:28)
+ * Michael P. Gerlek <mpg at flaxen.com> added IDE grouping (16:14:19)
+ * Michael P. Gerlek <mpg at flaxen.com> refactoring support functions (16:00:25)
+ * Howard Butler <hobu.inc at gmail.com> scaffolding for libxml2-based schema reader/writer for OCI driver (15:37:04)
+ * Howard Butler <hobu.inc at gmail.com> add a default: case to handle other pointformats (14:49:00)
+ * Howard Butler <hobu.inc at gmail.com> include ostream for defn (14:48:40)
+ * Michael P. Gerlek <mpg at flaxen.com> liblaswriter now does header rewriting (14:43:44)
+
+2011-04-14
+ * Howard Butler <hobu.inc at gmail.com> throw buffer_too_small error when user requested a buffer that won't fit the oracle block (13:45:48)
+ * Howard Butler <hobu.inc at gmail.com> logic bug in determining if we can fit more points in the block. This was causing lots of extra PointBuffer creation. (10:26:10)
+ * Howard Butler <hobu.inc at gmail.com> merge (09:24:44)
+ * Howard Butler <hobu.inc at gmail.com> move block define and query type operations from Iterator to Reader (09:24:34)
+
+2011-04-13
+ * Michael P. Gerlek <mpg at flaxen.com> added tests for liblas formats (18:06:33)
+ * Michael P. Gerlek <mpg at flaxen.com> add control over version, guid (18:06:19)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (16:45:07)
+ * Michael P. Gerlek <mpg at flaxen.com> refactoring of common code in las/liblas readers/writers (16:44:57)
+ * Michael P. Gerlek <mpg at flaxen.com> add nonconst version of getDim (16:44:08)
+ * Howard Butler <hobu.inc at gmail.com> decruft in preparation for moving definition onto the Reader instead of the Iterator (15:15:13)
+ * Howard Butler <hobu.inc at gmail.com> use liblas writer for reader test because it matches our fixed schema right now (14:39:20)
+ * Howard Butler <hobu.inc at gmail.com> virtualize Stage::getNumPoints (14:38:55)
+ * Howard Butler <hobu.inc at gmail.com> only run OCI test if you give a connection string via command line argument (13:28:49)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (12:58:09)
+ * Michael P. Gerlek <mpg at flaxen.com> fix vs2010 build (12:57:56)
+ * Howard Butler <hobu.inc at gmail.com> merge (12:50:55)
+ * Howard Butler <hobu.inc at gmail.com> merge (12:50:41)
+ * Michael P. Gerlek <mpg at flaxen.com> sync with Dimension:: changes (12:50:37)
+ * Howard Butler <hobu.inc at gmail.com> use LasWriter instead of LiblasWriter (12:50:00)
+ * Howard Butler <hobu.inc at gmail.com> throw a connection_error in the event we are unable to connect (09:11:56)
+ * Pete Gadomski <pete.gadomski at gmail.com> Changed cmake's WITH_LIBLAS to default to TRUE (09:00:19)
+
+2011-04-12
+ * Howard Butler <hobu.inc at gmail.com> remove extra writing of buffer overrun data (15:11:31)
+ * Howard Butler <hobu.inc at gmail.com> rename getNumericValue (14:30:30)
+ * Howard Butler <hobu.inc at gmail.com> throw dimension_not_found error when it doesn't match up (14:30:09)
+ * Howard Butler <hobu.inc at gmail.com> add dimension_not_found exception (14:26:01)
+ * Howard Butler <hobu.inc at gmail.com> use applyScaling method that was renamed (14:24:44)
+ * Howard Butler <hobu.inc at gmail.com> rename Dimension::getNumericValue to applyScaling, add a removeScaling method, and add an Undefined DataType (14:23:47)
+ * Howard Butler <hobu.inc at gmail.com> Start on an OCI test case (11:41:18)
+ * Howard Butler <hobu.inc at gmail.com> lint and operator precedence (11:41:08)
+ * Howard Butler <hobu.inc at gmail.com> hop out of readImpl before resetting the buffer's count to 0 (11:40:43)
+ * Howard Butler <hobu.inc at gmail.com> reset the point count to 0 for each readBuffer call (11:38:38)
+ * Howard Butler <hobu.inc at gmail.com> convenience function to fetch the connection (11:38:15)
+ * Howard Butler <hobu.inc at gmail.com> move connection to the database at construction time (11:38:01)
+ * Howard Butler <hobu.inc at gmail.com> LASzip's version has increased to 1.2.0, this means updating the test file (11:37:23)
+
+2011-04-11
+ * Howard Butler <hobu.inc at gmail.com> fix up block edge accounting (16:30:25)
+ * Howard Butler <hobu.inc at gmail.com> copy/paste error (15:12:24)
+ * Howard Butler <hobu.inc at gmail.com> we need to fill in variables to compare to (15:12:06)
+ * Howard Butler <hobu.inc at gmail.com> don't set scales until initialize() (15:10:49)
+ * Howard Butler <hobu.inc at gmail.com> more useful lint :) (15:01:10)
+ * Howard Butler <hobu.inc at gmail.com> add some lint (14:57:15)
+ * Howard Butler <hobu.inc at gmail.com> set scale and offset (14:43:45)
+ * Howard Butler <hobu.inc at gmail.com> explicitly write the num points written at writeEnd (14:41:22)
+ * Howard Butler <hobu.inc at gmail.com> keep track of the number of points we've written and rewrite the header on writeEnd to put the count in (14:33:28)
+ * Howard Butler <hobu.inc at gmail.com> more case name stuff for header files (11:54:16)
+ * Howard Butler <hobu.inc at gmail.com> newline at end of file (11:53:37)
+ * Howard Butler <hobu.inc at gmail.com> more case name stuff for header files (11:52:58)
+ * Howard Butler <hobu.inc at gmail.com> libLAS' header file names are lower cased (11:51:10)
+ * Howard Butler <hobu.inc at gmail.com> merge (09:50:44)
+ * Howard Butler <hobu.inc at gmail.com> add endian swapping for OCI. This should be updated to just use boost's (09:50:35)
+ * Howard Butler <hobu.inc at gmail.com> ignore bin/ (08:26:25)
+ * Howard Butler <hobu.inc at gmail.com> add a WKT boundary file for LAS data (08:26:20)
+
+2011-04-10
+ * Howard Butler <hobu.inc at gmail.com> use Ivan's WriteClob function to write and bind the WKT column into the SDO_GEOMETRY constructor (21:10:59)
+ * Howard Butler <hobu.inc at gmail.com> fix off-by-one error in binding column position of writer (14:45:12)
+
+2011-04-08
+ * Howard Butler <hobu.inc at gmail.com> more tweaks of oracle configs (16:30:52)
+ * Howard Butler <hobu.inc at gmail.com> remove dead code, add bounds fetching (16:30:36)
+ * Howard Butler <hobu.inc at gmail.com> use size_type instead of size_t for vector size, add an add() method (16:14:17)
+ * Howard Butler <hobu.inc at gmail.com> only try deleting block table if it exists (15:45:52)
+ * Howard Butler <hobu.inc at gmail.com> use liblas::HeaderPtr to keep track of header information for LAS writer (14:27:32)
+ * Howard Butler <hobu.inc at gmail.com> trim dead code (08:30:05)
+
+2011-04-07
+ * Howard Butler <hobu.inc at gmail.com> support table deletion and PC object creation (15:29:00)
+ * Howard Butler <hobu.inc at gmail.com> support overwrite for OCI (15:28:20)
+ * Howard Butler <hobu.inc at gmail.com> successfully read 5-fixed-dimension OCI data for the first time (13:06:22)
+ * Howard Butler <hobu.inc at gmail.com> comment out the assertion about making sure we wrote the right number of points. We don't know that anymore (13:04:18)
+
+2011-04-06
+ * Howard Butler <hobu.inc at gmail.com> a good stopping point (21:19:59)
+
+2011-04-05
+ * Michael P. Gerlek <mpg at flaxen.com> merge (17:10:07)
+ * Michael P. Gerlek <mpg at flaxen.com> add las reading (17:09:55)
+ * Howard Butler <hobu.inc at gmail.com> add support for fetching OCIArray* lengths (16:46:20)
+ * Michael P. Gerlek <mpg at flaxen.com> add pcview (16:28:51)
+ * Michael P. Gerlek <mpg at flaxen.com> add FreeGLUT library (16:02:08)
+ * Howard Butler <hobu.inc at gmail.com> a few debugging updates for oracle (12:00:00)
+
+2011-04-04
+ * Howard Butler <hobu.inc at gmail.com> I could swear I fixed this (15:24:32)
+ * Howard Butler <hobu.inc at gmail.com> execute needs to be inside try/except (15:17:16)
+ * Howard Butler <hobu.inc at gmail.com> SDO_GEOMETRY blk_extent fetching for readBuffer (08:04:16)
+
+2011-04-01
+ * Howard Butler <hobu.inc at gmail.com> if ::write(0) is called, we just write until the iteratore reads 0 points for us (16:02:02)
+ * Howard Butler <hobu.inc at gmail.com> no longer need to bogusly set the point count (16:01:19)
+ * Howard Butler <hobu.inc at gmail.com> move most reading functions into the IteratorBase (15:48:16)
+ * Howard Butler <hobu.inc at gmail.com> supportsIterator is a const method (15:48:01)
+ * Howard Butler <hobu.inc at gmail.com> more blob fetching for libpc::drivers::oci::Reader (13:53:59)
+ * Howard Butler <hobu.inc at gmail.com> add new ReadBlob method that can be called multiple times until the blob is entirely read (09:15:55)
+ * Howard Butler <hobu.inc at gmail.com> BLOB point selection now working (07:43:52)
+ * Howard Butler <hobu.inc at gmail.com> No longer do assert() when getDimensionIndex returns a -1. Instead, return the -1, and then have getField return a 0 if it was given a field dimension of -1 (07:43:35)
+
+2011-03-31
+ * Howard Butler <hobu.inc at gmail.com> add support for boundary insertion via CLOBs to libpc::drivers::oci::Writer (09:33:40)
+ * Howard Butler <hobu.inc at gmail.com> more libpc::drivers::oci::Reader work (07:27:43)
+
+2011-03-29
+ * Howard Butler <hobu.inc at gmail.com> more oci reader scaffolding (12:22:08)
+ * Howard Butler <hobu.inc at gmail.com> use libPC include path for oci_wrapper.h (12:21:28)
+ * Howard Butler <hobu.inc at gmail.com> update OCI wrapper to match latest in SVN (12:20:33)
+
+2011-03-28
+ * Howard Butler <hobu.inc at gmail.com> have oci::Reader iterator create a statement using the shared connection (15:09:11)
+ * Howard Butler <hobu.inc at gmail.com> oci::Reader Iterator scaffolding. use libpc::drivers instead of libpc::driver for namespace for OCI driver like the rest (14:04:55)
+ * Howard Butler <hobu.inc at gmail.com> more oci reader scaffolding (12:57:26)
+ * Howard Butler <hobu.inc at gmail.com> move the connect code into common for both reader and writer to use (12:03:53)
+ * Howard Butler <hobu.inc at gmail.com> remove supportsITERATORTYPEIterator() methods in favor of supportsIterator(IteratorType t) (11:31:58)
+ * Howard Butler <hobu.inc at gmail.com> Make the chipper support a SequentialIterator and implement writeBuffer to use it (11:13:35)
+
+2011-03-25
+ * Michael P. Gerlek <mpg at flaxen.com> remove old (and now empty) Header class files (18:46:41)
+ * Michael P. Gerlek <mpg at flaxen.com> get rid of need for separate Header classes (yippee) (18:27:51)
+ * Michael P. Gerlek <mpg at flaxen.com> getDimensionIndex() now takes both the field name and the datatype, to reduce errors; it is defined to throw if the field is not found or if it is found but with the wrong datatype (17:12:09)
+ * Howard Butler <hobu.inc at gmail.com> merge (14:58:05)
+ * Howard Butler <hobu.inc at gmail.com> BlockIterator scaffolding (14:56:40)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (14:09:34)
+ * Michael P. Gerlek <mpg at flaxen.com> fix compare_approx to work more betterer (14:09:22)
+ * Howard Butler <hobu.inc at gmail.com> move chipper down into filters and namespace appropriately (13:58:59)
+ * Howard Butler <hobu.inc at gmail.com> merge (13:36:15)
+ * Howard Butler <hobu.inc at gmail.com> move chipper down into filters namespace (13:36:06)
+ * Michael P. Gerlek <mpg at flaxen.com> fix comment (13:35:56)
+ * Michael P. Gerlek <mpg at flaxen.com> handle 64-bit errors (13:32:02)
+ * Michael P. Gerlek <mpg at flaxen.com> handle 64-bit errors (13:25:06)
+ * Michael P. Gerlek <mpg at flaxen.com> allow for 64b writes (13:10:15)
+ * Michael P. Gerlek <mpg at flaxen.com> refactor to remove duplicated code (13:05:10)
+ * Michael P. Gerlek <mpg at flaxen.com> updated comments (13:05:00)
+ * Michael P. Gerlek <mpg at flaxen.com> refactor to remove duplicated code (13:00:54)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (12:38:57)
+ * Michael P. Gerlek <mpg at flaxen.com> #1: now using consistent LIBPC_* macros, fixed some old ones (12:38:47)
+ * Howard Butler <hobu.inc at gmail.com> add bool suppo0rtsIterator(StageIteratorType t) method and remove other junk :) (12:15:16)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (11:56:02)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (11:53:25)
+ * Michael P. Gerlek <mpg at flaxen.com> nasty lint (11:53:16)
+ * Howard Butler <hobu.inc at gmail.com> merge (11:51:37)
+ * Howard Butler <hobu.inc at gmail.com> add generic createIterator(StageIteratorType t) method to stages (11:51:27)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (11:50:49)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (11:45:00)
+ * Michael P. Gerlek <mpg at flaxen.com> use perc, not eps, for FP compares (11:44:44)
+ * Michael P. Gerlek <mpg at flaxen.com> added note about FP compares (11:44:24)
+ * Howard Butler <hobu.inc at gmail.com> add getIteratorSupport method to Stage:: to make it easier to add new iterator types (11:29:51)
+ * Michael P. Gerlek <mpg at flaxen.com> a cut-and-paste error and an off-by-one error at the same time :-) (10:59:12)
+ * Howard Butler <hobu.inc at gmail.com> use BOOST_CHECK_EQUAL and BOOST_CHECK_CLOSE and friends from http://www.boost.org/doc/libs/1_46_0/libs/test/doc/html/utf/testing-tools/reference.html so we get better output instead of merely using BOOST_CHECK (09:55:29)
+ * Howard Butler <hobu.inc at gmail.com> include fixups related to #21 (08:07:44)
+ * Howard Butler <hobu.inc at gmail.com> merge (07:54:45)
+ * Howard Butler <hobu.inc at gmail.com> scaffolding for BlockIterator (07:54:32)
+ * Howard Butler <hobu.inc at gmail.com> use BOOST_CHECK_CLOSE instead of BOOST_CHECK_CLOSE_FRACTION (07:54:19)
+
+2011-03-24
+ * Michael P. Gerlek <mpg at flaxen.com> merge (23:03:03)
+ * Michael P. Gerlek <mpg at flaxen.com> fix a bunch of #include issues (23:02:53)
+ * Michael P. Gerlek <mpg at flaxen.com> fix a bunch of #include issues (22:47:27)
+ * Michael P. Gerlek <mpg at flaxen.com> fix a bunch of #include issues (19:32:09)
+ * Michael P. Gerlek <mpg at flaxen.com> fix a bunch of #include issues (19:09:37)
+ * Howard Butler <hobu.inc at gmail.com> more test of chipper (14:26:10)
+ * Michael P. Gerlek <mpg at flaxen.com> fix test that was too subject to random data (14:12:56)
+ * Michael P. Gerlek <mpg at flaxen.com> fix off-by-one (14:12:21)
+ * Michael P. Gerlek <mpg at flaxen.com> added a Ramp mode to FauxReader (13:19:10)
+ * Michael P. Gerlek <mpg at flaxen.com> merg (12:54:51)
+ * Michael P. Gerlek <mpg at flaxen.com> provide pessimistic defaults for iter creation (12:54:33)
+ * Howard Butler <hobu.inc at gmail.com> merge (12:39:53)
+ * Howard Butler <hobu.inc at gmail.com> start making the Chipper a filter (12:39:43)
+ * Michael P. Gerlek <mpg at flaxen.com> good 4-iter test (12:38:30)
+ * Michael P. Gerlek <mpg at flaxen.com> refactored read() into the liblasiter base (12:08:53)
+ * Michael P. Gerlek <mpg at flaxen.com> make the liblas iters have their own ::liblas::reader objects (12:04:29)
+ * Michael P. Gerlek <mpg at flaxen.com> removed commented-out code (11:12:53)
+ * Michael P. Gerlek <mpg at flaxen.com> additional test for liblas iter reset (11:03:39)
+ * Michael P. Gerlek <mpg at flaxen.com> temp hack for multi-iter support (10:48:17)
+ * Michael P. Gerlek <mpg at flaxen.com> test (10:06:11)
+
+2011-03-23
+ * Michael P. Gerlek <mpg at flaxen.com> fix stupid name and remove silly cast (21:03:35)
+ * Michael P. Gerlek <mpg at flaxen.com> added random iterators (17:43:21)
+ * Michael P. Gerlek <mpg at flaxen.com> rename Iterator -> SequentialIterator (16:59:25)
+ * Howard Butler <hobu.inc at gmail.com> completely back up the chipper in preparation for random iterators (16:37:10)
+ * Howard Butler <hobu.inc at gmail.com> have the chipper carry around its point's data and then provide a GetPointBuffer method for blocks to return it to those who need it (14:27:22)
+ * Howard Butler <hobu.inc at gmail.com> add indeterminate_count_error for situations where that's a problem (14:26:46)
+ * Howard Butler <hobu.inc at gmail.com> Give PointBuffer a ::setData method for those wishing to interact with it at the raw level (14:23:24)
+ * Michael P. Gerlek <mpg at flaxen.com> make the las readers take filenames, not istreams, for future parallel I/O (13:25:19)
+ * Michael P. Gerlek <mpg at flaxen.com> refactor for const-correctness and to unfriend the Iter (13:03:19)
+ * Michael P. Gerlek <mpg at flaxen.com> refactor for const-correctness and to unfriend the Iter (12:54:26)
+ * Michael P. Gerlek <mpg at flaxen.com> refactor for const-correctness and to unfriend the Iter (12:47:37)
+ * Michael P. Gerlek <mpg at flaxen.com> comment (12:47:00)
+ * Michael P. Gerlek <mpg at flaxen.com> refactor cache system for const-correctness (12:30:31)
+ * Michael P. Gerlek <mpg at flaxen.com> change stupid name (11:59:16)
+ * Howard Butler <hobu.inc at gmail.com> that never would have worked (PointBuffer::operator=) (11:32:45)
+ * Howard Butler <hobu.inc at gmail.com> undo PointBuffer stuff, let's try a different way (11:29:23)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (11:10:46)
+ * Michael P. Gerlek <mpg at flaxen.com> iter work - hiding the point count management (11:10:20)
+ * Michael P. Gerlek <mpg at flaxen.com> rename some iter functions (10:48:01)
+ * Howard Butler <hobu.inc at gmail.com> fix up stupidity in PointBuffer assignment constructor (10:43:55)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (10:36:43)
+ * Michael P. Gerlek <mpg at flaxen.com> iter work - tests passing now (10:36:31)
+ * Howard Butler <hobu.inc at gmail.com> use copyable PointBuffer for caching points in Chipper (10:11:26)
+ * Michael P. Gerlek <mpg at flaxen.com> iter work (10:01:47)
+ * Howard Butler <hobu.inc at gmail.com> blindly cast to char* for unix putenv (09:56:21)
+
+2011-03-22
+ * Michael P. Gerlek <mpg at flaxen.com> banish vile const_cast (18:05:20)
+ * Michael P. Gerlek <mpg at flaxen.com> fix leak (17:55:30)
+ * Michael P. Gerlek <mpg at flaxen.com> fix test name (17:51:28)
+ * Michael P. Gerlek <mpg at flaxen.com> fix test name (17:46:37)
+ * Michael P. Gerlek <mpg at flaxen.com> fix leak in iterators (17:36:54)
+ * Michael P. Gerlek <mpg at flaxen.com> fix leak, fix warning (16:49:51)
+ * Howard Butler <hobu.inc at gmail.com> add a getData method that returns copied raw bytes back to the user they can own (12:58:50)
+ * Howard Butler <hobu.inc at gmail.com> file rename for PointData->PointBuffer (12:58:10)
+ * Howard Butler <hobu.inc at gmail.com> PointData now == PointBuffer (12:04:59)
+ * Howard Butler <hobu.inc at gmail.com> back PointData's m_data with a boost::scoped_array instead of a naked array of bytes so we get some exception and leak safety (11:39:21)
+ * Howard Butler <hobu.inc at gmail.com> http://stackoverflow.com/questions/656948/a-class-key-must-be-declared-when-declaring-a-friend states that we must use 'friend class className' to satisfy gcc rather than merely 'friend className' I don't know why, and I don't have any friends (10:39:17)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (09:34:07)
+
+2011-03-21
+ * Michael P. Gerlek <mpg at flaxen.com> archived copies of sprint slides (19:53:47)
+ * Michael P. Gerlek <mpg at flaxen.com> moving to _static (19:51:01)
+ * Michael P. Gerlek <mpg at flaxen.com> obsolete (19:49:40)
+ * Michael P. Gerlek <mpg at flaxen.com> remove extra ifdefs (19:42:49)
+ * Michael P. Gerlek <mpg at flaxen.com> update for gdal, oci (19:42:33)
+
+2011-03-18
+ * Michael P. Gerlek <mpg at flaxen.com> made Stages be const wrt other stages and iterators (21:26:41)
+ * Michael P. Gerlek <mpg at flaxen.com> put the Iters into their own files (20:46:41)
+ * Michael P. Gerlek <mpg at flaxen.com> iterator work checkpoint -stage-based read methods now gone (19:54:29)
+ * Michael P. Gerlek <mpg at flaxen.com> iterator work checkpoint (18:10:08)
+ * Kirk McKelvey <kirkoman at lizardtech.com> allow pcinfo build w/out mrsid configured (11:19:49)
+ * Kirk McKelvey <kirkoman at lizardtech.com> get mrsid reader linking and reporting num points (11:03:09)
+ * Kirk McKelvey <kirkoman at lizardtech.com> teach pcinfo to open .sid files (11:00:22)
+ * Kirk McKelvey <kirkoman at lizardtech.com> not every app should claim to be pc2pc (10:59:49)
+ * Howard Butler <hobu.inc at gmail.com> fix ups to carry along raw point data with PtRef's (10:39:39)
+ * Howard Butler <hobu.inc at gmail.com> make getData public (10:39:26)
+ * Howard Butler <hobu.inc at gmail.com> copy data in assigment and copy constructors (10:39:09)
+ * Howard Butler <hobu.inc at gmail.com> merge (09:07:37)
+ * Howard Butler <hobu.inc at gmail.com> clean up includes a bit in Chipper (09:07:26)
+ * Kirk McKelvey <kirkoman at lizardtech.com> get rid of WITH_LIBLAS-not-used message (09:06:04)
+ * Howard Butler <hobu.inc at gmail.com> merge (09:02:12)
+ * Howard Butler <hobu.inc at gmail.com> oci::Block copy constructor should actually copy something (09:01:46)
+ * Kirk McKelvey <kirkoman at lizardtech.com> introducing build and source files for mrsid driver (driver not operational) (09:01:33)
+ * Howard Butler <hobu.inc at gmail.com> merge (08:53:33)
+ * Howard Butler <hobu.inc at gmail.com> fix up chipper::Block constructor (08:53:27)
+ * Howard Butler <hobu.inc at gmail.com> add copy and assignment constructors to PointData (08:53:06)
+ * Kirk McKelvey <kmckelvey at lizardtech.com> make FindOracle friendlier to Instant Client (08:37:07)
+
+2011-03-17
+ * Howard Butler <hobu.inc at gmail.com> merge (14:46:55)
+ * Howard Butler <hobu.inc at gmail.com> some (broken) chipper work (14:46:41)
+ * Howard Butler <hobu.inc at gmail.com> make getCapacity const (14:46:20)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (14:38:48)
+ * Michael P. Gerlek <mpg at flaxen.com> guards (14:38:27)
+ * Howard Butler <hobu.inc at gmail.com> merge (14:35:05)
+ * Howard Butler <hobu.inc at gmail.com> don't include libpc_config.hpp right now (14:31:14)
+ * Howard Butler <hobu.inc at gmail.com> don't multiple include _config (14:30:39)
+ * Howard Butler <hobu.inc at gmail.com> do something if we read no points (14:30:11)
+ * Michael P. Gerlek <mpg at flaxen.com> removed bounds from read() calls (14:26:33)
+ * Michael P. Gerlek <mpg at flaxen.com> added bounds member (14:11:02)
+ * Michael P. Gerlek <mpg at flaxen.com> iter work (13:56:34)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (13:24:36)
+ * Michael P. Gerlek <mpg at flaxen.com> add point count type get/set (13:24:23)
+ * Kirk McKelvey <kirkoman at gmail.com> reparenting the OCI Reader (13:12:20)
+ * Michael P. Gerlek <mpg at flaxen.com> reorder files (13:04:19)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (13:01:41)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (13:00:17)
+ * Michael P. Gerlek <mpg at flaxen.com> make test dir work for win32 (12:59:57)
+ * Howard Butler <hobu.inc at gmail.com> merge (12:59:24)
+ * Howard Butler <hobu.inc at gmail.com> comment about bounds fix (12:59:09)
+ * Howard Butler <hobu.inc at gmail.com> fix up LAS readers to use capacity instead of numPoints (12:58:59)
+ * Michael P. Gerlek <mpg at flaxen.com> repair init order (12:26:18)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (12:12:51)
+ * Michael P. Gerlek <mpg at flaxen.com> removed Reader class; add some iter support code (12:12:31)
+ * Kirk McKelvey <kirkoman at gmail.com> second try at the global data path (11:38:16)
+ * Kirk McKelvey <kirkoman at gmail.com> first pieces of mrsid cmake config (10:16:35)
+ * Howard Butler <hobu.inc at gmail.com> fix ups for bounds-based reading for OCI (10:15:32)
+ * Michael P. Gerlek <mpg at flaxen.com> bad merge (10:06:31)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (10:04:38)
+ * Michael P. Gerlek <mpg at flaxen.com> bounds fix (10:03:52)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (10:03:44)
+ * Howard Butler <hobu.inc at gmail.com> keep track of point count vs capacity in CropFilter (09:57:00)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (09:52:54)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (conflicts resolved) (09:52:25)
+ * Howard Butler <hobu.inc at gmail.com> keep track of point count when adding points to the mosaic and use the capacity of the PointData to inform how many points we might be reading instead of PointData::getNumPoints() (09:42:09)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (09:41:03)
+ * Michael P. Gerlek <mpg at flaxen.com> add bounds param to read() calls (09:40:49)
+ * Howard Butler <hobu.inc at gmail.com> keep track of point count when adding points to the mosaic and use the capacity of the PointData to inform how many points we might be reading instead of PointData::getNumPoints() (09:29:42)
+ * Howard Butler <hobu.inc at gmail.com> keep track of point count when adding points to the PointData (09:28:59)
+ * Howard Butler <hobu.inc at gmail.com> the user must always keep track of the point count when doing copyPoint(s) (09:28:33)
+ * Michael P. Gerlek <mpg at flaxen.com> add default bounds getter (09:20:03)
+ * Howard Butler <hobu.inc at gmail.com> merge (08:57:14)
+ * Howard Butler <hobu.inc at gmail.com> fix up PointDataTest in light of changes to PointData wrt capacity vs. count (08:57:04)
+ * Howard Butler <hobu.inc at gmail.com> fix up CacheFilter in light of changes to PointData wrt capacity vs. count (08:56:45)
+ * Michael P. Gerlek <mpg at flaxen.com> missing file (empty for now) (08:56:31)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (08:39:21)
+ * Michael P. Gerlek <mpg at flaxen.com> add impedance checking to colorizer filter (08:38:58)
+
+2011-03-16
+ * Pete Gadomski <pete.gadomski at gmail.com> Added rudimentary cmake-swig support for csharp and python (15:55:46)
+ * Howard Butler <hobu.inc at gmail.com> merge (15:52:29)
+ * Howard Butler <hobu.inc at gmail.com> it's not worse than it was before -- attempting to keep track of count and capacity for PointData (15:52:21)
+ * Michael P. Gerlek <mpg at flaxen.com> updated (15:21:48)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (15:19:33)
+ * Michael P. Gerlek <mpg at flaxen.com> added libpc.hpp (15:19:23)
+ * Michael P. Gerlek <mpg at flaxen.com> offbyone error (15:19:10)
+ * Howard Butler <hobu.inc at gmail.com> fix up BOOST_TEST_MODULE for static boost::unit_test (14:44:04)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (14:38:38)
+ * Michael P. Gerlek <mpg at flaxen.com> build fix for win32 (14:38:27)
+ * Howard Butler <hobu.inc at gmail.com> fix namespaced liblas reader (14:37:25)
+ * Howard Butler <hobu.inc at gmail.com> merge (14:33:44)
+ * Howard Butler <hobu.inc at gmail.com> add capacity arg to pointData (14:33:34)
+ * Kirk McKelvey <kirkoman at gmail.com> static linkage already defines main in the boost lib (14:32:54)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (14:31:50)
+ * Michael P. Gerlek <mpg at flaxen.com> add some more namespacing (14:31:35)
+ * Howard Butler <hobu.inc at gmail.com> merge (14:15:10)
+ * Howard Butler <hobu.inc at gmail.com> remove IsValid et. al. from PointData (14:14:56)
+ * Kirk McKelvey <kirkoman at gmail.com> merge (14:13:18)
+ * Michael P. Gerlek <mpg at flaxen.com> turn off iters for now (13:49:38)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (13:48:35)
+ * Michael P. Gerlek <mpg at flaxen.com> placeholder for future work (13:48:21)
+ * Michael P. Gerlek <mpg at flaxen.com> switch to doubles (13:48:05)
+ * Kirk McKelvey <kirkoman at gmail.com> set libpc_test data directory from the command line (13:23:10)
+ * Howard Butler <hobu.inc at gmail.com> fix up float->double in FauxReader/Writer (12:11:43)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (11:49:08)
+ * Michael P. Gerlek <mpg at flaxen.com> getting ready for iterators (11:48:57)
+ * Michael P. Gerlek <mpg at flaxen.com> typo in IDE grouping (11:36:51)
+ * Howard Butler <hobu.inc at gmail.com> clean up more == comparison tests with epsilon tests (11:22:48)
+ * Howard Butler <hobu.inc at gmail.com> clean up more == comparison tests with epsilon tests (11:15:07)
+ * Howard Butler <hobu.inc at gmail.com> make Faux Writer deal in doubles, not floats, and clean up some == comparisons to use epsilon tests (10:58:15)
+ * Howard Butler <hobu.inc at gmail.com> make DescribeType take in a const char* (10:47:12)
+ * Howard Butler <hobu.inc at gmail.com> clean up comment junk (10:38:32)
+ * Howard Butler <hobu.inc at gmail.com> add file for iterators (10:37:19)
+ * Howard Butler <hobu.inc at gmail.com> merge (09:51:26)
+ * Howard Butler <hobu.inc at gmail.com> make libpc::driver::oci::Writer derive from libpc::Writer (09:51:08)
+ * Kirk McKelvey <kirkoman at gmail.com> merge (09:50:00)
+ * Kirk McKelvey <kirkoman at gmail.com> refer to CacheFilter in its namespace (09:47:48)
+ * Pete Gadomski <pete.gadomski at gmail.com> Added conditional BOOST_TEST_DYN_LINK option for testing (09:45:51)
+ * Howard Butler <hobu.inc at gmail.com> rearrange oci driver to fit new layout (09:42:59)
+ * Kirk McKelvey <kirkoman at gmail.com> header capitalization, location (09:33:19)
+ * Howard Butler <hobu.inc at gmail.com> merge (09:21:33)
+ * Howard Butler <hobu.inc at gmail.com> more epsilon compares (09:21:28)
+ * Howard Butler <hobu.inc at gmail.com> oops, rollback that (09:16:58)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (09:06:46)
+ * Michael P. Gerlek <mpg at flaxen.com> group files for IDE explorer (09:06:33)
+ * Howard Butler <hobu.inc at gmail.com> clean up initialization order warning (09:02:17)
+ * Howard Butler <hobu.inc at gmail.com> Use epsilon compares instead of == for doubles (08:57:57)
+ * Howard Butler <hobu.inc at gmail.com> clean up initialization order warning (08:47:42)
+ * Howard Butler <hobu.inc at gmail.com> do an epsilon compare for testing doubles (08:46:11)
+ * Michael P. Gerlek <mpg at flaxen.com> fix spelling (01:35:32)
+ * Michael P. Gerlek <mpg at flaxen.com> better namespacing (01:34:47)
+
+2011-03-15
+ * Michael P. Gerlek <mpg at flaxen.com> namespace'd the filters (21:26:50)
+ * Michael P. Gerlek <mpg at flaxen.com> namespace'd the filters (20:51:33)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (20:37:30)
+ * Michael P. Gerlek <mpg at flaxen.com> fix capitalization of some file names (20:37:15)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (20:25:15)
+ * Michael P. Gerlek <mpg at flaxen.com> renamed Producer->Reader, Consumer->Writer; made Writer not be a Stage (20:25:01)
+ * Howard Butler <hobu.inc at gmail.com> add dummies so _templates and _static directories stick (15:35:16)
+ * Howard Butler <hobu.inc at gmail.com> merge (15:33:04)
+ * Howard Butler <hobu.inc at gmail.com> add Sphinx build setup (15:32:41)
+ * Michael P. Gerlek <mpg at flaxen.com> move filters into a subdir (15:29:46)
+ * Michael P. Gerlek <mpg at flaxen.com> cleaning include paths; build fixes (15:13:45)
+ * Michael P. Gerlek <mpg at flaxen.com> cleaning include paths; build fixes (15:11:04)
+ * Howard Butler <hobu.inc at gmail.com> add Pete as a contributor (14:35:30)
+ * Michael P. Gerlek <mpg at flaxen.com> cleaing include paths (14:30:13)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (14:02:28)
+ * Michael P. Gerlek <mpg at flaxen.com> rationalize placement of drivers, public headers (14:02:00)
+ * Howard Butler <hobu.inc at gmail.com> make libLAS 1.6.0 a required dependency for now (13:32:40)
+ * Pete Gadomski <pete.gadomski at gmail.com> Removed a stale reference to libpc.pc (13:24:49)
+ * Howard Butler <hobu.inc at gmail.com> merge (13:18:20)
+ * Howard Butler <hobu.inc at gmail.com> rename chipper.cpp to Chipper.cpp to match naming styles (13:17:45)
+ * Howard Butler <hobu.inc at gmail.com> ignore Makefiles (13:17:25)
+ * Michael P. Gerlek <mpg at flaxen.com> fix boost version; tweak mpg builds (12:44:03)
+
+2011-03-14
+ * Michael P. Gerlek <mpg at flaxen.com> merge (15:39:47)
+ * Howard Butler <hobu.inc at gmail.com> giant messy merge (14:08:54)
+ * Michael P. Gerlek <mpg at flaxen.com> start to add swig build (13:42:10)
+ * Michael P. Gerlek <mpg at flaxen.com> make less chatty; fix libpc/liblas typo (13:39:07)
+ * Michael P. Gerlek <mpg at flaxen.com> unused (13:30:00)
+ * Howard Butler <hobu.inc at gmail.com> start on libpc::driver::oci::Reader scaffolding (12:20:27)
+ * Howard Butler <hobu.inc at gmail.com> move more stuff into common spot (12:20:09)
+ * Howard Butler <hobu.inc at gmail.com> move gdal debug stuff into common.cpp (12:19:45)
+ * Howard Butler <hobu.inc at gmail.com> move more stuff into common.hpp (12:19:31)
+ * Howard Butler <hobu.inc at gmail.com> put common libpc::driver.oci stuff into a single file (12:07:20)
+ * Howard Butler <hobu.inc at gmail.com> tweak libLAS library detection to account for lib naming on win32 (11:49:36)
+
+2011-03-12
+ * Howard Butler <hobu.inc at gmail.com> basic block insertion working (09:20:52)
+ * Howard Butler <hobu.inc at gmail.com> fixups to bring things in line with mpg's latest changes (08:09:18)
+
+2011-03-11
+ * Michael P. Gerlek <mpg at flaxen.com> VS10 lint (19:18:10)
+ * Michael P. Gerlek <mpg at flaxen.com> get rid of readBegin/End; each concrete stage must manage currentPointIndex on its own now (18:23:59)
+ * Michael P. Gerlek <mpg at flaxen.com> GpsTime --> Time (17:36:08)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (17:31:26)
+ * Michael P. Gerlek <mpg at flaxen.com> add stats collection; fix small seek bug; add clear cache function; add cache size configurability (17:31:13)
+ * Howard Butler <hobu.inc at gmail.com> more OCI block construction work (17:12:01)
+ * Michael P. Gerlek <mpg at flaxen.com> throw if sad reader (16:56:11)
+ * Howard Butler <hobu.inc at gmail.com> add seekToPoint to reset reader (15:10:46)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (14:10:33)
+ * Michael P. Gerlek <mpg at flaxen.com> bringing lru cache online (14:10:23)
+ * Howard Butler <hobu.inc at gmail.com> tweak #ifdefs (13:27:39)
+ * Michael P. Gerlek <mpg at flaxen.com> rename lru cache (11:29:21)
+ * Michael P. Gerlek <mpg at flaxen.com> mild and likely inconsequential bug fix (11:23:19)
+ * Michael P. Gerlek <mpg at flaxen.com> non-ORA build fix (11:21:59)
+
+2011-03-10
+ * Howard Butler <hobu.inc at gmail.com> #ifdef Oracle out of the way (21:20:01)
+ * Michael P. Gerlek <mpg at flaxen.com> converted lru cache to a PointData cache, with the needed semantics (20:17:28)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (19:42:55)
+ * Michael P. Gerlek <mpg at flaxen.com> lru cache testing (19:42:39)
+ * Michael P. Gerlek <mpg at flaxen.com> added LRU cache (18:09:32)
+ * Howard Butler <hobu.inc at gmail.com> fix up GDAL CPL_DEBUG output so it at least works (leaks a putenv string right now). start on an oci example (17:04:03)
+ * Michael P. Gerlek <mpg at flaxen.com> minimally turn on pcinfo (16:56:29)
+ * Michael P. Gerlek <mpg at flaxen.com> add support for positional opts (16:55:59)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (16:24:29)
+ * Michael P. Gerlek <mpg at flaxen.com> lint; mild bug fix (16:20:43)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (13:00:10)
+ * Michael P. Gerlek <mpg at flaxen.com> docs and notes for sprint (12:59:54)
+ * Michael P. Gerlek <mpg at flaxen.com> added dump() (12:38:40)
+ * Michael P. Gerlek <mpg at flaxen.com> notes for/during the montreal sprint (12:25:48)
+ * Michael P. Gerlek <mpg at flaxen.com> should be private (12:13:25)
+
+2011-03-09
+ * Michael P. Gerlek <mpg at flaxen.com> updated (18:40:01)
+ * Howard Butler <hobu.inc at gmail.com> add method for creating spatial index table entry (14:04:43)
+ * Howard Butler <hobu.inc at gmail.com> rework insertion of point cloud entry (13:24:26)
+ * Howard Butler <hobu.inc at gmail.com> a big wad of Oracle writer (08:21:32)
+
+2011-03-08
+ * Michael P. Gerlek <mpg at flaxen.com> viewer work (18:05:29)
+ * Michael P. Gerlek <mpg at flaxen.com> added cheesy decimation filter (18:04:11)
+
+2011-03-07
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint (22:52:36)
+ * Michael P. Gerlek <mpg at flaxen.com> sync w/ Reader->Producer change (18:31:08)
+ * Michael P. Gerlek <mpg at flaxen.com> minor cleanups and docs (18:03:52)
+ * Michael P. Gerlek <mpg at flaxen.com> very simple cache filter (16:44:33)
+ * Howard Butler <hobu.inc at gmail.com> rename libpc::Reader to libpc::Producer (14:37:14)
+ * Howard Butler <hobu.inc at gmail.com> rename libpc::Writer to libpc::Consumer (14:07:33)
+ * Howard Butler <hobu.inc at gmail.com> fix up missing invocation (14:03:34)
+ * Howard Butler <hobu.inc at gmail.com> more OCI writer scaffolding (13:46:28)
+
+2011-03-04
+ * Michael P. Gerlek <mpg at flaxen.com> pcview work (16:47:27)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (14:39:35)
+ * Michael P. Gerlek <mpg at flaxen.com> I can read a point in C# now (14:39:21)
+ * Michael P. Gerlek <mpg at flaxen.com> more incremental swig work (14:13:29)
+ * Michael P. Gerlek <mpg at flaxen.com> fix typedef (14:12:57)
+ * Michael P. Gerlek <mpg at flaxen.com> added set() for oper[] (13:39:06)
+ * Michael P. Gerlek <mpg at flaxen.com> incremental swig work (13:18:25)
+ * Howard Butler <hobu.inc at gmail.com> get chipper working. bolt on some testing (12:27:30)
+
+2011-03-03
+ * Michael P. Gerlek <mpg at flaxen.com> swig work (19:39:35)
+ * Michael P. Gerlek <mpg at flaxen.com> don't expose liblas headers\! (19:03:54)
+ * Michael P. Gerlek <mpg at flaxen.com> fixed bad types (18:46:50)
+ * Michael P. Gerlek <mpg at flaxen.com> improved virtual functions in Stage classes; implemented MosaicFilter (18:44:46)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (14:16:04)
+ * Michael P. Gerlek <mpg at flaxen.com> fix argument order (14:15:52)
+ * Howard Butler <hobu.inc at gmail.com> merge (14:10:50)
+ * Howard Butler <hobu.inc at gmail.com> add the chipper (14:10:39)
+ * Michael P. Gerlek <mpg at flaxen.com> start of pcview (12:09:26)
+ * Michael P. Gerlek <mpg at flaxen.com> get swig building (11:58:37)
+ * Michael P. Gerlek <mpg at flaxen.com> get swig building (11:55:47)
+
+2011-03-02
+ * Michael P. Gerlek <mpg at flaxen.com> missing files (22:47:18)
+ * Michael P. Gerlek <mpg at flaxen.com> start at bindings (22:43:42)
+ * Howard Butler <hobu.inc at gmail.com> more OCI scaffolding (12:56:55)
+ * Howard Butler <hobu.inc at gmail.com> using often blows my foot off. (10:58:47)
+ * Howard Butler <hobu.inc at gmail.com> simplify allValid to hop out of testing once we hit a false one. Clean up initialization of m_numPoints so it is only set once on construction (10:49:11)
+ * Howard Butler <hobu.inc at gmail.com> std::vector<bool> doesn't work on a lot of compilers. Use std::vector<uint8_t>::size_type for vector indicies instead of size_t. Provide an allValid method to shortcut testing each item in the validity mask individually. (10:39:52)
+
+2011-03-01
+ * Michael P. Gerlek <mpg at flaxen.com> added -native (18:21:54)
+ * Michael P. Gerlek <mpg at flaxen.com> more coding (18:10:45)
+ * Michael P. Gerlek <mpg at flaxen.com> better point format control (17:33:58)
+ * Michael P. Gerlek <mpg at flaxen.com> bump up blocking factor, again (17:33:31)
+ * Michael P. Gerlek <mpg at flaxen.com> explicitly inline these dudes (17:33:05)
+ * Michael P. Gerlek <mpg at flaxen.com> wrap user function in try/catch (17:32:03)
+ * Michael P. Gerlek <mpg at flaxen.com> set output point format to same as input (17:31:48)
+ * Michael P. Gerlek <mpg at flaxen.com> move *Layout classes into separate files (15:51:51)
+ * Michael P. Gerlek <mpg at flaxen.com> add Stage::getName() (15:40:24)
+ * Michael P. Gerlek <mpg at flaxen.com> reset default size (15:40:08)
+ * Howard Butler <hobu.inc at gmail.com> merge (15:08:17)
+ * Howard Butler <hobu.inc at gmail.com> clean up test target invocation (15:08:10)
+ * Michael P. Gerlek <mpg at flaxen.com> was using wrong filesize (14:52:38)
+ * Michael P. Gerlek <mpg at flaxen.com> tidying up (14:52:18)
+ * Michael P. Gerlek <mpg at flaxen.com> fix test name (13:37:19)
+ * Michael P. Gerlek <mpg at flaxen.com> remove nonsense (13:36:02)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (13:10:07)
+ * Michael P. Gerlek <mpg at flaxen.com> fixes to getDimension APIs; trying to get liblaswriter to work (13:09:53)
+ * Howard Butler <hobu.inc at gmail.com> plumbing for OCI driver (12:29:56)
+ * Michael P. Gerlek <mpg at flaxen.com> 32-bit compilation lint (11:27:22)
+ * Michael P. Gerlek <mpg at flaxen.com> 32-bit compilation lint (11:21:30)
+ * Howard Butler <hobu.inc at gmail.com> handle liblas::ePointFormatUnknown (08:57:41)
+ * Howard Butler <hobu.inc at gmail.com> you can't forward declare enums (08:57:29)
+
+2011-02-28
+ * Michael P. Gerlek <mpg at flaxen.com> adding -i, -o (19:28:52)
+ * Michael P. Gerlek <mpg at flaxen.com> typos (19:28:30)
+ * Michael P. Gerlek <mpg at flaxen.com> increase block size for actual runs (19:27:32)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (19:27:06)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (19:26:48)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (19:26:07)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (19:25:52)
+ * Michael P. Gerlek <mpg at flaxen.com> w00t: .laz support (18:21:04)
+ * Michael P. Gerlek <mpg at flaxen.com> improve liblaswriter (18:15:15)
+ * Michael P. Gerlek <mpg at flaxen.com> updated liblas ref file (17:34:21)
+ * Michael P. Gerlek <mpg at flaxen.com> moved note on custom fields NYI (17:34:03)
+ * Michael P. Gerlek <mpg at flaxen.com> turned on liblas writer for point types (17:32:03)
+ * Michael P. Gerlek <mpg at flaxen.com> added addDims() (17:31:29)
+ * Michael P. Gerlek <mpg at flaxen.com> note custom fields NYI (17:30:53)
+ * Michael P. Gerlek <mpg at flaxen.com> started ability to use custom fields (17:28:52)
+ * Michael P. Gerlek <mpg at flaxen.com> liblas reader now accepting all point types (16:22:15)
+ * Michael P. Gerlek <mpg at flaxen.com> missed fix to signaller test (11:31:08)
+ * Michael P. Gerlek <mpg at flaxen.com> make it compile, for now (11:29:10)
+
+2011-02-26
+ * Michael P. Gerlek <mpg at flaxen.com> merge (20:40:20)
+ * Michael P. Gerlek <mpg at flaxen.com> added -timer (20:30:26)
+ * Michael P. Gerlek <mpg at flaxen.com> unit test for progress meter (20:14:43)
+ * Michael P. Gerlek <mpg at flaxen.com> use fixed date (20:08:04)
+ * Michael P. Gerlek <mpg at flaxen.com> tidy up Application class usage (19:45:08)
+
+2011-02-25
+ * Michael P. Gerlek <mpg at flaxen.com> cmd line app harness (19:53:33)
+ * Michael P. Gerlek <mpg at flaxen.com> move boost test DYN_LINK into cmake (15:37:04)
+ * Howard Butler <hobu.inc at gmail.com> merge (15:13:52)
+ * Howard Butler <hobu.inc at gmail.com> start re-organizing things into separate driver directories (15:07:13)
+ * Michael P. Gerlek <mpg at flaxen.com> fix file path (15:04:51)
+ * Michael P. Gerlek <mpg at flaxen.com> fix dyn linkage (15:04:42)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (15:02:20)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (14:59:12)
+ * Michael P. Gerlek <mpg at flaxen.com> liblas writer working; added file comparator, support functions (14:58:56)
+ * Howard Butler <hobu.inc at gmail.com> get tests building and working on osx with 'make test' target (14:05:33)
+ * Michael P. Gerlek <mpg at flaxen.com> liblas reader ocming online; fixed bad by-ref param (13:30:11)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (13:28:56)
+
+2011-02-24
+ * Michael P. Gerlek <mpg at flaxen.com> get liblas linking in correctly (14:08:59)
+ * Michael P. Gerlek <mpg at flaxen.com> boy did that cause problems (13:35:16)
+ * Michael P. Gerlek <mpg at flaxen.com> improved version tests (12:58:48)
+ * Michael P. Gerlek <mpg at flaxen.com> stubbing in liblas support (12:55:38)
+ * Michael P. Gerlek <mpg at flaxen.com> added libLAS support, added some config tests (12:54:21)
+ * Michael P. Gerlek <mpg at flaxen.com> outdated, already moved (12:50:54)
+ * Michael P. Gerlek <mpg at flaxen.com> major cut/paste error (11:07:46)
+
+2011-02-23
+ * Howard Butler <hobu.inc at gmail.com> fix ups to compile on gcc -- we don't link yet though (21:17:51)
+ * Howard Butler <hobu.inc at gmail.com> gcc complains about these, and I don't get what was going on here. copy/paste error? (21:16:36)
+ * Michael P. Gerlek <mpg at flaxen.com> add Crop filter test (20:18:58)
+ * Michael P. Gerlek <mpg at flaxen.com> revise error tolerance (20:18:28)
+ * Michael P. Gerlek <mpg at flaxen.com> comment (20:18:02)
+ * Michael P. Gerlek <mpg at flaxen.com> add Faux read/write tests (20:00:03)
+ * Michael P. Gerlek <mpg at flaxen.com> add FP compare support (19:59:11)
+ * Michael P. Gerlek <mpg at flaxen.com> start of reader/writer stage tests (19:22:36)
+ * Michael P. Gerlek <mpg at flaxen.com> clean up reader/writer classes (19:16:53)
+ * Michael P. Gerlek <mpg at flaxen.com> use constant-time field indexing (17:06:04)
+ * Michael P. Gerlek <mpg at flaxen.com> init properly (13:44:54)
+ * Michael P. Gerlek <mpg at flaxen.com> catch missing file (13:44:40)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (13:32:05)
+ * Michael P. Gerlek <mpg at flaxen.com> more unit tests (10:39:29)
+
+2011-02-22
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint (15:49:03)
+ * Michael P. Gerlek <mpg at flaxen.com> bunch of unit test work (12:38:12)
+
+2011-02-21
+ * Michael P. Gerlek <mpg at flaxen.com> why? (10:59:21)
+ * Michael P. Gerlek <mpg at flaxen.com> added some unit tests (10:58:49)
+
+2011-02-18
+ * Michael P. Gerlek <mpg at flaxen.com> cmake work (13:54:21)
+
+2011-02-17
+ * Michael P. Gerlek <mpg at flaxen.com> unit test work (14:35:44)
+ * Michael P. Gerlek <mpg at flaxen.com> stub for using boost unit tests (14:00:55)
+ * Michael P. Gerlek <mpg at flaxen.com> fix bad cast (#213 from liblas) (12:23:40)
+ * Michael P. Gerlek <mpg at flaxen.com> first las output achieved (11:22:01)
+
+2011-02-16
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint - las writing (16:22:44)
+ * Michael P. Gerlek <mpg at flaxen.com> debugging (15:38:24)
+ * Michael P. Gerlek <mpg at flaxen.com> boost I/O fix (15:38:01)
+
+2011-02-15
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint - las read/write (19:25:48)
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint - working on las reading (15:54:49)
+ * Michael P. Gerlek <mpg at flaxen.com> tweaks (14:16:37)
+ * Michael P. Gerlek <mpg at flaxen.com> las header reader coming online (13:58:18)
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint: renamed Layout to Schema, adding las header reading ability (12:30:59)
+
+2011-02-14
+ * Michael P. Gerlek <mpg at flaxen.com> added SpatialReference, Metadata; split out LasSchema (23:14:06)
+ * Michael P. Gerlek <mpg at flaxen.com> added Vector, to back up Range and Bounds (20:25:48)
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint - schema work (19:33:43)
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint - Schema work (16:57:34)
+ * Michael P. Gerlek <mpg at flaxen.com> uml project (10:42:55)
+ * Michael P. Gerlek <mpg at flaxen.com> stub in progress/interrupt callback (10:41:08)
+
+2011-02-12
+ * Michael P. Gerlek <mpg at flaxen.com> fix size_t (16:42:10)
+ * Michael P. Gerlek <mpg at flaxen.com> convert to std::size_t and friends (15:21:13)
+ * Michael P. Gerlek <mpg at flaxen.com> more updates (14:01:09)
+ * Michael P. Gerlek <mpg at flaxen.com> misc updates (11:11:48)
+
+2011-02-11
+ * Michael P. Gerlek <mpg at flaxen.com> quick hack until cmake can do it for us (22:44:52)
+ * Michael P. Gerlek <mpg at flaxen.com> lint (16:33:25)
+ * Michael P. Gerlek <mpg at flaxen.com> moved color ramp function (16:18:19)
+ * Michael P. Gerlek <mpg at flaxen.com> byte -> boost::uint8_t (16:18:05)
+ * Michael P. Gerlek <mpg at flaxen.com> moved in some utility funcs (16:00:41)
+ * Michael P. Gerlek <mpg at flaxen.com> added Color (from liblas) (15:45:24)
+ * Michael P. Gerlek <mpg at flaxen.com> added Schema (from liblas) (15:35:19)
+ * Michael P. Gerlek <mpg at flaxen.com> move << to .cpp (14:20:09)
+ * Michael P. Gerlek <mpg at flaxen.com> "using namspace libpc;" -> "namespace libpc {..." (14:11:37)
+ * Michael P. Gerlek <mpg at flaxen.com> added Dimension (from liblas) (13:51:31)
+ * Michael P. Gerlek <mpg at flaxen.com> added exceptions and versioning support (12:13:52)
+ * Michael P. Gerlek <mpg at flaxen.com> cleaned up source conventions (11:22:07)
+ * Michael P. Gerlek <mpg at flaxen.com> applied astyle everywhere (mostly to fix indents) (10:28:32)
+ * Michael P. Gerlek <mpg at flaxen.com> initial guess (10:28:07)
+ * Howard Butler <hobu.inc at gmail.com> namespace closing }'s should not have ;'s after them (08:35:14)
+ * Howard Butler <hobu.inc at gmail.com> don't replace header for liblas::Bounds (08:26:47)
+
+2011-02-10
+ * Michael P. Gerlek <mpg at flaxen.com> building with liblas' Bounds class now (23:46:18)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (22:53:09)
+ * Michael P. Gerlek <mpg at flaxen.com> namespacing, adding Bounds class (22:47:31)
+
+2011-02-09
+ * Michael P. Gerlek <mpg at flaxen.com> cmake builds now working (22:38:20)
+ * Michael P. Gerlek <mpg at flaxen.com> comment everything out for now (22:14:32)
+ * Michael P. Gerlek <mpg at flaxen.com> unix name fix (22:14:17)
+ * Michael P. Gerlek <mpg at flaxen.com> starting to turn on cmake builds (22:07:18)
+ * Michael P. Gerlek <mpg at flaxen.com> obsolete (21:49:50)
+ * Michael P. Gerlek <mpg at flaxen.com> copied from liblas (21:08:06)
+ * Michael P. Gerlek <mpg at flaxen.com> copied from liblas (14:33:36)
+ * Michael P. Gerlek <mpg at flaxen.com> copy of cmake files from liblas (14:25:21)
+ * Michael P. Gerlek <mpg at flaxen.com> removed (14:25:04)
+ * Michael P. Gerlek <mpg at flaxen.com> 0.1 (14:18:11)
+ * Michael P. Gerlek <mpg at flaxen.com> credits (14:16:44)
+
+2011-02-08
+ * Michael P. Gerlek <mpg at flaxen.com> remove unused index (18:31:41)
+ * Michael P. Gerlek <mpg at flaxen.com> removed isActive (I feel better now) (16:51:21)
+ * Michael P. Gerlek <mpg at flaxen.com> moved isActive into the Field, but it is still isn't a clean concept; checkpoint here, before removing it (16:48:46)
+ * Michael P. Gerlek <mpg at flaxen.com> cleanup work on isActive notion (15:08:59)
+ * Michael P. Gerlek <mpg at flaxen.com> cleanups (14:51:09)
+ * Michael P. Gerlek <mpg at flaxen.com> remove evil initialize() protocols (14:19:18)
+ * Michael P. Gerlek <mpg at flaxen.com> mosaicker basically working (13:03:16)
+ * Michael P. Gerlek <mpg at flaxen.com> working end-to-end now (11:11:46)
+
+2011-02-07
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint (still need to set isActive) (20:39:05)
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint (15:53:54)
+ * Michael P. Gerlek <mpg at flaxen.com> checkpoint (13:32:25)
+
+2011-02-05
+ * Michael P. Gerlek <mpg at flaxen.com> fix for Hobu :-) (17:54:32)
+
+2011-02-04
+ * Michael P. Gerlek <mpg at flaxen.com> updated copyright (20:11:50)
+ * Michael P. Gerlek <mpg at flaxen.com> merge (18:08:40)
+ * Michael P. Gerlek <mpg at flaxen.com> start of prototype API (18:08:23)
+ * Howard Butler <hobu.inc at gmail.com> attempt to answer some questions and fill in more stuff (11:01:53)
+
+2011-02-03
+ * Michael P. Gerlek <mpg at flaxen.com> rst fix (17:37:07)
+ * Michael P. Gerlek <mpg at flaxen.com> first post! (17:06:15)
+
diff --git a/apps/pdal-config b/apps/pdal-config
index 4876801..b3a8d0c 100644
--- a/apps/pdal-config
+++ b/apps/pdal-config
@@ -58,7 +58,7 @@ case $1 in
;;
--version)
- echo 1.0.1
+ echo 1.1.0
;;
*)
diff --git a/cmake/geowave.cmake b/cmake/geowave.cmake
index a9cec72..1b69798 100644
--- a/cmake/geowave.cmake
+++ b/cmake/geowave.cmake
@@ -5,9 +5,9 @@
# GeoWave support - optional, default=OFF
option(BUILD_PLUGIN_GEOWAVE "Choose if GeoWave support should be built" FALSE)
if(BUILD_PLUGIN_GEOWAVE)
- find_package(GeoWave 0.8.3)
+ find_package(GeoWave)
if(GEOWAVE_FOUND)
- mark_as_advanced(CLEAR GeoWave_RUNTIME_JAR)
+ mark_as_advanced(CLEAR GEOWAVE_RUNTIME_JAR)
add_definitions(-DGEOWAVE_RUNTIME_JAR=${GEOWAVE_RUNTIME_JAR})
set(PDAL_HAVE_GEOWAVE 1)
else()
diff --git a/cmake/jace.cmake b/cmake/jace.cmake
index 62ed14f..390d94f 100644
--- a/cmake/jace.cmake
+++ b/cmake/jace.cmake
@@ -10,12 +10,10 @@ if(BUILD_PLUGIN_GEOWAVE)
include_directories(${JACE_INCLUDE_DIR})
mark_as_advanced(CLEAR JACE_INCLUDE_DIR)
mark_as_advanced(CLEAR JACE_LIBRARY)
- mark_as_advanced(CLEAR JACE_RUNTIME_JAR)
- add_definitions(-DJACE_RUNTIME_JAR=${JACE_RUNTIME_JAR})
set(PDAL_HAVE_JACE 1)
else()
+ set(JACE_INCLUDE_DIR "")
set(JACE_LIBRARY "")
- set(JACE_RUNTIME "")
set(BUILD_PLUGIN_GEOWAVE FALSE)
endif()
endif()
diff --git a/cmake/jni.cmake b/cmake/jni.cmake
index f3a89aa..37e7ded 100644
--- a/cmake/jni.cmake
+++ b/cmake/jni.cmake
@@ -6,14 +6,17 @@
if(BUILD_PLUGIN_GEOWAVE)
find_package(JNI)
if(JNI_FOUND)
- set(CMAKE_REQUIRED_LIBRARIES "${JNI_LIBRARIES}")
- include_directories(${JNI_INCLUDE_DIRS})
- mark_as_advanced(CLEAR JNI_INCLUDE_DIRS)
- mark_as_advanced(CLEAR JNI_LIBRARIES)
- add_definitions(-DJAVA_EXECUTABLE_PATH=${Java_JAVA_EXECUTABLE})
+ set(CMAKE_REQUIRED_LIBRARIES "${JAVA_JVM_LIBRARY}")
+ include_directories(${JAVA_INCLUDE_PATH})
+ include_directories(${JAVA_INCLUDE_PATH2})
+ mark_as_advanced(CLEAR JAVA_INCLUDE_PATH)
+ mark_as_advanced(CLEAR JAVA_INCLUDE_PATH2)
+ mark_as_advanced(CLEAR JAVA_JVM_LIBRARY)
set(PDAL_HAVE_JNI 1)
else()
- set(JNI_LIBRARIES "")
+ set(JAVA_INCLUDE_PATH "")
+ set(JAVA_INCLUDE_PATH2 "")
+ set(JAVA_JVM_LIBRARY "")
set(BUILD_PLUGIN_GEOWAVE FALSE)
endif()
endif()
diff --git a/cmake/modules/FindGeoWave.cmake b/cmake/modules/FindGeoWave.cmake
index 7440eef..06231f8 100644
--- a/cmake/modules/FindGeoWave.cmake
+++ b/cmake/modules/FindGeoWave.cmake
@@ -15,7 +15,7 @@ IF(GEOWAVE_RUNTIME_JAR)
ENDIF()
FIND_FILE(GEOWAVE_RUNTIME_JAR
- geowave-deploy-${GeoWave_FIND_VERSION}-accumulo-singlejar.jar
+ geowave-jace.jar
PATHS
/usr/bin
/usr/local
diff --git a/cmake/modules/FindJace.cmake b/cmake/modules/FindJace.cmake
index a413db2..122b66a 100644
--- a/cmake/modules/FindJace.cmake
+++ b/cmake/modules/FindJace.cmake
@@ -24,23 +24,14 @@ FIND_PATH(JACE_INCLUDE_DIR
/usr/local
/usr/local/include)
-SET(JACE_NAMES libjace.so jace.lib)
-
FIND_LIBRARY(JACE_LIBRARY
- NAMES ${JACE_NAMES}
+ NAMES jace
PATHS
/usr/lib
/usr/local
/usr/local/lib)
-FIND_FILE(JACE_RUNTIME_JAR
- jace-runtime.jar
- PATHS
- /usr/bin
- /usr/local
- /usr/local/bin)
-
# Handle the QUIETLY and REQUIRED arguments and set JACE_FOUND to TRUE
# if all listed variables are TRUE
INCLUDE(FindPackageHandleStandardArgs)
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(Jace DEFAULT_MSG JACE_RUNTIME_JAR JACE_LIBRARY JACE_INCLUDE_DIR)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(Jace DEFAULT_MSG JACE_LIBRARY JACE_INCLUDE_DIR)
diff --git a/doc/_templates/layout.html b/doc/_templates/layout.html
new file mode 100644
index 0000000..13b0ad1
--- /dev/null
+++ b/doc/_templates/layout.html
@@ -0,0 +1,20 @@
+{# Import the theme's layout. #}
+{% extends "!layout.html" %}
+
+{# Add some extra stuff before and use existing with 'super()' call. #}
+
+{%- block footer %}
+ <div class="footer">
+ <div class="container">
+ © {{ copyright }}
+ <a href="http://github.com/hobu">Howard Butler</a>,
+ <a href="http://github.com/mpgerlek">Michael Gerlek</a>,
+ and
+ <a href="https://github.com/PDAL/PDAL/graphs/contributors">others</a>,
+ {%- if last_updated %}
+ {% trans last_updated=last_updated|e %}Last updated
+ on {{ last_updated }}.{% endtrans %}
+ {%- endif %}
+ </div>
+ </div>
+{%- endblock %}
diff --git a/doc/_themes/bootstrap/bootstrap.js b/doc/_themes/bootstrap/bootstrap.js
deleted file mode 100755
index 39ad031..0000000
--- a/doc/_themes/bootstrap/bootstrap.js
+++ /dev/null
@@ -1,2038 +0,0 @@
-/* ===================================================
- * bootstrap-transition.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#transitions
- * ===================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-
-!function ($) {
-
- $(function () {
-
- "use strict"; // jshint ;_;
-
-
- /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
- * ======================================================= */
-
- $.support.transition = (function () {
-
- var transitionEnd = (function () {
-
- var el = document.createElement('bootstrap')
- , transEndEventNames = {
- 'WebkitTransition' : 'webkitTransitionEnd'
- , 'MozTransition' : 'transitionend'
- , 'OTransition' : 'oTransitionEnd otransitionend'
- , 'transition' : 'transitionend'
- }
- , name
-
- for (name in transEndEventNames){
- if (el.style[name] !== undefined) {
- return transEndEventNames[name]
- }
- }
-
- }())
-
- return transitionEnd && {
- end: transitionEnd
- }
-
- })()
-
- })
-
-}(window.jQuery);
-/* =========================================================
- * bootstrap-modal.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#modals
- * =========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================= */
-
-
-!function ($) {
-
- "use strict"; // jshint ;_;
-
-
- /* MODAL CLASS DEFINITION
- * ====================== */
-
- var Modal = function (element, options) {
- this.options = options
- this.$element = $(element)
- .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
- this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
- }
-
- Modal.prototype = {
-
- constructor: Modal
-
- , toggle: function () {
- return this[!this.isShown ? 'show' : 'hide']()
- }
-
- , show: function () {
- var that = this
- , e = $.Event('show')
-
- this.$element.trigger(e)
-
- if (this.isShown || e.isDefaultPrevented()) return
-
- $('body').addClass('modal-open')
-
- this.isShown = true
-
- this.escape()
-
- this.backdrop(function () {
- var transition = $.support.transition && that.$element.hasClass('fade')
-
- if (!that.$element.parent().length) {
- that.$element.appendTo(document.body) //don't move modals dom position
- }
-
- that.$element
- .show()
-
- if (transition) {
- that.$element[0].offsetWidth // force reflow
- }
-
- that.$element
- .addClass('in')
- .attr('aria-hidden', false)
- .focus()
-
- that.enforceFocus()
-
- transition ?
- that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :
- that.$element.trigger('shown')
-
- })
- }
-
- , hide: function (e) {
- e && e.preventDefault()
-
- var that = this
-
- e = $.Event('hide')
-
- this.$element.trigger(e)
-
- if (!this.isShown || e.isDefaultPrevented()) return
-
- this.isShown = false
-
- $('body').removeClass('modal-open')
-
- this.escape()
-
- $(document).off('focusin.modal')
-
- this.$element
- .removeClass('in')
- .attr('aria-hidden', true)
-
- $.support.transition && this.$element.hasClass('fade') ?
- this.hideWithTransition() :
- this.hideModal()
- }
-
- , enforceFocus: function () {
- var that = this
- $(document).on('focusin.modal', function (e) {
- if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
- that.$element.focus()
- }
- })
- }
-
- , escape: function () {
- var that = this
- if (this.isShown && this.options.keyboard) {
- this.$element.on('keyup.dismiss.modal', function ( e ) {
- e.which == 27 && that.hide()
- })
- } else if (!this.isShown) {
- this.$element.off('keyup.dismiss.modal')
- }
- }
-
- , hideWithTransition: function () {
- var that = this
- , timeout = setTimeout(function () {
- that.$element.off($.support.transition.end)
- that.hideModal()
- }, 500)
-
- this.$element.one($.support.transition.end, function () {
- clearTimeout(timeout)
- that.hideModal()
- })
- }
-
- , hideModal: function (that) {
- this.$element
- .hide()
- .trigger('hidden')
-
- this.backdrop()
- }
-
- , removeBackdrop: function () {
- this.$backdrop.remove()
- this.$backdrop = null
- }
-
- , backdrop: function (callback) {
- var that = this
- , animate = this.$element.hasClass('fade') ? 'fade' : ''
-
- if (this.isShown && this.options.backdrop) {
- var doAnimate = $.support.transition && animate
-
- this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
- .appendTo(document.body)
-
- if (this.options.backdrop != 'static') {
- this.$backdrop.click($.proxy(this.hide, this))
- }
-
- if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
-
- this.$backdrop.addClass('in')
-
- doAnimate ?
- this.$backdrop.one($.support.transition.end, callback) :
- callback()
-
- } else if (!this.isShown && this.$backdrop) {
- this.$backdrop.removeClass('in')
-
- $.support.transition && this.$element.hasClass('fade')?
- this.$backdrop.one($.support.transition.end, $.proxy(this.removeBackdrop, this)) :
- this.removeBackdrop()
-
- } else if (callback) {
- callback()
- }
- }
- }
-
-
- /* MODAL PLUGIN DEFINITION
- * ======================= */
-
- $.fn.modal = function (option) {
- return this.each(function () {
- var $this = $(this)
- , data = $this.data('modal')
- , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
- if (!data) $this.data('modal', (data = new Modal(this, options)))
- if (typeof option == 'string') data[option]()
- else if (options.show) data.show()
- })
- }
-
- $.fn.modal.defaults = {
- backdrop: true
- , keyboard: true
- , show: true
- }
-
- $.fn.modal.Constructor = Modal
-
-
- /* MODAL DATA-API
- * ============== */
-
- $(function () {
- $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) {
- var $this = $(this)
- , href = $this.attr('href')
- , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
- , option = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
-
- e.preventDefault()
-
- $target
- .modal(option)
- .one('hide', function () {
- $this.focus()
- })
- })
- })
-
-}(window.jQuery);
-/* ============================================================
- * bootstrap-dropdown.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#dropdowns
- * ============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-
-!function ($) {
-
- "use strict"; // jshint ;_;
-
-
- /* DROPDOWN CLASS DEFINITION
- * ========================= */
-
- var toggle = '[data-toggle=dropdown]'
- , Dropdown = function (element) {
- var $el = $(element).on('click.dropdown.data-api', this.toggle)
- $('html').on('click.dropdown.data-api', function () {
- $el.parent().removeClass('open')
- })
- }
-
- Dropdown.prototype = {
-
- constructor: Dropdown
-
- , toggle: function (e) {
- var $this = $(this)
- , $parent
- , isActive
-
- if ($this.is('.disabled, :disabled')) return
-
- $parent = getParent($this)
-
- isActive = $parent.hasClass('open')
-
- clearMenus()
-
- if (!isActive) {
- $parent.toggleClass('open')
- $this.focus()
- }
-
- return false
- }
-
- , keydown: function (e) {
- var $this
- , $items
- , $active
- , $parent
- , isActive
- , index
-
- if (!/(38|40|27)/.test(e.keyCode)) return
-
- $this = $(this)
-
- e.preventDefault()
- e.stopPropagation()
-
- if ($this.is('.disabled, :disabled')) return
-
- $parent = getParent($this)
-
- isActive = $parent.hasClass('open')
-
- if (!isActive || (isActive && e.keyCode == 27)) return $this.click()
-
- $items = $('[role=menu] li:not(.divider) a', $parent)
-
- if (!$items.length) return
-
- index = $items.index($items.filter(':focus'))
-
- if (e.keyCode == 38 && index > 0) index-- // up
- if (e.keyCode == 40 && index < $items.length - 1) index++ // down
- if (!~index) index = 0
-
- $items
- .eq(index)
- .focus()
- }
-
- }
-
- function clearMenus() {
- getParent($(toggle))
- .removeClass('open')
- }
-
- function getParent($this) {
- var selector = $this.attr('data-target')
- , $parent
-
- if (!selector) {
- selector = $this.attr('href')
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
- }
-
- $parent = $(selector)
- $parent.length || ($parent = $this.parent())
-
- return $parent
- }
-
-
- /* DROPDOWN PLUGIN DEFINITION
- * ========================== */
-
- $.fn.dropdown = function (option) {
- return this.each(function () {
- var $this = $(this)
- , data = $this.data('dropdown')
- if (!data) $this.data('dropdown', (data = new Dropdown(this)))
- if (typeof option == 'string') data[option].call($this)
- })
- }
-
- $.fn.dropdown.Constructor = Dropdown
-
-
- /* APPLY TO STANDARD DROPDOWN ELEMENTS
- * =================================== */
-
- $(function () {
- $('html')
- .on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus)
- $('body')
- .on('click.dropdown touchstart.dropdown.data-api', '.dropdown', function (e) { e.stopPropagation() })
- .on('click.dropdown.data-api touchstart.dropdown.data-api' , toggle, Dropdown.prototype.toggle)
- .on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
- })
-
-}(window.jQuery);
-/* =============================================================
- * bootstrap-scrollspy.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#scrollspy
- * =============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================== */
-
-
-!function ($) {
-
- "use strict"; // jshint ;_;
-
-
- /* SCROLLSPY CLASS DEFINITION
- * ========================== */
-
- function ScrollSpy(element, options) {
- var process = $.proxy(this.process, this)
- , $element = $(element).is('body') ? $(window) : $(element)
- , href
- this.options = $.extend({}, $.fn.scrollspy.defaults, options)
- this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
- this.selector = (this.options.target
- || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
- || '') + ' .nav li > a'
- this.$body = $('body')
- this.refresh()
- this.process()
- }
-
- ScrollSpy.prototype = {
-
- constructor: ScrollSpy
-
- , refresh: function () {
- var self = this
- , $targets
-
- this.offsets = $([])
- this.targets = $([])
-
- $targets = this.$body
- .find(this.selector)
- .map(function () {
- var $el = $(this)
- , href = $el.data('target') || $el.attr('href')
- , $href = /^#\w/.test(href) && $(href)
- return ( $href
- && $href.length
- && [[ $href.position().top, href ]] ) || null
- })
- .sort(function (a, b) { return a[0] - b[0] })
- .each(function () {
- self.offsets.push(this[0])
- self.targets.push(this[1])
- })
- }
-
- , process: function () {
- var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
- , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
- , maxScroll = scrollHeight - this.$scrollElement.height()
- , offsets = this.offsets
- , targets = this.targets
- , activeTarget = this.activeTarget
- , i
-
- if (scrollTop >= maxScroll) {
- return activeTarget != (i = targets.last()[0])
- && this.activate ( i )
- }
-
- for (i = offsets.length; i--;) {
- activeTarget != targets[i]
- && scrollTop >= offsets[i]
- && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
- && this.activate( targets[i] )
- }
- }
-
- , activate: function (target) {
- var active
- , selector
-
- this.activeTarget = target
-
- $(this.selector)
- .parent('.active')
- .removeClass('active')
-
- selector = this.selector
- + '[data-target="' + target + '"],'
- + this.selector + '[href="' + target + '"]'
-
- active = $(selector)
- .parent('li')
- .addClass('active')
-
- if (active.parent('.dropdown-menu').length) {
- active = active.closest('li.dropdown').addClass('active')
- }
-
- active.trigger('activate')
- }
-
- }
-
-
- /* SCROLLSPY PLUGIN DEFINITION
- * =========================== */
-
- $.fn.scrollspy = function (option) {
- return this.each(function () {
- var $this = $(this)
- , data = $this.data('scrollspy')
- , options = typeof option == 'object' && option
- if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- $.fn.scrollspy.Constructor = ScrollSpy
-
- $.fn.scrollspy.defaults = {
- offset: 10
- }
-
-
- /* SCROLLSPY DATA-API
- * ================== */
-
- $(window).on('load', function () {
- $('[data-spy="scroll"]').each(function () {
- var $spy = $(this)
- $spy.scrollspy($spy.data())
- })
- })
-
-}(window.jQuery);
-/* ========================================================
- * bootstrap-tab.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#tabs
- * ========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ======================================================== */
-
-
-!function ($) {
-
- "use strict"; // jshint ;_;
-
-
- /* TAB CLASS DEFINITION
- * ==================== */
-
- var Tab = function (element) {
- this.element = $(element)
- }
-
- Tab.prototype = {
-
- constructor: Tab
-
- , show: function () {
- var $this = this.element
- , $ul = $this.closest('ul:not(.dropdown-menu)')
- , selector = $this.attr('data-target')
- , previous
- , $target
- , e
-
- if (!selector) {
- selector = $this.attr('href')
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
- }
-
- if ( $this.parent('li').hasClass('active') ) return
-
- previous = $ul.find('.active a').last()[0]
-
- e = $.Event('show', {
- relatedTarget: previous
- })
-
- $this.trigger(e)
-
- if (e.isDefaultPrevented()) return
-
- $target = $(selector)
-
- this.activate($this.parent('li'), $ul)
- this.activate($target, $target.parent(), function () {
- $this.trigger({
- type: 'shown'
- , relatedTarget: previous
- })
- })
- }
-
- , activate: function ( element, container, callback) {
- var $active = container.find('> .active')
- , transition = callback
- && $.support.transition
- && $active.hasClass('fade')
-
- function next() {
- $active
- .removeClass('active')
- .find('> .dropdown-menu > .active')
- .removeClass('active')
-
- element.addClass('active')
-
- if (transition) {
- element[0].offsetWidth // reflow for transition
- element.addClass('in')
- } else {
- element.removeClass('fade')
- }
-
- if ( element.parent('.dropdown-menu') ) {
- element.closest('li.dropdown').addClass('active')
- }
-
- callback && callback()
- }
-
- transition ?
- $active.one($.support.transition.end, next) :
- next()
-
- $active.removeClass('in')
- }
- }
-
-
- /* TAB PLUGIN DEFINITION
- * ===================== */
-
- $.fn.tab = function ( option ) {
- return this.each(function () {
- var $this = $(this)
- , data = $this.data('tab')
- if (!data) $this.data('tab', (data = new Tab(this)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- $.fn.tab.Constructor = Tab
-
-
- /* TAB DATA-API
- * ============ */
-
- $(function () {
- $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
- e.preventDefault()
- $(this).tab('show')
- })
- })
-
-}(window.jQuery);
-/* ===========================================================
- * bootstrap-tooltip.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#tooltips
- * Inspired by the original jQuery.tipsy by Jason Frame
- * ===========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-
-!function ($) {
-
- "use strict"; // jshint ;_;
-
-
- /* TOOLTIP PUBLIC CLASS DEFINITION
- * =============================== */
-
- var Tooltip = function (element, options) {
- this.init('tooltip', element, options)
- }
-
- Tooltip.prototype = {
-
- constructor: Tooltip
-
- , init: function (type, element, options) {
- var eventIn
- , eventOut
-
- this.type = type
- this.$element = $(element)
- this.options = this.getOptions(options)
- this.enabled = true
-
- if (this.options.trigger == 'click') {
- this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
- } else if (this.options.trigger != 'manual') {
- eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
- eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
- this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
- this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
- }
-
- this.options.selector ?
- (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
- this.fixTitle()
- }
-
- , getOptions: function (options) {
- options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())
-
- if (options.delay && typeof options.delay == 'number') {
- options.delay = {
- show: options.delay
- , hide: options.delay
- }
- }
-
- return options
- }
-
- , enter: function (e) {
- var self = $(e.currentTarget)[this.type](this._options).data(this.type)
-
- if (!self.options.delay || !self.options.delay.show) return self.show()
-
- clearTimeout(this.timeout)
- self.hoverState = 'in'
- this.timeout = setTimeout(function() {
- if (self.hoverState == 'in') self.show()
- }, self.options.delay.show)
- }
-
- , leave: function (e) {
- var self = $(e.currentTarget)[this.type](this._options).data(this.type)
-
- if (this.timeout) clearTimeout(this.timeout)
- if (!self.options.delay || !self.options.delay.hide) return self.hide()
-
- self.hoverState = 'out'
- this.timeout = setTimeout(function() {
- if (self.hoverState == 'out') self.hide()
- }, self.options.delay.hide)
- }
-
- , show: function () {
- var $tip
- , inside
- , pos
- , actualWidth
- , actualHeight
- , placement
- , tp
-
- if (this.hasContent() && this.enabled) {
- $tip = this.tip()
- this.setContent()
-
- if (this.options.animation) {
- $tip.addClass('fade')
- }
-
- placement = typeof this.options.placement == 'function' ?
- this.options.placement.call(this, $tip[0], this.$element[0]) :
- this.options.placement
-
- inside = /in/.test(placement)
-
- $tip
- .remove()
- .css({ top: 0, left: 0, display: 'block' })
- .appendTo(inside ? this.$element : document.body)
-
- pos = this.getPosition(inside)
-
- actualWidth = $tip[0].offsetWidth
- actualHeight = $tip[0].offsetHeight
-
- switch (inside ? placement.split(' ')[1] : placement) {
- case 'bottom':
- tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
- break
- case 'top':
- tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
- break
- case 'left':
- tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
- break
- case 'right':
- tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
- break
- }
-
- $tip
- .css(tp)
- .addClass(placement)
- .addClass('in')
- }
- }
-
- , setContent: function () {
- var $tip = this.tip()
- , title = this.getTitle()
-
- $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
- $tip.removeClass('fade in top bottom left right')
- }
-
- , hide: function () {
- var that = this
- , $tip = this.tip()
-
- $tip.removeClass('in')
-
- function removeWithAnimation() {
- var timeout = setTimeout(function () {
- $tip.off($.support.transition.end).remove()
- }, 500)
-
- $tip.one($.support.transition.end, function () {
- clearTimeout(timeout)
- $tip.remove()
- })
- }
-
- $.support.transition && this.$tip.hasClass('fade') ?
- removeWithAnimation() :
- $tip.remove()
-
- return this
- }
-
- , fixTitle: function () {
- var $e = this.$element
- if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
- $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')
- }
- }
-
- , hasContent: function () {
- return this.getTitle()
- }
-
- , getPosition: function (inside) {
- return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {
- width: this.$element[0].offsetWidth
- , height: this.$element[0].offsetHeight
- })
- }
-
- , getTitle: function () {
- var title
- , $e = this.$element
- , o = this.options
-
- title = $e.attr('data-original-title')
- || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
-
- return title
- }
-
- , tip: function () {
- return this.$tip = this.$tip || $(this.options.template)
- }
-
- , validate: function () {
- if (!this.$element[0].parentNode) {
- this.hide()
- this.$element = null
- this.options = null
- }
- }
-
- , enable: function () {
- this.enabled = true
- }
-
- , disable: function () {
- this.enabled = false
- }
-
- , toggleEnabled: function () {
- this.enabled = !this.enabled
- }
-
- , toggle: function () {
- this[this.tip().hasClass('in') ? 'hide' : 'show']()
- }
-
- , destroy: function () {
- this.hide().$element.off('.' + this.type).removeData(this.type)
- }
-
- }
-
-
- /* TOOLTIP PLUGIN DEFINITION
- * ========================= */
-
- $.fn.tooltip = function ( option ) {
- return this.each(function () {
- var $this = $(this)
- , data = $this.data('tooltip')
- , options = typeof option == 'object' && option
- if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- $.fn.tooltip.Constructor = Tooltip
-
- $.fn.tooltip.defaults = {
- animation: true
- , placement: 'top'
- , selector: false
- , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
- , trigger: 'hover'
- , title: ''
- , delay: 0
- , html: true
- }
-
-}(window.jQuery);
-
-/* ===========================================================
- * bootstrap-popover.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#popovers
- * ===========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * =========================================================== */
-
-
-!function ($) {
-
- "use strict"; // jshint ;_;
-
-
- /* POPOVER PUBLIC CLASS DEFINITION
- * =============================== */
-
- var Popover = function (element, options) {
- this.init('popover', element, options)
- }
-
-
- /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
- ========================================== */
-
- Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
-
- constructor: Popover
-
- , setContent: function () {
- var $tip = this.tip()
- , title = this.getTitle()
- , content = this.getContent()
-
- $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
- $tip.find('.popover-content > *')[this.options.html ? 'html' : 'text'](content)
-
- $tip.removeClass('fade top bottom left right in')
- }
-
- , hasContent: function () {
- return this.getTitle() || this.getContent()
- }
-
- , getContent: function () {
- var content
- , $e = this.$element
- , o = this.options
-
- content = $e.attr('data-content')
- || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
-
- return content
- }
-
- , tip: function () {
- if (!this.$tip) {
- this.$tip = $(this.options.template)
- }
- return this.$tip
- }
-
- , destroy: function () {
- this.hide().$element.off('.' + this.type).removeData(this.type)
- }
-
- })
-
-
- /* POPOVER PLUGIN DEFINITION
- * ======================= */
-
- $.fn.popover = function (option) {
- return this.each(function () {
- var $this = $(this)
- , data = $this.data('popover')
- , options = typeof option == 'object' && option
- if (!data) $this.data('popover', (data = new Popover(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- $.fn.popover.Constructor = Popover
-
- $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
- placement: 'right'
- , trigger: 'click'
- , content: ''
- , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
- })
-
-}(window.jQuery);
-/* ==========================================================
- * bootstrap-affix.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#affix
- * ==========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-
-!function ($) {
-
- "use strict"; // jshint ;_;
-
-
- /* AFFIX CLASS DEFINITION
- * ====================== */
-
- var Affix = function (element, options) {
- this.options = $.extend({}, $.fn.affix.defaults, options)
- this.$window = $(window).on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
- this.$element = $(element)
- this.checkPosition()
- }
-
- Affix.prototype.checkPosition = function () {
- if (!this.$element.is(':visible')) return
-
- var scrollHeight = $(document).height()
- , scrollTop = this.$window.scrollTop()
- , position = this.$element.offset()
- , offset = this.options.offset
- , offsetBottom = offset.bottom
- , offsetTop = offset.top
- , reset = 'affix affix-top affix-bottom'
- , affix
-
- if (typeof offset != 'object') offsetBottom = offsetTop = offset
- if (typeof offsetTop == 'function') offsetTop = offset.top()
- if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
-
- affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
- false : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
- 'bottom' : offsetTop != null && scrollTop <= offsetTop ?
- 'top' : false
-
- if (this.affixed === affix) return
-
- this.affixed = affix
- this.unpin = affix == 'bottom' ? position.top - scrollTop : null
-
- this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
- }
-
-
- /* AFFIX PLUGIN DEFINITION
- * ======================= */
-
- $.fn.affix = function (option) {
- return this.each(function () {
- var $this = $(this)
- , data = $this.data('affix')
- , options = typeof option == 'object' && option
- if (!data) $this.data('affix', (data = new Affix(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- $.fn.affix.Constructor = Affix
-
- $.fn.affix.defaults = {
- offset: 0
- }
-
-
- /* AFFIX DATA-API
- * ============== */
-
- $(window).on('load', function () {
- $('[data-spy="affix"]').each(function () {
- var $spy = $(this)
- , data = $spy.data()
-
- data.offset = data.offset || {}
-
- data.offsetBottom && (data.offset.bottom = data.offsetBottom)
- data.offsetTop && (data.offset.top = data.offsetTop)
-
- $spy.affix(data)
- })
- })
-
-
-}(window.jQuery);
-/* ==========================================================
- * bootstrap-alert.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#alerts
- * ==========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-
-!function ($) {
-
- "use strict"; // jshint ;_;
-
-
- /* ALERT CLASS DEFINITION
- * ====================== */
-
- var dismiss = '[data-dismiss="alert"]'
- , Alert = function (el) {
- $(el).on('click', dismiss, this.close)
- }
-
- Alert.prototype.close = function (e) {
- var $this = $(this)
- , selector = $this.attr('data-target')
- , $parent
-
- if (!selector) {
- selector = $this.attr('href')
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
- }
-
- $parent = $(selector)
-
- e && e.preventDefault()
-
- $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
-
- $parent.trigger(e = $.Event('close'))
-
- if (e.isDefaultPrevented()) return
-
- $parent.removeClass('in')
-
- function removeElement() {
- $parent
- .trigger('closed')
- .remove()
- }
-
- $.support.transition && $parent.hasClass('fade') ?
- $parent.on($.support.transition.end, removeElement) :
- removeElement()
- }
-
-
- /* ALERT PLUGIN DEFINITION
- * ======================= */
-
- $.fn.alert = function (option) {
- return this.each(function () {
- var $this = $(this)
- , data = $this.data('alert')
- if (!data) $this.data('alert', (data = new Alert(this)))
- if (typeof option == 'string') data[option].call($this)
- })
- }
-
- $.fn.alert.Constructor = Alert
-
-
- /* ALERT DATA-API
- * ============== */
-
- $(function () {
- $('body').on('click.alert.data-api', dismiss, Alert.prototype.close)
- })
-
-}(window.jQuery);
-/* ============================================================
- * bootstrap-button.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#buttons
- * ============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-
-!function ($) {
-
- "use strict"; // jshint ;_;
-
-
- /* BUTTON PUBLIC CLASS DEFINITION
- * ============================== */
-
- var Button = function (element, options) {
- this.$element = $(element)
- this.options = $.extend({}, $.fn.button.defaults, options)
- }
-
- Button.prototype.setState = function (state) {
- var d = 'disabled'
- , $el = this.$element
- , data = $el.data()
- , val = $el.is('input') ? 'val' : 'html'
-
- state = state + 'Text'
- data.resetText || $el.data('resetText', $el[val]())
-
- $el[val](data[state] || this.options[state])
-
- // push to event loop to allow forms to submit
- setTimeout(function () {
- state == 'loadingText' ?
- $el.addClass(d).attr(d, d) :
- $el.removeClass(d).removeAttr(d)
- }, 0)
- }
-
- Button.prototype.toggle = function () {
- var $parent = this.$element.parent('[data-toggle="buttons-radio"]')
-
- $parent && $parent
- .find('.active')
- .removeClass('active')
-
- this.$element.toggleClass('active')
- }
-
-
- /* BUTTON PLUGIN DEFINITION
- * ======================== */
-
- $.fn.button = function (option) {
- return this.each(function () {
- var $this = $(this)
- , data = $this.data('button')
- , options = typeof option == 'object' && option
- if (!data) $this.data('button', (data = new Button(this, options)))
- if (option == 'toggle') data.toggle()
- else if (option) data.setState(option)
- })
- }
-
- $.fn.button.defaults = {
- loadingText: 'loading...'
- }
-
- $.fn.button.Constructor = Button
-
-
- /* BUTTON DATA-API
- * =============== */
-
- $(function () {
- $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) {
- var $btn = $(e.target)
- if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
- $btn.button('toggle')
- })
- })
-
-}(window.jQuery);
-/* =============================================================
- * bootstrap-collapse.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#collapse
- * =============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-
-!function ($) {
-
- "use strict"; // jshint ;_;
-
-
- /* COLLAPSE PUBLIC CLASS DEFINITION
- * ================================ */
-
- var Collapse = function (element, options) {
- this.$element = $(element)
- this.options = $.extend({}, $.fn.collapse.defaults, options)
-
- if (this.options.parent) {
- this.$parent = $(this.options.parent)
- }
-
- this.options.toggle && this.toggle()
- }
-
- Collapse.prototype = {
-
- constructor: Collapse
-
- , dimension: function () {
- var hasWidth = this.$element.hasClass('width')
- return hasWidth ? 'width' : 'height'
- }
-
- , show: function () {
- var dimension
- , scroll
- , actives
- , hasData
-
- if (this.transitioning) return
-
- dimension = this.dimension()
- scroll = $.camelCase(['scroll', dimension].join('-'))
- actives = this.$parent && this.$parent.find('> .accordion-group > .in')
-
- if (actives && actives.length) {
- hasData = actives.data('collapse')
- if (hasData && hasData.transitioning) return
- actives.collapse('hide')
- hasData || actives.data('collapse', null)
- }
-
- this.$element[dimension](0)
- this.transition('addClass', $.Event('show'), 'shown')
- $.support.transition && this.$element[dimension](this.$element[0][scroll])
- }
-
- , hide: function () {
- var dimension
- if (this.transitioning) return
- dimension = this.dimension()
- this.reset(this.$element[dimension]())
- this.transition('removeClass', $.Event('hide'), 'hidden')
- this.$element[dimension](0)
- }
-
- , reset: function (size) {
- var dimension = this.dimension()
-
- this.$element
- .removeClass('collapse')
- [dimension](size || 'auto')
- [0].offsetWidth
-
- this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
-
- return this
- }
-
- , transition: function (method, startEvent, completeEvent) {
- var that = this
- , complete = function () {
- if (startEvent.type == 'show') that.reset()
- that.transitioning = 0
- that.$element.trigger(completeEvent)
- }
-
- this.$element.trigger(startEvent)
-
- if (startEvent.isDefaultPrevented()) return
-
- this.transitioning = 1
-
- this.$element[method]('in')
-
- $.support.transition && this.$element.hasClass('collapse') ?
- this.$element.one($.support.transition.end, complete) :
- complete()
- }
-
- , toggle: function () {
- this[this.$element.hasClass('in') ? 'hide' : 'show']()
- }
-
- }
-
-
- /* COLLAPSIBLE PLUGIN DEFINITION
- * ============================== */
-
- $.fn.collapse = function (option) {
- return this.each(function () {
- var $this = $(this)
- , data = $this.data('collapse')
- , options = typeof option == 'object' && option
- if (!data) $this.data('collapse', (data = new Collapse(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- $.fn.collapse.defaults = {
- toggle: true
- }
-
- $.fn.collapse.Constructor = Collapse
-
-
- /* COLLAPSIBLE DATA-API
- * ==================== */
-
- $(function () {
- $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
- var $this = $(this), href
- , target = $this.attr('data-target')
- || e.preventDefault()
- || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
- , option = $(target).data('collapse') ? 'toggle' : $this.data()
- $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
- $(target).collapse(option)
- })
- })
-
-}(window.jQuery);
-/* ==========================================================
- * bootstrap-carousel.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#carousel
- * ==========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-
-!function ($) {
-
- "use strict"; // jshint ;_;
-
-
- /* CAROUSEL CLASS DEFINITION
- * ========================= */
-
- var Carousel = function (element, options) {
- this.$element = $(element)
- this.options = options
- this.options.slide && this.slide(this.options.slide)
- this.options.pause == 'hover' && this.$element
- .on('mouseenter', $.proxy(this.pause, this))
- .on('mouseleave', $.proxy(this.cycle, this))
- }
-
- Carousel.prototype = {
-
- cycle: function (e) {
- if (!e) this.paused = false
- this.options.interval
- && !this.paused
- && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
- return this
- }
-
- , to: function (pos) {
- var $active = this.$element.find('.item.active')
- , children = $active.parent().children()
- , activePos = children.index($active)
- , that = this
-
- if (pos > (children.length - 1) || pos < 0) return
-
- if (this.sliding) {
- return this.$element.one('slid', function () {
- that.to(pos)
- })
- }
-
- if (activePos == pos) {
- return this.pause().cycle()
- }
-
- return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
- }
-
- , pause: function (e) {
- if (!e) this.paused = true
- if (this.$element.find('.next, .prev').length && $.support.transition.end) {
- this.$element.trigger($.support.transition.end)
- this.cycle()
- }
- clearInterval(this.interval)
- this.interval = null
- return this
- }
-
- , next: function () {
- if (this.sliding) return
- return this.slide('next')
- }
-
- , prev: function () {
- if (this.sliding) return
- return this.slide('prev')
- }
-
- , slide: function (type, next) {
- var $active = this.$element.find('.item.active')
- , $next = next || $active[type]()
- , isCycling = this.interval
- , direction = type == 'next' ? 'left' : 'right'
- , fallback = type == 'next' ? 'first' : 'last'
- , that = this
- , e = $.Event('slide', {
- relatedTarget: $next[0]
- })
-
- this.sliding = true
-
- isCycling && this.pause()
-
- $next = $next.length ? $next : this.$element.find('.item')[fallback]()
-
- if ($next.hasClass('active')) return
-
- if ($.support.transition && this.$element.hasClass('slide')) {
- this.$element.trigger(e)
- if (e.isDefaultPrevented()) return
- $next.addClass(type)
- $next[0].offsetWidth // force reflow
- $active.addClass(direction)
- $next.addClass(direction)
- this.$element.one($.support.transition.end, function () {
- $next.removeClass([type, direction].join(' ')).addClass('active')
- $active.removeClass(['active', direction].join(' '))
- that.sliding = false
- setTimeout(function () { that.$element.trigger('slid') }, 0)
- })
- } else {
- this.$element.trigger(e)
- if (e.isDefaultPrevented()) return
- $active.removeClass('active')
- $next.addClass('active')
- this.sliding = false
- this.$element.trigger('slid')
- }
-
- isCycling && this.cycle()
-
- return this
- }
-
- }
-
-
- /* CAROUSEL PLUGIN DEFINITION
- * ========================== */
-
- $.fn.carousel = function (option) {
- return this.each(function () {
- var $this = $(this)
- , data = $this.data('carousel')
- , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
- , action = typeof option == 'string' ? option : options.slide
- if (!data) $this.data('carousel', (data = new Carousel(this, options)))
- if (typeof option == 'number') data.to(option)
- else if (action) data[action]()
- else if (options.interval) data.cycle()
- })
- }
-
- $.fn.carousel.defaults = {
- interval: 5000
- , pause: 'hover'
- }
-
- $.fn.carousel.Constructor = Carousel
-
-
- /* CAROUSEL DATA-API
- * ================= */
-
- $(function () {
- $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {
- var $this = $(this), href
- , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
- , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())
- $target.carousel(options)
- e.preventDefault()
- })
- })
-
-}(window.jQuery);
-/* =============================================================
- * bootstrap-typeahead.js v2.1.0
- * http://twitter.github.com/bootstrap/javascript.html#typeahead
- * =============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-
-!function($){
-
- "use strict"; // jshint ;_;
-
-
- /* TYPEAHEAD PUBLIC CLASS DEFINITION
- * ================================= */
-
- var Typeahead = function (element, options) {
- this.$element = $(element)
- this.options = $.extend({}, $.fn.typeahead.defaults, options)
- this.matcher = this.options.matcher || this.matcher
- this.sorter = this.options.sorter || this.sorter
- this.highlighter = this.options.highlighter || this.highlighter
- this.updater = this.options.updater || this.updater
- this.$menu = $(this.options.menu).appendTo('body')
- this.source = this.options.source
- this.shown = false
- this.listen()
- }
-
- Typeahead.prototype = {
-
- constructor: Typeahead
-
- , select: function () {
- var val = this.$menu.find('.active').attr('data-value')
- this.$element
- .val(this.updater(val))
- .change()
- return this.hide()
- }
-
- , updater: function (item) {
- return item
- }
-
- , show: function () {
- var pos = $.extend({}, this.$element.offset(), {
- height: this.$element[0].offsetHeight
- })
-
- this.$menu.css({
- top: pos.top + pos.height
- , left: pos.left
- })
-
- this.$menu.show()
- this.shown = true
- return this
- }
-
- , hide: function () {
- this.$menu.hide()
- this.shown = false
- return this
- }
-
- , lookup: function (event) {
- var items
-
- this.query = this.$element.val()
-
- if (!this.query || this.query.length < this.options.minLength) {
- return this.shown ? this.hide() : this
- }
-
- items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source
-
- return items ? this.process(items) : this
- }
-
- , process: function (items) {
- var that = this
-
- items = $.grep(items, function (item) {
- return that.matcher(item)
- })
-
- items = this.sorter(items)
-
- if (!items.length) {
- return this.shown ? this.hide() : this
- }
-
- return this.render(items.slice(0, this.options.items)).show()
- }
-
- , matcher: function (item) {
- return ~item.toLowerCase().indexOf(this.query.toLowerCase())
- }
-
- , sorter: function (items) {
- var beginswith = []
- , caseSensitive = []
- , caseInsensitive = []
- , item
-
- while (item = items.shift()) {
- if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
- else if (~item.indexOf(this.query)) caseSensitive.push(item)
- else caseInsensitive.push(item)
- }
-
- return beginswith.concat(caseSensitive, caseInsensitive)
- }
-
- , highlighter: function (item) {
- var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
- return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
- return '<strong>' + match + '</strong>'
- })
- }
-
- , render: function (items) {
- var that = this
-
- items = $(items).map(function (i, item) {
- i = $(that.options.item).attr('data-value', item)
- i.find('a').html(that.highlighter(item))
- return i[0]
- })
-
- items.first().addClass('active')
- this.$menu.html(items)
- return this
- }
-
- , next: function (event) {
- var active = this.$menu.find('.active').removeClass('active')
- , next = active.next()
-
- if (!next.length) {
- next = $(this.$menu.find('li')[0])
- }
-
- next.addClass('active')
- }
-
- , prev: function (event) {
- var active = this.$menu.find('.active').removeClass('active')
- , prev = active.prev()
-
- if (!prev.length) {
- prev = this.$menu.find('li').last()
- }
-
- prev.addClass('active')
- }
-
- , listen: function () {
- this.$element
- .on('blur', $.proxy(this.blur, this))
- .on('keypress', $.proxy(this.keypress, this))
- .on('keyup', $.proxy(this.keyup, this))
-
- if ($.browser.webkit || $.browser.msie) {
- this.$element.on('keydown', $.proxy(this.keydown, this))
- }
-
- this.$menu
- .on('click', $.proxy(this.click, this))
- .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
- }
-
- , move: function (e) {
- if (!this.shown) return
-
- switch(e.keyCode) {
- case 9: // tab
- case 13: // enter
- case 27: // escape
- e.preventDefault()
- break
-
- case 38: // up arrow
- e.preventDefault()
- this.prev()
- break
-
- case 40: // down arrow
- e.preventDefault()
- this.next()
- break
- }
-
- e.stopPropagation()
- }
-
- , keydown: function (e) {
- this.suppressKeyPressRepeat = !~$.inArray(e.keyCode, [40,38,9,13,27])
- this.move(e)
- }
-
- , keypress: function (e) {
- if (this.suppressKeyPressRepeat) return
- this.move(e)
- }
-
- , keyup: function (e) {
- switch(e.keyCode) {
- case 40: // down arrow
- case 38: // up arrow
- break
-
- case 9: // tab
- case 13: // enter
- if (!this.shown) return
- this.select()
- break
-
- case 27: // escape
- if (!this.shown) return
- this.hide()
- break
-
- default:
- this.lookup()
- }
-
- e.stopPropagation()
- e.preventDefault()
- }
-
- , blur: function (e) {
- var that = this
- setTimeout(function () { that.hide() }, 150)
- }
-
- , click: function (e) {
- e.stopPropagation()
- e.preventDefault()
- this.select()
- }
-
- , mouseenter: function (e) {
- this.$menu.find('.active').removeClass('active')
- $(e.currentTarget).addClass('active')
- }
-
- }
-
-
- /* TYPEAHEAD PLUGIN DEFINITION
- * =========================== */
-
- $.fn.typeahead = function (option) {
- return this.each(function () {
- var $this = $(this)
- , data = $this.data('typeahead')
- , options = typeof option == 'object' && option
- if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- $.fn.typeahead.defaults = {
- source: []
- , items: 8
- , menu: '<ul class="typeahead dropdown-menu"></ul>'
- , item: '<li><a href="#"></a></li>'
- , minLength: 1
- }
-
- $.fn.typeahead.Constructor = Typeahead
-
-
- /* TYPEAHEAD DATA-API
- * ================== */
-
- $(function () {
- $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
- var $this = $(this)
- if ($this.data('typeahead')) return
- e.preventDefault()
- $this.typeahead($this.data())
- })
- })
-
-}(window.jQuery);
diff --git a/doc/_themes/bootstrap/bootstrap.min.js b/doc/_themes/bootstrap/bootstrap.min.js
deleted file mode 100755
index 731e0ad..0000000
--- a/doc/_themes/bootstrap/bootstrap.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
-* Bootstrap.js by @fat & @mdo
-* plugins: bootstrap-transition.js, bootstrap-modal.js, bootstrap-dropdown.js, bootstrap-scrollspy.js, bootstrap-tab.js, bootstrap-tooltip.js, bootstrap-popover.js, bootstrap-affix.js, bootstrap-alert.js, bootstrap-button.js, bootstrap-collapse.js, bootstrap-carousel.js, bootstrap-typeahead.js
-* Copyright 2012 Twitter, Inc.
-* http://www.apache.org/licenses/LICENSE-2.0.txt
-*/
-!function(a){a(function(){a.support.transition=function(){var a=function(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},c;for(c in b)if(a.style[c]!==undefined)return b[c]}();return a&&{end:a}}()})}(window.jQuery),!function(a){var b=function(b,c){this.options=c,this.$element=a(b).delegate('[data-dismiss="modal"]',"click.dismiss.modal",a.proxy(this.hi [...]
\ No newline at end of file
diff --git a/doc/_themes/bootstrap/indexsidebar.html b/doc/_themes/bootstrap/indexsidebar.html
deleted file mode 100644
index 7d542f2..0000000
--- a/doc/_themes/bootstrap/indexsidebar.html
+++ /dev/null
@@ -1,42 +0,0 @@
-
-<p>
-<script src="http://widgets.twimg.com/j/2/widget.js"></script>
-<script>
-new TWTR.Widget({
- version: 2,
- type: 'profile',
- rpp: 4,
- interval: 6000,
- width: 'auto',
- height: 200,
- theme: {
- shell: {
- background: '#2c7fb8',
- color: '#ffffff'
- },
- tweets: {
- background: '#2c7fb8',
- color: '#ffffff',
- links: '#ffffff'
- }
- },
- features: {
- scrollbar: false,
- loop: false,
- live: false,
- hashtags: true,
- timestamp: true,
- avatars: false,
- behavior: 'all'
- }
-}).render().setUser('pointcloudpipe').start();
-</script>
-</p>
-
-
-
-<p>
-<script type="text/javascript" src="http://www.ohloh.net/p/585810/widgets/project_thin_badge.js"></script>
-</p>
-
-
diff --git a/doc/_themes/bootstrap/static/bootstrap-default.css b/doc/_themes/bootstrap/static/bootstrap-default.css
deleted file mode 100644
index 0664207..0000000
--- a/doc/_themes/bootstrap/static/bootstrap-default.css
+++ /dev/null
@@ -1,5624 +0,0 @@
-/*!
- * Bootstrap v2.1.0
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */
-
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-nav,
-section {
- display: block;
-}
-
-audio,
-canvas,
-video {
- display: inline-block;
- *display: inline;
- *zoom: 1;
-}
-
-audio:not([controls]) {
- display: none;
-}
-
-html {
- font-size: 100%;
- -webkit-text-size-adjust: 100%;
- -ms-text-size-adjust: 100%;
-}
-
-a:focus {
- outline: thin dotted #333;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-
-a:hover,
-a:active {
- outline: 0;
-}
-
-sub,
-sup {
- position: relative;
- font-size: 75%;
- line-height: 0;
- vertical-align: baseline;
-}
-
-sup {
- top: -0.5em;
-}
-
-sub {
- bottom: -0.25em;
-}
-
-img {
- height: auto;
- max-width: 100%;
- vertical-align: middle;
- border: 0;
- -ms-interpolation-mode: bicubic;
-}
-
-#map_canvas img {
- max-width: none;
-}
-
-button,
-input,
-select,
-textarea {
- margin: 0;
- font-size: 100%;
- vertical-align: middle;
-}
-
-button,
-input {
- *overflow: visible;
- line-height: normal;
-}
-
-button::-moz-focus-inner,
-input::-moz-focus-inner {
- padding: 0;
- border: 0;
-}
-
-button,
-input[type="button"],
-input[type="reset"],
-input[type="submit"] {
- cursor: pointer;
- -webkit-appearance: button;
-}
-
-input[type="search"] {
- -webkit-box-sizing: content-box;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
- -webkit-appearance: textfield;
-}
-
-input[type="search"]::-webkit-search-decoration,
-input[type="search"]::-webkit-search-cancel-button {
- -webkit-appearance: none;
-}
-
-textarea {
- overflow: auto;
- vertical-align: top;
-}
-
-.clearfix {
- *zoom: 1;
-}
-
-.clearfix:before,
-.clearfix:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.clearfix:after {
- clear: both;
-}
-
-.hide-text {
- font: 0/0 a;
- color: transparent;
- text-shadow: none;
- background-color: transparent;
- border: 0;
-}
-
-.input-block-level {
- display: block;
- width: 100%;
- min-height: 30px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-
-body {
- margin: 0;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 14px;
- line-height: 20px;
- color: #333333;
- background-color: #ffffff;
-}
-
-a {
- color: #0088cc;
- text-decoration: none;
-}
-
-a:hover {
- color: #005580;
- text-decoration: underline;
-}
-
-.img-rounded {
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
-}
-
-.img-polaroid {
- padding: 4px;
- background-color: #fff;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, 0.2);
- -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
- -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-}
-
-.img-circle {
- -webkit-border-radius: 500px;
- -moz-border-radius: 500px;
- border-radius: 500px;
-}
-
-.row {
- margin-left: -20px;
- *zoom: 1;
-}
-
-.row:before,
-.row:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.row:after {
- clear: both;
-}
-
-[class*="span"] {
- float: left;
- margin-left: 20px;
-}
-
-.container,
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
- width: 940px;
-}
-
-.span12 {
- width: 940px;
-}
-
-.span11 {
- width: 860px;
-}
-
-.span10 {
- width: 780px;
-}
-
-.span9 {
- width: 700px;
-}
-
-.span8 {
- width: 620px;
-}
-
-.span7 {
- width: 540px;
-}
-
-.span6 {
- width: 460px;
-}
-
-.span5 {
- width: 380px;
-}
-
-.span4 {
- width: 300px;
-}
-
-.span3 {
- width: 220px;
-}
-
-.span2 {
- width: 140px;
-}
-
-.span1 {
- width: 60px;
-}
-
-.offset12 {
- margin-left: 980px;
-}
-
-.offset11 {
- margin-left: 900px;
-}
-
-.offset10 {
- margin-left: 820px;
-}
-
-.offset9 {
- margin-left: 740px;
-}
-
-.offset8 {
- margin-left: 660px;
-}
-
-.offset7 {
- margin-left: 580px;
-}
-
-.offset6 {
- margin-left: 500px;
-}
-
-.offset5 {
- margin-left: 420px;
-}
-
-.offset4 {
- margin-left: 340px;
-}
-
-.offset3 {
- margin-left: 260px;
-}
-
-.offset2 {
- margin-left: 180px;
-}
-
-.offset1 {
- margin-left: 100px;
-}
-
-.row-fluid {
- width: 100%;
- *zoom: 1;
-}
-
-.row-fluid:before,
-.row-fluid:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.row-fluid:after {
- clear: both;
-}
-
-.row-fluid [class*="span"] {
- display: block;
- float: left;
- width: 100%;
- min-height: 30px;
- margin-left: 2.127659574468085%;
- *margin-left: 2.074468085106383%;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-
-.row-fluid [class*="span"]:first-child {
- margin-left: 0;
-}
-
-.row-fluid .span12 {
- width: 100%;
- *width: 99.94680851063829%;
-}
-
-.row-fluid .span11 {
- width: 91.48936170212765%;
- *width: 91.43617021276594%;
-}
-
-.row-fluid .span10 {
- width: 82.97872340425532%;
- *width: 82.92553191489361%;
-}
-
-.row-fluid .span9 {
- width: 74.46808510638297%;
- *width: 74.41489361702126%;
-}
-
-.row-fluid .span8 {
- width: 65.95744680851064%;
- *width: 65.90425531914893%;
-}
-
-.row-fluid .span7 {
- width: 57.44680851063829%;
- *width: 57.39361702127659%;
-}
-
-.row-fluid .span6 {
- width: 48.93617021276595%;
- *width: 48.88297872340425%;
-}
-
-.row-fluid .span5 {
- width: 40.42553191489362%;
- *width: 40.37234042553192%;
-}
-
-.row-fluid .span4 {
- width: 31.914893617021278%;
- *width: 31.861702127659576%;
-}
-
-.row-fluid .span3 {
- width: 23.404255319148934%;
- *width: 23.351063829787233%;
-}
-
-.row-fluid .span2 {
- width: 14.893617021276595%;
- *width: 14.840425531914894%;
-}
-
-.row-fluid .span1 {
- width: 6.382978723404255%;
- *width: 6.329787234042553%;
-}
-
-.row-fluid .offset12 {
- margin-left: 104.25531914893617%;
- *margin-left: 104.14893617021275%;
-}
-
-.row-fluid .offset12:first-child {
- margin-left: 102.12765957446808%;
- *margin-left: 102.02127659574467%;
-}
-
-.row-fluid .offset11 {
- margin-left: 95.74468085106382%;
- *margin-left: 95.6382978723404%;
-}
-
-.row-fluid .offset11:first-child {
- margin-left: 93.61702127659574%;
- *margin-left: 93.51063829787232%;
-}
-
-.row-fluid .offset10 {
- margin-left: 87.23404255319149%;
- *margin-left: 87.12765957446807%;
-}
-
-.row-fluid .offset10:first-child {
- margin-left: 85.1063829787234%;
- *margin-left: 84.99999999999999%;
-}
-
-.row-fluid .offset9 {
- margin-left: 78.72340425531914%;
- *margin-left: 78.61702127659572%;
-}
-
-.row-fluid .offset9:first-child {
- margin-left: 76.59574468085106%;
- *margin-left: 76.48936170212764%;
-}
-
-.row-fluid .offset8 {
- margin-left: 70.2127659574468%;
- *margin-left: 70.10638297872339%;
-}
-
-.row-fluid .offset8:first-child {
- margin-left: 68.08510638297872%;
- *margin-left: 67.9787234042553%;
-}
-
-.row-fluid .offset7 {
- margin-left: 61.70212765957446%;
- *margin-left: 61.59574468085106%;
-}
-
-.row-fluid .offset7:first-child {
- margin-left: 59.574468085106375%;
- *margin-left: 59.46808510638297%;
-}
-
-.row-fluid .offset6 {
- margin-left: 53.191489361702125%;
- *margin-left: 53.085106382978715%;
-}
-
-.row-fluid .offset6:first-child {
- margin-left: 51.063829787234035%;
- *margin-left: 50.95744680851063%;
-}
-
-.row-fluid .offset5 {
- margin-left: 44.68085106382979%;
- *margin-left: 44.57446808510638%;
-}
-
-.row-fluid .offset5:first-child {
- margin-left: 42.5531914893617%;
- *margin-left: 42.4468085106383%;
-}
-
-.row-fluid .offset4 {
- margin-left: 36.170212765957444%;
- *margin-left: 36.06382978723405%;
-}
-
-.row-fluid .offset4:first-child {
- margin-left: 34.04255319148936%;
- *margin-left: 33.93617021276596%;
-}
-
-.row-fluid .offset3 {
- margin-left: 27.659574468085104%;
- *margin-left: 27.5531914893617%;
-}
-
-.row-fluid .offset3:first-child {
- margin-left: 25.53191489361702%;
- *margin-left: 25.425531914893618%;
-}
-
-.row-fluid .offset2 {
- margin-left: 19.148936170212764%;
- *margin-left: 19.04255319148936%;
-}
-
-.row-fluid .offset2:first-child {
- margin-left: 17.02127659574468%;
- *margin-left: 16.914893617021278%;
-}
-
-.row-fluid .offset1 {
- margin-left: 10.638297872340425%;
- *margin-left: 10.53191489361702%;
-}
-
-.row-fluid .offset1:first-child {
- margin-left: 8.51063829787234%;
- *margin-left: 8.404255319148938%;
-}
-
-[class*="span"].hide,
-.row-fluid [class*="span"].hide {
- display: none;
-}
-
-[class*="span"].pull-right,
-.row-fluid [class*="span"].pull-right {
- float: right;
-}
-
-.container {
- margin-right: auto;
- margin-left: auto;
- *zoom: 1;
-}
-
-.container:before,
-.container:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.container:after {
- clear: both;
-}
-
-.container-fluid {
- padding-right: 20px;
- padding-left: 20px;
- *zoom: 1;
-}
-
-.container-fluid:before,
-.container-fluid:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.container-fluid:after {
- clear: both;
-}
-
-p {
- margin: 0 0 10px;
-}
-
-.lead {
- margin-bottom: 20px;
- font-size: 20px;
- font-weight: 200;
- line-height: 30px;
-}
-
-small {
- font-size: 85%;
-}
-
-strong {
- font-weight: bold;
-}
-
-em {
- font-style: italic;
-}
-
-cite {
- font-style: normal;
-}
-
-.muted {
- color: #999999;
-}
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- margin: 10px 0;
- font-family: inherit;
- font-weight: bold;
- line-height: 1;
- color: inherit;
- text-rendering: optimizelegibility;
-}
-
-h1 small,
-h2 small,
-h3 small,
-h4 small,
-h5 small,
-h6 small {
- font-weight: normal;
- line-height: 1;
- color: #999999;
-}
-
-h1 {
- font-size: 36px;
- line-height: 40px;
-}
-
-h2 {
- font-size: 30px;
- line-height: 40px;
-}
-
-h3 {
- font-size: 24px;
- line-height: 40px;
-}
-
-h4 {
- font-size: 18px;
- line-height: 20px;
-}
-
-h5 {
- font-size: 14px;
- line-height: 20px;
-}
-
-h6 {
- font-size: 12px;
- line-height: 20px;
-}
-
-h1 small {
- font-size: 24px;
-}
-
-h2 small {
- font-size: 18px;
-}
-
-h3 small {
- font-size: 14px;
-}
-
-h4 small {
- font-size: 14px;
-}
-
-.page-header {
- padding-bottom: 9px;
- margin: 20px 0 30px;
- border-bottom: 1px solid #eeeeee;
-}
-
-ul,
-ol {
- padding: 0;
- margin: 0 0 10px 25px;
-}
-
-ul ul,
-ul ol,
-ol ol,
-ol ul {
- margin-bottom: 0;
-}
-
-li {
- line-height: 20px;
-}
-
-ul.unstyled,
-ol.unstyled {
- margin-left: 0;
- list-style: none;
-}
-
-dl {
- margin-bottom: 20px;
-}
-
-dt,
-dd {
- line-height: 20px;
-}
-
-dt {
- font-weight: bold;
-}
-
-dd {
- margin-left: 10px;
-}
-
-.dl-horizontal dt {
- float: left;
- width: 120px;
- overflow: hidden;
- clear: left;
- text-align: right;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-.dl-horizontal dd {
- margin-left: 130px;
-}
-
-hr {
- margin: 20px 0;
- border: 0;
- border-top: 1px solid #eeeeee;
- border-bottom: 1px solid #ffffff;
-}
-
-abbr[title] {
- cursor: help;
- border-bottom: 1px dotted #999999;
-}
-
-abbr.initialism {
- font-size: 90%;
- text-transform: uppercase;
-}
-
-blockquote {
- padding: 0 0 0 15px;
- margin: 0 0 20px;
- border-left: 5px solid #eeeeee;
-}
-
-blockquote p {
- margin-bottom: 0;
- font-size: 16px;
- font-weight: 300;
- line-height: 25px;
-}
-
-blockquote small {
- display: block;
- line-height: 20px;
- color: #999999;
-}
-
-blockquote small:before {
- content: '\2014 \00A0';
-}
-
-blockquote.pull-right {
- float: right;
- padding-right: 15px;
- padding-left: 0;
- border-right: 5px solid #eeeeee;
- border-left: 0;
-}
-
-blockquote.pull-right p,
-blockquote.pull-right small {
- text-align: right;
-}
-
-blockquote.pull-right small:before {
- content: '';
-}
-
-blockquote.pull-right small:after {
- content: '\00A0 \2014';
-}
-
-q:before,
-q:after,
-blockquote:before,
-blockquote:after {
- content: "";
-}
-
-address {
- display: block;
- margin-bottom: 20px;
- font-style: normal;
- line-height: 20px;
-}
-
-code,
-pre {
- padding: 0 3px 2px;
- font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
- font-size: 12px;
- color: #333333;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
-}
-
-code {
- padding: 2px 4px;
- color: #d14;
- background-color: #f7f7f9;
- border: 1px solid #e1e1e8;
-}
-
-pre {
- display: block;
- padding: 9.5px;
- margin: 0 0 10px;
- font-size: 13px;
- line-height: 20px;
- word-break: break-all;
- word-wrap: break-word;
- white-space: pre;
- white-space: pre-wrap;
- background-color: #f5f5f5;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, 0.15);
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-
-pre.prettyprint {
- margin-bottom: 20px;
-}
-
-pre code {
- padding: 0;
- color: inherit;
- background-color: transparent;
- border: 0;
-}
-
-.pre-scrollable {
- max-height: 340px;
- overflow-y: scroll;
-}
-
-form {
- margin: 0 0 20px;
-}
-
-fieldset {
- padding: 0;
- margin: 0;
- border: 0;
-}
-
-legend {
- display: block;
- width: 100%;
- padding: 0;
- margin-bottom: 20px;
- font-size: 21px;
- line-height: 40px;
- color: #333333;
- border: 0;
- border-bottom: 1px solid #e5e5e5;
-}
-
-legend small {
- font-size: 15px;
- color: #999999;
-}
-
-label,
-input,
-button,
-select,
-textarea {
- font-size: 14px;
- font-weight: normal;
- line-height: 20px;
-}
-
-input,
-button,
-select,
-textarea {
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-}
-
-label {
- display: block;
- margin-bottom: 5px;
-}
-
-select,
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
- display: inline-block;
- height: 20px;
- padding: 4px 6px;
- margin-bottom: 9px;
- font-size: 14px;
- line-height: 20px;
- color: #555555;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
-}
-
-input,
-textarea {
- width: 210px;
-}
-
-textarea {
- height: auto;
-}
-
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
- background-color: #ffffff;
- border: 1px solid #cccccc;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
- -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
- -o-transition: border linear 0.2s, box-shadow linear 0.2s;
- transition: border linear 0.2s, box-shadow linear 0.2s;
-}
-
-textarea:focus,
-input[type="text"]:focus,
-input[type="password"]:focus,
-input[type="datetime"]:focus,
-input[type="datetime-local"]:focus,
-input[type="date"]:focus,
-input[type="month"]:focus,
-input[type="time"]:focus,
-input[type="week"]:focus,
-input[type="number"]:focus,
-input[type="email"]:focus,
-input[type="url"]:focus,
-input[type="search"]:focus,
-input[type="tel"]:focus,
-input[type="color"]:focus,
-.uneditable-input:focus {
- border-color: rgba(82, 168, 236, 0.8);
- outline: 0;
- outline: thin dotted \9;
- /* IE6-9 */
-
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
-}
-
-input[type="radio"],
-input[type="checkbox"] {
- margin: 4px 0 0;
- margin-top: 1px \9;
- *margin-top: 0;
- line-height: normal;
- cursor: pointer;
-}
-
-input[type="file"],
-input[type="image"],
-input[type="submit"],
-input[type="reset"],
-input[type="button"],
-input[type="radio"],
-input[type="checkbox"] {
- width: auto;
-}
-
-select,
-input[type="file"] {
- height: 30px;
- /* In IE7, the height of the select element cannot be changed by height, only font-size */
-
- *margin-top: 4px;
- /* For IE7, add top margin to align select with labels */
-
- line-height: 30px;
-}
-
-select {
- width: 220px;
- background-color: #ffffff;
- border: 1px solid #bbb;
-}
-
-select[multiple],
-select[size] {
- height: auto;
-}
-
-select:focus,
-input[type="file"]:focus,
-input[type="radio"]:focus,
-input[type="checkbox"]:focus {
- outline: thin dotted #333;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-
-.uneditable-input,
-.uneditable-textarea {
- color: #999999;
- cursor: not-allowed;
- background-color: #fcfcfc;
- border-color: #cccccc;
- -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
- -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-}
-
-.uneditable-input {
- overflow: hidden;
- white-space: nowrap;
-}
-
-.uneditable-textarea {
- width: auto;
- height: auto;
-}
-
-input:-moz-placeholder,
-textarea:-moz-placeholder {
- color: #999999;
-}
-
-input:-ms-input-placeholder,
-textarea:-ms-input-placeholder {
- color: #999999;
-}
-
-input::-webkit-input-placeholder,
-textarea::-webkit-input-placeholder {
- color: #999999;
-}
-
-.radio,
-.checkbox {
- min-height: 18px;
- padding-left: 18px;
-}
-
-.radio input[type="radio"],
-.checkbox input[type="checkbox"] {
- float: left;
- margin-left: -18px;
-}
-
-.controls > .radio:first-child,
-.controls > .checkbox:first-child {
- padding-top: 5px;
-}
-
-.radio.inline,
-.checkbox.inline {
- display: inline-block;
- padding-top: 5px;
- margin-bottom: 0;
- vertical-align: middle;
-}
-
-.radio.inline + .radio.inline,
-.checkbox.inline + .checkbox.inline {
- margin-left: 10px;
-}
-
-.input-mini {
- width: 60px;
-}
-
-.input-small {
- width: 90px;
-}
-
-.input-medium {
- width: 150px;
-}
-
-.input-large {
- width: 210px;
-}
-
-.input-xlarge {
- width: 270px;
-}
-
-.input-xxlarge {
- width: 530px;
-}
-
-input[class*="span"],
-select[class*="span"],
-textarea[class*="span"],
-.uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"] {
- float: none;
- margin-left: 0;
-}
-
-.input-append input[class*="span"],
-.input-append .uneditable-input[class*="span"],
-.input-prepend input[class*="span"],
-.input-prepend .uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"],
-.row-fluid .input-prepend [class*="span"],
-.row-fluid .input-append [class*="span"] {
- display: inline-block;
-}
-
-input,
-textarea,
-.uneditable-input {
- margin-left: 0;
-}
-
-.controls-row [class*="span"] + [class*="span"] {
- margin-left: 20px;
-}
-
-input.span12,
-textarea.span12,
-.uneditable-input.span12 {
- width: 926px;
-}
-
-input.span11,
-textarea.span11,
-.uneditable-input.span11 {
- width: 846px;
-}
-
-input.span10,
-textarea.span10,
-.uneditable-input.span10 {
- width: 766px;
-}
-
-input.span9,
-textarea.span9,
-.uneditable-input.span9 {
- width: 686px;
-}
-
-input.span8,
-textarea.span8,
-.uneditable-input.span8 {
- width: 606px;
-}
-
-input.span7,
-textarea.span7,
-.uneditable-input.span7 {
- width: 526px;
-}
-
-input.span6,
-textarea.span6,
-.uneditable-input.span6 {
- width: 446px;
-}
-
-input.span5,
-textarea.span5,
-.uneditable-input.span5 {
- width: 366px;
-}
-
-input.span4,
-textarea.span4,
-.uneditable-input.span4 {
- width: 286px;
-}
-
-input.span3,
-textarea.span3,
-.uneditable-input.span3 {
- width: 206px;
-}
-
-input.span2,
-textarea.span2,
-.uneditable-input.span2 {
- width: 126px;
-}
-
-input.span1,
-textarea.span1,
-.uneditable-input.span1 {
- width: 46px;
-}
-
-.controls-row {
- *zoom: 1;
-}
-
-.controls-row:before,
-.controls-row:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.controls-row:after {
- clear: both;
-}
-
-.controls-row [class*="span"] {
- float: left;
-}
-
-input[disabled],
-select[disabled],
-textarea[disabled],
-input[readonly],
-select[readonly],
-textarea[readonly] {
- cursor: not-allowed;
- background-color: #eeeeee;
-}
-
-input[type="radio"][disabled],
-input[type="checkbox"][disabled],
-input[type="radio"][readonly],
-input[type="checkbox"][readonly] {
- background-color: transparent;
-}
-
-.control-group.warning > label,
-.control-group.warning .help-block,
-.control-group.warning .help-inline {
- color: #c09853;
-}
-
-.control-group.warning .checkbox,
-.control-group.warning .radio,
-.control-group.warning input,
-.control-group.warning select,
-.control-group.warning textarea {
- color: #c09853;
- border-color: #c09853;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-
-.control-group.warning .checkbox:focus,
-.control-group.warning .radio:focus,
-.control-group.warning input:focus,
-.control-group.warning select:focus,
-.control-group.warning textarea:focus {
- border-color: #a47e3c;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-}
-
-.control-group.warning .input-prepend .add-on,
-.control-group.warning .input-append .add-on {
- color: #c09853;
- background-color: #fcf8e3;
- border-color: #c09853;
-}
-
-.control-group.error > label,
-.control-group.error .help-block,
-.control-group.error .help-inline {
- color: #b94a48;
-}
-
-.control-group.error .checkbox,
-.control-group.error .radio,
-.control-group.error input,
-.control-group.error select,
-.control-group.error textarea {
- color: #b94a48;
- border-color: #b94a48;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-
-.control-group.error .checkbox:focus,
-.control-group.error .radio:focus,
-.control-group.error input:focus,
-.control-group.error select:focus,
-.control-group.error textarea:focus {
- border-color: #953b39;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-}
-
-.control-group.error .input-prepend .add-on,
-.control-group.error .input-append .add-on {
- color: #b94a48;
- background-color: #f2dede;
- border-color: #b94a48;
-}
-
-.control-group.success > label,
-.control-group.success .help-block,
-.control-group.success .help-inline {
- color: #468847;
-}
-
-.control-group.success .checkbox,
-.control-group.success .radio,
-.control-group.success input,
-.control-group.success select,
-.control-group.success textarea {
- color: #468847;
- border-color: #468847;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-
-.control-group.success .checkbox:focus,
-.control-group.success .radio:focus,
-.control-group.success input:focus,
-.control-group.success select:focus,
-.control-group.success textarea:focus {
- border-color: #356635;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-}
-
-.control-group.success .input-prepend .add-on,
-.control-group.success .input-append .add-on {
- color: #468847;
- background-color: #dff0d8;
- border-color: #468847;
-}
-
-input:focus:required:invalid,
-textarea:focus:required:invalid,
-select:focus:required:invalid {
- color: #b94a48;
- border-color: #ee5f5b;
-}
-
-input:focus:required:invalid:focus,
-textarea:focus:required:invalid:focus,
-select:focus:required:invalid:focus {
- border-color: #e9322d;
- -webkit-box-shadow: 0 0 6px #f8b9b7;
- -moz-box-shadow: 0 0 6px #f8b9b7;
- box-shadow: 0 0 6px #f8b9b7;
-}
-
-.form-actions {
- padding: 19px 20px 20px;
- margin-top: 20px;
- margin-bottom: 20px;
- background-color: #f5f5f5;
- border-top: 1px solid #e5e5e5;
- *zoom: 1;
-}
-
-.form-actions:before,
-.form-actions:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.form-actions:after {
- clear: both;
-}
-
-.help-block,
-.help-inline {
- color: #595959;
-}
-
-.help-block {
- display: block;
- margin-bottom: 10px;
-}
-
-.help-inline {
- display: inline-block;
- *display: inline;
- padding-left: 5px;
- vertical-align: middle;
- *zoom: 1;
-}
-
-.input-append,
-.input-prepend {
- margin-bottom: 5px;
- font-size: 0;
- white-space: nowrap;
-}
-
-.input-append input,
-.input-prepend input,
-.input-append select,
-.input-prepend select,
-.input-append .uneditable-input,
-.input-prepend .uneditable-input {
- position: relative;
- margin-bottom: 0;
- *margin-left: 0;
- font-size: 14px;
- vertical-align: top;
- -webkit-border-radius: 0 3px 3px 0;
- -moz-border-radius: 0 3px 3px 0;
- border-radius: 0 3px 3px 0;
-}
-
-.input-append input:focus,
-.input-prepend input:focus,
-.input-append select:focus,
-.input-prepend select:focus,
-.input-append .uneditable-input:focus,
-.input-prepend .uneditable-input:focus {
- z-index: 2;
-}
-
-.input-append .add-on,
-.input-prepend .add-on {
- display: inline-block;
- width: auto;
- height: 20px;
- min-width: 16px;
- padding: 4px 5px;
- font-size: 14px;
- font-weight: normal;
- line-height: 20px;
- text-align: center;
- text-shadow: 0 1px 0 #ffffff;
- background-color: #eeeeee;
- border: 1px solid #ccc;
-}
-
-.input-append .add-on,
-.input-prepend .add-on,
-.input-append .btn,
-.input-prepend .btn {
- margin-left: -1px;
- vertical-align: top;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.input-append .active,
-.input-prepend .active {
- background-color: #a9dba9;
- border-color: #46a546;
-}
-
-.input-prepend .add-on,
-.input-prepend .btn {
- margin-right: -1px;
-}
-
-.input-prepend .add-on:first-child,
-.input-prepend .btn:first-child {
- -webkit-border-radius: 3px 0 0 3px;
- -moz-border-radius: 3px 0 0 3px;
- border-radius: 3px 0 0 3px;
-}
-
-.input-append input,
-.input-append select,
-.input-append .uneditable-input {
- -webkit-border-radius: 3px 0 0 3px;
- -moz-border-radius: 3px 0 0 3px;
- border-radius: 3px 0 0 3px;
-}
-
-.input-append .add-on:last-child,
-.input-append .btn:last-child {
- -webkit-border-radius: 0 3px 3px 0;
- -moz-border-radius: 0 3px 3px 0;
- border-radius: 0 3px 3px 0;
-}
-
-.input-prepend.input-append input,
-.input-prepend.input-append select,
-.input-prepend.input-append .uneditable-input {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.input-prepend.input-append .add-on:first-child,
-.input-prepend.input-append .btn:first-child {
- margin-right: -1px;
- -webkit-border-radius: 3px 0 0 3px;
- -moz-border-radius: 3px 0 0 3px;
- border-radius: 3px 0 0 3px;
-}
-
-.input-prepend.input-append .add-on:last-child,
-.input-prepend.input-append .btn:last-child {
- margin-left: -1px;
- -webkit-border-radius: 0 3px 3px 0;
- -moz-border-radius: 0 3px 3px 0;
- border-radius: 0 3px 3px 0;
-}
-
-input.search-query {
- padding-right: 14px;
- padding-right: 4px \9;
- padding-left: 14px;
- padding-left: 4px \9;
- /* IE7-8 doesn't have border-radius, so don't indent the padding */
-
- margin-bottom: 0;
- -webkit-border-radius: 15px;
- -moz-border-radius: 15px;
- border-radius: 15px;
-}
-
-/* Allow for input prepend/append in search forms */
-
-.form-search .input-append .search-query,
-.form-search .input-prepend .search-query {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.form-search .input-append .search-query {
- -webkit-border-radius: 14px 0 0 14px;
- -moz-border-radius: 14px 0 0 14px;
- border-radius: 14px 0 0 14px;
-}
-
-.form-search .input-append .btn {
- -webkit-border-radius: 0 14px 14px 0;
- -moz-border-radius: 0 14px 14px 0;
- border-radius: 0 14px 14px 0;
-}
-
-.form-search .input-prepend .search-query {
- -webkit-border-radius: 0 14px 14px 0;
- -moz-border-radius: 0 14px 14px 0;
- border-radius: 0 14px 14px 0;
-}
-
-.form-search .input-prepend .btn {
- -webkit-border-radius: 14px 0 0 14px;
- -moz-border-radius: 14px 0 0 14px;
- border-radius: 14px 0 0 14px;
-}
-
-.form-search input,
-.form-inline input,
-.form-horizontal input,
-.form-search textarea,
-.form-inline textarea,
-.form-horizontal textarea,
-.form-search select,
-.form-inline select,
-.form-horizontal select,
-.form-search .help-inline,
-.form-inline .help-inline,
-.form-horizontal .help-inline,
-.form-search .uneditable-input,
-.form-inline .uneditable-input,
-.form-horizontal .uneditable-input,
-.form-search .input-prepend,
-.form-inline .input-prepend,
-.form-horizontal .input-prepend,
-.form-search .input-append,
-.form-inline .input-append,
-.form-horizontal .input-append {
- display: inline-block;
- *display: inline;
- margin-bottom: 0;
- vertical-align: middle;
- *zoom: 1;
-}
-
-.form-search .hide,
-.form-inline .hide,
-.form-horizontal .hide {
- display: none;
-}
-
-.form-search label,
-.form-inline label,
-.form-search .btn-group,
-.form-inline .btn-group {
- display: inline-block;
-}
-
-.form-search .input-append,
-.form-inline .input-append,
-.form-search .input-prepend,
-.form-inline .input-prepend {
- margin-bottom: 0;
-}
-
-.form-search .radio,
-.form-search .checkbox,
-.form-inline .radio,
-.form-inline .checkbox {
- padding-left: 0;
- margin-bottom: 0;
- vertical-align: middle;
-}
-
-.form-search .radio input[type="radio"],
-.form-search .checkbox input[type="checkbox"],
-.form-inline .radio input[type="radio"],
-.form-inline .checkbox input[type="checkbox"] {
- float: left;
- margin-right: 3px;
- margin-left: 0;
-}
-
-.control-group {
- margin-bottom: 10px;
-}
-
-legend + .control-group {
- margin-top: 20px;
- -webkit-margin-top-collapse: separate;
-}
-
-.form-horizontal .control-group {
- margin-bottom: 20px;
- *zoom: 1;
-}
-
-.form-horizontal .control-group:before,
-.form-horizontal .control-group:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.form-horizontal .control-group:after {
- clear: both;
-}
-
-.form-horizontal .control-label {
- float: left;
- width: 140px;
- padding-top: 5px;
- text-align: right;
-}
-
-.form-horizontal .controls {
- *display: inline-block;
- *padding-left: 20px;
- margin-left: 160px;
- *margin-left: 0;
-}
-
-.form-horizontal .controls:first-child {
- *padding-left: 160px;
-}
-
-.form-horizontal .help-block {
- margin-top: 10px;
- margin-bottom: 0;
-}
-
-.form-horizontal .form-actions {
- padding-left: 160px;
-}
-
-table {
- max-width: 100%;
- background-color: transparent;
- border-collapse: collapse;
- border-spacing: 0;
-}
-
-.table {
- width: 100%;
- margin-bottom: 20px;
-}
-
-.table th,
-.table td {
- padding: 8px;
- line-height: 20px;
- text-align: left;
- vertical-align: top;
- border-top: 1px solid #dddddd;
-}
-
-.table th {
- font-weight: bold;
-}
-
-.table thead th {
- vertical-align: bottom;
-}
-
-.table caption + thead tr:first-child th,
-.table caption + thead tr:first-child td,
-.table colgroup + thead tr:first-child th,
-.table colgroup + thead tr:first-child td,
-.table thead:first-child tr:first-child th,
-.table thead:first-child tr:first-child td {
- border-top: 0;
-}
-
-.table tbody + tbody {
- border-top: 2px solid #dddddd;
-}
-
-.table-condensed th,
-.table-condensed td {
- padding: 4px 5px;
-}
-
-.table-bordered {
- border: 1px solid #dddddd;
- border-collapse: separate;
- *border-collapse: collapse;
- border-left: 0;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-
-.table-bordered th,
-.table-bordered td {
- border-left: 1px solid #dddddd;
-}
-
-.table-bordered caption + thead tr:first-child th,
-.table-bordered caption + tbody tr:first-child th,
-.table-bordered caption + tbody tr:first-child td,
-.table-bordered colgroup + thead tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child td,
-.table-bordered thead:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child td {
- border-top: 0;
-}
-
-.table-bordered thead:first-child tr:first-child th:first-child,
-.table-bordered tbody:first-child tr:first-child td:first-child {
- -webkit-border-top-left-radius: 4px;
- border-top-left-radius: 4px;
- -moz-border-radius-topleft: 4px;
-}
-
-.table-bordered thead:first-child tr:first-child th:last-child,
-.table-bordered tbody:first-child tr:first-child td:last-child {
- -webkit-border-top-right-radius: 4px;
- border-top-right-radius: 4px;
- -moz-border-radius-topright: 4px;
-}
-
-.table-bordered thead:last-child tr:last-child th:first-child,
-.table-bordered tbody:last-child tr:last-child td:first-child,
-.table-bordered tfoot:last-child tr:last-child td:first-child {
- -webkit-border-radius: 0 0 0 4px;
- -moz-border-radius: 0 0 0 4px;
- border-radius: 0 0 0 4px;
- -webkit-border-bottom-left-radius: 4px;
- border-bottom-left-radius: 4px;
- -moz-border-radius-bottomleft: 4px;
-}
-
-.table-bordered thead:last-child tr:last-child th:last-child,
-.table-bordered tbody:last-child tr:last-child td:last-child,
-.table-bordered tfoot:last-child tr:last-child td:last-child {
- -webkit-border-bottom-right-radius: 4px;
- border-bottom-right-radius: 4px;
- -moz-border-radius-bottomright: 4px;
-}
-
-.table-bordered caption + thead tr:first-child th:first-child,
-.table-bordered caption + tbody tr:first-child td:first-child,
-.table-bordered colgroup + thead tr:first-child th:first-child,
-.table-bordered colgroup + tbody tr:first-child td:first-child {
- -webkit-border-top-left-radius: 4px;
- border-top-left-radius: 4px;
- -moz-border-radius-topleft: 4px;
-}
-
-.table-bordered caption + thead tr:first-child th:last-child,
-.table-bordered caption + tbody tr:first-child td:last-child,
-.table-bordered colgroup + thead tr:first-child th:last-child,
-.table-bordered colgroup + tbody tr:first-child td:last-child {
- -webkit-border-top-right-radius: 4px;
- border-top-right-radius: 4px;
- -moz-border-right-topleft: 4px;
-}
-
-.table-striped tbody tr:nth-child(odd) td,
-.table-striped tbody tr:nth-child(odd) th {
- background-color: #f9f9f9;
-}
-
-.table-hover tbody tr:hover td,
-.table-hover tbody tr:hover th {
- background-color: #f5f5f5;
-}
-
-table [class*=span],
-.row-fluid table [class*=span] {
- display: table-cell;
- float: none;
- margin-left: 0;
-}
-
-table .span1 {
- float: none;
- width: 44px;
- margin-left: 0;
-}
-
-table .span2 {
- float: none;
- width: 124px;
- margin-left: 0;
-}
-
-table .span3 {
- float: none;
- width: 204px;
- margin-left: 0;
-}
-
-table .span4 {
- float: none;
- width: 284px;
- margin-left: 0;
-}
-
-table .span5 {
- float: none;
- width: 364px;
- margin-left: 0;
-}
-
-table .span6 {
- float: none;
- width: 444px;
- margin-left: 0;
-}
-
-table .span7 {
- float: none;
- width: 524px;
- margin-left: 0;
-}
-
-table .span8 {
- float: none;
- width: 604px;
- margin-left: 0;
-}
-
-table .span9 {
- float: none;
- width: 684px;
- margin-left: 0;
-}
-
-table .span10 {
- float: none;
- width: 764px;
- margin-left: 0;
-}
-
-table .span11 {
- float: none;
- width: 844px;
- margin-left: 0;
-}
-
-table .span12 {
- float: none;
- width: 924px;
- margin-left: 0;
-}
-
-table .span13 {
- float: none;
- width: 1004px;
- margin-left: 0;
-}
-
-table .span14 {
- float: none;
- width: 1084px;
- margin-left: 0;
-}
-
-table .span15 {
- float: none;
- width: 1164px;
- margin-left: 0;
-}
-
-table .span16 {
- float: none;
- width: 1244px;
- margin-left: 0;
-}
-
-table .span17 {
- float: none;
- width: 1324px;
- margin-left: 0;
-}
-
-table .span18 {
- float: none;
- width: 1404px;
- margin-left: 0;
-}
-
-table .span19 {
- float: none;
- width: 1484px;
- margin-left: 0;
-}
-
-table .span20 {
- float: none;
- width: 1564px;
- margin-left: 0;
-}
-
-table .span21 {
- float: none;
- width: 1644px;
- margin-left: 0;
-}
-
-table .span22 {
- float: none;
- width: 1724px;
- margin-left: 0;
-}
-
-table .span23 {
- float: none;
- width: 1804px;
- margin-left: 0;
-}
-
-table .span24 {
- float: none;
- width: 1884px;
- margin-left: 0;
-}
-
-.table tbody tr.success td {
- background-color: #dff0d8;
-}
-
-.table tbody tr.error td {
- background-color: #f2dede;
-}
-
-.table tbody tr.info td {
- background-color: #d9edf7;
-}
-
-[class^="icon-"],
-[class*=" icon-"] {
- display: inline-block;
- width: 14px;
- height: 14px;
- margin-top: 1px;
- *margin-right: .3em;
- line-height: 14px;
- vertical-align: text-top;
- background-image: url("../img/glyphicons-halflings.png");
- background-position: 14px 14px;
- background-repeat: no-repeat;
-}
-
-/* White icons with optional class, or on hover/active states of certain elements */
-
-.icon-white,
-.nav > .active > a > [class^="icon-"],
-.nav > .active > a > [class*=" icon-"],
-.dropdown-menu > li > a:hover > [class^="icon-"],
-.dropdown-menu > li > a:hover > [class*=" icon-"],
-.dropdown-menu > .active > a > [class^="icon-"],
-.dropdown-menu > .active > a > [class*=" icon-"] {
- background-image: url("../img/glyphicons-halflings-white.png");
-}
-
-.icon-glass {
- background-position: 0 0;
-}
-
-.icon-music {
- background-position: -24px 0;
-}
-
-.icon-search {
- background-position: -48px 0;
-}
-
-.icon-envelope {
- background-position: -72px 0;
-}
-
-.icon-heart {
- background-position: -96px 0;
-}
-
-.icon-star {
- background-position: -120px 0;
-}
-
-.icon-star-empty {
- background-position: -144px 0;
-}
-
-.icon-user {
- background-position: -168px 0;
-}
-
-.icon-film {
- background-position: -192px 0;
-}
-
-.icon-th-large {
- background-position: -216px 0;
-}
-
-.icon-th {
- background-position: -240px 0;
-}
-
-.icon-th-list {
- background-position: -264px 0;
-}
-
-.icon-ok {
- background-position: -288px 0;
-}
-
-.icon-remove {
- background-position: -312px 0;
-}
-
-.icon-zoom-in {
- background-position: -336px 0;
-}
-
-.icon-zoom-out {
- background-position: -360px 0;
-}
-
-.icon-off {
- background-position: -384px 0;
-}
-
-.icon-signal {
- background-position: -408px 0;
-}
-
-.icon-cog {
- background-position: -432px 0;
-}
-
-.icon-trash {
- background-position: -456px 0;
-}
-
-.icon-home {
- background-position: 0 -24px;
-}
-
-.icon-file {
- background-position: -24px -24px;
-}
-
-.icon-time {
- background-position: -48px -24px;
-}
-
-.icon-road {
- background-position: -72px -24px;
-}
-
-.icon-download-alt {
- background-position: -96px -24px;
-}
-
-.icon-download {
- background-position: -120px -24px;
-}
-
-.icon-upload {
- background-position: -144px -24px;
-}
-
-.icon-inbox {
- background-position: -168px -24px;
-}
-
-.icon-play-circle {
- background-position: -192px -24px;
-}
-
-.icon-repeat {
- background-position: -216px -24px;
-}
-
-.icon-refresh {
- background-position: -240px -24px;
-}
-
-.icon-list-alt {
- background-position: -264px -24px;
-}
-
-.icon-lock {
- background-position: -287px -24px;
-}
-
-.icon-flag {
- background-position: -312px -24px;
-}
-
-.icon-headphones {
- background-position: -336px -24px;
-}
-
-.icon-volume-off {
- background-position: -360px -24px;
-}
-
-.icon-volume-down {
- background-position: -384px -24px;
-}
-
-.icon-volume-up {
- background-position: -408px -24px;
-}
-
-.icon-qrcode {
- background-position: -432px -24px;
-}
-
-.icon-barcode {
- background-position: -456px -24px;
-}
-
-.icon-tag {
- background-position: 0 -48px;
-}
-
-.icon-tags {
- background-position: -25px -48px;
-}
-
-.icon-book {
- background-position: -48px -48px;
-}
-
-.icon-bookmark {
- background-position: -72px -48px;
-}
-
-.icon-print {
- background-position: -96px -48px;
-}
-
-.icon-camera {
- background-position: -120px -48px;
-}
-
-.icon-font {
- background-position: -144px -48px;
-}
-
-.icon-bold {
- background-position: -167px -48px;
-}
-
-.icon-italic {
- background-position: -192px -48px;
-}
-
-.icon-text-height {
- background-position: -216px -48px;
-}
-
-.icon-text-width {
- background-position: -240px -48px;
-}
-
-.icon-align-left {
- background-position: -264px -48px;
-}
-
-.icon-align-center {
- background-position: -288px -48px;
-}
-
-.icon-align-right {
- background-position: -312px -48px;
-}
-
-.icon-align-justify {
- background-position: -336px -48px;
-}
-
-.icon-list {
- background-position: -360px -48px;
-}
-
-.icon-indent-left {
- background-position: -384px -48px;
-}
-
-.icon-indent-right {
- background-position: -408px -48px;
-}
-
-.icon-facetime-video {
- background-position: -432px -48px;
-}
-
-.icon-picture {
- background-position: -456px -48px;
-}
-
-.icon-pencil {
- background-position: 0 -72px;
-}
-
-.icon-map-marker {
- background-position: -24px -72px;
-}
-
-.icon-adjust {
- background-position: -48px -72px;
-}
-
-.icon-tint {
- background-position: -72px -72px;
-}
-
-.icon-edit {
- background-position: -96px -72px;
-}
-
-.icon-share {
- background-position: -120px -72px;
-}
-
-.icon-check {
- background-position: -144px -72px;
-}
-
-.icon-move {
- background-position: -168px -72px;
-}
-
-.icon-step-backward {
- background-position: -192px -72px;
-}
-
-.icon-fast-backward {
- background-position: -216px -72px;
-}
-
-.icon-backward {
- background-position: -240px -72px;
-}
-
-.icon-play {
- background-position: -264px -72px;
-}
-
-.icon-pause {
- background-position: -288px -72px;
-}
-
-.icon-stop {
- background-position: -312px -72px;
-}
-
-.icon-forward {
- background-position: -336px -72px;
-}
-
-.icon-fast-forward {
- background-position: -360px -72px;
-}
-
-.icon-step-forward {
- background-position: -384px -72px;
-}
-
-.icon-eject {
- background-position: -408px -72px;
-}
-
-.icon-chevron-left {
- background-position: -432px -72px;
-}
-
-.icon-chevron-right {
- background-position: -456px -72px;
-}
-
-.icon-plus-sign {
- background-position: 0 -96px;
-}
-
-.icon-minus-sign {
- background-position: -24px -96px;
-}
-
-.icon-remove-sign {
- background-position: -48px -96px;
-}
-
-.icon-ok-sign {
- background-position: -72px -96px;
-}
-
-.icon-question-sign {
- background-position: -96px -96px;
-}
-
-.icon-info-sign {
- background-position: -120px -96px;
-}
-
-.icon-screenshot {
- background-position: -144px -96px;
-}
-
-.icon-remove-circle {
- background-position: -168px -96px;
-}
-
-.icon-ok-circle {
- background-position: -192px -96px;
-}
-
-.icon-ban-circle {
- background-position: -216px -96px;
-}
-
-.icon-arrow-left {
- background-position: -240px -96px;
-}
-
-.icon-arrow-right {
- background-position: -264px -96px;
-}
-
-.icon-arrow-up {
- background-position: -289px -96px;
-}
-
-.icon-arrow-down {
- background-position: -312px -96px;
-}
-
-.icon-share-alt {
- background-position: -336px -96px;
-}
-
-.icon-resize-full {
- background-position: -360px -96px;
-}
-
-.icon-resize-small {
- background-position: -384px -96px;
-}
-
-.icon-plus {
- background-position: -408px -96px;
-}
-
-.icon-minus {
- background-position: -433px -96px;
-}
-
-.icon-asterisk {
- background-position: -456px -96px;
-}
-
-.icon-exclamation-sign {
- background-position: 0 -120px;
-}
-
-.icon-gift {
- background-position: -24px -120px;
-}
-
-.icon-leaf {
- background-position: -48px -120px;
-}
-
-.icon-fire {
- background-position: -72px -120px;
-}
-
-.icon-eye-open {
- background-position: -96px -120px;
-}
-
-.icon-eye-close {
- background-position: -120px -120px;
-}
-
-.icon-warning-sign {
- background-position: -144px -120px;
-}
-
-.icon-plane {
- background-position: -168px -120px;
-}
-
-.icon-calendar {
- background-position: -192px -120px;
-}
-
-.icon-random {
- width: 16px;
- background-position: -216px -120px;
-}
-
-.icon-comment {
- background-position: -240px -120px;
-}
-
-.icon-magnet {
- background-position: -264px -120px;
-}
-
-.icon-chevron-up {
- background-position: -288px -120px;
-}
-
-.icon-chevron-down {
- background-position: -313px -119px;
-}
-
-.icon-retweet {
- background-position: -336px -120px;
-}
-
-.icon-shopping-cart {
- background-position: -360px -120px;
-}
-
-.icon-folder-close {
- background-position: -384px -120px;
-}
-
-.icon-folder-open {
- width: 16px;
- background-position: -408px -120px;
-}
-
-.icon-resize-vertical {
- background-position: -432px -119px;
-}
-
-.icon-resize-horizontal {
- background-position: -456px -118px;
-}
-
-.icon-hdd {
- background-position: 0 -144px;
-}
-
-.icon-bullhorn {
- background-position: -24px -144px;
-}
-
-.icon-bell {
- background-position: -48px -144px;
-}
-
-.icon-certificate {
- background-position: -72px -144px;
-}
-
-.icon-thumbs-up {
- background-position: -96px -144px;
-}
-
-.icon-thumbs-down {
- background-position: -120px -144px;
-}
-
-.icon-hand-right {
- background-position: -144px -144px;
-}
-
-.icon-hand-left {
- background-position: -168px -144px;
-}
-
-.icon-hand-up {
- background-position: -192px -144px;
-}
-
-.icon-hand-down {
- background-position: -216px -144px;
-}
-
-.icon-circle-arrow-right {
- background-position: -240px -144px;
-}
-
-.icon-circle-arrow-left {
- background-position: -264px -144px;
-}
-
-.icon-circle-arrow-up {
- background-position: -288px -144px;
-}
-
-.icon-circle-arrow-down {
- background-position: -312px -144px;
-}
-
-.icon-globe {
- background-position: -336px -144px;
-}
-
-.icon-wrench {
- background-position: -360px -144px;
-}
-
-.icon-tasks {
- background-position: -384px -144px;
-}
-
-.icon-filter {
- background-position: -408px -144px;
-}
-
-.icon-briefcase {
- background-position: -432px -144px;
-}
-
-.icon-fullscreen {
- background-position: -456px -144px;
-}
-
-.dropup,
-.dropdown {
- position: relative;
-}
-
-.dropdown-toggle {
- *margin-bottom: -3px;
-}
-
-.dropdown-toggle:active,
-.open .dropdown-toggle {
- outline: 0;
-}
-
-.caret {
- display: inline-block;
- width: 0;
- height: 0;
- vertical-align: top;
- border-top: 4px solid #000000;
- border-right: 4px solid transparent;
- border-left: 4px solid transparent;
- content: "";
-}
-
-.dropdown .caret {
- margin-top: 8px;
- margin-left: 2px;
-}
-
-.dropdown-menu {
- position: absolute;
- top: 100%;
- left: 0;
- z-index: 1000;
- display: none;
- float: left;
- min-width: 160px;
- padding: 5px 0;
- margin: 2px 0 0;
- list-style: none;
- background-color: #ffffff;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, 0.2);
- *border-right-width: 2px;
- *border-bottom-width: 2px;
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
- -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding;
- background-clip: padding-box;
-}
-
-.dropdown-menu.pull-right {
- right: 0;
- left: auto;
-}
-
-.dropdown-menu .divider {
- *width: 100%;
- height: 1px;
- margin: 9px 1px;
- *margin: -5px 0 5px;
- overflow: hidden;
- background-color: #e5e5e5;
- border-bottom: 1px solid #ffffff;
-}
-
-.dropdown-menu a {
- display: block;
- padding: 3px 20px;
- clear: both;
- font-weight: normal;
- line-height: 20px;
- color: #333333;
- white-space: nowrap;
-}
-
-.dropdown-menu li > a:hover,
-.dropdown-menu li > a:focus,
-.dropdown-submenu:hover > a {
- color: #ffffff;
- text-decoration: none;
- background-color: #0088cc;
- background-color: #0081c2;
- background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
- background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
- background-image: -o-linear-gradient(top, #0088cc, #0077b3);
- background-image: linear-gradient(to bottom, #0088cc, #0077b3);
- background-repeat: repeat-x;
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
-}
-
-.dropdown-menu .active > a,
-.dropdown-menu .active > a:hover {
- color: #ffffff;
- text-decoration: none;
- background-color: #0088cc;
- background-color: #0081c2;
- background-image: linear-gradient(to bottom, #0088cc, #0077b3);
- background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
- background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
- background-image: -o-linear-gradient(top, #0088cc, #0077b3);
- background-repeat: repeat-x;
- outline: 0;
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
-}
-
-.dropdown-menu .disabled > a,
-.dropdown-menu .disabled > a:hover {
- color: #999999;
-}
-
-.dropdown-menu .disabled > a:hover {
- text-decoration: none;
- cursor: default;
- background-color: transparent;
-}
-
-.open {
- *z-index: 1000;
-}
-
-.open > .dropdown-menu {
- display: block;
-}
-
-.pull-right > .dropdown-menu {
- right: 0;
- left: auto;
-}
-
-.dropup .caret,
-.navbar-fixed-bottom .dropdown .caret {
- border-top: 0;
- border-bottom: 4px solid #000000;
- content: "\2191";
-}
-
-.dropup .dropdown-menu,
-.navbar-fixed-bottom .dropdown .dropdown-menu {
- top: auto;
- bottom: 100%;
- margin-bottom: 1px;
-}
-
-.dropdown-submenu {
- position: relative;
-}
-
-.dropdown-submenu > .dropdown-menu {
- top: 0;
- left: 100%;
- margin-top: -6px;
- margin-left: -1px;
- -webkit-border-radius: 0 6px 6px 6px;
- -moz-border-radius: 0 6px 6px 6px;
- border-radius: 0 6px 6px 6px;
-}
-
-.dropdown-submenu:hover .dropdown-menu {
- display: block;
-}
-
-.dropdown-submenu > a:after {
- display: block;
- float: right;
- width: 0;
- height: 0;
- margin-top: 5px;
- margin-right: -10px;
- border-color: transparent;
- border-left-color: #cccccc;
- border-style: solid;
- border-width: 5px 0 5px 5px;
- content: " ";
-}
-
-.dropdown-submenu:hover > a:after {
- border-left-color: #ffffff;
-}
-
-.dropdown .dropdown-menu .nav-header {
- padding-right: 20px;
- padding-left: 20px;
-}
-
-.typeahead {
- margin-top: 2px;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-
-.well {
- min-height: 20px;
- padding: 19px;
- margin-bottom: 20px;
- background-color: #f5f5f5;
- border: 1px solid #e3e3e3;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-}
-
-.well blockquote {
- border-color: #ddd;
- border-color: rgba(0, 0, 0, 0.15);
-}
-
-.well-large {
- padding: 24px;
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
-}
-
-.well-small {
- padding: 9px;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
-}
-
-.fade {
- opacity: 0;
- -webkit-transition: opacity 0.15s linear;
- -moz-transition: opacity 0.15s linear;
- -o-transition: opacity 0.15s linear;
- transition: opacity 0.15s linear;
-}
-
-.fade.in {
- opacity: 1;
-}
-
-.collapse {
- position: relative;
- height: 0;
- overflow: hidden;
- overflow: visible \9;
- -webkit-transition: height 0.35s ease;
- -moz-transition: height 0.35s ease;
- -o-transition: height 0.35s ease;
- transition: height 0.35s ease;
-}
-
-.collapse.in {
- height: auto;
-}
-
-.close {
- float: right;
- font-size: 20px;
- font-weight: bold;
- line-height: 20px;
- color: #000000;
- text-shadow: 0 1px 0 #ffffff;
- opacity: 0.2;
- filter: alpha(opacity=20);
-}
-
-.close:hover {
- color: #000000;
- text-decoration: none;
- cursor: pointer;
- opacity: 0.4;
- filter: alpha(opacity=40);
-}
-
-button.close {
- padding: 0;
- cursor: pointer;
- background: transparent;
- border: 0;
- -webkit-appearance: none;
-}
-
-.btn {
- display: inline-block;
- *display: inline;
- padding: 4px 14px;
- margin-bottom: 0;
- *margin-left: .3em;
- font-size: 14px;
- line-height: 20px;
- *line-height: 20px;
- color: #333333;
- text-align: center;
- text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
- vertical-align: middle;
- cursor: pointer;
- background-color: #f5f5f5;
- *background-color: #e6e6e6;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
- background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
- background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
- background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
- background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
- background-repeat: repeat-x;
- border: 1px solid #bbbbbb;
- *border: 0;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- border-color: #e6e6e6 #e6e6e6 #bfbfbf;
- border-bottom-color: #a2a2a2;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
- filter: progid:dximagetransform.microsoft.gradient(enabled=false);
- *zoom: 1;
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn:hover,
-.btn:active,
-.btn.active,
-.btn.disabled,
-.btn[disabled] {
- color: #333333;
- background-color: #e6e6e6;
- *background-color: #d9d9d9;
-}
-
-.btn:active,
-.btn.active {
- background-color: #cccccc \9;
-}
-
-.btn:first-child {
- *margin-left: 0;
-}
-
-.btn:hover {
- color: #333333;
- text-decoration: none;
- background-color: #e6e6e6;
- *background-color: #d9d9d9;
- /* Buttons in IE7 don't get borders, so darken on hover */
-
- background-position: 0 -15px;
- -webkit-transition: background-position 0.1s linear;
- -moz-transition: background-position 0.1s linear;
- -o-transition: background-position 0.1s linear;
- transition: background-position 0.1s linear;
-}
-
-.btn:focus {
- outline: thin dotted #333;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-
-.btn.active,
-.btn:active {
- background-color: #e6e6e6;
- background-color: #d9d9d9 \9;
- background-image: none;
- outline: 0;
- -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
- box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn.disabled,
-.btn[disabled] {
- cursor: default;
- background-color: #e6e6e6;
- background-image: none;
- opacity: 0.65;
- filter: alpha(opacity=65);
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
-}
-
-.btn-large {
- padding: 9px 14px;
- font-size: 16px;
- line-height: normal;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
-}
-
-.btn-large [class^="icon-"] {
- margin-top: 2px;
-}
-
-.btn-small {
- padding: 3px 9px;
- font-size: 12px;
- line-height: 18px;
-}
-
-.btn-small [class^="icon-"] {
- margin-top: 0;
-}
-
-.btn-mini {
- padding: 2px 6px;
- font-size: 11px;
- line-height: 16px;
-}
-
-.btn-block {
- display: block;
- width: 100%;
- padding-right: 0;
- padding-left: 0;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-
-.btn-block + .btn-block {
- margin-top: 5px;
-}
-
-.btn-primary.active,
-.btn-warning.active,
-.btn-danger.active,
-.btn-success.active,
-.btn-info.active,
-.btn-inverse.active {
- color: rgba(255, 255, 255, 0.75);
-}
-
-.btn {
- border-color: #c5c5c5;
- border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);
-}
-
-.btn-primary {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #006dcc;
- *background-color: #0044cc;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
- background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
- background-image: -o-linear-gradient(top, #0088cc, #0044cc);
- background-image: linear-gradient(to bottom, #0088cc, #0044cc);
- background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
- background-repeat: repeat-x;
- border-color: #0044cc #0044cc #002a80;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
- filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-primary:hover,
-.btn-primary:active,
-.btn-primary.active,
-.btn-primary.disabled,
-.btn-primary[disabled] {
- color: #ffffff;
- background-color: #0044cc;
- *background-color: #003bb3;
-}
-
-.btn-primary:active,
-.btn-primary.active {
- background-color: #003399 \9;
-}
-
-.btn-warning {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #faa732;
- *background-color: #f89406;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
- background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
- background-image: -o-linear-gradient(top, #fbb450, #f89406);
- background-image: linear-gradient(to bottom, #fbb450, #f89406);
- background-image: -moz-linear-gradient(top, #fbb450, #f89406);
- background-repeat: repeat-x;
- border-color: #f89406 #f89406 #ad6704;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
- filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-warning:hover,
-.btn-warning:active,
-.btn-warning.active,
-.btn-warning.disabled,
-.btn-warning[disabled] {
- color: #ffffff;
- background-color: #f89406;
- *background-color: #df8505;
-}
-
-.btn-warning:active,
-.btn-warning.active {
- background-color: #c67605 \9;
-}
-
-.btn-danger {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #da4f49;
- *background-color: #bd362f;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
- background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
- background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
- background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
- background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
- background-repeat: repeat-x;
- border-color: #bd362f #bd362f #802420;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
- filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-danger:hover,
-.btn-danger:active,
-.btn-danger.active,
-.btn-danger.disabled,
-.btn-danger[disabled] {
- color: #ffffff;
- background-color: #bd362f;
- *background-color: #a9302a;
-}
-
-.btn-danger:active,
-.btn-danger.active {
- background-color: #942a25 \9;
-}
-
-.btn-success {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #5bb75b;
- *background-color: #51a351;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
- background-image: -webkit-linear-gradient(top, #62c462, #51a351);
- background-image: -o-linear-gradient(top, #62c462, #51a351);
- background-image: linear-gradient(to bottom, #62c462, #51a351);
- background-image: -moz-linear-gradient(top, #62c462, #51a351);
- background-repeat: repeat-x;
- border-color: #51a351 #51a351 #387038;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
- filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-success:hover,
-.btn-success:active,
-.btn-success.active,
-.btn-success.disabled,
-.btn-success[disabled] {
- color: #ffffff;
- background-color: #51a351;
- *background-color: #499249;
-}
-
-.btn-success:active,
-.btn-success.active {
- background-color: #408140 \9;
-}
-
-.btn-info {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #49afcd;
- *background-color: #2f96b4;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
- background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
- background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
- background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
- background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
- background-repeat: repeat-x;
- border-color: #2f96b4 #2f96b4 #1f6377;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
- filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-info:hover,
-.btn-info:active,
-.btn-info.active,
-.btn-info.disabled,
-.btn-info[disabled] {
- color: #ffffff;
- background-color: #2f96b4;
- *background-color: #2a85a0;
-}
-
-.btn-info:active,
-.btn-info.active {
- background-color: #24748c \9;
-}
-
-.btn-inverse {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #363636;
- *background-color: #222222;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
- background-image: -webkit-linear-gradient(top, #444444, #222222);
- background-image: -o-linear-gradient(top, #444444, #222222);
- background-image: linear-gradient(to bottom, #444444, #222222);
- background-image: -moz-linear-gradient(top, #444444, #222222);
- background-repeat: repeat-x;
- border-color: #222222 #222222 #000000;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
- filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-inverse:hover,
-.btn-inverse:active,
-.btn-inverse.active,
-.btn-inverse.disabled,
-.btn-inverse[disabled] {
- color: #ffffff;
- background-color: #222222;
- *background-color: #151515;
-}
-
-.btn-inverse:active,
-.btn-inverse.active {
- background-color: #080808 \9;
-}
-
-button.btn,
-input[type="submit"].btn {
- *padding-top: 3px;
- *padding-bottom: 3px;
-}
-
-button.btn::-moz-focus-inner,
-input[type="submit"].btn::-moz-focus-inner {
- padding: 0;
- border: 0;
-}
-
-button.btn.btn-large,
-input[type="submit"].btn.btn-large {
- *padding-top: 7px;
- *padding-bottom: 7px;
-}
-
-button.btn.btn-small,
-input[type="submit"].btn.btn-small {
- *padding-top: 3px;
- *padding-bottom: 3px;
-}
-
-button.btn.btn-mini,
-input[type="submit"].btn.btn-mini {
- *padding-top: 1px;
- *padding-bottom: 1px;
-}
-
-.btn-link,
-.btn-link:active {
- background-color: transparent;
- background-image: none;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
-}
-
-.btn-link {
- color: #0088cc;
- cursor: pointer;
- border-color: transparent;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.btn-link:hover {
- color: #005580;
- text-decoration: underline;
- background-color: transparent;
-}
-
-.btn-group {
- position: relative;
- *margin-left: .3em;
- font-size: 0;
- white-space: nowrap;
-}
-
-.btn-group:first-child {
- *margin-left: 0;
-}
-
-.btn-group + .btn-group {
- margin-left: 5px;
-}
-
-.btn-toolbar {
- margin-top: 10px;
- margin-bottom: 10px;
- font-size: 0;
-}
-
-.btn-toolbar .btn-group {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
-
- *zoom: 1;
-}
-
-.btn-toolbar .btn + .btn,
-.btn-toolbar .btn-group + .btn,
-.btn-toolbar .btn + .btn-group {
- margin-left: 5px;
-}
-
-.btn-group > .btn {
- position: relative;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.btn-group > .btn + .btn {
- margin-left: -1px;
-}
-
-.btn-group > .btn,
-.btn-group > .dropdown-menu {
- font-size: 14px;
-}
-
-.btn-group > .btn-mini {
- font-size: 11px;
-}
-
-.btn-group > .btn-small {
- font-size: 12px;
-}
-
-.btn-group > .btn-large {
- font-size: 16px;
-}
-
-.btn-group > .btn:first-child {
- margin-left: 0;
- -webkit-border-bottom-left-radius: 4px;
- border-bottom-left-radius: 4px;
- -webkit-border-top-left-radius: 4px;
- border-top-left-radius: 4px;
- -moz-border-radius-bottomleft: 4px;
- -moz-border-radius-topleft: 4px;
-}
-
-.btn-group > .btn:last-child,
-.btn-group > .dropdown-toggle {
- -webkit-border-top-right-radius: 4px;
- border-top-right-radius: 4px;
- -webkit-border-bottom-right-radius: 4px;
- border-bottom-right-radius: 4px;
- -moz-border-radius-topright: 4px;
- -moz-border-radius-bottomright: 4px;
-}
-
-.btn-group > .btn.large:first-child {
- margin-left: 0;
- -webkit-border-bottom-left-radius: 6px;
- border-bottom-left-radius: 6px;
- -webkit-border-top-left-radius: 6px;
- border-top-left-radius: 6px;
- -moz-border-radius-bottomleft: 6px;
- -moz-border-radius-topleft: 6px;
-}
-
-.btn-group > .btn.large:last-child,
-.btn-group > .large.dropdown-toggle {
- -webkit-border-top-right-radius: 6px;
- border-top-right-radius: 6px;
- -webkit-border-bottom-right-radius: 6px;
- border-bottom-right-radius: 6px;
- -moz-border-radius-topright: 6px;
- -moz-border-radius-bottomright: 6px;
-}
-
-.btn-group > .btn:hover,
-.btn-group > .btn:focus,
-.btn-group > .btn:active,
-.btn-group > .btn.active {
- z-index: 2;
-}
-
-.btn-group .dropdown-toggle:active,
-.btn-group.open .dropdown-toggle {
- outline: 0;
-}
-
-.btn-group > .btn + .dropdown-toggle {
- *padding-top: 5px;
- padding-right: 8px;
- *padding-bottom: 5px;
- padding-left: 8px;
- -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
- box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn-group > .btn-mini + .dropdown-toggle {
- *padding-top: 2px;
- padding-right: 5px;
- *padding-bottom: 2px;
- padding-left: 5px;
-}
-
-.btn-group > .btn-small + .dropdown-toggle {
- *padding-top: 5px;
- *padding-bottom: 4px;
-}
-
-.btn-group > .btn-large + .dropdown-toggle {
- *padding-top: 7px;
- padding-right: 12px;
- *padding-bottom: 7px;
- padding-left: 12px;
-}
-
-.btn-group.open .dropdown-toggle {
- background-image: none;
- -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
- box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn-group.open .btn.dropdown-toggle {
- background-color: #e6e6e6;
-}
-
-.btn-group.open .btn-primary.dropdown-toggle {
- background-color: #0044cc;
-}
-
-.btn-group.open .btn-warning.dropdown-toggle {
- background-color: #f89406;
-}
-
-.btn-group.open .btn-danger.dropdown-toggle {
- background-color: #bd362f;
-}
-
-.btn-group.open .btn-success.dropdown-toggle {
- background-color: #51a351;
-}
-
-.btn-group.open .btn-info.dropdown-toggle {
- background-color: #2f96b4;
-}
-
-.btn-group.open .btn-inverse.dropdown-toggle {
- background-color: #222222;
-}
-
-.btn .caret {
- margin-top: 8px;
- margin-left: 0;
-}
-
-.btn-mini .caret,
-.btn-small .caret,
-.btn-large .caret {
- margin-top: 6px;
-}
-
-.btn-large .caret {
- border-top-width: 5px;
- border-right-width: 5px;
- border-left-width: 5px;
-}
-
-.dropup .btn-large .caret {
- border-top: 0;
- border-bottom: 5px solid #000000;
-}
-
-.btn-primary .caret,
-.btn-warning .caret,
-.btn-danger .caret,
-.btn-info .caret,
-.btn-success .caret,
-.btn-inverse .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
-}
-
-.btn-group-vertical {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
-
- *zoom: 1;
-}
-
-.btn-group-vertical .btn {
- display: block;
- float: none;
- width: 100%;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.btn-group-vertical .btn + .btn {
- margin-top: -1px;
- margin-left: 0;
-}
-
-.btn-group-vertical .btn:first-child {
- -webkit-border-radius: 4px 4px 0 0;
- -moz-border-radius: 4px 4px 0 0;
- border-radius: 4px 4px 0 0;
-}
-
-.btn-group-vertical .btn:last-child {
- -webkit-border-radius: 0 0 4px 4px;
- -moz-border-radius: 0 0 4px 4px;
- border-radius: 0 0 4px 4px;
-}
-
-.btn-group-vertical .btn-large:first-child {
- -webkit-border-radius: 6px 6px 0 0;
- -moz-border-radius: 6px 6px 0 0;
- border-radius: 6px 6px 0 0;
-}
-
-.btn-group-vertical .btn-large:last-child {
- -webkit-border-radius: 0 0 6px 6px;
- -moz-border-radius: 0 0 6px 6px;
- border-radius: 0 0 6px 6px;
-}
-
-.alert {
- padding: 8px 35px 8px 14px;
- margin-bottom: 20px;
- color: #c09853;
- text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
- background-color: #fcf8e3;
- border: 1px solid #fbeed5;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-
-.alert h4 {
- margin: 0;
-}
-
-.alert .close {
- position: relative;
- top: -2px;
- right: -21px;
- line-height: 20px;
-}
-
-.alert-success {
- color: #468847;
- background-color: #dff0d8;
- border-color: #d6e9c6;
-}
-
-.alert-danger,
-.alert-error {
- color: #b94a48;
- background-color: #f2dede;
- border-color: #eed3d7;
-}
-
-.alert-info {
- color: #3a87ad;
- background-color: #d9edf7;
- border-color: #bce8f1;
-}
-
-.alert-block {
- padding-top: 14px;
- padding-bottom: 14px;
-}
-
-.alert-block > p,
-.alert-block > ul {
- margin-bottom: 0;
-}
-
-.alert-block p + p {
- margin-top: 5px;
-}
-
-.nav {
- margin-bottom: 20px;
- margin-left: 0;
- list-style: none;
-}
-
-.nav > li > a {
- display: block;
-}
-
-.nav > li > a:hover {
- text-decoration: none;
- background-color: #eeeeee;
-}
-
-.nav > .pull-right {
- float: right;
-}
-
-.nav-header {
- display: block;
- padding: 3px 15px;
- font-size: 11px;
- font-weight: bold;
- line-height: 20px;
- color: #999999;
- text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
- text-transform: uppercase;
-}
-
-.nav li + .nav-header {
- margin-top: 9px;
-}
-
-.nav-list {
- padding-right: 15px;
- padding-left: 15px;
- margin-bottom: 0;
-}
-
-.nav-list > li > a,
-.nav-list .nav-header {
- margin-right: -15px;
- margin-left: -15px;
- text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-}
-
-.nav-list > li > a {
- padding: 3px 15px;
-}
-
-.nav-list > .active > a,
-.nav-list > .active > a:hover {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
- background-color: #0088cc;
-}
-
-.nav-list [class^="icon-"] {
- margin-right: 2px;
-}
-
-.nav-list .divider {
- *width: 100%;
- height: 1px;
- margin: 9px 1px;
- *margin: -5px 0 5px;
- overflow: hidden;
- background-color: #e5e5e5;
- border-bottom: 1px solid #ffffff;
-}
-
-.nav-tabs,
-.nav-pills {
- *zoom: 1;
-}
-
-.nav-tabs:before,
-.nav-pills:before,
-.nav-tabs:after,
-.nav-pills:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.nav-tabs:after,
-.nav-pills:after {
- clear: both;
-}
-
-.nav-tabs > li,
-.nav-pills > li {
- float: left;
-}
-
-.nav-tabs > li > a,
-.nav-pills > li > a {
- padding-right: 12px;
- padding-left: 12px;
- margin-right: 2px;
- line-height: 14px;
-}
-
-.nav-tabs {
- border-bottom: 1px solid #ddd;
-}
-
-.nav-tabs > li {
- margin-bottom: -1px;
-}
-
-.nav-tabs > li > a {
- padding-top: 8px;
- padding-bottom: 8px;
- line-height: 20px;
- border: 1px solid transparent;
- -webkit-border-radius: 4px 4px 0 0;
- -moz-border-radius: 4px 4px 0 0;
- border-radius: 4px 4px 0 0;
-}
-
-.nav-tabs > li > a:hover {
- border-color: #eeeeee #eeeeee #dddddd;
-}
-
-.nav-tabs > .active > a,
-.nav-tabs > .active > a:hover {
- color: #555555;
- cursor: default;
- background-color: #ffffff;
- border: 1px solid #ddd;
- border-bottom-color: transparent;
-}
-
-.nav-pills > li > a {
- padding-top: 8px;
- padding-bottom: 8px;
- margin-top: 2px;
- margin-bottom: 2px;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
-}
-
-.nav-pills > .active > a,
-.nav-pills > .active > a:hover {
- color: #ffffff;
- background-color: #0088cc;
-}
-
-.nav-stacked > li {
- float: none;
-}
-
-.nav-stacked > li > a {
- margin-right: 0;
-}
-
-.nav-tabs.nav-stacked {
- border-bottom: 0;
-}
-
-.nav-tabs.nav-stacked > li > a {
- border: 1px solid #ddd;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.nav-tabs.nav-stacked > li:first-child > a {
- -webkit-border-top-right-radius: 4px;
- border-top-right-radius: 4px;
- -webkit-border-top-left-radius: 4px;
- border-top-left-radius: 4px;
- -moz-border-radius-topright: 4px;
- -moz-border-radius-topleft: 4px;
-}
-
-.nav-tabs.nav-stacked > li:last-child > a {
- -webkit-border-bottom-right-radius: 4px;
- border-bottom-right-radius: 4px;
- -webkit-border-bottom-left-radius: 4px;
- border-bottom-left-radius: 4px;
- -moz-border-radius-bottomright: 4px;
- -moz-border-radius-bottomleft: 4px;
-}
-
-.nav-tabs.nav-stacked > li > a:hover {
- z-index: 2;
- border-color: #ddd;
-}
-
-.nav-pills.nav-stacked > li > a {
- margin-bottom: 3px;
-}
-
-.nav-pills.nav-stacked > li:last-child > a {
- margin-bottom: 1px;
-}
-
-.nav-tabs .dropdown-menu {
- -webkit-border-radius: 0 0 6px 6px;
- -moz-border-radius: 0 0 6px 6px;
- border-radius: 0 0 6px 6px;
-}
-
-.nav-pills .dropdown-menu {
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
-}
-
-.nav .dropdown-toggle .caret {
- margin-top: 6px;
- border-top-color: #0088cc;
- border-bottom-color: #0088cc;
-}
-
-.nav .dropdown-toggle:hover .caret {
- border-top-color: #005580;
- border-bottom-color: #005580;
-}
-
-/* move down carets for tabs */
-
-.nav-tabs .dropdown-toggle .caret {
- margin-top: 8px;
-}
-
-.nav .active .dropdown-toggle .caret {
- border-top-color: #fff;
- border-bottom-color: #fff;
-}
-
-.nav-tabs .active .dropdown-toggle .caret {
- border-top-color: #555555;
- border-bottom-color: #555555;
-}
-
-.nav > .dropdown.active > a:hover {
- cursor: pointer;
-}
-
-.nav-tabs .open .dropdown-toggle,
-.nav-pills .open .dropdown-toggle,
-.nav > li.dropdown.open.active > a:hover {
- color: #ffffff;
- background-color: #999999;
- border-color: #999999;
-}
-
-.nav li.dropdown.open .caret,
-.nav li.dropdown.open.active .caret,
-.nav li.dropdown.open a:hover .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
- opacity: 1;
- filter: alpha(opacity=100);
-}
-
-.tabs-stacked .open > a:hover {
- border-color: #999999;
-}
-
-.tabbable {
- *zoom: 1;
-}
-
-.tabbable:before,
-.tabbable:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.tabbable:after {
- clear: both;
-}
-
-.tab-content {
- overflow: auto;
-}
-
-.tabs-below > .nav-tabs,
-.tabs-right > .nav-tabs,
-.tabs-left > .nav-tabs {
- border-bottom: 0;
-}
-
-.tab-content > .tab-pane,
-.pill-content > .pill-pane {
- display: none;
-}
-
-.tab-content > .active,
-.pill-content > .active {
- display: block;
-}
-
-.tabs-below > .nav-tabs {
- border-top: 1px solid #ddd;
-}
-
-.tabs-below > .nav-tabs > li {
- margin-top: -1px;
- margin-bottom: 0;
-}
-
-.tabs-below > .nav-tabs > li > a {
- -webkit-border-radius: 0 0 4px 4px;
- -moz-border-radius: 0 0 4px 4px;
- border-radius: 0 0 4px 4px;
-}
-
-.tabs-below > .nav-tabs > li > a:hover {
- border-top-color: #ddd;
- border-bottom-color: transparent;
-}
-
-.tabs-below > .nav-tabs > .active > a,
-.tabs-below > .nav-tabs > .active > a:hover {
- border-color: transparent #ddd #ddd #ddd;
-}
-
-.tabs-left > .nav-tabs > li,
-.tabs-right > .nav-tabs > li {
- float: none;
-}
-
-.tabs-left > .nav-tabs > li > a,
-.tabs-right > .nav-tabs > li > a {
- min-width: 74px;
- margin-right: 0;
- margin-bottom: 3px;
-}
-
-.tabs-left > .nav-tabs {
- float: left;
- margin-right: 19px;
- border-right: 1px solid #ddd;
-}
-
-.tabs-left > .nav-tabs > li > a {
- margin-right: -1px;
- -webkit-border-radius: 4px 0 0 4px;
- -moz-border-radius: 4px 0 0 4px;
- border-radius: 4px 0 0 4px;
-}
-
-.tabs-left > .nav-tabs > li > a:hover {
- border-color: #eeeeee #dddddd #eeeeee #eeeeee;
-}
-
-.tabs-left > .nav-tabs .active > a,
-.tabs-left > .nav-tabs .active > a:hover {
- border-color: #ddd transparent #ddd #ddd;
- *border-right-color: #ffffff;
-}
-
-.tabs-right > .nav-tabs {
- float: right;
- margin-left: 19px;
- border-left: 1px solid #ddd;
-}
-
-.tabs-right > .nav-tabs > li > a {
- margin-left: -1px;
- -webkit-border-radius: 0 4px 4px 0;
- -moz-border-radius: 0 4px 4px 0;
- border-radius: 0 4px 4px 0;
-}
-
-.tabs-right > .nav-tabs > li > a:hover {
- border-color: #eeeeee #eeeeee #eeeeee #dddddd;
-}
-
-.tabs-right > .nav-tabs .active > a,
-.tabs-right > .nav-tabs .active > a:hover {
- border-color: #ddd #ddd #ddd transparent;
- *border-left-color: #ffffff;
-}
-
-.nav > .disabled > a {
- color: #999999;
-}
-
-.nav > .disabled > a:hover {
- text-decoration: none;
- cursor: default;
- background-color: transparent;
-}
-
-.navbar {
- *position: relative;
- *z-index: 2;
- margin-bottom: 20px;
- overflow: visible;
- color: #555555;
-}
-
-.navbar-inner {
- min-height: 40px;
- padding-right: 20px;
- padding-left: 20px;
- background-color: #fafafa;
- background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));
- background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);
- background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);
- background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
- background-repeat: repeat-x;
- border: 1px solid #d4d4d4;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);
- -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
- -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-}
-
-.navbar .container {
- width: auto;
-}
-
-.nav-collapse.collapse {
- height: auto;
-}
-
-.navbar .brand {
- display: block;
- float: left;
- padding: 10px 20px 10px;
- margin-left: -20px;
- font-size: 20px;
- font-weight: 200;
- color: #555555;
- text-shadow: 0 1px 0 #ffffff;
-}
-
-.navbar .brand:hover {
- text-decoration: none;
-}
-
-.navbar-text {
- margin-bottom: 0;
- line-height: 40px;
-}
-
-.navbar-link {
- color: #555555;
-}
-
-.navbar-link:hover {
- color: #333333;
-}
-
-.navbar .divider-vertical {
- height: 40px;
- margin: 0 9px;
- border-right: 1px solid #ffffff;
- border-left: 1px solid #f2f2f2;
-}
-
-.navbar .btn,
-.navbar .btn-group {
- margin-top: 6px;
-}
-
-.navbar .btn-group .btn {
- margin: 0;
-}
-
-.navbar-form {
- margin-bottom: 0;
- *zoom: 1;
-}
-
-.navbar-form:before,
-.navbar-form:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.navbar-form:after {
- clear: both;
-}
-
-.navbar-form input,
-.navbar-form select,
-.navbar-form .radio,
-.navbar-form .checkbox {
- margin-top: 5px;
-}
-
-.navbar-form input,
-.navbar-form select,
-.navbar-form .btn {
- display: inline-block;
- margin-bottom: 0;
-}
-
-.navbar-form input[type="image"],
-.navbar-form input[type="checkbox"],
-.navbar-form input[type="radio"] {
- margin-top: 3px;
-}
-
-.navbar-form .input-append,
-.navbar-form .input-prepend {
- margin-top: 6px;
- white-space: nowrap;
-}
-
-.navbar-form .input-append input,
-.navbar-form .input-prepend input {
- margin-top: 0;
-}
-
-.navbar-search {
- position: relative;
- float: left;
- margin-top: 5px;
- margin-bottom: 0;
-}
-
-.navbar-search .search-query {
- padding: 4px 14px;
- margin-bottom: 0;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 13px;
- font-weight: normal;
- line-height: 1;
- -webkit-border-radius: 15px;
- -moz-border-radius: 15px;
- border-radius: 15px;
-}
-
-.navbar-static-top {
- position: static;
- width: 100%;
- margin-bottom: 0;
-}
-
-.navbar-static-top .navbar-inner {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.navbar-fixed-top,
-.navbar-fixed-bottom {
- position: fixed;
- right: 0;
- left: 0;
- z-index: 1030;
- margin-bottom: 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-fixed-bottom .navbar-inner,
-.navbar-static-top .navbar-inner {
- border: 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-fixed-bottom .navbar-inner {
- padding-right: 0;
- padding-left: 0;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
- width: 940px;
-}
-
-.navbar-fixed-top {
- top: 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-static-top .navbar-inner {
- -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
- -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
- box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
-}
-
-.navbar-fixed-bottom {
- bottom: 0;
-}
-
-.navbar-fixed-bottom .navbar-inner {
- -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);
- -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);
- box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);
-}
-
-.navbar .nav {
- position: relative;
- left: 0;
- display: block;
- float: left;
- margin: 0 10px 0 0;
-}
-
-.navbar .nav.pull-right {
- float: right;
-}
-
-.navbar .nav > li {
- float: left;
-}
-
-.navbar .nav > li > a {
- float: none;
- padding: 10px 15px 10px;
- color: #555555;
- text-decoration: none;
- text-shadow: 0 1px 0 #ffffff;
-}
-
-.navbar .nav .dropdown-toggle .caret {
- margin-top: 8px;
-}
-
-.navbar .nav > li > a:focus,
-.navbar .nav > li > a:hover {
- color: #333333;
- text-decoration: none;
- background-color: transparent;
-}
-
-.navbar .nav > .active > a,
-.navbar .nav > .active > a:hover,
-.navbar .nav > .active > a:focus {
- color: #555555;
- text-decoration: none;
- background-color: #e5e5e5;
- -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
- -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
- box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-}
-
-.navbar .btn-navbar {
- display: none;
- float: right;
- padding: 7px 10px;
- margin-right: 5px;
- margin-left: 5px;
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #ededed;
- *background-color: #e5e5e5;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));
- background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5);
- background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5);
- background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5);
- background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5);
- background-repeat: repeat-x;
- border-color: #e5e5e5 #e5e5e5 #bfbfbf;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);
- filter: progid:dximagetransform.microsoft.gradient(enabled=false);
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
- -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
-}
-
-.navbar .btn-navbar:hover,
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active,
-.navbar .btn-navbar.disabled,
-.navbar .btn-navbar[disabled] {
- color: #ffffff;
- background-color: #e5e5e5;
- *background-color: #d9d9d9;
-}
-
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active {
- background-color: #cccccc \9;
-}
-
-.navbar .btn-navbar .icon-bar {
- display: block;
- width: 18px;
- height: 2px;
- background-color: #f5f5f5;
- -webkit-border-radius: 1px;
- -moz-border-radius: 1px;
- border-radius: 1px;
- -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
- -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
- box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-}
-
-.btn-navbar .icon-bar + .icon-bar {
- margin-top: 3px;
-}
-
-.navbar .nav > li > .dropdown-menu:before {
- position: absolute;
- top: -7px;
- left: 9px;
- display: inline-block;
- border-right: 7px solid transparent;
- border-bottom: 7px solid #ccc;
- border-left: 7px solid transparent;
- border-bottom-color: rgba(0, 0, 0, 0.2);
- content: '';
-}
-
-.navbar .nav > li > .dropdown-menu:after {
- position: absolute;
- top: -6px;
- left: 10px;
- display: inline-block;
- border-right: 6px solid transparent;
- border-bottom: 6px solid #ffffff;
- border-left: 6px solid transparent;
- content: '';
-}
-
-.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
- top: auto;
- bottom: -7px;
- border-top: 7px solid #ccc;
- border-bottom: 0;
- border-top-color: rgba(0, 0, 0, 0.2);
-}
-
-.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
- top: auto;
- bottom: -6px;
- border-top: 6px solid #ffffff;
- border-bottom: 0;
-}
-
-.navbar .nav li.dropdown.open > .dropdown-toggle,
-.navbar .nav li.dropdown.active > .dropdown-toggle,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle {
- color: #555555;
- background-color: #e5e5e5;
-}
-
-.navbar .nav li.dropdown > .dropdown-toggle .caret {
- border-top-color: #555555;
- border-bottom-color: #555555;
-}
-
-.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
- border-top-color: #555555;
- border-bottom-color: #555555;
-}
-
-.navbar .pull-right > li > .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right {
- right: 0;
- left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu:before,
-.navbar .nav > li > .dropdown-menu.pull-right:before {
- right: 12px;
- left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu:after,
-.navbar .nav > li > .dropdown-menu.pull-right:after {
- right: 13px;
- left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
- right: 100%;
- left: auto;
- margin-right: -1px;
- margin-left: 0;
- -webkit-border-radius: 6px 0 6px 6px;
- -moz-border-radius: 6px 0 6px 6px;
- border-radius: 6px 0 6px 6px;
-}
-
-.navbar-inverse {
- color: #999999;
-}
-
-.navbar-inverse .navbar-inner {
- background-color: #1b1b1b;
- background-image: -moz-linear-gradient(top, #222222, #111111);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
- background-image: -webkit-linear-gradient(top, #222222, #111111);
- background-image: -o-linear-gradient(top, #222222, #111111);
- background-image: linear-gradient(to bottom, #222222, #111111);
- background-repeat: repeat-x;
- border-color: #252525;
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
-}
-
-.navbar-inverse .brand,
-.navbar-inverse .nav > li > a {
- color: #999999;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-}
-
-.navbar-inverse .brand:hover,
-.navbar-inverse .nav > li > a:hover {
- color: #ffffff;
-}
-
-.navbar-inverse .nav > li > a:focus,
-.navbar-inverse .nav > li > a:hover {
- color: #ffffff;
- background-color: transparent;
-}
-
-.navbar-inverse .nav .active > a,
-.navbar-inverse .nav .active > a:hover,
-.navbar-inverse .nav .active > a:focus {
- color: #ffffff;
- background-color: #111111;
-}
-
-.navbar-inverse .navbar-link {
- color: #999999;
-}
-
-.navbar-inverse .navbar-link:hover {
- color: #ffffff;
-}
-
-.navbar-inverse .divider-vertical {
- border-right-color: #222222;
- border-left-color: #111111;
-}
-
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
- color: #ffffff;
- background-color: #111111;
-}
-
-.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
- border-top-color: #999999;
- border-bottom-color: #999999;
-}
-
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
-}
-
-.navbar-inverse .navbar-search .search-query {
- color: #ffffff;
- background-color: #515151;
- border-color: #111111;
- -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
- -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
- -webkit-transition: none;
- -moz-transition: none;
- -o-transition: none;
- transition: none;
-}
-
-.navbar-inverse .navbar-search .search-query:-moz-placeholder {
- color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
- color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
- color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query:focus,
-.navbar-inverse .navbar-search .search-query.focused {
- padding: 5px 15px;
- color: #333333;
- text-shadow: 0 1px 0 #ffffff;
- background-color: #ffffff;
- border: 0;
- outline: 0;
- -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
- -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
- box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-}
-
-.navbar-inverse .btn-navbar {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #0e0e0e;
- *background-color: #040404;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
- background-image: -webkit-linear-gradient(top, #151515, #040404);
- background-image: -o-linear-gradient(top, #151515, #040404);
- background-image: linear-gradient(to bottom, #151515, #040404);
- background-image: -moz-linear-gradient(top, #151515, #040404);
- background-repeat: repeat-x;
- border-color: #040404 #040404 #000000;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
- filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.navbar-inverse .btn-navbar:hover,
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active,
-.navbar-inverse .btn-navbar.disabled,
-.navbar-inverse .btn-navbar[disabled] {
- color: #ffffff;
- background-color: #040404;
- *background-color: #000000;
-}
-
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active {
- background-color: #000000 \9;
-}
-
-.breadcrumb {
- padding: 8px 15px;
- margin: 0 0 20px;
- list-style: none;
- background-color: #f5f5f5;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-
-.breadcrumb li {
- display: inline-block;
- *display: inline;
- text-shadow: 0 1px 0 #ffffff;
- *zoom: 1;
-}
-
-.breadcrumb .divider {
- padding: 0 5px;
- color: #ccc;
-}
-
-.breadcrumb .active {
- color: #999999;
-}
-
-.pagination {
- height: 40px;
- margin: 20px 0;
-}
-
-.pagination ul {
- display: inline-block;
- *display: inline;
- margin-bottom: 0;
- margin-left: 0;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
- *zoom: 1;
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.pagination li {
- display: inline;
-}
-
-.pagination a,
-.pagination span {
- float: left;
- padding: 0 14px;
- line-height: 38px;
- text-decoration: none;
- background-color: #ffffff;
- border: 1px solid #dddddd;
- border-left-width: 0;
-}
-
-.pagination a:hover,
-.pagination .active a,
-.pagination .active span {
- background-color: #f5f5f5;
-}
-
-.pagination .active a,
-.pagination .active span {
- color: #999999;
- cursor: default;
-}
-
-.pagination .disabled span,
-.pagination .disabled a,
-.pagination .disabled a:hover {
- color: #999999;
- cursor: default;
- background-color: transparent;
-}
-
-.pagination li:first-child a,
-.pagination li:first-child span {
- border-left-width: 1px;
- -webkit-border-radius: 3px 0 0 3px;
- -moz-border-radius: 3px 0 0 3px;
- border-radius: 3px 0 0 3px;
-}
-
-.pagination li:last-child a,
-.pagination li:last-child span {
- -webkit-border-radius: 0 3px 3px 0;
- -moz-border-radius: 0 3px 3px 0;
- border-radius: 0 3px 3px 0;
-}
-
-.pagination-centered {
- text-align: center;
-}
-
-.pagination-right {
- text-align: right;
-}
-
-.pager {
- margin: 20px 0;
- text-align: center;
- list-style: none;
- *zoom: 1;
-}
-
-.pager:before,
-.pager:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.pager:after {
- clear: both;
-}
-
-.pager li {
- display: inline;
-}
-
-.pager a {
- display: inline-block;
- padding: 5px 14px;
- background-color: #fff;
- border: 1px solid #ddd;
- -webkit-border-radius: 15px;
- -moz-border-radius: 15px;
- border-radius: 15px;
-}
-
-.pager a:hover {
- text-decoration: none;
- background-color: #f5f5f5;
-}
-
-.pager .next a {
- float: right;
-}
-
-.pager .previous a {
- float: left;
-}
-
-.pager .disabled a,
-.pager .disabled a:hover {
- color: #999999;
- cursor: default;
- background-color: #fff;
-}
-
-.modal-open .dropdown-menu {
- z-index: 2050;
-}
-
-.modal-open .dropdown.open {
- *z-index: 2050;
-}
-
-.modal-open .popover {
- z-index: 2060;
-}
-
-.modal-open .tooltip {
- z-index: 2080;
-}
-
-.modal-backdrop {
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 1040;
- background-color: #000000;
-}
-
-.modal-backdrop.fade {
- opacity: 0;
-}
-
-.modal-backdrop,
-.modal-backdrop.fade.in {
- opacity: 0.8;
- filter: alpha(opacity=80);
-}
-
-.modal {
- position: fixed;
- top: 50%;
- left: 50%;
- z-index: 1050;
- width: 560px;
- margin: -250px 0 0 -280px;
- overflow: auto;
- background-color: #ffffff;
- border: 1px solid #999;
- border: 1px solid rgba(0, 0, 0, 0.3);
- *border: 1px solid #999;
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
- -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
- -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
- box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding-box;
- background-clip: padding-box;
-}
-
-.modal.fade {
- top: -25%;
- -webkit-transition: opacity 0.3s linear, top 0.3s ease-out;
- -moz-transition: opacity 0.3s linear, top 0.3s ease-out;
- -o-transition: opacity 0.3s linear, top 0.3s ease-out;
- transition: opacity 0.3s linear, top 0.3s ease-out;
-}
-
-.modal.fade.in {
- top: 50%;
-}
-
-.modal-header {
- padding: 9px 15px;
- border-bottom: 1px solid #eee;
-}
-
-.modal-header .close {
- margin-top: 2px;
-}
-
-.modal-header h3 {
- margin: 0;
- line-height: 30px;
-}
-
-.modal-body {
- max-height: 400px;
- padding: 15px;
- overflow-y: auto;
-}
-
-.modal-form {
- margin-bottom: 0;
-}
-
-.modal-footer {
- padding: 14px 15px 15px;
- margin-bottom: 0;
- text-align: right;
- background-color: #f5f5f5;
- border-top: 1px solid #ddd;
- -webkit-border-radius: 0 0 6px 6px;
- -moz-border-radius: 0 0 6px 6px;
- border-radius: 0 0 6px 6px;
- *zoom: 1;
- -webkit-box-shadow: inset 0 1px 0 #ffffff;
- -moz-box-shadow: inset 0 1px 0 #ffffff;
- box-shadow: inset 0 1px 0 #ffffff;
-}
-
-.modal-footer:before,
-.modal-footer:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.modal-footer:after {
- clear: both;
-}
-
-.modal-footer .btn + .btn {
- margin-bottom: 0;
- margin-left: 5px;
-}
-
-.modal-footer .btn-group .btn + .btn {
- margin-left: -1px;
-}
-
-.tooltip {
- position: absolute;
- z-index: 1030;
- display: block;
- padding: 5px;
- font-size: 11px;
- opacity: 0;
- filter: alpha(opacity=0);
- visibility: visible;
-}
-
-.tooltip.in {
- opacity: 0.8;
- filter: alpha(opacity=80);
-}
-
-.tooltip.top {
- margin-top: -3px;
-}
-
-.tooltip.right {
- margin-left: 3px;
-}
-
-.tooltip.bottom {
- margin-top: 3px;
-}
-
-.tooltip.left {
- margin-left: -3px;
-}
-
-.tooltip-inner {
- max-width: 200px;
- padding: 3px 8px;
- color: #ffffff;
- text-align: center;
- text-decoration: none;
- background-color: #000000;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-
-.tooltip-arrow {
- position: absolute;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
-}
-
-.tooltip.top .tooltip-arrow {
- bottom: 0;
- left: 50%;
- margin-left: -5px;
- border-top-color: #000000;
- border-width: 5px 5px 0;
-}
-
-.tooltip.right .tooltip-arrow {
- top: 50%;
- left: 0;
- margin-top: -5px;
- border-right-color: #000000;
- border-width: 5px 5px 5px 0;
-}
-
-.tooltip.left .tooltip-arrow {
- top: 50%;
- right: 0;
- margin-top: -5px;
- border-left-color: #000000;
- border-width: 5px 0 5px 5px;
-}
-
-.tooltip.bottom .tooltip-arrow {
- top: 0;
- left: 50%;
- margin-left: -5px;
- border-bottom-color: #000000;
- border-width: 0 5px 5px;
-}
-
-.popover {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 1010;
- display: none;
- width: 236px;
- padding: 1px;
- background-color: #ffffff;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, 0.2);
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
- -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding;
- background-clip: padding-box;
-}
-
-.popover.top {
- margin-bottom: 10px;
-}
-
-.popover.right {
- margin-left: 10px;
-}
-
-.popover.bottom {
- margin-top: 10px;
-}
-
-.popover.left {
- margin-right: 10px;
-}
-
-.popover-title {
- padding: 8px 14px;
- margin: 0;
- font-size: 14px;
- font-weight: normal;
- line-height: 18px;
- background-color: #f7f7f7;
- border-bottom: 1px solid #ebebeb;
- -webkit-border-radius: 5px 5px 0 0;
- -moz-border-radius: 5px 5px 0 0;
- border-radius: 5px 5px 0 0;
-}
-
-.popover-content {
- padding: 9px 14px;
-}
-
-.popover-content p,
-.popover-content ul,
-.popover-content ol {
- margin-bottom: 0;
-}
-
-.popover .arrow,
-.popover .arrow:after {
- position: absolute;
- display: inline-block;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
-}
-
-.popover .arrow:after {
- z-index: -1;
- content: "";
-}
-
-.popover.top .arrow {
- bottom: -10px;
- left: 50%;
- margin-left: -10px;
- border-top-color: #ffffff;
- border-width: 10px 10px 0;
-}
-
-.popover.top .arrow:after {
- bottom: -1px;
- left: -11px;
- border-top-color: rgba(0, 0, 0, 0.25);
- border-width: 11px 11px 0;
-}
-
-.popover.right .arrow {
- top: 50%;
- left: -10px;
- margin-top: -10px;
- border-right-color: #ffffff;
- border-width: 10px 10px 10px 0;
-}
-
-.popover.right .arrow:after {
- bottom: -11px;
- left: -1px;
- border-right-color: rgba(0, 0, 0, 0.25);
- border-width: 11px 11px 11px 0;
-}
-
-.popover.bottom .arrow {
- top: -10px;
- left: 50%;
- margin-left: -10px;
- border-bottom-color: #ffffff;
- border-width: 0 10px 10px;
-}
-
-.popover.bottom .arrow:after {
- top: -1px;
- left: -11px;
- border-bottom-color: rgba(0, 0, 0, 0.25);
- border-width: 0 11px 11px;
-}
-
-.popover.left .arrow {
- top: 50%;
- right: -10px;
- margin-top: -10px;
- border-left-color: #ffffff;
- border-width: 10px 0 10px 10px;
-}
-
-.popover.left .arrow:after {
- right: -1px;
- bottom: -11px;
- border-left-color: rgba(0, 0, 0, 0.25);
- border-width: 11px 0 11px 11px;
-}
-
-.thumbnails {
- margin-left: -20px;
- list-style: none;
- *zoom: 1;
-}
-
-.thumbnails:before,
-.thumbnails:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.thumbnails:after {
- clear: both;
-}
-
-.row-fluid .thumbnails {
- margin-left: 0;
-}
-
-.thumbnails > li {
- float: left;
- margin-bottom: 20px;
- margin-left: 20px;
-}
-
-.thumbnail {
- display: block;
- padding: 4px;
- line-height: 20px;
- border: 1px solid #ddd;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
- -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
- -webkit-transition: all 0.2s ease-in-out;
- -moz-transition: all 0.2s ease-in-out;
- -o-transition: all 0.2s ease-in-out;
- transition: all 0.2s ease-in-out;
-}
-
-a.thumbnail:hover {
- border-color: #0088cc;
- -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
- -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
- box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-}
-
-.thumbnail > img {
- display: block;
- max-width: 100%;
- margin-right: auto;
- margin-left: auto;
-}
-
-.thumbnail .caption {
- padding: 9px;
- color: #555555;
-}
-
-.label,
-.badge {
- font-size: 11.844px;
- font-weight: bold;
- line-height: 14px;
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- white-space: nowrap;
- vertical-align: baseline;
- background-color: #999999;
-}
-
-.label {
- padding: 1px 4px 2px;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
-}
-
-.badge {
- padding: 1px 9px 2px;
- -webkit-border-radius: 9px;
- -moz-border-radius: 9px;
- border-radius: 9px;
-}
-
-a.label:hover,
-a.badge:hover {
- color: #ffffff;
- text-decoration: none;
- cursor: pointer;
-}
-
-.label-important,
-.badge-important {
- background-color: #b94a48;
-}
-
-.label-important[href],
-.badge-important[href] {
- background-color: #953b39;
-}
-
-.label-warning,
-.badge-warning {
- background-color: #f89406;
-}
-
-.label-warning[href],
-.badge-warning[href] {
- background-color: #c67605;
-}
-
-.label-success,
-.badge-success {
- background-color: #468847;
-}
-
-.label-success[href],
-.badge-success[href] {
- background-color: #356635;
-}
-
-.label-info,
-.badge-info {
- background-color: #3a87ad;
-}
-
-.label-info[href],
-.badge-info[href] {
- background-color: #2d6987;
-}
-
-.label-inverse,
-.badge-inverse {
- background-color: #333333;
-}
-
-.label-inverse[href],
-.badge-inverse[href] {
- background-color: #1a1a1a;
-}
-
-.btn .label,
-.btn .badge {
- position: relative;
- top: -1px;
-}
-
-.btn-mini .label,
-.btn-mini .badge {
- top: 0;
-}
-
- at -webkit-keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
-
- at -moz-keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
-
- at -ms-keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
-
- at -o-keyframes progress-bar-stripes {
- from {
- background-position: 0 0;
- }
- to {
- background-position: 40px 0;
- }
-}
-
- at keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
-
-.progress {
- height: 20px;
- margin-bottom: 20px;
- overflow: hidden;
- background-color: #f7f7f7;
- background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
- background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
- background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
- background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
- background-repeat: repeat-x;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
- -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
- -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-}
-
-.progress .bar {
- float: left;
- width: 0;
- height: 100%;
- font-size: 12px;
- color: #ffffff;
- text-align: center;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #0e90d2;
- background-image: -moz-linear-gradient(top, #149bdf, #0480be);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
- background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
- background-image: -o-linear-gradient(top, #149bdf, #0480be);
- background-image: linear-gradient(to bottom, #149bdf, #0480be);
- background-repeat: repeat-x;
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
- -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
- -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
- box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- -webkit-transition: width 0.6s ease;
- -moz-transition: width 0.6s ease;
- -o-transition: width 0.6s ease;
- transition: width 0.6s ease;
-}
-
-.progress .bar + .bar {
- -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
- -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
- box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-}
-
-.progress-striped .bar {
- background-color: #149bdf;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- -webkit-background-size: 40px 40px;
- -moz-background-size: 40px 40px;
- -o-background-size: 40px 40px;
- background-size: 40px 40px;
-}
-
-.progress.active .bar {
- -webkit-animation: progress-bar-stripes 2s linear infinite;
- -moz-animation: progress-bar-stripes 2s linear infinite;
- -ms-animation: progress-bar-stripes 2s linear infinite;
- -o-animation: progress-bar-stripes 2s linear infinite;
- animation: progress-bar-stripes 2s linear infinite;
-}
-
-.progress-danger .bar,
-.progress .bar-danger {
- background-color: #dd514c;
- background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
- background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
- background-repeat: repeat-x;
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
-}
-
-.progress-danger.progress-striped .bar,
-.progress-striped .bar-danger {
- background-color: #ee5f5b;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-
-.progress-success .bar,
-.progress .bar-success {
- background-color: #5eb95e;
- background-image: -moz-linear-gradient(top, #62c462, #57a957);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
- background-image: -webkit-linear-gradient(top, #62c462, #57a957);
- background-image: -o-linear-gradient(top, #62c462, #57a957);
- background-image: linear-gradient(to bottom, #62c462, #57a957);
- background-repeat: repeat-x;
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
-}
-
-.progress-success.progress-striped .bar,
-.progress-striped .bar-success {
- background-color: #62c462;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-
-.progress-info .bar,
-.progress .bar-info {
- background-color: #4bb1cf;
- background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
- background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
- background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
- background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
- background-repeat: repeat-x;
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
-}
-
-.progress-info.progress-striped .bar,
-.progress-striped .bar-info {
- background-color: #5bc0de;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-
-.progress-warning .bar,
-.progress .bar-warning {
- background-color: #faa732;
- background-image: -moz-linear-gradient(top, #fbb450, #f89406);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
- background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
- background-image: -o-linear-gradient(top, #fbb450, #f89406);
- background-image: linear-gradient(to bottom, #fbb450, #f89406);
- background-repeat: repeat-x;
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
-}
-
-.progress-warning.progress-striped .bar,
-.progress-striped .bar-warning {
- background-color: #fbb450;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-
-.accordion {
- margin-bottom: 20px;
-}
-
-.accordion-group {
- margin-bottom: 2px;
- border: 1px solid #e5e5e5;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-
-.accordion-heading {
- border-bottom: 0;
-}
-
-.accordion-heading .accordion-toggle {
- display: block;
- padding: 8px 15px;
-}
-
-.accordion-toggle {
- cursor: pointer;
-}
-
-.accordion-inner {
- padding: 9px 15px;
- border-top: 1px solid #e5e5e5;
-}
-
-.carousel {
- position: relative;
- margin-bottom: 20px;
- line-height: 1;
-}
-
-.carousel-inner {
- position: relative;
- width: 100%;
- overflow: hidden;
-}
-
-.carousel .item {
- position: relative;
- display: none;
- -webkit-transition: 0.6s ease-in-out left;
- -moz-transition: 0.6s ease-in-out left;
- -o-transition: 0.6s ease-in-out left;
- transition: 0.6s ease-in-out left;
-}
-
-.carousel .item > img {
- display: block;
- line-height: 1;
-}
-
-.carousel .active,
-.carousel .next,
-.carousel .prev {
- display: block;
-}
-
-.carousel .active {
- left: 0;
-}
-
-.carousel .next,
-.carousel .prev {
- position: absolute;
- top: 0;
- width: 100%;
-}
-
-.carousel .next {
- left: 100%;
-}
-
-.carousel .prev {
- left: -100%;
-}
-
-.carousel .next.left,
-.carousel .prev.right {
- left: 0;
-}
-
-.carousel .active.left {
- left: -100%;
-}
-
-.carousel .active.right {
- left: 100%;
-}
-
-.carousel-control {
- position: absolute;
- top: 40%;
- left: 15px;
- width: 40px;
- height: 40px;
- margin-top: -20px;
- font-size: 60px;
- font-weight: 100;
- line-height: 30px;
- color: #ffffff;
- text-align: center;
- background: #222222;
- border: 3px solid #ffffff;
- -webkit-border-radius: 23px;
- -moz-border-radius: 23px;
- border-radius: 23px;
- opacity: 0.5;
- filter: alpha(opacity=50);
-}
-
-.carousel-control.right {
- right: 15px;
- left: auto;
-}
-
-.carousel-control:hover {
- color: #ffffff;
- text-decoration: none;
- opacity: 0.9;
- filter: alpha(opacity=90);
-}
-
-.carousel-caption {
- position: absolute;
- right: 0;
- bottom: 0;
- left: 0;
- padding: 15px;
- background: #333333;
- background: rgba(0, 0, 0, 0.75);
-}
-
-.carousel-caption h4,
-.carousel-caption p {
- line-height: 20px;
- color: #ffffff;
-}
-
-.carousel-caption h4 {
- margin: 0 0 5px;
-}
-
-.carousel-caption p {
- margin-bottom: 0;
-}
-
-.hero-unit {
- padding: 60px;
- margin-bottom: 30px;
- background-color: #eeeeee;
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
-}
-
-.hero-unit h1 {
- margin-bottom: 0;
- font-size: 60px;
- line-height: 1;
- letter-spacing: -1px;
- color: inherit;
-}
-
-.hero-unit p {
- font-size: 18px;
- font-weight: 200;
- line-height: 30px;
- color: inherit;
-}
-
-.pull-right {
- float: right;
-}
-
-.pull-left {
- float: left;
-}
-
-.hide {
- display: none;
-}
-
-.show {
- display: block;
-}
-
-.invisible {
- visibility: hidden;
-}
-
-.affix {
- position: fixed;
-}
diff --git a/doc/_themes/bootstrap/static/bootstrap-default.min.css b/doc/_themes/bootstrap/static/bootstrap-default.min.css
deleted file mode 100644
index 3119038..0000000
--- a/doc/_themes/bootstrap/static/bootstrap-default.min.css
+++ /dev/null
@@ -1,9 +0,0 @@
-/*!
- * Bootstrap v2.1.0
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:- [...]
diff --git a/doc/_themes/bootstrap/static/bootstrap-dropdown.js b/doc/_themes/bootstrap/static/bootstrap-dropdown.js
deleted file mode 100644
index 15f4677..0000000
--- a/doc/_themes/bootstrap/static/bootstrap-dropdown.js
+++ /dev/null
@@ -1,81 +0,0 @@
-/* ============================================================
- * bootstrap-dropdown.js v2.0.0
- * http://twitter.github.com/bootstrap/javascript.html#dropdown
- * ============================================================
- * Copyright 2011 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-
-!function( $ ){
-
- "use strict"
-
- /* DROPDOWN CLASS DEFINITION
- * ========================= */
-
- var toggle = '[data-toggle="dropdown"]'
- , Dropdown = function ( element ) {
- $(element).bind('click', this.toggle)
- }
-
- Dropdown.prototype = {
-
- constructor: Dropdown
-
- , toggle: function ( e ) {
- var $this = $(this)
- , selector = $this.attr('data-target') || $this.attr('href')
- , $parent = $(selector)
-
- $parent.length || ($parent = $this.parent())
-
- clearMenus()
-
- !$parent.hasClass('open') && $parent.toggleClass('open')
-
- return false
- }
-
- }
-
- function clearMenus() {
- $(toggle).parent().removeClass('open')
- }
-
-
- /* DROPDOWN PLUGIN DEFINITION
- * ========================== */
-
- $.fn.dropdown = function ( option ) {
- return this.each(function () {
- var $this = $(this)
- , data = $this.data('dropdown')
- if (!data) $this.data('dropdown', (data = new Dropdown(this)))
- if (typeof option == 'string') data[option].call($this)
- })
- }
-
- $.fn.dropdown.Constructor = Dropdown
-
-
- /* APPLY TO STANDARD DROPDOWN ELEMENTS
- * =================================== */
-
- $(function () {
- $('html').on('click.dropdown.data-api', clearMenus)
- $('body').on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle)
- })
-
-}( window.jQuery )
\ No newline at end of file
diff --git a/doc/_themes/bootstrap/static/bootstrap-engineauth.css b/doc/_themes/bootstrap/static/bootstrap-engineauth.css
deleted file mode 100755
index 0cc15fd..0000000
--- a/doc/_themes/bootstrap/static/bootstrap-engineauth.css
+++ /dev/null
@@ -1,5700 +0,0 @@
-/*!
- * Bootstrap v2.1.0
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */
-.clearfix {
- *zoom: 1;
-}
-.clearfix:before,
-.clearfix:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.clearfix:after {
- clear: both;
-}
-.hide-text {
- font: 0/0 a;
- color: transparent;
- text-shadow: none;
- background-color: transparent;
- border: 0;
-}
-.input-block-level {
- display: block;
- width: 100%;
- min-height: 30px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-nav,
-section {
- display: block;
-}
-audio,
-canvas,
-video {
- display: inline-block;
- *display: inline;
- *zoom: 1;
-}
-audio:not([controls]) {
- display: none;
-}
-html {
- font-size: 100%;
- -webkit-text-size-adjust: 100%;
- -ms-text-size-adjust: 100%;
-}
-a:focus {
- outline: thin dotted #333;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-a:hover,
-a:active {
- outline: 0;
-}
-sub,
-sup {
- position: relative;
- font-size: 75%;
- line-height: 0;
- vertical-align: baseline;
-}
-sup {
- top: -0.5em;
-}
-sub {
- bottom: -0.25em;
-}
-img {
- max-width: 100%;
- height: auto;
- vertical-align: middle;
- border: 0;
- -ms-interpolation-mode: bicubic;
-}
-#map_canvas img {
- max-width: none;
-}
-button,
-input,
-select,
-textarea {
- margin: 0;
- font-size: 100%;
- vertical-align: middle;
-}
-button,
-input {
- *overflow: visible;
- line-height: normal;
-}
-button::-moz-focus-inner,
-input::-moz-focus-inner {
- padding: 0;
- border: 0;
-}
-button,
-input[type="button"],
-input[type="reset"],
-input[type="submit"] {
- cursor: pointer;
- -webkit-appearance: button;
-}
-input[type="search"] {
- -webkit-box-sizing: content-box;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
- -webkit-appearance: textfield;
-}
-input[type="search"]::-webkit-search-decoration,
-input[type="search"]::-webkit-search-cancel-button {
- -webkit-appearance: none;
-}
-textarea {
- overflow: auto;
- vertical-align: top;
-}
-body {
- margin: 0;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 14px;
- line-height: 20px;
- color: #333333;
- background-color: #ffffff;
-}
-a {
- color: #0e84b5;
- text-decoration: none;
-}
-a:hover {
- color: #f26a1e;
- text-decoration: underline;
-}
-.img-rounded {
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
-}
-.img-polaroid {
- padding: 4px;
- background-color: #fff;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, 0.2);
- -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
- -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-}
-.img-circle {
- -webkit-border-radius: 500px;
- -moz-border-radius: 500px;
- border-radius: 500px;
-}
-.row {
- margin-left: -20px;
- *zoom: 1;
-}
-.row:before,
-.row:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.row:after {
- clear: both;
-}
-[class*="span"] {
- float: left;
- margin-left: 20px;
-}
-.container,
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
- width: 940px;
-}
-.span12 {
- width: 940px;
-}
-.span11 {
- width: 860px;
-}
-.span10 {
- width: 780px;
-}
-.span9 {
- width: 700px;
-}
-.span8 {
- width: 620px;
-}
-.span7 {
- width: 540px;
-}
-.span6 {
- width: 460px;
-}
-.span5 {
- width: 380px;
-}
-.span4 {
- width: 300px;
-}
-.span3 {
- width: 220px;
-}
-.span2 {
- width: 140px;
-}
-.span1 {
- width: 60px;
-}
-.offset12 {
- margin-left: 980px;
-}
-.offset11 {
- margin-left: 900px;
-}
-.offset10 {
- margin-left: 820px;
-}
-.offset9 {
- margin-left: 740px;
-}
-.offset8 {
- margin-left: 660px;
-}
-.offset7 {
- margin-left: 580px;
-}
-.offset6 {
- margin-left: 500px;
-}
-.offset5 {
- margin-left: 420px;
-}
-.offset4 {
- margin-left: 340px;
-}
-.offset3 {
- margin-left: 260px;
-}
-.offset2 {
- margin-left: 180px;
-}
-.offset1 {
- margin-left: 100px;
-}
-.row-fluid {
- width: 100%;
- *zoom: 1;
-}
-.row-fluid:before,
-.row-fluid:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.row-fluid:after {
- clear: both;
-}
-.row-fluid [class*="span"] {
- display: block;
- width: 100%;
- min-height: 30px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- float: left;
- margin-left: 2.127659574468085%;
- *margin-left: 2.074468085106383%;
-}
-.row-fluid [class*="span"]:first-child {
- margin-left: 0;
-}
-.row-fluid .span12 {
- width: 100%;
- *width: 99.94680851063829%;
-}
-.row-fluid .span11 {
- width: 91.48936170212765%;
- *width: 91.43617021276594%;
-}
-.row-fluid .span10 {
- width: 82.97872340425532%;
- *width: 82.92553191489361%;
-}
-.row-fluid .span9 {
- width: 74.46808510638297%;
- *width: 74.41489361702126%;
-}
-.row-fluid .span8 {
- width: 65.95744680851064%;
- *width: 65.90425531914893%;
-}
-.row-fluid .span7 {
- width: 57.44680851063829%;
- *width: 57.39361702127659%;
-}
-.row-fluid .span6 {
- width: 48.93617021276595%;
- *width: 48.88297872340425%;
-}
-.row-fluid .span5 {
- width: 40.42553191489362%;
- *width: 40.37234042553192%;
-}
-.row-fluid .span4 {
- width: 31.914893617021278%;
- *width: 31.861702127659576%;
-}
-.row-fluid .span3 {
- width: 23.404255319148934%;
- *width: 23.351063829787233%;
-}
-.row-fluid .span2 {
- width: 14.893617021276595%;
- *width: 14.840425531914894%;
-}
-.row-fluid .span1 {
- width: 6.382978723404255%;
- *width: 6.329787234042553%;
-}
-.row-fluid .offset12 {
- margin-left: 104.25531914893617%;
- *margin-left: 104.14893617021275%;
-}
-.row-fluid .offset12:first-child {
- margin-left: 102.12765957446808%;
- *margin-left: 102.02127659574467%;
-}
-.row-fluid .offset11 {
- margin-left: 95.74468085106382%;
- *margin-left: 95.6382978723404%;
-}
-.row-fluid .offset11:first-child {
- margin-left: 93.61702127659574%;
- *margin-left: 93.51063829787232%;
-}
-.row-fluid .offset10 {
- margin-left: 87.23404255319149%;
- *margin-left: 87.12765957446807%;
-}
-.row-fluid .offset10:first-child {
- margin-left: 85.1063829787234%;
- *margin-left: 84.99999999999999%;
-}
-.row-fluid .offset9 {
- margin-left: 78.72340425531914%;
- *margin-left: 78.61702127659572%;
-}
-.row-fluid .offset9:first-child {
- margin-left: 76.59574468085106%;
- *margin-left: 76.48936170212764%;
-}
-.row-fluid .offset8 {
- margin-left: 70.2127659574468%;
- *margin-left: 70.10638297872339%;
-}
-.row-fluid .offset8:first-child {
- margin-left: 68.08510638297872%;
- *margin-left: 67.9787234042553%;
-}
-.row-fluid .offset7 {
- margin-left: 61.70212765957446%;
- *margin-left: 61.59574468085106%;
-}
-.row-fluid .offset7:first-child {
- margin-left: 59.574468085106375%;
- *margin-left: 59.46808510638297%;
-}
-.row-fluid .offset6 {
- margin-left: 53.191489361702125%;
- *margin-left: 53.085106382978715%;
-}
-.row-fluid .offset6:first-child {
- margin-left: 51.063829787234035%;
- *margin-left: 50.95744680851063%;
-}
-.row-fluid .offset5 {
- margin-left: 44.68085106382979%;
- *margin-left: 44.57446808510638%;
-}
-.row-fluid .offset5:first-child {
- margin-left: 42.5531914893617%;
- *margin-left: 42.4468085106383%;
-}
-.row-fluid .offset4 {
- margin-left: 36.170212765957444%;
- *margin-left: 36.06382978723405%;
-}
-.row-fluid .offset4:first-child {
- margin-left: 34.04255319148936%;
- *margin-left: 33.93617021276596%;
-}
-.row-fluid .offset3 {
- margin-left: 27.659574468085104%;
- *margin-left: 27.5531914893617%;
-}
-.row-fluid .offset3:first-child {
- margin-left: 25.53191489361702%;
- *margin-left: 25.425531914893618%;
-}
-.row-fluid .offset2 {
- margin-left: 19.148936170212764%;
- *margin-left: 19.04255319148936%;
-}
-.row-fluid .offset2:first-child {
- margin-left: 17.02127659574468%;
- *margin-left: 16.914893617021278%;
-}
-.row-fluid .offset1 {
- margin-left: 10.638297872340425%;
- *margin-left: 10.53191489361702%;
-}
-.row-fluid .offset1:first-child {
- margin-left: 8.51063829787234%;
- *margin-left: 8.404255319148938%;
-}
-[class*="span"].hide,
-.row-fluid [class*="span"].hide {
- display: none;
-}
-[class*="span"].pull-right,
-.row-fluid [class*="span"].pull-right {
- float: right;
-}
-.container {
- margin-right: auto;
- margin-left: auto;
- *zoom: 1;
-}
-.container:before,
-.container:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.container:after {
- clear: both;
-}
-.container-fluid {
- padding-right: 20px;
- padding-left: 20px;
- *zoom: 1;
-}
-.container-fluid:before,
-.container-fluid:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.container-fluid:after {
- clear: both;
-}
-p {
- margin: 0 0 10px;
-}
-.lead {
- margin-bottom: 20px;
- font-size: 20px;
- font-weight: 200;
- line-height: 30px;
-}
-small {
- font-size: 85%;
-}
-strong {
- font-weight: bold;
-}
-em {
- font-style: italic;
-}
-cite {
- font-style: normal;
-}
-.muted {
- color: #999999;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- margin: 10px 0;
- font-family: inherit;
- font-weight: normal;
- line-height: 1;
- color: inherit;
- text-rendering: optimizelegibility;
-}
-h1 small,
-h2 small,
-h3 small,
-h4 small,
-h5 small,
-h6 small {
- font-weight: normal;
- line-height: 1;
- color: #999999;
-}
-h1 {
- font-size: 36px;
- line-height: 40px;
-}
-h2 {
- font-size: 30px;
- line-height: 40px;
-}
-h3 {
- font-size: 24px;
- line-height: 40px;
-}
-h4 {
- font-size: 18px;
- line-height: 20px;
-}
-h5 {
- font-size: 14px;
- line-height: 20px;
-}
-h6 {
- font-size: 12px;
- line-height: 20px;
-}
-h1 small {
- font-size: 24px;
-}
-h2 small {
- font-size: 18px;
-}
-h3 small {
- font-size: 14px;
-}
-h4 small {
- font-size: 14px;
-}
-.page-header {
- padding-bottom: 9px;
- margin: 20px 0 30px;
- border-bottom: 1px solid #eeeeee;
-}
-ul,
-ol {
- padding: 0;
- margin: 0 0 10px 25px;
-}
-ul ul,
-ul ol,
-ol ol,
-ol ul {
- margin-bottom: 0;
-}
-li {
- line-height: 20px;
-}
-ul.unstyled,
-ol.unstyled {
- margin-left: 0;
- list-style: none;
-}
-dl {
- margin-bottom: 20px;
-}
-dt,
-dd {
- line-height: 20px;
-}
-dt {
- font-weight: bold;
-}
-dd {
- margin-left: 10px;
-}
-.dl-horizontal dt {
- float: left;
- width: 120px;
- clear: left;
- text-align: right;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-.dl-horizontal dd {
- margin-left: 130px;
-}
-hr {
- margin: 20px 0;
- border: 0;
- border-top: 1px solid #eeeeee;
- border-bottom: 1px solid #ffffff;
-}
-abbr[title] {
- cursor: help;
- border-bottom: 1px dotted #999999;
-}
-abbr.initialism {
- font-size: 90%;
- text-transform: uppercase;
-}
-blockquote {
- padding: 0 0 0 15px;
- margin: 0 0 20px;
- border-left: 5px solid #eeeeee;
-}
-blockquote p {
- margin-bottom: 0;
- font-size: 16px;
- font-weight: 300;
- line-height: 25px;
-}
-blockquote small {
- display: block;
- line-height: 20px;
- color: #999999;
-}
-blockquote small:before {
- content: '\2014 \00A0';
-}
-blockquote.pull-right {
- float: right;
- padding-right: 15px;
- padding-left: 0;
- border-right: 5px solid #eeeeee;
- border-left: 0;
-}
-blockquote.pull-right p,
-blockquote.pull-right small {
- text-align: right;
-}
-blockquote.pull-right small:before {
- content: '';
-}
-blockquote.pull-right small:after {
- content: '\00A0 \2014';
-}
-q:before,
-q:after,
-blockquote:before,
-blockquote:after {
- content: "";
-}
-address {
- display: block;
- margin-bottom: 20px;
- font-style: normal;
- line-height: 20px;
-}
-code,
-pre {
- padding: 0 3px 2px;
- font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
- font-size: 12px;
- color: #333333;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
-}
-code {
- padding: 2px 4px;
- color: #d14;
- background-color: #f7f7f9;
- border: 1px solid #e1e1e8;
-}
-pre {
- display: block;
- padding: 9.5px;
- margin: 0 0 10px;
- font-size: 13px;
- line-height: 20px;
- word-break: break-all;
- word-wrap: break-word;
- white-space: pre;
- white-space: pre-wrap;
- background-color: #f5f5f5;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, 0.15);
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-pre.prettyprint {
- margin-bottom: 20px;
-}
-pre code {
- padding: 0;
- color: inherit;
- background-color: transparent;
- border: 0;
-}
-.pre-scrollable {
- max-height: 340px;
- overflow-y: scroll;
-}
-.label,
-.badge {
- font-size: 11.844px;
- font-weight: bold;
- line-height: 14px;
- color: #ffffff;
- vertical-align: baseline;
- white-space: nowrap;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #999999;
-}
-.label {
- padding: 1px 4px 2px;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
-}
-.badge {
- padding: 1px 9px 2px;
- -webkit-border-radius: 9px;
- -moz-border-radius: 9px;
- border-radius: 9px;
-}
-a.label:hover,
-a.badge:hover {
- color: #ffffff;
- text-decoration: none;
- cursor: pointer;
-}
-.label-important,
-.badge-important {
- background-color: #b94a48;
-}
-.label-important[href],
-.badge-important[href] {
- background-color: #953b39;
-}
-.label-warning,
-.badge-warning {
- background-color: #f89406;
-}
-.label-warning[href],
-.badge-warning[href] {
- background-color: #c67605;
-}
-.label-success,
-.badge-success {
- background-color: #468847;
-}
-.label-success[href],
-.badge-success[href] {
- background-color: #356635;
-}
-.label-info,
-.badge-info {
- background-color: #3a87ad;
-}
-.label-info[href],
-.badge-info[href] {
- background-color: #2d6987;
-}
-.label-inverse,
-.badge-inverse {
- background-color: #333333;
-}
-.label-inverse[href],
-.badge-inverse[href] {
- background-color: #1a1a1a;
-}
-.btn .label,
-.btn .badge {
- position: relative;
- top: -1px;
-}
-.btn-mini .label,
-.btn-mini .badge {
- top: 0;
-}
-table {
- max-width: 100%;
- background-color: transparent;
- border-collapse: collapse;
- border-spacing: 0;
-}
-.table {
- width: 100%;
- margin-bottom: 20px;
-}
-.table th,
-.table td {
- padding: 8px;
- line-height: 20px;
- text-align: left;
- vertical-align: top;
- border-top: 1px solid #dddddd;
-}
-.table th {
- font-weight: bold;
-}
-.table thead th {
- vertical-align: bottom;
-}
-.table caption + thead tr:first-child th,
-.table caption + thead tr:first-child td,
-.table colgroup + thead tr:first-child th,
-.table colgroup + thead tr:first-child td,
-.table thead:first-child tr:first-child th,
-.table thead:first-child tr:first-child td {
- border-top: 0;
-}
-.table tbody + tbody {
- border-top: 2px solid #dddddd;
-}
-.table-condensed th,
-.table-condensed td {
- padding: 4px 5px;
-}
-.table-bordered {
- border: 1px solid #dddddd;
- border-collapse: separate;
- *border-collapse: collapse;
- border-left: 0;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-.table-bordered th,
-.table-bordered td {
- border-left: 1px solid #dddddd;
-}
-.table-bordered caption + thead tr:first-child th,
-.table-bordered caption + tbody tr:first-child th,
-.table-bordered caption + tbody tr:first-child td,
-.table-bordered colgroup + thead tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child td,
-.table-bordered thead:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child td {
- border-top: 0;
-}
-.table-bordered thead:first-child tr:first-child th:first-child,
-.table-bordered tbody:first-child tr:first-child td:first-child {
- -webkit-border-top-left-radius: 4px;
- border-top-left-radius: 4px;
- -moz-border-radius-topleft: 4px;
-}
-.table-bordered thead:first-child tr:first-child th:last-child,
-.table-bordered tbody:first-child tr:first-child td:last-child {
- -webkit-border-top-right-radius: 4px;
- border-top-right-radius: 4px;
- -moz-border-radius-topright: 4px;
-}
-.table-bordered thead:last-child tr:last-child th:first-child,
-.table-bordered tbody:last-child tr:last-child td:first-child,
-.table-bordered tfoot:last-child tr:last-child td:first-child {
- -webkit-border-radius: 0 0 0 4px;
- -moz-border-radius: 0 0 0 4px;
- border-radius: 0 0 0 4px;
- -webkit-border-bottom-left-radius: 4px;
- border-bottom-left-radius: 4px;
- -moz-border-radius-bottomleft: 4px;
-}
-.table-bordered thead:last-child tr:last-child th:last-child,
-.table-bordered tbody:last-child tr:last-child td:last-child,
-.table-bordered tfoot:last-child tr:last-child td:last-child {
- -webkit-border-bottom-right-radius: 4px;
- border-bottom-right-radius: 4px;
- -moz-border-radius-bottomright: 4px;
-}
-.table-bordered caption + thead tr:first-child th:first-child,
-.table-bordered caption + tbody tr:first-child td:first-child,
-.table-bordered colgroup + thead tr:first-child th:first-child,
-.table-bordered colgroup + tbody tr:first-child td:first-child {
- -webkit-border-top-left-radius: 4px;
- border-top-left-radius: 4px;
- -moz-border-radius-topleft: 4px;
-}
-.table-bordered caption + thead tr:first-child th:last-child,
-.table-bordered caption + tbody tr:first-child td:last-child,
-.table-bordered colgroup + thead tr:first-child th:last-child,
-.table-bordered colgroup + tbody tr:first-child td:last-child {
- -webkit-border-top-right-radius: 4px;
- border-top-right-radius: 4px;
- -moz-border-right-topleft: 4px;
-}
-.table-striped tbody tr:nth-child(odd) td,
-.table-striped tbody tr:nth-child(odd) th {
- background-color: #f9f9f9;
-}
-.table-hover tbody tr:hover td,
-.table-hover tbody tr:hover th {
- background-color: #f5f5f5;
-}
-table [class*=span],
-.row-fluid table [class*=span] {
- display: table-cell;
- float: none;
- margin-left: 0;
-}
-table .span1 {
- float: none;
- width: 44px;
- margin-left: 0;
-}
-table .span2 {
- float: none;
- width: 124px;
- margin-left: 0;
-}
-table .span3 {
- float: none;
- width: 204px;
- margin-left: 0;
-}
-table .span4 {
- float: none;
- width: 284px;
- margin-left: 0;
-}
-table .span5 {
- float: none;
- width: 364px;
- margin-left: 0;
-}
-table .span6 {
- float: none;
- width: 444px;
- margin-left: 0;
-}
-table .span7 {
- float: none;
- width: 524px;
- margin-left: 0;
-}
-table .span8 {
- float: none;
- width: 604px;
- margin-left: 0;
-}
-table .span9 {
- float: none;
- width: 684px;
- margin-left: 0;
-}
-table .span10 {
- float: none;
- width: 764px;
- margin-left: 0;
-}
-table .span11 {
- float: none;
- width: 844px;
- margin-left: 0;
-}
-table .span12 {
- float: none;
- width: 924px;
- margin-left: 0;
-}
-table .span13 {
- float: none;
- width: 1004px;
- margin-left: 0;
-}
-table .span14 {
- float: none;
- width: 1084px;
- margin-left: 0;
-}
-table .span15 {
- float: none;
- width: 1164px;
- margin-left: 0;
-}
-table .span16 {
- float: none;
- width: 1244px;
- margin-left: 0;
-}
-table .span17 {
- float: none;
- width: 1324px;
- margin-left: 0;
-}
-table .span18 {
- float: none;
- width: 1404px;
- margin-left: 0;
-}
-table .span19 {
- float: none;
- width: 1484px;
- margin-left: 0;
-}
-table .span20 {
- float: none;
- width: 1564px;
- margin-left: 0;
-}
-table .span21 {
- float: none;
- width: 1644px;
- margin-left: 0;
-}
-table .span22 {
- float: none;
- width: 1724px;
- margin-left: 0;
-}
-table .span23 {
- float: none;
- width: 1804px;
- margin-left: 0;
-}
-table .span24 {
- float: none;
- width: 1884px;
- margin-left: 0;
-}
-.table tbody tr.success td {
- background-color: #dff0d8;
-}
-.table tbody tr.error td {
- background-color: #f2dede;
-}
-.table tbody tr.info td {
- background-color: #d9edf7;
-}
-form {
- margin: 0 0 20px;
-}
-fieldset {
- padding: 0;
- margin: 0;
- border: 0;
-}
-legend {
- display: block;
- width: 100%;
- padding: 0;
- margin-bottom: 20px;
- font-size: 21px;
- line-height: 40px;
- color: #333333;
- border: 0;
- border-bottom: 1px solid #e5e5e5;
-}
-legend small {
- font-size: 15px;
- color: #999999;
-}
-label,
-input,
-button,
-select,
-textarea {
- font-size: 14px;
- font-weight: normal;
- line-height: 20px;
-}
-input,
-button,
-select,
-textarea {
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-}
-label {
- display: block;
- margin-bottom: 5px;
-}
-select,
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
- display: inline-block;
- height: 20px;
- padding: 4px 6px;
- margin-bottom: 9px;
- font-size: 14px;
- line-height: 20px;
- color: #555555;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
-}
-input,
-textarea {
- width: 210px;
-}
-textarea {
- height: auto;
-}
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
- background-color: #ffffff;
- border: 1px solid #cccccc;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -webkit-transition: border linear .2s, box-shadow linear .2s;
- -moz-transition: border linear .2s, box-shadow linear .2s;
- -o-transition: border linear .2s, box-shadow linear .2s;
- transition: border linear .2s, box-shadow linear .2s;
-}
-textarea:focus,
-input[type="text"]:focus,
-input[type="password"]:focus,
-input[type="datetime"]:focus,
-input[type="datetime-local"]:focus,
-input[type="date"]:focus,
-input[type="month"]:focus,
-input[type="time"]:focus,
-input[type="week"]:focus,
-input[type="number"]:focus,
-input[type="email"]:focus,
-input[type="url"]:focus,
-input[type="search"]:focus,
-input[type="tel"]:focus,
-input[type="color"]:focus,
-.uneditable-input:focus {
- border-color: rgba(82, 168, 236, 0.8);
- outline: 0;
- outline: thin dotted \9;
- /* IE6-9 */
-
- -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
- -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
- box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
-}
-input[type="radio"],
-input[type="checkbox"] {
- margin: 4px 0 0;
- *margin-top: 0;
- /* IE7 */
-
- margin-top: 1px \9;
- /* IE8-9 */
-
- line-height: normal;
- cursor: pointer;
-}
-input[type="file"],
-input[type="image"],
-input[type="submit"],
-input[type="reset"],
-input[type="button"],
-input[type="radio"],
-input[type="checkbox"] {
- width: auto;
-}
-select,
-input[type="file"] {
- height: 30px;
- /* In IE7, the height of the select element cannot be changed by height, only font-size */
-
- *margin-top: 4px;
- /* For IE7, add top margin to align select with labels */
-
- line-height: 30px;
-}
-select {
- width: 220px;
- border: 1px solid #bbb;
- background-color: #ffffff;
-}
-select[multiple],
-select[size] {
- height: auto;
-}
-select:focus,
-input[type="file"]:focus,
-input[type="radio"]:focus,
-input[type="checkbox"]:focus {
- outline: thin dotted #333;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-.uneditable-input,
-.uneditable-textarea {
- color: #999999;
- background-color: #fcfcfc;
- border-color: #cccccc;
- -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
- -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
- cursor: not-allowed;
-}
-.uneditable-input {
- overflow: hidden;
- white-space: nowrap;
-}
-.uneditable-textarea {
- width: auto;
- height: auto;
-}
-input:-moz-placeholder,
-textarea:-moz-placeholder {
- color: #999999;
-}
-input:-ms-input-placeholder,
-textarea:-ms-input-placeholder {
- color: #999999;
-}
-input::-webkit-input-placeholder,
-textarea::-webkit-input-placeholder {
- color: #999999;
-}
-.radio,
-.checkbox {
- min-height: 18px;
- padding-left: 18px;
-}
-.radio input[type="radio"],
-.checkbox input[type="checkbox"] {
- float: left;
- margin-left: -18px;
-}
-.controls > .radio:first-child,
-.controls > .checkbox:first-child {
- padding-top: 5px;
-}
-.radio.inline,
-.checkbox.inline {
- display: inline-block;
- padding-top: 5px;
- margin-bottom: 0;
- vertical-align: middle;
-}
-.radio.inline + .radio.inline,
-.checkbox.inline + .checkbox.inline {
- margin-left: 10px;
-}
-.input-mini {
- width: 60px;
-}
-.input-small {
- width: 90px;
-}
-.input-medium {
- width: 150px;
-}
-.input-large {
- width: 210px;
-}
-.input-xlarge {
- width: 270px;
-}
-.input-xxlarge {
- width: 530px;
-}
-input[class*="span"],
-select[class*="span"],
-textarea[class*="span"],
-.uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"] {
- float: none;
- margin-left: 0;
-}
-.input-append input[class*="span"],
-.input-append .uneditable-input[class*="span"],
-.input-prepend input[class*="span"],
-.input-prepend .uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"],
-.row-fluid .input-prepend [class*="span"],
-.row-fluid .input-append [class*="span"] {
- display: inline-block;
-}
-input,
-textarea,
-.uneditable-input {
- margin-left: 0;
-}
-.controls-row [class*="span"] + [class*="span"] {
- margin-left: 20px;
-}
-input.span12, textarea.span12, .uneditable-input.span12 {
- width: 926px;
-}
-input.span11, textarea.span11, .uneditable-input.span11 {
- width: 846px;
-}
-input.span10, textarea.span10, .uneditable-input.span10 {
- width: 766px;
-}
-input.span9, textarea.span9, .uneditable-input.span9 {
- width: 686px;
-}
-input.span8, textarea.span8, .uneditable-input.span8 {
- width: 606px;
-}
-input.span7, textarea.span7, .uneditable-input.span7 {
- width: 526px;
-}
-input.span6, textarea.span6, .uneditable-input.span6 {
- width: 446px;
-}
-input.span5, textarea.span5, .uneditable-input.span5 {
- width: 366px;
-}
-input.span4, textarea.span4, .uneditable-input.span4 {
- width: 286px;
-}
-input.span3, textarea.span3, .uneditable-input.span3 {
- width: 206px;
-}
-input.span2, textarea.span2, .uneditable-input.span2 {
- width: 126px;
-}
-input.span1, textarea.span1, .uneditable-input.span1 {
- width: 46px;
-}
-.controls-row {
- *zoom: 1;
-}
-.controls-row:before,
-.controls-row:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.controls-row:after {
- clear: both;
-}
-.controls-row [class*="span"] {
- float: left;
-}
-input[disabled],
-select[disabled],
-textarea[disabled],
-input[readonly],
-select[readonly],
-textarea[readonly] {
- cursor: not-allowed;
- background-color: #eeeeee;
-}
-input[type="radio"][disabled],
-input[type="checkbox"][disabled],
-input[type="radio"][readonly],
-input[type="checkbox"][readonly] {
- background-color: transparent;
-}
-.control-group.warning > label,
-.control-group.warning .help-block,
-.control-group.warning .help-inline {
- color: #c09853;
-}
-.control-group.warning .checkbox,
-.control-group.warning .radio,
-.control-group.warning input,
-.control-group.warning select,
-.control-group.warning textarea {
- color: #c09853;
- border-color: #c09853;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.control-group.warning .checkbox:focus,
-.control-group.warning .radio:focus,
-.control-group.warning input:focus,
-.control-group.warning select:focus,
-.control-group.warning textarea:focus {
- border-color: #a47e3c;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-}
-.control-group.warning .input-prepend .add-on,
-.control-group.warning .input-append .add-on {
- color: #c09853;
- background-color: #fcf8e3;
- border-color: #c09853;
-}
-.control-group.error > label,
-.control-group.error .help-block,
-.control-group.error .help-inline {
- color: #b94a48;
-}
-.control-group.error .checkbox,
-.control-group.error .radio,
-.control-group.error input,
-.control-group.error select,
-.control-group.error textarea {
- color: #b94a48;
- border-color: #b94a48;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.control-group.error .checkbox:focus,
-.control-group.error .radio:focus,
-.control-group.error input:focus,
-.control-group.error select:focus,
-.control-group.error textarea:focus {
- border-color: #953b39;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-}
-.control-group.error .input-prepend .add-on,
-.control-group.error .input-append .add-on {
- color: #b94a48;
- background-color: #f2dede;
- border-color: #b94a48;
-}
-.control-group.success > label,
-.control-group.success .help-block,
-.control-group.success .help-inline {
- color: #468847;
-}
-.control-group.success .checkbox,
-.control-group.success .radio,
-.control-group.success input,
-.control-group.success select,
-.control-group.success textarea {
- color: #468847;
- border-color: #468847;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.control-group.success .checkbox:focus,
-.control-group.success .radio:focus,
-.control-group.success input:focus,
-.control-group.success select:focus,
-.control-group.success textarea:focus {
- border-color: #356635;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-}
-.control-group.success .input-prepend .add-on,
-.control-group.success .input-append .add-on {
- color: #468847;
- background-color: #dff0d8;
- border-color: #468847;
-}
-input:focus:required:invalid,
-textarea:focus:required:invalid,
-select:focus:required:invalid {
- color: #b94a48;
- border-color: #ee5f5b;
-}
-input:focus:required:invalid:focus,
-textarea:focus:required:invalid:focus,
-select:focus:required:invalid:focus {
- border-color: #e9322d;
- -webkit-box-shadow: 0 0 6px #f8b9b7;
- -moz-box-shadow: 0 0 6px #f8b9b7;
- box-shadow: 0 0 6px #f8b9b7;
-}
-.form-actions {
- padding: 19px 20px 20px;
- margin-top: 20px;
- margin-bottom: 20px;
- background-color: #f5f5f5;
- border-top: 1px solid #e5e5e5;
- *zoom: 1;
-}
-.form-actions:before,
-.form-actions:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.form-actions:after {
- clear: both;
-}
-.help-block,
-.help-inline {
- color: #595959;
-}
-.help-block {
- display: block;
- margin-bottom: 10px;
-}
-.help-inline {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
-
- *zoom: 1;
- vertical-align: middle;
- padding-left: 5px;
-}
-.input-append,
-.input-prepend {
- margin-bottom: 5px;
- font-size: 0;
- white-space: nowrap;
-}
-.input-append input,
-.input-prepend input,
-.input-append select,
-.input-prepend select,
-.input-append .uneditable-input,
-.input-prepend .uneditable-input {
- position: relative;
- margin-bottom: 0;
- *margin-left: 0;
- font-size: 14px;
- vertical-align: top;
- -webkit-border-radius: 0 3px 3px 0;
- -moz-border-radius: 0 3px 3px 0;
- border-radius: 0 3px 3px 0;
-}
-.input-append input:focus,
-.input-prepend input:focus,
-.input-append select:focus,
-.input-prepend select:focus,
-.input-append .uneditable-input:focus,
-.input-prepend .uneditable-input:focus {
- z-index: 2;
-}
-.input-append .add-on,
-.input-prepend .add-on {
- display: inline-block;
- width: auto;
- height: 20px;
- min-width: 16px;
- padding: 4px 5px;
- font-size: 14px;
- font-weight: normal;
- line-height: 20px;
- text-align: center;
- text-shadow: 0 1px 0 #ffffff;
- background-color: #eeeeee;
- border: 1px solid #ccc;
-}
-.input-append .add-on,
-.input-prepend .add-on,
-.input-append .btn,
-.input-prepend .btn {
- margin-left: -1px;
- vertical-align: top;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-.input-append .active,
-.input-prepend .active {
- background-color: #a9dba9;
- border-color: #46a546;
-}
-.input-prepend .add-on,
-.input-prepend .btn {
- margin-right: -1px;
-}
-.input-prepend .add-on:first-child,
-.input-prepend .btn:first-child {
- -webkit-border-radius: 3px 0 0 3px;
- -moz-border-radius: 3px 0 0 3px;
- border-radius: 3px 0 0 3px;
-}
-.input-append input,
-.input-append select,
-.input-append .uneditable-input {
- -webkit-border-radius: 3px 0 0 3px;
- -moz-border-radius: 3px 0 0 3px;
- border-radius: 3px 0 0 3px;
-}
-.input-append .add-on:last-child,
-.input-append .btn:last-child {
- -webkit-border-radius: 0 3px 3px 0;
- -moz-border-radius: 0 3px 3px 0;
- border-radius: 0 3px 3px 0;
-}
-.input-prepend.input-append input,
-.input-prepend.input-append select,
-.input-prepend.input-append .uneditable-input {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-.input-prepend.input-append .add-on:first-child,
-.input-prepend.input-append .btn:first-child {
- margin-right: -1px;
- -webkit-border-radius: 3px 0 0 3px;
- -moz-border-radius: 3px 0 0 3px;
- border-radius: 3px 0 0 3px;
-}
-.input-prepend.input-append .add-on:last-child,
-.input-prepend.input-append .btn:last-child {
- margin-left: -1px;
- -webkit-border-radius: 0 3px 3px 0;
- -moz-border-radius: 0 3px 3px 0;
- border-radius: 0 3px 3px 0;
-}
-input.search-query {
- padding-right: 14px;
- padding-right: 4px \9;
- padding-left: 14px;
- padding-left: 4px \9;
- /* IE7-8 doesn't have border-radius, so don't indent the padding */
-
- margin-bottom: 0;
- -webkit-border-radius: 15px;
- -moz-border-radius: 15px;
- border-radius: 15px;
-}
-/* Allow for input prepend/append in search forms */
-.form-search .input-append .search-query,
-.form-search .input-prepend .search-query {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-.form-search .input-append .search-query {
- -webkit-border-radius: 14px 0 0 14px;
- -moz-border-radius: 14px 0 0 14px;
- border-radius: 14px 0 0 14px;
-}
-.form-search .input-append .btn {
- -webkit-border-radius: 0 14px 14px 0;
- -moz-border-radius: 0 14px 14px 0;
- border-radius: 0 14px 14px 0;
-}
-.form-search .input-prepend .search-query {
- -webkit-border-radius: 0 14px 14px 0;
- -moz-border-radius: 0 14px 14px 0;
- border-radius: 0 14px 14px 0;
-}
-.form-search .input-prepend .btn {
- -webkit-border-radius: 14px 0 0 14px;
- -moz-border-radius: 14px 0 0 14px;
- border-radius: 14px 0 0 14px;
-}
-.form-search input,
-.form-inline input,
-.form-horizontal input,
-.form-search textarea,
-.form-inline textarea,
-.form-horizontal textarea,
-.form-search select,
-.form-inline select,
-.form-horizontal select,
-.form-search .help-inline,
-.form-inline .help-inline,
-.form-horizontal .help-inline,
-.form-search .uneditable-input,
-.form-inline .uneditable-input,
-.form-horizontal .uneditable-input,
-.form-search .input-prepend,
-.form-inline .input-prepend,
-.form-horizontal .input-prepend,
-.form-search .input-append,
-.form-inline .input-append,
-.form-horizontal .input-append {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
-
- *zoom: 1;
- margin-bottom: 0;
- vertical-align: middle;
-}
-.form-search .hide,
-.form-inline .hide,
-.form-horizontal .hide {
- display: none;
-}
-.form-search label,
-.form-inline label,
-.form-search .btn-group,
-.form-inline .btn-group {
- display: inline-block;
-}
-.form-search .input-append,
-.form-inline .input-append,
-.form-search .input-prepend,
-.form-inline .input-prepend {
- margin-bottom: 0;
-}
-.form-search .radio,
-.form-search .checkbox,
-.form-inline .radio,
-.form-inline .checkbox {
- padding-left: 0;
- margin-bottom: 0;
- vertical-align: middle;
-}
-.form-search .radio input[type="radio"],
-.form-search .checkbox input[type="checkbox"],
-.form-inline .radio input[type="radio"],
-.form-inline .checkbox input[type="checkbox"] {
- float: left;
- margin-right: 3px;
- margin-left: 0;
-}
-.control-group {
- margin-bottom: 10px;
-}
-legend + .control-group {
- margin-top: 20px;
- -webkit-margin-top-collapse: separate;
-}
-.form-horizontal .control-group {
- margin-bottom: 20px;
- *zoom: 1;
-}
-.form-horizontal .control-group:before,
-.form-horizontal .control-group:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.form-horizontal .control-group:after {
- clear: both;
-}
-.form-horizontal .control-label {
- float: left;
- width: 140px;
- padding-top: 5px;
- text-align: right;
-}
-.form-horizontal .controls {
- *display: inline-block;
- *padding-left: 20px;
- margin-left: 160px;
- *margin-left: 0;
-}
-.form-horizontal .controls:first-child {
- *padding-left: 160px;
-}
-.form-horizontal .help-block {
- margin-top: 10px;
- margin-bottom: 0;
-}
-.form-horizontal .form-actions {
- padding-left: 160px;
-}
-.btn {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
-
- *zoom: 1;
- padding: 4px 14px;
- margin-bottom: 0;
- font-size: 14px;
- line-height: 20px;
- *line-height: 20px;
- text-align: center;
- vertical-align: middle;
- cursor: pointer;
- color: #333333;
- text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
- background-color: #f5f5f5;
- background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
- background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
- background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
- background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
- border-color: #e6e6e6 #e6e6e6 #bfbfbf;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #e6e6e6;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- border: 1px solid #bbbbbb;
- *border: 0;
- border-bottom-color: #a2a2a2;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- *margin-left: .3em;
- -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
- -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
- box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
-}
-.btn:hover,
-.btn:active,
-.btn.active,
-.btn.disabled,
-.btn[disabled] {
- color: #333333;
- background-color: #e6e6e6;
- *background-color: #d9d9d9;
-}
-.btn:active,
-.btn.active {
- background-color: #cccccc \9;
-}
-.btn:first-child {
- *margin-left: 0;
-}
-.btn:hover {
- color: #333333;
- text-decoration: none;
- background-color: #e6e6e6;
- *background-color: #d9d9d9;
- /* Buttons in IE7 don't get borders, so darken on hover */
-
- background-position: 0 -15px;
- -webkit-transition: background-position 0.1s linear;
- -moz-transition: background-position 0.1s linear;
- -o-transition: background-position 0.1s linear;
- transition: background-position 0.1s linear;
-}
-.btn:focus {
- outline: thin dotted #333;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-.btn.active,
-.btn:active {
- background-color: #e6e6e6;
- background-color: #d9d9d9 \9;
- background-image: none;
- outline: 0;
- -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
- -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
- box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
-}
-.btn.disabled,
-.btn[disabled] {
- cursor: default;
- background-color: #e6e6e6;
- background-image: none;
- opacity: 0.65;
- filter: alpha(opacity=65);
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
-}
-.btn-large {
- padding: 9px 14px;
- font-size: 16px;
- line-height: normal;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
-}
-.btn-large [class^="icon-"] {
- margin-top: 2px;
-}
-.btn-small {
- padding: 3px 9px;
- font-size: 12px;
- line-height: 18px;
-}
-.btn-small [class^="icon-"] {
- margin-top: 0;
-}
-.btn-mini {
- padding: 2px 6px;
- font-size: 11px;
- line-height: 16px;
-}
-.btn-block {
- display: block;
- width: 100%;
- padding-left: 0;
- padding-right: 0;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-.btn-block + .btn-block {
- margin-top: 5px;
-}
-.btn-primary.active,
-.btn-warning.active,
-.btn-danger.active,
-.btn-success.active,
-.btn-info.active,
-.btn-inverse.active {
- color: rgba(255, 255, 255, 0.75);
-}
-.btn {
- border-color: #c5c5c5;
- border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);
-}
-.btn-primary {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #0e6eb5;
- background-image: -moz-linear-gradient(top, #0e84b5, #0e4cb5);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0e84b5), to(#0e4cb5));
- background-image: -webkit-linear-gradient(top, #0e84b5, #0e4cb5);
- background-image: -o-linear-gradient(top, #0e84b5, #0e4cb5);
- background-image: linear-gradient(to bottom, #0e84b5, #0e4cb5);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0e84b5', endColorstr='#ff0e4cb5', GradientType=0);
- border-color: #0e4cb5 #0e4cb5 #092e6e;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #0e4cb5;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-primary:hover,
-.btn-primary:active,
-.btn-primary.active,
-.btn-primary.disabled,
-.btn-primary[disabled] {
- color: #ffffff;
- background-color: #0e4cb5;
- *background-color: #0c429d;
-}
-.btn-primary:active,
-.btn-primary.active {
- background-color: #0a3886 \9;
-}
-.btn-warning {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #faa732;
- background-image: -moz-linear-gradient(top, #fbb450, #f89406);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
- background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
- background-image: -o-linear-gradient(top, #fbb450, #f89406);
- background-image: linear-gradient(to bottom, #fbb450, #f89406);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
- border-color: #f89406 #f89406 #ad6704;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #f89406;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-warning:hover,
-.btn-warning:active,
-.btn-warning.active,
-.btn-warning.disabled,
-.btn-warning[disabled] {
- color: #ffffff;
- background-color: #f89406;
- *background-color: #df8505;
-}
-.btn-warning:active,
-.btn-warning.active {
- background-color: #c67605 \9;
-}
-.btn-danger {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #da4f49;
- background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
- background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
- background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
- background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
- border-color: #bd362f #bd362f #802420;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #bd362f;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-danger:hover,
-.btn-danger:active,
-.btn-danger.active,
-.btn-danger.disabled,
-.btn-danger[disabled] {
- color: #ffffff;
- background-color: #bd362f;
- *background-color: #a9302a;
-}
-.btn-danger:active,
-.btn-danger.active {
- background-color: #942a25 \9;
-}
-.btn-success {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #5bb75b;
- background-image: -moz-linear-gradient(top, #62c462, #51a351);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
- background-image: -webkit-linear-gradient(top, #62c462, #51a351);
- background-image: -o-linear-gradient(top, #62c462, #51a351);
- background-image: linear-gradient(to bottom, #62c462, #51a351);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
- border-color: #51a351 #51a351 #387038;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #51a351;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-success:hover,
-.btn-success:active,
-.btn-success.active,
-.btn-success.disabled,
-.btn-success[disabled] {
- color: #ffffff;
- background-color: #51a351;
- *background-color: #499249;
-}
-.btn-success:active,
-.btn-success.active {
- background-color: #408140 \9;
-}
-.btn-info {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #49afcd;
- background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
- background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
- background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
- background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
- border-color: #2f96b4 #2f96b4 #1f6377;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #2f96b4;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-info:hover,
-.btn-info:active,
-.btn-info.active,
-.btn-info.disabled,
-.btn-info[disabled] {
- color: #ffffff;
- background-color: #2f96b4;
- *background-color: #2a85a0;
-}
-.btn-info:active,
-.btn-info.active {
- background-color: #24748c \9;
-}
-.btn-inverse {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #363636;
- background-image: -moz-linear-gradient(top, #444444, #222222);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
- background-image: -webkit-linear-gradient(top, #444444, #222222);
- background-image: -o-linear-gradient(top, #444444, #222222);
- background-image: linear-gradient(to bottom, #444444, #222222);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
- border-color: #222222 #222222 #000000;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #222222;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-inverse:hover,
-.btn-inverse:active,
-.btn-inverse.active,
-.btn-inverse.disabled,
-.btn-inverse[disabled] {
- color: #ffffff;
- background-color: #222222;
- *background-color: #151515;
-}
-.btn-inverse:active,
-.btn-inverse.active {
- background-color: #080808 \9;
-}
-button.btn,
-input[type="submit"].btn {
- *padding-top: 3px;
- *padding-bottom: 3px;
-}
-button.btn::-moz-focus-inner,
-input[type="submit"].btn::-moz-focus-inner {
- padding: 0;
- border: 0;
-}
-button.btn.btn-large,
-input[type="submit"].btn.btn-large {
- *padding-top: 7px;
- *padding-bottom: 7px;
-}
-button.btn.btn-small,
-input[type="submit"].btn.btn-small {
- *padding-top: 3px;
- *padding-bottom: 3px;
-}
-button.btn.btn-mini,
-input[type="submit"].btn.btn-mini {
- *padding-top: 1px;
- *padding-bottom: 1px;
-}
-.btn-link,
-.btn-link:active {
- background-color: transparent;
- background-image: none;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
-}
-.btn-link {
- border-color: transparent;
- cursor: pointer;
- color: #0e84b5;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-.btn-link:hover {
- color: #f26a1e;
- text-decoration: underline;
- background-color: transparent;
-}
-[class^="icon-"],
-[class*=" icon-"] {
- display: inline-block;
- width: 14px;
- height: 14px;
- *margin-right: .3em;
- line-height: 14px;
- vertical-align: text-top;
- background-image: url("../img/glyphicons-halflings.png");
- background-position: 14px 14px;
- background-repeat: no-repeat;
- margin-top: 1px;
-}
-/* White icons with optional class, or on hover/active states of certain elements */
-.icon-white,
-.nav > .active > a > [class^="icon-"],
-.nav > .active > a > [class*=" icon-"],
-.dropdown-menu > li > a:hover > [class^="icon-"],
-.dropdown-menu > li > a:hover > [class*=" icon-"],
-.dropdown-menu > .active > a > [class^="icon-"],
-.dropdown-menu > .active > a > [class*=" icon-"] {
- background-image: url("../img/glyphicons-halflings-white.png");
-}
-.icon-glass {
- background-position: 0 0;
-}
-.icon-music {
- background-position: -24px 0;
-}
-.icon-search {
- background-position: -48px 0;
-}
-.icon-envelope {
- background-position: -72px 0;
-}
-.icon-heart {
- background-position: -96px 0;
-}
-.icon-star {
- background-position: -120px 0;
-}
-.icon-star-empty {
- background-position: -144px 0;
-}
-.icon-user {
- background-position: -168px 0;
-}
-.icon-film {
- background-position: -192px 0;
-}
-.icon-th-large {
- background-position: -216px 0;
-}
-.icon-th {
- background-position: -240px 0;
-}
-.icon-th-list {
- background-position: -264px 0;
-}
-.icon-ok {
- background-position: -288px 0;
-}
-.icon-remove {
- background-position: -312px 0;
-}
-.icon-zoom-in {
- background-position: -336px 0;
-}
-.icon-zoom-out {
- background-position: -360px 0;
-}
-.icon-off {
- background-position: -384px 0;
-}
-.icon-signal {
- background-position: -408px 0;
-}
-.icon-cog {
- background-position: -432px 0;
-}
-.icon-trash {
- background-position: -456px 0;
-}
-.icon-home {
- background-position: 0 -24px;
-}
-.icon-file {
- background-position: -24px -24px;
-}
-.icon-time {
- background-position: -48px -24px;
-}
-.icon-road {
- background-position: -72px -24px;
-}
-.icon-download-alt {
- background-position: -96px -24px;
-}
-.icon-download {
- background-position: -120px -24px;
-}
-.icon-upload {
- background-position: -144px -24px;
-}
-.icon-inbox {
- background-position: -168px -24px;
-}
-.icon-play-circle {
- background-position: -192px -24px;
-}
-.icon-repeat {
- background-position: -216px -24px;
-}
-.icon-refresh {
- background-position: -240px -24px;
-}
-.icon-list-alt {
- background-position: -264px -24px;
-}
-.icon-lock {
- background-position: -287px -24px;
-}
-.icon-flag {
- background-position: -312px -24px;
-}
-.icon-headphones {
- background-position: -336px -24px;
-}
-.icon-volume-off {
- background-position: -360px -24px;
-}
-.icon-volume-down {
- background-position: -384px -24px;
-}
-.icon-volume-up {
- background-position: -408px -24px;
-}
-.icon-qrcode {
- background-position: -432px -24px;
-}
-.icon-barcode {
- background-position: -456px -24px;
-}
-.icon-tag {
- background-position: 0 -48px;
-}
-.icon-tags {
- background-position: -25px -48px;
-}
-.icon-book {
- background-position: -48px -48px;
-}
-.icon-bookmark {
- background-position: -72px -48px;
-}
-.icon-print {
- background-position: -96px -48px;
-}
-.icon-camera {
- background-position: -120px -48px;
-}
-.icon-font {
- background-position: -144px -48px;
-}
-.icon-bold {
- background-position: -167px -48px;
-}
-.icon-italic {
- background-position: -192px -48px;
-}
-.icon-text-height {
- background-position: -216px -48px;
-}
-.icon-text-width {
- background-position: -240px -48px;
-}
-.icon-align-left {
- background-position: -264px -48px;
-}
-.icon-align-center {
- background-position: -288px -48px;
-}
-.icon-align-right {
- background-position: -312px -48px;
-}
-.icon-align-justify {
- background-position: -336px -48px;
-}
-.icon-list {
- background-position: -360px -48px;
-}
-.icon-indent-left {
- background-position: -384px -48px;
-}
-.icon-indent-right {
- background-position: -408px -48px;
-}
-.icon-facetime-video {
- background-position: -432px -48px;
-}
-.icon-picture {
- background-position: -456px -48px;
-}
-.icon-pencil {
- background-position: 0 -72px;
-}
-.icon-map-marker {
- background-position: -24px -72px;
-}
-.icon-adjust {
- background-position: -48px -72px;
-}
-.icon-tint {
- background-position: -72px -72px;
-}
-.icon-edit {
- background-position: -96px -72px;
-}
-.icon-share {
- background-position: -120px -72px;
-}
-.icon-check {
- background-position: -144px -72px;
-}
-.icon-move {
- background-position: -168px -72px;
-}
-.icon-step-backward {
- background-position: -192px -72px;
-}
-.icon-fast-backward {
- background-position: -216px -72px;
-}
-.icon-backward {
- background-position: -240px -72px;
-}
-.icon-play {
- background-position: -264px -72px;
-}
-.icon-pause {
- background-position: -288px -72px;
-}
-.icon-stop {
- background-position: -312px -72px;
-}
-.icon-forward {
- background-position: -336px -72px;
-}
-.icon-fast-forward {
- background-position: -360px -72px;
-}
-.icon-step-forward {
- background-position: -384px -72px;
-}
-.icon-eject {
- background-position: -408px -72px;
-}
-.icon-chevron-left {
- background-position: -432px -72px;
-}
-.icon-chevron-right {
- background-position: -456px -72px;
-}
-.icon-plus-sign {
- background-position: 0 -96px;
-}
-.icon-minus-sign {
- background-position: -24px -96px;
-}
-.icon-remove-sign {
- background-position: -48px -96px;
-}
-.icon-ok-sign {
- background-position: -72px -96px;
-}
-.icon-question-sign {
- background-position: -96px -96px;
-}
-.icon-info-sign {
- background-position: -120px -96px;
-}
-.icon-screenshot {
- background-position: -144px -96px;
-}
-.icon-remove-circle {
- background-position: -168px -96px;
-}
-.icon-ok-circle {
- background-position: -192px -96px;
-}
-.icon-ban-circle {
- background-position: -216px -96px;
-}
-.icon-arrow-left {
- background-position: -240px -96px;
-}
-.icon-arrow-right {
- background-position: -264px -96px;
-}
-.icon-arrow-up {
- background-position: -289px -96px;
-}
-.icon-arrow-down {
- background-position: -312px -96px;
-}
-.icon-share-alt {
- background-position: -336px -96px;
-}
-.icon-resize-full {
- background-position: -360px -96px;
-}
-.icon-resize-small {
- background-position: -384px -96px;
-}
-.icon-plus {
- background-position: -408px -96px;
-}
-.icon-minus {
- background-position: -433px -96px;
-}
-.icon-asterisk {
- background-position: -456px -96px;
-}
-.icon-exclamation-sign {
- background-position: 0 -120px;
-}
-.icon-gift {
- background-position: -24px -120px;
-}
-.icon-leaf {
- background-position: -48px -120px;
-}
-.icon-fire {
- background-position: -72px -120px;
-}
-.icon-eye-open {
- background-position: -96px -120px;
-}
-.icon-eye-close {
- background-position: -120px -120px;
-}
-.icon-warning-sign {
- background-position: -144px -120px;
-}
-.icon-plane {
- background-position: -168px -120px;
-}
-.icon-calendar {
- background-position: -192px -120px;
-}
-.icon-random {
- background-position: -216px -120px;
- width: 16px;
-}
-.icon-comment {
- background-position: -240px -120px;
-}
-.icon-magnet {
- background-position: -264px -120px;
-}
-.icon-chevron-up {
- background-position: -288px -120px;
-}
-.icon-chevron-down {
- background-position: -313px -119px;
-}
-.icon-retweet {
- background-position: -336px -120px;
-}
-.icon-shopping-cart {
- background-position: -360px -120px;
-}
-.icon-folder-close {
- background-position: -384px -120px;
-}
-.icon-folder-open {
- background-position: -408px -120px;
- width: 16px;
-}
-.icon-resize-vertical {
- background-position: -432px -119px;
-}
-.icon-resize-horizontal {
- background-position: -456px -118px;
-}
-.icon-hdd {
- background-position: 0 -144px;
-}
-.icon-bullhorn {
- background-position: -24px -144px;
-}
-.icon-bell {
- background-position: -48px -144px;
-}
-.icon-certificate {
- background-position: -72px -144px;
-}
-.icon-thumbs-up {
- background-position: -96px -144px;
-}
-.icon-thumbs-down {
- background-position: -120px -144px;
-}
-.icon-hand-right {
- background-position: -144px -144px;
-}
-.icon-hand-left {
- background-position: -168px -144px;
-}
-.icon-hand-up {
- background-position: -192px -144px;
-}
-.icon-hand-down {
- background-position: -216px -144px;
-}
-.icon-circle-arrow-right {
- background-position: -240px -144px;
-}
-.icon-circle-arrow-left {
- background-position: -264px -144px;
-}
-.icon-circle-arrow-up {
- background-position: -288px -144px;
-}
-.icon-circle-arrow-down {
- background-position: -312px -144px;
-}
-.icon-globe {
- background-position: -336px -144px;
-}
-.icon-wrench {
- background-position: -360px -144px;
-}
-.icon-tasks {
- background-position: -384px -144px;
-}
-.icon-filter {
- background-position: -408px -144px;
-}
-.icon-briefcase {
- background-position: -432px -144px;
-}
-.icon-fullscreen {
- background-position: -456px -144px;
-}
-.btn-group {
- position: relative;
- font-size: 0;
- white-space: nowrap;
- *margin-left: .3em;
-}
-.btn-group:first-child {
- *margin-left: 0;
-}
-.btn-group + .btn-group {
- margin-left: 5px;
-}
-.btn-toolbar {
- font-size: 0;
- margin-top: 10px;
- margin-bottom: 10px;
-}
-.btn-toolbar .btn-group {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
-
- *zoom: 1;
-}
-.btn-toolbar .btn + .btn,
-.btn-toolbar .btn-group + .btn,
-.btn-toolbar .btn + .btn-group {
- margin-left: 5px;
-}
-.btn-group > .btn {
- position: relative;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-.btn-group > .btn + .btn {
- margin-left: -1px;
-}
-.btn-group > .btn,
-.btn-group > .dropdown-menu {
- font-size: 14px;
-}
-.btn-group > .btn-mini {
- font-size: 11px;
-}
-.btn-group > .btn-small {
- font-size: 12px;
-}
-.btn-group > .btn-large {
- font-size: 16px;
-}
-.btn-group > .btn:first-child {
- margin-left: 0;
- -webkit-border-top-left-radius: 4px;
- -moz-border-radius-topleft: 4px;
- border-top-left-radius: 4px;
- -webkit-border-bottom-left-radius: 4px;
- -moz-border-radius-bottomleft: 4px;
- border-bottom-left-radius: 4px;
-}
-.btn-group > .btn:last-child,
-.btn-group > .dropdown-toggle {
- -webkit-border-top-right-radius: 4px;
- -moz-border-radius-topright: 4px;
- border-top-right-radius: 4px;
- -webkit-border-bottom-right-radius: 4px;
- -moz-border-radius-bottomright: 4px;
- border-bottom-right-radius: 4px;
-}
-.btn-group > .btn.large:first-child {
- margin-left: 0;
- -webkit-border-top-left-radius: 6px;
- -moz-border-radius-topleft: 6px;
- border-top-left-radius: 6px;
- -webkit-border-bottom-left-radius: 6px;
- -moz-border-radius-bottomleft: 6px;
- border-bottom-left-radius: 6px;
-}
-.btn-group > .btn.large:last-child,
-.btn-group > .large.dropdown-toggle {
- -webkit-border-top-right-radius: 6px;
- -moz-border-radius-topright: 6px;
- border-top-right-radius: 6px;
- -webkit-border-bottom-right-radius: 6px;
- -moz-border-radius-bottomright: 6px;
- border-bottom-right-radius: 6px;
-}
-.btn-group > .btn:hover,
-.btn-group > .btn:focus,
-.btn-group > .btn:active,
-.btn-group > .btn.active {
- z-index: 2;
-}
-.btn-group .dropdown-toggle:active,
-.btn-group.open .dropdown-toggle {
- outline: 0;
-}
-.btn-group > .btn + .dropdown-toggle {
- padding-left: 8px;
- padding-right: 8px;
- -webkit-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
- -moz-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
- box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
- *padding-top: 5px;
- *padding-bottom: 5px;
-}
-.btn-group > .btn-mini + .dropdown-toggle {
- padding-left: 5px;
- padding-right: 5px;
- *padding-top: 2px;
- *padding-bottom: 2px;
-}
-.btn-group > .btn-small + .dropdown-toggle {
- *padding-top: 5px;
- *padding-bottom: 4px;
-}
-.btn-group > .btn-large + .dropdown-toggle {
- padding-left: 12px;
- padding-right: 12px;
- *padding-top: 7px;
- *padding-bottom: 7px;
-}
-.btn-group.open .dropdown-toggle {
- background-image: none;
- -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
- -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
- box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
-}
-.btn-group.open .btn.dropdown-toggle {
- background-color: #e6e6e6;
-}
-.btn-group.open .btn-primary.dropdown-toggle {
- background-color: #0e4cb5;
-}
-.btn-group.open .btn-warning.dropdown-toggle {
- background-color: #f89406;
-}
-.btn-group.open .btn-danger.dropdown-toggle {
- background-color: #bd362f;
-}
-.btn-group.open .btn-success.dropdown-toggle {
- background-color: #51a351;
-}
-.btn-group.open .btn-info.dropdown-toggle {
- background-color: #2f96b4;
-}
-.btn-group.open .btn-inverse.dropdown-toggle {
- background-color: #222222;
-}
-.btn .caret {
- margin-top: 8px;
- margin-left: 0;
-}
-.btn-mini .caret,
-.btn-small .caret,
-.btn-large .caret {
- margin-top: 6px;
-}
-.btn-large .caret {
- border-left-width: 5px;
- border-right-width: 5px;
- border-top-width: 5px;
-}
-.dropup .btn-large .caret {
- border-bottom: 5px solid #000000;
- border-top: 0;
-}
-.btn-primary .caret,
-.btn-warning .caret,
-.btn-danger .caret,
-.btn-info .caret,
-.btn-success .caret,
-.btn-inverse .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
-}
-.btn-group-vertical {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
-
- *zoom: 1;
-}
-.btn-group-vertical .btn {
- display: block;
- float: none;
- width: 100%;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-.btn-group-vertical .btn + .btn {
- margin-left: 0;
- margin-top: -1px;
-}
-.btn-group-vertical .btn:first-child {
- -webkit-border-radius: 4px 4px 0 0;
- -moz-border-radius: 4px 4px 0 0;
- border-radius: 4px 4px 0 0;
-}
-.btn-group-vertical .btn:last-child {
- -webkit-border-radius: 0 0 4px 4px;
- -moz-border-radius: 0 0 4px 4px;
- border-radius: 0 0 4px 4px;
-}
-.btn-group-vertical .btn-large:first-child {
- -webkit-border-radius: 6px 6px 0 0;
- -moz-border-radius: 6px 6px 0 0;
- border-radius: 6px 6px 0 0;
-}
-.btn-group-vertical .btn-large:last-child {
- -webkit-border-radius: 0 0 6px 6px;
- -moz-border-radius: 0 0 6px 6px;
- border-radius: 0 0 6px 6px;
-}
-.nav {
- margin-left: 0;
- margin-bottom: 20px;
- list-style: none;
-}
-.nav > li > a {
- display: block;
-}
-.nav > li > a:hover {
- text-decoration: none;
- background-color: #eeeeee;
-}
-.nav > .pull-right {
- float: right;
-}
-.nav-header {
- display: block;
- padding: 3px 15px;
- font-size: 11px;
- font-weight: bold;
- line-height: 20px;
- color: #999999;
- text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
- text-transform: uppercase;
-}
-.nav li + .nav-header {
- margin-top: 9px;
-}
-.nav-list {
- padding-left: 15px;
- padding-right: 15px;
- margin-bottom: 0;
-}
-.nav-list > li > a,
-.nav-list .nav-header {
- margin-left: -15px;
- margin-right: -15px;
- text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-}
-.nav-list > li > a {
- padding: 3px 15px;
-}
-.nav-list > .active > a,
-.nav-list > .active > a:hover {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
- background-color: #0e84b5;
-}
-.nav-list [class^="icon-"] {
- margin-right: 2px;
-}
-.nav-list .divider {
- *width: 100%;
- height: 1px;
- margin: 9px 1px;
- *margin: -5px 0 5px;
- overflow: hidden;
- background-color: #e5e5e5;
- border-bottom: 1px solid #ffffff;
-}
-.nav-tabs,
-.nav-pills {
- *zoom: 1;
-}
-.nav-tabs:before,
-.nav-pills:before,
-.nav-tabs:after,
-.nav-pills:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.nav-tabs:after,
-.nav-pills:after {
- clear: both;
-}
-.nav-tabs > li,
-.nav-pills > li {
- float: left;
-}
-.nav-tabs > li > a,
-.nav-pills > li > a {
- padding-right: 12px;
- padding-left: 12px;
- margin-right: 2px;
- line-height: 14px;
-}
-.nav-tabs {
- border-bottom: 1px solid #ddd;
-}
-.nav-tabs > li {
- margin-bottom: -1px;
-}
-.nav-tabs > li > a {
- padding-top: 8px;
- padding-bottom: 8px;
- line-height: 20px;
- border: 1px solid transparent;
- -webkit-border-radius: 4px 4px 0 0;
- -moz-border-radius: 4px 4px 0 0;
- border-radius: 4px 4px 0 0;
-}
-.nav-tabs > li > a:hover {
- border-color: #eeeeee #eeeeee #dddddd;
-}
-.nav-tabs > .active > a,
-.nav-tabs > .active > a:hover {
- color: #555555;
- background-color: #ffffff;
- border: 1px solid #ddd;
- border-bottom-color: transparent;
- cursor: default;
-}
-.nav-pills > li > a {
- padding-top: 8px;
- padding-bottom: 8px;
- margin-top: 2px;
- margin-bottom: 2px;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
-}
-.nav-pills > .active > a,
-.nav-pills > .active > a:hover {
- color: #ffffff;
- background-color: #0e84b5;
-}
-.nav-stacked > li {
- float: none;
-}
-.nav-stacked > li > a {
- margin-right: 0;
-}
-.nav-tabs.nav-stacked {
- border-bottom: 0;
-}
-.nav-tabs.nav-stacked > li > a {
- border: 1px solid #ddd;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-.nav-tabs.nav-stacked > li:first-child > a {
- -webkit-border-top-right-radius: 4px;
- -moz-border-radius-topright: 4px;
- border-top-right-radius: 4px;
- -webkit-border-top-left-radius: 4px;
- -moz-border-radius-topleft: 4px;
- border-top-left-radius: 4px;
-}
-.nav-tabs.nav-stacked > li:last-child > a {
- -webkit-border-bottom-right-radius: 4px;
- -moz-border-radius-bottomright: 4px;
- border-bottom-right-radius: 4px;
- -webkit-border-bottom-left-radius: 4px;
- -moz-border-radius-bottomleft: 4px;
- border-bottom-left-radius: 4px;
-}
-.nav-tabs.nav-stacked > li > a:hover {
- border-color: #ddd;
- z-index: 2;
-}
-.nav-pills.nav-stacked > li > a {
- margin-bottom: 3px;
-}
-.nav-pills.nav-stacked > li:last-child > a {
- margin-bottom: 1px;
-}
-.nav-tabs .dropdown-menu {
- -webkit-border-radius: 0 0 6px 6px;
- -moz-border-radius: 0 0 6px 6px;
- border-radius: 0 0 6px 6px;
-}
-.nav-pills .dropdown-menu {
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
-}
-.nav .dropdown-toggle .caret {
- border-top-color: #0e84b5;
- border-bottom-color: #0e84b5;
- margin-top: 6px;
-}
-.nav .dropdown-toggle:hover .caret {
- border-top-color: #f26a1e;
- border-bottom-color: #f26a1e;
-}
-/* move down carets for tabs */
-.nav-tabs .dropdown-toggle .caret {
- margin-top: 8px;
-}
-.nav .active .dropdown-toggle .caret {
- border-top-color: #fff;
- border-bottom-color: #fff;
-}
-.nav-tabs .active .dropdown-toggle .caret {
- border-top-color: #555555;
- border-bottom-color: #555555;
-}
-.nav > .dropdown.active > a:hover {
- cursor: pointer;
-}
-.nav-tabs .open .dropdown-toggle,
-.nav-pills .open .dropdown-toggle,
-.nav > li.dropdown.open.active > a:hover {
- color: #ffffff;
- background-color: #999999;
- border-color: #999999;
-}
-.nav li.dropdown.open .caret,
-.nav li.dropdown.open.active .caret,
-.nav li.dropdown.open a:hover .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
- opacity: 1;
- filter: alpha(opacity=100);
-}
-.tabs-stacked .open > a:hover {
- border-color: #999999;
-}
-.tabbable {
- *zoom: 1;
-}
-.tabbable:before,
-.tabbable:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.tabbable:after {
- clear: both;
-}
-.tab-content {
- overflow: auto;
-}
-.tabs-below > .nav-tabs,
-.tabs-right > .nav-tabs,
-.tabs-left > .nav-tabs {
- border-bottom: 0;
-}
-.tab-content > .tab-pane,
-.pill-content > .pill-pane {
- display: none;
-}
-.tab-content > .active,
-.pill-content > .active {
- display: block;
-}
-.tabs-below > .nav-tabs {
- border-top: 1px solid #ddd;
-}
-.tabs-below > .nav-tabs > li {
- margin-top: -1px;
- margin-bottom: 0;
-}
-.tabs-below > .nav-tabs > li > a {
- -webkit-border-radius: 0 0 4px 4px;
- -moz-border-radius: 0 0 4px 4px;
- border-radius: 0 0 4px 4px;
-}
-.tabs-below > .nav-tabs > li > a:hover {
- border-bottom-color: transparent;
- border-top-color: #ddd;
-}
-.tabs-below > .nav-tabs > .active > a,
-.tabs-below > .nav-tabs > .active > a:hover {
- border-color: transparent #ddd #ddd #ddd;
-}
-.tabs-left > .nav-tabs > li,
-.tabs-right > .nav-tabs > li {
- float: none;
-}
-.tabs-left > .nav-tabs > li > a,
-.tabs-right > .nav-tabs > li > a {
- min-width: 74px;
- margin-right: 0;
- margin-bottom: 3px;
-}
-.tabs-left > .nav-tabs {
- float: left;
- margin-right: 19px;
- border-right: 1px solid #ddd;
-}
-.tabs-left > .nav-tabs > li > a {
- margin-right: -1px;
- -webkit-border-radius: 4px 0 0 4px;
- -moz-border-radius: 4px 0 0 4px;
- border-radius: 4px 0 0 4px;
-}
-.tabs-left > .nav-tabs > li > a:hover {
- border-color: #eeeeee #dddddd #eeeeee #eeeeee;
-}
-.tabs-left > .nav-tabs .active > a,
-.tabs-left > .nav-tabs .active > a:hover {
- border-color: #ddd transparent #ddd #ddd;
- *border-right-color: #ffffff;
-}
-.tabs-right > .nav-tabs {
- float: right;
- margin-left: 19px;
- border-left: 1px solid #ddd;
-}
-.tabs-right > .nav-tabs > li > a {
- margin-left: -1px;
- -webkit-border-radius: 0 4px 4px 0;
- -moz-border-radius: 0 4px 4px 0;
- border-radius: 0 4px 4px 0;
-}
-.tabs-right > .nav-tabs > li > a:hover {
- border-color: #eeeeee #eeeeee #eeeeee #dddddd;
-}
-.tabs-right > .nav-tabs .active > a,
-.tabs-right > .nav-tabs .active > a:hover {
- border-color: #ddd #ddd #ddd transparent;
- *border-left-color: #ffffff;
-}
-.nav > .disabled > a {
- color: #999999;
-}
-.nav > .disabled > a:hover {
- text-decoration: none;
- background-color: transparent;
- cursor: default;
-}
-.navbar {
- overflow: visible;
- margin-bottom: 20px;
- color: #0e84b5;
- *position: relative;
- *z-index: 2;
-}
-.navbar-inner {
- min-height: 40px;
- padding-left: 20px;
- padding-right: 20px;
- background-color: #ffffff;
- background-image: -moz-linear-gradient(top, #ffffff, #ffffff);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#ffffff));
- background-image: -webkit-linear-gradient(top, #ffffff, #ffffff);
- background-image: -o-linear-gradient(top, #ffffff, #ffffff);
- background-image: linear-gradient(to bottom, #ffffff, #ffffff);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffffffff', GradientType=0);
- border: 1px solid #e0e0e0;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
- -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-}
-.navbar .container {
- width: auto;
-}
-.nav-collapse.collapse {
- height: auto;
-}
-.navbar .brand {
- float: left;
- display: block;
- padding: 10px 20px 10px;
- margin-left: -20px;
- font-size: 20px;
- font-weight: 200;
- color: #0e84b5;
- text-shadow: 0 1px 0 #ffffff;
-}
-.navbar .brand:hover {
- text-decoration: none;
-}
-.navbar-text {
- margin-bottom: 0;
- line-height: 40px;
-}
-.navbar-link {
- color: #0e84b5;
-}
-.navbar-link:hover {
- color: #f26a1e;
-}
-.navbar .divider-vertical {
- height: 40px;
- margin: 0 9px;
- border-left: 1px solid #ffffff;
- border-right: 1px solid #ffffff;
-}
-.navbar .btn,
-.navbar .btn-group {
- margin-top: 6px;
-}
-.navbar .btn-group .btn {
- margin: 0;
-}
-.navbar-form {
- margin-bottom: 0;
- *zoom: 1;
-}
-.navbar-form:before,
-.navbar-form:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.navbar-form:after {
- clear: both;
-}
-.navbar-form input,
-.navbar-form select,
-.navbar-form .radio,
-.navbar-form .checkbox {
- margin-top: 5px;
-}
-.navbar-form input,
-.navbar-form select,
-.navbar-form .btn {
- display: inline-block;
- margin-bottom: 0;
-}
-.navbar-form input[type="image"],
-.navbar-form input[type="checkbox"],
-.navbar-form input[type="radio"] {
- margin-top: 3px;
-}
-.navbar-form .input-append,
-.navbar-form .input-prepend {
- margin-top: 6px;
- white-space: nowrap;
-}
-.navbar-form .input-append input,
-.navbar-form .input-prepend input {
- margin-top: 0;
-}
-.navbar-search {
- position: relative;
- float: left;
- margin-top: 5px;
- margin-bottom: 0;
-}
-.navbar-search .search-query {
- margin-bottom: 0;
- padding: 4px 14px;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 13px;
- font-weight: normal;
- line-height: 1;
- -webkit-border-radius: 15px;
- -moz-border-radius: 15px;
- border-radius: 15px;
-}
-.navbar-static-top {
- position: static;
- width: 100%;
- margin-bottom: 0;
-}
-.navbar-static-top .navbar-inner {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-.navbar-fixed-top,
-.navbar-fixed-bottom {
- position: fixed;
- right: 0;
- left: 0;
- z-index: 1030;
- margin-bottom: 0;
-}
-.navbar-fixed-top .navbar-inner,
-.navbar-fixed-bottom .navbar-inner,
-.navbar-static-top .navbar-inner {
- border: 0;
-}
-.navbar-fixed-top .navbar-inner,
-.navbar-fixed-bottom .navbar-inner {
- padding-left: 0;
- padding-right: 0;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
- width: 940px;
-}
-.navbar-fixed-top {
- top: 0;
-}
-.navbar-fixed-top .navbar-inner,
-.navbar-static-top .navbar-inner {
- -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);
- -moz-box-shadow: inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);
- box-shadow: inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);
-}
-.navbar-fixed-bottom {
- bottom: 0;
-}
-.navbar-fixed-bottom .navbar-inner {
- -webkit-box-shadow: inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);
- -moz-box-shadow: inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);
- box-shadow: inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);
-}
-.navbar .nav {
- position: relative;
- left: 0;
- display: block;
- float: left;
- margin: 0 10px 0 0;
-}
-.navbar .nav.pull-right {
- float: right;
-}
-.navbar .nav > li {
- float: left;
-}
-.navbar .nav > li > a {
- float: none;
- padding: 10px 15px 10px;
- color: #0e84b5;
- text-decoration: none;
- text-shadow: 0 1px 0 #ffffff;
-}
-.navbar .nav .dropdown-toggle .caret {
- margin-top: 8px;
-}
-.navbar .nav > li > a:focus,
-.navbar .nav > li > a:hover {
- background-color: transparent;
- color: #f26a1e;
- text-decoration: none;
-}
-.navbar .nav > .active > a,
-.navbar .nav > .active > a:hover,
-.navbar .nav > .active > a:focus {
- color: #f26a1e;
- text-decoration: none;
- background-color: #f2f2f2;
- -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
- -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
- box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-}
-.navbar .btn-navbar {
- display: none;
- float: right;
- padding: 7px 10px;
- margin-left: 5px;
- margin-right: 5px;
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #f2f2f2;
- background-image: -moz-linear-gradient(top, #f2f2f2, #f2f2f2);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#f2f2f2));
- background-image: -webkit-linear-gradient(top, #f2f2f2, #f2f2f2);
- background-image: -o-linear-gradient(top, #f2f2f2, #f2f2f2);
- background-image: linear-gradient(to bottom, #f2f2f2, #f2f2f2);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#fff2f2f2', GradientType=0);
- border-color: #f2f2f2 #f2f2f2 #cccccc;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #f2f2f2;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
- -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
- box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
-}
-.navbar .btn-navbar:hover,
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active,
-.navbar .btn-navbar.disabled,
-.navbar .btn-navbar[disabled] {
- color: #ffffff;
- background-color: #f2f2f2;
- *background-color: #e5e5e5;
-}
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active {
- background-color: #d9d9d9 \9;
-}
-.navbar .btn-navbar .icon-bar {
- display: block;
- width: 18px;
- height: 2px;
- background-color: #f5f5f5;
- -webkit-border-radius: 1px;
- -moz-border-radius: 1px;
- border-radius: 1px;
- -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
- -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
- box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-}
-.btn-navbar .icon-bar + .icon-bar {
- margin-top: 3px;
-}
-.navbar .nav > li > .dropdown-menu:before {
- content: '';
- display: inline-block;
- border-left: 7px solid transparent;
- border-right: 7px solid transparent;
- border-bottom: 7px solid #ccc;
- border-bottom-color: rgba(0, 0, 0, 0.2);
- position: absolute;
- top: -7px;
- left: 9px;
-}
-.navbar .nav > li > .dropdown-menu:after {
- content: '';
- display: inline-block;
- border-left: 6px solid transparent;
- border-right: 6px solid transparent;
- border-bottom: 6px solid #ffffff;
- position: absolute;
- top: -6px;
- left: 10px;
-}
-.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
- border-top: 7px solid #ccc;
- border-top-color: rgba(0, 0, 0, 0.2);
- border-bottom: 0;
- bottom: -7px;
- top: auto;
-}
-.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
- border-top: 6px solid #ffffff;
- border-bottom: 0;
- bottom: -6px;
- top: auto;
-}
-.navbar .nav li.dropdown.open > .dropdown-toggle,
-.navbar .nav li.dropdown.active > .dropdown-toggle,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle {
- background-color: #f2f2f2;
- color: #f26a1e;
-}
-.navbar .nav li.dropdown > .dropdown-toggle .caret {
- border-top-color: #0e84b5;
- border-bottom-color: #0e84b5;
-}
-.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
- border-top-color: #f26a1e;
- border-bottom-color: #f26a1e;
-}
-.navbar .pull-right > li > .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right {
- left: auto;
- right: 0;
-}
-.navbar .pull-right > li > .dropdown-menu:before,
-.navbar .nav > li > .dropdown-menu.pull-right:before {
- left: auto;
- right: 12px;
-}
-.navbar .pull-right > li > .dropdown-menu:after,
-.navbar .nav > li > .dropdown-menu.pull-right:after {
- left: auto;
- right: 13px;
-}
-.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
- left: auto;
- right: 100%;
- margin-left: 0;
- margin-right: -1px;
- -webkit-border-radius: 6px 0 6px 6px;
- -moz-border-radius: 6px 0 6px 6px;
- border-radius: 6px 0 6px 6px;
-}
-.navbar-inverse {
- color: #999999;
-}
-.navbar-inverse .navbar-inner {
- background-color: #1b1b1b;
- background-image: -moz-linear-gradient(top, #222222, #111111);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
- background-image: -webkit-linear-gradient(top, #222222, #111111);
- background-image: -o-linear-gradient(top, #222222, #111111);
- background-image: linear-gradient(to bottom, #222222, #111111);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
- border-color: #252525;
-}
-.navbar-inverse .brand,
-.navbar-inverse .nav > li > a {
- color: #999999;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-}
-.navbar-inverse .brand:hover,
-.navbar-inverse .nav > li > a:hover {
- color: #ffffff;
-}
-.navbar-inverse .nav > li > a:focus,
-.navbar-inverse .nav > li > a:hover {
- background-color: transparent;
- color: #ffffff;
-}
-.navbar-inverse .nav .active > a,
-.navbar-inverse .nav .active > a:hover,
-.navbar-inverse .nav .active > a:focus {
- color: #ffffff;
- background-color: #111111;
-}
-.navbar-inverse .navbar-link {
- color: #999999;
-}
-.navbar-inverse .navbar-link:hover {
- color: #ffffff;
-}
-.navbar-inverse .divider-vertical {
- border-left-color: #111111;
- border-right-color: #222222;
-}
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
- background-color: #111111;
- color: #ffffff;
-}
-.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
- border-top-color: #999999;
- border-bottom-color: #999999;
-}
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
-}
-.navbar-inverse .navbar-search .search-query {
- color: #ffffff;
- background-color: #515151;
- border-color: #111111;
- -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
- -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
- box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
- -webkit-transition: none;
- -moz-transition: none;
- -o-transition: none;
- transition: none;
-}
-.navbar-inverse .navbar-search .search-query:-moz-placeholder {
- color: #cccccc;
-}
-.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
- color: #cccccc;
-}
-.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
- color: #cccccc;
-}
-.navbar-inverse .navbar-search .search-query:focus,
-.navbar-inverse .navbar-search .search-query.focused {
- padding: 5px 15px;
- color: #333333;
- text-shadow: 0 1px 0 #ffffff;
- background-color: #ffffff;
- border: 0;
- -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
- -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
- box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
- outline: 0;
-}
-.navbar-inverse .btn-navbar {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #0e0e0e;
- background-image: -moz-linear-gradient(top, #151515, #040404);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
- background-image: -webkit-linear-gradient(top, #151515, #040404);
- background-image: -o-linear-gradient(top, #151515, #040404);
- background-image: linear-gradient(to bottom, #151515, #040404);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
- border-color: #040404 #040404 #000000;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #040404;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.navbar-inverse .btn-navbar:hover,
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active,
-.navbar-inverse .btn-navbar.disabled,
-.navbar-inverse .btn-navbar[disabled] {
- color: #ffffff;
- background-color: #040404;
- *background-color: #000000;
-}
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active {
- background-color: #000000 \9;
-}
-.breadcrumb {
- padding: 8px 15px;
- margin: 0 0 20px;
- list-style: none;
- background-color: #f5f5f5;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-.breadcrumb li {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
-
- *zoom: 1;
- text-shadow: 0 1px 0 #ffffff;
-}
-.breadcrumb .divider {
- padding: 0 5px;
- color: #ccc;
-}
-.breadcrumb .active {
- color: #999999;
-}
-.pagination {
- height: 40px;
- margin: 20px 0;
-}
-.pagination ul {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
-
- *zoom: 1;
- margin-left: 0;
- margin-bottom: 0;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-.pagination li {
- display: inline;
-}
-.pagination a,
-.pagination span {
- float: left;
- padding: 0 14px;
- line-height: 38px;
- text-decoration: none;
- background-color: #ffffff;
- border: 1px solid #dddddd;
- border-left-width: 0;
-}
-.pagination a:hover,
-.pagination .active a,
-.pagination .active span {
- background-color: #f5f5f5;
-}
-.pagination .active a,
-.pagination .active span {
- color: #999999;
- cursor: default;
-}
-.pagination .disabled span,
-.pagination .disabled a,
-.pagination .disabled a:hover {
- color: #999999;
- background-color: transparent;
- cursor: default;
-}
-.pagination li:first-child a,
-.pagination li:first-child span {
- border-left-width: 1px;
- -webkit-border-radius: 3px 0 0 3px;
- -moz-border-radius: 3px 0 0 3px;
- border-radius: 3px 0 0 3px;
-}
-.pagination li:last-child a,
-.pagination li:last-child span {
- -webkit-border-radius: 0 3px 3px 0;
- -moz-border-radius: 0 3px 3px 0;
- border-radius: 0 3px 3px 0;
-}
-.pagination-centered {
- text-align: center;
-}
-.pagination-right {
- text-align: right;
-}
-.pager {
- margin: 20px 0;
- list-style: none;
- text-align: center;
- *zoom: 1;
-}
-.pager:before,
-.pager:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.pager:after {
- clear: both;
-}
-.pager li {
- display: inline;
-}
-.pager a {
- display: inline-block;
- padding: 5px 14px;
- background-color: #fff;
- border: 1px solid #ddd;
- -webkit-border-radius: 15px;
- -moz-border-radius: 15px;
- border-radius: 15px;
-}
-.pager a:hover {
- text-decoration: none;
- background-color: #f5f5f5;
-}
-.pager .next a {
- float: right;
-}
-.pager .previous a {
- float: left;
-}
-.pager .disabled a,
-.pager .disabled a:hover {
- color: #999999;
- background-color: #fff;
- cursor: default;
-}
-.thumbnails {
- margin-left: -20px;
- list-style: none;
- *zoom: 1;
-}
-.thumbnails:before,
-.thumbnails:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.thumbnails:after {
- clear: both;
-}
-.row-fluid .thumbnails {
- margin-left: 0;
-}
-.thumbnails > li {
- float: left;
- margin-bottom: 20px;
- margin-left: 20px;
-}
-.thumbnail {
- display: block;
- padding: 4px;
- line-height: 20px;
- border: 1px solid #ddd;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
- -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
- -webkit-transition: all 0.2s ease-in-out;
- -moz-transition: all 0.2s ease-in-out;
- -o-transition: all 0.2s ease-in-out;
- transition: all 0.2s ease-in-out;
-}
-a.thumbnail:hover {
- border-color: #0e84b5;
- -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
- -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
- box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-}
-.thumbnail > img {
- display: block;
- max-width: 100%;
- margin-left: auto;
- margin-right: auto;
-}
-.thumbnail .caption {
- padding: 9px;
- color: #555555;
-}
-.alert {
- padding: 8px 35px 8px 14px;
- margin-bottom: 20px;
- text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
- background-color: #fcf8e3;
- border: 1px solid #fbeed5;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- color: #c09853;
-}
-.alert h4 {
- margin: 0;
-}
-.alert .close {
- position: relative;
- top: -2px;
- right: -21px;
- line-height: 20px;
-}
-.alert-success {
- background-color: #dff0d8;
- border-color: #d6e9c6;
- color: #468847;
-}
-.alert-danger,
-.alert-error {
- background-color: #f2dede;
- border-color: #eed3d7;
- color: #b94a48;
-}
-.alert-info {
- background-color: #d9edf7;
- border-color: #bce8f1;
- color: #3a87ad;
-}
-.alert-block {
- padding-top: 14px;
- padding-bottom: 14px;
-}
-.alert-block > p,
-.alert-block > ul {
- margin-bottom: 0;
-}
-.alert-block p + p {
- margin-top: 5px;
-}
- at -webkit-keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
- at -moz-keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
- at -ms-keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
- at -o-keyframes progress-bar-stripes {
- from {
- background-position: 0 0;
- }
- to {
- background-position: 40px 0;
- }
-}
- at keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
-.progress {
- overflow: hidden;
- height: 20px;
- margin-bottom: 20px;
- background-color: #f7f7f7;
- background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
- background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
- background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
- background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
- -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
- -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-.progress .bar {
- width: 0%;
- height: 100%;
- color: #ffffff;
- float: left;
- font-size: 12px;
- text-align: center;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #0e90d2;
- background-image: -moz-linear-gradient(top, #149bdf, #0480be);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
- background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
- background-image: -o-linear-gradient(top, #149bdf, #0480be);
- background-image: linear-gradient(to bottom, #149bdf, #0480be);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
- -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
- -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
- box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- -webkit-transition: width 0.6s ease;
- -moz-transition: width 0.6s ease;
- -o-transition: width 0.6s ease;
- transition: width 0.6s ease;
-}
-.progress .bar + .bar {
- -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
- -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
- box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
-}
-.progress-striped .bar {
- background-color: #149bdf;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- -webkit-background-size: 40px 40px;
- -moz-background-size: 40px 40px;
- -o-background-size: 40px 40px;
- background-size: 40px 40px;
-}
-.progress.active .bar {
- -webkit-animation: progress-bar-stripes 2s linear infinite;
- -moz-animation: progress-bar-stripes 2s linear infinite;
- -ms-animation: progress-bar-stripes 2s linear infinite;
- -o-animation: progress-bar-stripes 2s linear infinite;
- animation: progress-bar-stripes 2s linear infinite;
-}
-.progress-danger .bar,
-.progress .bar-danger {
- background-color: #dd514c;
- background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
- background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
-}
-.progress-danger.progress-striped .bar,
-.progress-striped .bar-danger {
- background-color: #ee5f5b;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.progress-success .bar,
-.progress .bar-success {
- background-color: #5eb95e;
- background-image: -moz-linear-gradient(top, #62c462, #57a957);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
- background-image: -webkit-linear-gradient(top, #62c462, #57a957);
- background-image: -o-linear-gradient(top, #62c462, #57a957);
- background-image: linear-gradient(to bottom, #62c462, #57a957);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
-}
-.progress-success.progress-striped .bar,
-.progress-striped .bar-success {
- background-color: #62c462;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.progress-info .bar,
-.progress .bar-info {
- background-color: #4bb1cf;
- background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
- background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
- background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
- background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
-}
-.progress-info.progress-striped .bar,
-.progress-striped .bar-info {
- background-color: #5bc0de;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.progress-warning .bar,
-.progress .bar-warning {
- background-color: #faa732;
- background-image: -moz-linear-gradient(top, #fbb450, #f89406);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
- background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
- background-image: -o-linear-gradient(top, #fbb450, #f89406);
- background-image: linear-gradient(to bottom, #fbb450, #f89406);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
-}
-.progress-warning.progress-striped .bar,
-.progress-striped .bar-warning {
- background-color: #fbb450;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.hero-unit {
- padding: 60px;
- margin-bottom: 30px;
- background-color: #eeeeee;
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
-}
-.hero-unit h1 {
- margin-bottom: 0;
- font-size: 60px;
- line-height: 1;
- color: inherit;
- letter-spacing: -1px;
-}
-.hero-unit p {
- font-size: 18px;
- font-weight: 200;
- line-height: 30px;
- color: inherit;
-}
-.tooltip {
- position: absolute;
- z-index: 1030;
- display: block;
- visibility: visible;
- padding: 5px;
- font-size: 11px;
- opacity: 0;
- filter: alpha(opacity=0);
-}
-.tooltip.in {
- opacity: 0.8;
- filter: alpha(opacity=80);
-}
-.tooltip.top {
- margin-top: -3px;
-}
-.tooltip.right {
- margin-left: 3px;
-}
-.tooltip.bottom {
- margin-top: 3px;
-}
-.tooltip.left {
- margin-left: -3px;
-}
-.tooltip-inner {
- max-width: 200px;
- padding: 3px 8px;
- color: #ffffff;
- text-align: center;
- text-decoration: none;
- background-color: #000000;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-.tooltip-arrow {
- position: absolute;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
-}
-.tooltip.top .tooltip-arrow {
- bottom: 0;
- left: 50%;
- margin-left: -5px;
- border-width: 5px 5px 0;
- border-top-color: #000000;
-}
-.tooltip.right .tooltip-arrow {
- top: 50%;
- left: 0;
- margin-top: -5px;
- border-width: 5px 5px 5px 0;
- border-right-color: #000000;
-}
-.tooltip.left .tooltip-arrow {
- top: 50%;
- right: 0;
- margin-top: -5px;
- border-width: 5px 0 5px 5px;
- border-left-color: #000000;
-}
-.tooltip.bottom .tooltip-arrow {
- top: 0;
- left: 50%;
- margin-left: -5px;
- border-width: 0 5px 5px;
- border-bottom-color: #000000;
-}
-.popover {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 1010;
- display: none;
- width: 236px;
- padding: 1px;
- background-color: #ffffff;
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding;
- background-clip: padding-box;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, 0.2);
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
- -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-}
-.popover.top {
- margin-bottom: 10px;
-}
-.popover.right {
- margin-left: 10px;
-}
-.popover.bottom {
- margin-top: 10px;
-}
-.popover.left {
- margin-right: 10px;
-}
-.popover-title {
- margin: 0;
- padding: 8px 14px;
- font-size: 14px;
- font-weight: normal;
- line-height: 18px;
- background-color: #f7f7f7;
- border-bottom: 1px solid #ebebeb;
- -webkit-border-radius: 5px 5px 0 0;
- -moz-border-radius: 5px 5px 0 0;
- border-radius: 5px 5px 0 0;
-}
-.popover-content {
- padding: 9px 14px;
-}
-.popover-content p,
-.popover-content ul,
-.popover-content ol {
- margin-bottom: 0;
-}
-.popover .arrow,
-.popover .arrow:after {
- position: absolute;
- display: inline-block;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
-}
-.popover .arrow:after {
- content: "";
- z-index: -1;
-}
-.popover.top .arrow {
- bottom: -10px;
- left: 50%;
- margin-left: -10px;
- border-width: 10px 10px 0;
- border-top-color: #ffffff;
-}
-.popover.top .arrow:after {
- border-width: 11px 11px 0;
- border-top-color: rgba(0, 0, 0, 0.25);
- bottom: -1px;
- left: -11px;
-}
-.popover.right .arrow {
- top: 50%;
- left: -10px;
- margin-top: -10px;
- border-width: 10px 10px 10px 0;
- border-right-color: #ffffff;
-}
-.popover.right .arrow:after {
- border-width: 11px 11px 11px 0;
- border-right-color: rgba(0, 0, 0, 0.25);
- bottom: -11px;
- left: -1px;
-}
-.popover.bottom .arrow {
- top: -10px;
- left: 50%;
- margin-left: -10px;
- border-width: 0 10px 10px;
- border-bottom-color: #ffffff;
-}
-.popover.bottom .arrow:after {
- border-width: 0 11px 11px;
- border-bottom-color: rgba(0, 0, 0, 0.25);
- top: -1px;
- left: -11px;
-}
-.popover.left .arrow {
- top: 50%;
- right: -10px;
- margin-top: -10px;
- border-width: 10px 0 10px 10px;
- border-left-color: #ffffff;
-}
-.popover.left .arrow:after {
- border-width: 11px 0 11px 11px;
- border-left-color: rgba(0, 0, 0, 0.25);
- bottom: -11px;
- right: -1px;
-}
-.modal-open .dropdown-menu {
- z-index: 2050;
-}
-.modal-open .dropdown.open {
- *z-index: 2050;
-}
-.modal-open .popover {
- z-index: 2060;
-}
-.modal-open .tooltip {
- z-index: 2080;
-}
-.modal-backdrop {
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 1040;
- background-color: #000000;
-}
-.modal-backdrop.fade {
- opacity: 0;
-}
-.modal-backdrop,
-.modal-backdrop.fade.in {
- opacity: 0.8;
- filter: alpha(opacity=80);
-}
-.modal {
- position: fixed;
- top: 50%;
- left: 50%;
- z-index: 1050;
- overflow: auto;
- width: 560px;
- margin: -250px 0 0 -280px;
- background-color: #ffffff;
- border: 1px solid #999;
- border: 1px solid rgba(0, 0, 0, 0.3);
- *border: 1px solid #999;
- /* IE6-7 */
-
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
- -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
- -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
- box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding-box;
- background-clip: padding-box;
-}
-.modal.fade {
- -webkit-transition: opacity .3s linear, top .3s ease-out;
- -moz-transition: opacity .3s linear, top .3s ease-out;
- -o-transition: opacity .3s linear, top .3s ease-out;
- transition: opacity .3s linear, top .3s ease-out;
- top: -25%;
-}
-.modal.fade.in {
- top: 50%;
-}
-.modal-header {
- padding: 9px 15px;
- border-bottom: 1px solid #eee;
-}
-.modal-header .close {
- margin-top: 2px;
-}
-.modal-header h3 {
- margin: 0;
- line-height: 30px;
-}
-.modal-body {
- overflow-y: auto;
- max-height: 400px;
- padding: 15px;
-}
-.modal-form {
- margin-bottom: 0;
-}
-.modal-footer {
- padding: 14px 15px 15px;
- margin-bottom: 0;
- text-align: right;
- background-color: #f5f5f5;
- border-top: 1px solid #ddd;
- -webkit-border-radius: 0 0 6px 6px;
- -moz-border-radius: 0 0 6px 6px;
- border-radius: 0 0 6px 6px;
- -webkit-box-shadow: inset 0 1px 0 #ffffff;
- -moz-box-shadow: inset 0 1px 0 #ffffff;
- box-shadow: inset 0 1px 0 #ffffff;
- *zoom: 1;
-}
-.modal-footer:before,
-.modal-footer:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.modal-footer:after {
- clear: both;
-}
-.modal-footer .btn + .btn {
- margin-left: 5px;
- margin-bottom: 0;
-}
-.modal-footer .btn-group .btn + .btn {
- margin-left: -1px;
-}
-.dropup,
-.dropdown {
- position: relative;
-}
-.dropdown-toggle {
- *margin-bottom: -3px;
-}
-.dropdown-toggle:active,
-.open .dropdown-toggle {
- outline: 0;
-}
-.caret {
- display: inline-block;
- width: 0;
- height: 0;
- vertical-align: top;
- border-top: 4px solid #000000;
- border-right: 4px solid transparent;
- border-left: 4px solid transparent;
- content: "";
-}
-.dropdown .caret {
- margin-top: 8px;
- margin-left: 2px;
-}
-.dropdown-menu {
- position: absolute;
- top: 100%;
- left: 0;
- z-index: 1000;
- display: none;
- float: left;
- min-width: 160px;
- padding: 5px 0;
- margin: 2px 0 0;
- list-style: none;
- background-color: #ffffff;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, 0.2);
- *border-right-width: 2px;
- *border-bottom-width: 2px;
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
- -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding;
- background-clip: padding-box;
-}
-.dropdown-menu.pull-right {
- right: 0;
- left: auto;
-}
-.dropdown-menu .divider {
- *width: 100%;
- height: 1px;
- margin: 9px 1px;
- *margin: -5px 0 5px;
- overflow: hidden;
- background-color: #e5e5e5;
- border-bottom: 1px solid #ffffff;
-}
-.dropdown-menu a {
- display: block;
- padding: 3px 20px;
- clear: both;
- font-weight: normal;
- line-height: 20px;
- color: #333333;
- white-space: nowrap;
-}
-.dropdown-menu li > a:hover,
-.dropdown-menu li > a:focus,
-.dropdown-submenu:hover > a {
- text-decoration: none;
- color: #ffffff;
- background-color: #0e84b5;
- background-color: #0d7dac;
- background-image: -moz-linear-gradient(top, #0e84b5, #0c739d);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0e84b5), to(#0c739d));
- background-image: -webkit-linear-gradient(top, #0e84b5, #0c739d);
- background-image: -o-linear-gradient(top, #0e84b5, #0c739d);
- background-image: linear-gradient(to bottom, #0e84b5, #0c739d);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0e84b5', endColorstr='#ff0c739d', GradientType=0);
-}
-.dropdown-menu .active > a,
-.dropdown-menu .active > a:hover {
- color: #ffffff;
- text-decoration: none;
- outline: 0;
- background-color: #0e84b5;
- background-color: #0d7dac;
- background-image: -moz-linear-gradient(top, #0e84b5, #0c739d);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0e84b5), to(#0c739d));
- background-image: -webkit-linear-gradient(top, #0e84b5, #0c739d);
- background-image: -o-linear-gradient(top, #0e84b5, #0c739d);
- background-image: linear-gradient(to bottom, #0e84b5, #0c739d);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0e84b5', endColorstr='#ff0c739d', GradientType=0);
-}
-.dropdown-menu .disabled > a,
-.dropdown-menu .disabled > a:hover {
- color: #999999;
-}
-.dropdown-menu .disabled > a:hover {
- text-decoration: none;
- background-color: transparent;
- cursor: default;
-}
-.open {
- *z-index: 1000;
-}
-.open > .dropdown-menu {
- display: block;
-}
-.pull-right > .dropdown-menu {
- right: 0;
- left: auto;
-}
-.dropup .caret,
-.navbar-fixed-bottom .dropdown .caret {
- border-top: 0;
- border-bottom: 4px solid #000000;
- content: "\2191";
-}
-.dropup .dropdown-menu,
-.navbar-fixed-bottom .dropdown .dropdown-menu {
- top: auto;
- bottom: 100%;
- margin-bottom: 1px;
-}
-.dropdown-submenu {
- position: relative;
-}
-.dropdown-submenu > .dropdown-menu {
- top: 0;
- left: 100%;
- margin-top: -6px;
- margin-left: -1px;
- -webkit-border-radius: 0 6px 6px 6px;
- -moz-border-radius: 0 6px 6px 6px;
- border-radius: 0 6px 6px 6px;
-}
-.dropdown-submenu:hover .dropdown-menu {
- display: block;
-}
-.dropdown-submenu > a:after {
- display: block;
- content: " ";
- float: right;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
- border-width: 5px 0 5px 5px;
- border-left-color: #cccccc;
- margin-top: 5px;
- margin-right: -10px;
-}
-.dropdown-submenu:hover > a:after {
- border-left-color: #ffffff;
-}
-.dropdown .dropdown-menu .nav-header {
- padding-left: 20px;
- padding-right: 20px;
-}
-.typeahead {
- margin-top: 2px;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-.accordion {
- margin-bottom: 20px;
-}
-.accordion-group {
- margin-bottom: 2px;
- border: 1px solid #e5e5e5;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-.accordion-heading {
- border-bottom: 0;
-}
-.accordion-heading .accordion-toggle {
- display: block;
- padding: 8px 15px;
-}
-.accordion-toggle {
- cursor: pointer;
-}
-.accordion-inner {
- padding: 9px 15px;
- border-top: 1px solid #e5e5e5;
-}
-.carousel {
- position: relative;
- margin-bottom: 20px;
- line-height: 1;
-}
-.carousel-inner {
- overflow: hidden;
- width: 100%;
- position: relative;
-}
-.carousel .item {
- display: none;
- position: relative;
- -webkit-transition: 0.6s ease-in-out left;
- -moz-transition: 0.6s ease-in-out left;
- -o-transition: 0.6s ease-in-out left;
- transition: 0.6s ease-in-out left;
-}
-.carousel .item > img {
- display: block;
- line-height: 1;
-}
-.carousel .active,
-.carousel .next,
-.carousel .prev {
- display: block;
-}
-.carousel .active {
- left: 0;
-}
-.carousel .next,
-.carousel .prev {
- position: absolute;
- top: 0;
- width: 100%;
-}
-.carousel .next {
- left: 100%;
-}
-.carousel .prev {
- left: -100%;
-}
-.carousel .next.left,
-.carousel .prev.right {
- left: 0;
-}
-.carousel .active.left {
- left: -100%;
-}
-.carousel .active.right {
- left: 100%;
-}
-.carousel-control {
- position: absolute;
- top: 40%;
- left: 15px;
- width: 40px;
- height: 40px;
- margin-top: -20px;
- font-size: 60px;
- font-weight: 100;
- line-height: 30px;
- color: #ffffff;
- text-align: center;
- background: #222222;
- border: 3px solid #ffffff;
- -webkit-border-radius: 23px;
- -moz-border-radius: 23px;
- border-radius: 23px;
- opacity: 0.5;
- filter: alpha(opacity=50);
-}
-.carousel-control.right {
- left: auto;
- right: 15px;
-}
-.carousel-control:hover {
- color: #ffffff;
- text-decoration: none;
- opacity: 0.9;
- filter: alpha(opacity=90);
-}
-.carousel-caption {
- position: absolute;
- left: 0;
- right: 0;
- bottom: 0;
- padding: 15px;
- background: #333333;
- background: rgba(0, 0, 0, 0.75);
-}
-.carousel-caption h4,
-.carousel-caption p {
- color: #ffffff;
- line-height: 20px;
-}
-.carousel-caption h4 {
- margin: 0 0 5px;
-}
-.carousel-caption p {
- margin-bottom: 0;
-}
-.well {
- min-height: 20px;
- padding: 19px;
- margin-bottom: 20px;
- background-color: #f5f5f5;
- border: 1px solid #e3e3e3;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-}
-.well blockquote {
- border-color: #ddd;
- border-color: rgba(0, 0, 0, 0.15);
-}
-.well-large {
- padding: 24px;
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
-}
-.well-small {
- padding: 9px;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
-}
-.close {
- float: right;
- font-size: 20px;
- font-weight: bold;
- line-height: 20px;
- color: #000000;
- text-shadow: 0 1px 0 #ffffff;
- opacity: 0.2;
- filter: alpha(opacity=20);
-}
-.close:hover {
- color: #000000;
- text-decoration: none;
- cursor: pointer;
- opacity: 0.4;
- filter: alpha(opacity=40);
-}
-button.close {
- padding: 0;
- cursor: pointer;
- background: transparent;
- border: 0;
- -webkit-appearance: none;
-}
-.pull-right {
- float: right;
-}
-.pull-left {
- float: left;
-}
-.hide {
- display: none;
-}
-.show {
- display: block;
-}
-.invisible {
- visibility: hidden;
-}
-.affix {
- position: fixed;
-}
-.fade {
- opacity: 0;
- -webkit-transition: opacity 0.15s linear;
- -moz-transition: opacity 0.15s linear;
- -o-transition: opacity 0.15s linear;
- transition: opacity 0.15s linear;
-}
-.fade.in {
- opacity: 1;
-}
-.collapse {
- position: relative;
- height: 0;
- overflow: hidden;
- overflow: visible \9;
- -webkit-transition: height 0.35s ease;
- -moz-transition: height 0.35s ease;
- -o-transition: height 0.35s ease;
- transition: height 0.35s ease;
-}
-.collapse.in {
- height: auto;
-}
-.hidden {
- display: none;
- visibility: hidden;
-}
-.visible-phone {
- display: none !important;
-}
-.visible-tablet {
- display: none !important;
-}
-.hidden-desktop {
- display: none !important;
-}
-.visible-desktop {
- display: inherit !important;
-}
- at media (min-width: 768px) and (max-width: 979px) {
- .hidden-desktop {
- display: inherit !important;
- }
- .visible-desktop {
- display: none !important ;
- }
- .visible-tablet {
- display: inherit !important;
- }
- .hidden-tablet {
- display: none !important;
- }
-}
- at media (max-width: 767px) {
- .hidden-desktop {
- display: inherit !important;
- }
- .visible-desktop {
- display: none !important;
- }
- .visible-phone {
- display: inherit !important;
- }
- .hidden-phone {
- display: none !important;
- }
-}
- at media (max-width: 767px) {
- body {
- padding-left: 20px;
- padding-right: 20px;
- }
- .navbar-fixed-top,
- .navbar-fixed-bottom {
- margin-left: -20px;
- margin-right: -20px;
- }
- .container-fluid {
- padding: 0;
- }
- .dl-horizontal dt {
- float: none;
- clear: none;
- width: auto;
- text-align: left;
- }
- .dl-horizontal dd {
- margin-left: 0;
- }
- .container {
- width: auto;
- }
- .row-fluid {
- width: 100%;
- }
- .row,
- .thumbnails {
- margin-left: 0;
- }
- .thumbnails > li {
- float: none;
- margin-left: 0;
- }
- [class*="span"],
- .row-fluid [class*="span"] {
- float: none;
- display: block;
- width: auto;
- margin-left: 0;
- }
- .span12,
- .row-fluid .span12 {
- width: 100%;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- }
- .input-large,
- .input-xlarge,
- .input-xxlarge,
- input[class*="span"],
- select[class*="span"],
- textarea[class*="span"],
- .uneditable-input {
- display: block;
- width: 100%;
- min-height: 30px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- }
- .input-prepend input,
- .input-append input,
- .input-prepend input[class*="span"],
- .input-append input[class*="span"] {
- display: inline-block;
- width: auto;
- }
- .modal {
- position: fixed;
- top: 20px;
- left: 20px;
- right: 20px;
- width: auto;
- margin: 0;
- }
- .modal.fade.in {
- top: auto;
- }
-}
- at media (max-width: 480px) {
- .nav-collapse {
- -webkit-transform: translate3d(0, 0, 0);
- }
- .page-header h1 small {
- display: block;
- line-height: 20px;
- }
- input[type="checkbox"],
- input[type="radio"] {
- border: 1px solid #ccc;
- }
- .form-horizontal .control-group > label {
- float: none;
- width: auto;
- padding-top: 0;
- text-align: left;
- }
- .form-horizontal .controls {
- margin-left: 0;
- }
- .form-horizontal .control-list {
- padding-top: 0;
- }
- .form-horizontal .form-actions {
- padding-left: 10px;
- padding-right: 10px;
- }
- .modal {
- top: 10px;
- left: 10px;
- right: 10px;
- }
- .modal-header .close {
- padding: 10px;
- margin: -10px;
- }
- .carousel-caption {
- position: static;
- }
-}
- at media (min-width: 768px) and (max-width: 979px) {
- .row {
- margin-left: -20px;
- *zoom: 1;
- }
- .row:before,
- .row:after {
- display: table;
- content: "";
- line-height: 0;
- }
- .row:after {
- clear: both;
- }
- [class*="span"] {
- float: left;
- margin-left: 20px;
- }
- .container,
- .navbar-static-top .container,
- .navbar-fixed-top .container,
- .navbar-fixed-bottom .container {
- width: 724px;
- }
- .span12 {
- width: 724px;
- }
- .span11 {
- width: 662px;
- }
- .span10 {
- width: 600px;
- }
- .span9 {
- width: 538px;
- }
- .span8 {
- width: 476px;
- }
- .span7 {
- width: 414px;
- }
- .span6 {
- width: 352px;
- }
- .span5 {
- width: 290px;
- }
- .span4 {
- width: 228px;
- }
- .span3 {
- width: 166px;
- }
- .span2 {
- width: 104px;
- }
- .span1 {
- width: 42px;
- }
- .offset12 {
- margin-left: 764px;
- }
- .offset11 {
- margin-left: 702px;
- }
- .offset10 {
- margin-left: 640px;
- }
- .offset9 {
- margin-left: 578px;
- }
- .offset8 {
- margin-left: 516px;
- }
- .offset7 {
- margin-left: 454px;
- }
- .offset6 {
- margin-left: 392px;
- }
- .offset5 {
- margin-left: 330px;
- }
- .offset4 {
- margin-left: 268px;
- }
- .offset3 {
- margin-left: 206px;
- }
- .offset2 {
- margin-left: 144px;
- }
- .offset1 {
- margin-left: 82px;
- }
- .row-fluid {
- width: 100%;
- *zoom: 1;
- }
- .row-fluid:before,
- .row-fluid:after {
- display: table;
- content: "";
- line-height: 0;
- }
- .row-fluid:after {
- clear: both;
- }
- .row-fluid [class*="span"] {
- display: block;
- width: 100%;
- min-height: 30px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- float: left;
- margin-left: 2.7624309392265194%;
- *margin-left: 2.709239449864817%;
- }
- .row-fluid [class*="span"]:first-child {
- margin-left: 0;
- }
- .row-fluid .span12 {
- width: 100%;
- *width: 99.94680851063829%;
- }
- .row-fluid .span11 {
- width: 91.43646408839778%;
- *width: 91.38327259903608%;
- }
- .row-fluid .span10 {
- width: 82.87292817679558%;
- *width: 82.81973668743387%;
- }
- .row-fluid .span9 {
- width: 74.30939226519337%;
- *width: 74.25620077583166%;
- }
- .row-fluid .span8 {
- width: 65.74585635359117%;
- *width: 65.69266486422946%;
- }
- .row-fluid .span7 {
- width: 57.18232044198895%;
- *width: 57.12912895262725%;
- }
- .row-fluid .span6 {
- width: 48.61878453038674%;
- *width: 48.56559304102504%;
- }
- .row-fluid .span5 {
- width: 40.05524861878453%;
- *width: 40.00205712942283%;
- }
- .row-fluid .span4 {
- width: 31.491712707182323%;
- *width: 31.43852121782062%;
- }
- .row-fluid .span3 {
- width: 22.92817679558011%;
- *width: 22.87498530621841%;
- }
- .row-fluid .span2 {
- width: 14.3646408839779%;
- *width: 14.311449394616199%;
- }
- .row-fluid .span1 {
- width: 5.801104972375691%;
- *width: 5.747913483013988%;
- }
- .row-fluid .offset12 {
- margin-left: 105.52486187845304%;
- *margin-left: 105.41847889972962%;
- }
- .row-fluid .offset12:first-child {
- margin-left: 102.76243093922652%;
- *margin-left: 102.6560479605031%;
- }
- .row-fluid .offset11 {
- margin-left: 96.96132596685082%;
- *margin-left: 96.8549429881274%;
- }
- .row-fluid .offset11:first-child {
- margin-left: 94.1988950276243%;
- *margin-left: 94.09251204890089%;
- }
- .row-fluid .offset10 {
- margin-left: 88.39779005524862%;
- *margin-left: 88.2914070765252%;
- }
- .row-fluid .offset10:first-child {
- margin-left: 85.6353591160221%;
- *margin-left: 85.52897613729868%;
- }
- .row-fluid .offset9 {
- margin-left: 79.8342541436464%;
- *margin-left: 79.72787116492299%;
- }
- .row-fluid .offset9:first-child {
- margin-left: 77.07182320441989%;
- *margin-left: 76.96544022569647%;
- }
- .row-fluid .offset8 {
- margin-left: 71.2707182320442%;
- *margin-left: 71.16433525332079%;
- }
- .row-fluid .offset8:first-child {
- margin-left: 68.50828729281768%;
- *margin-left: 68.40190431409427%;
- }
- .row-fluid .offset7 {
- margin-left: 62.70718232044199%;
- *margin-left: 62.600799341718584%;
- }
- .row-fluid .offset7:first-child {
- margin-left: 59.94475138121547%;
- *margin-left: 59.838368402492065%;
- }
- .row-fluid .offset6 {
- margin-left: 54.14364640883978%;
- *margin-left: 54.037263430116376%;
- }
- .row-fluid .offset6:first-child {
- margin-left: 51.38121546961326%;
- *margin-left: 51.27483249088986%;
- }
- .row-fluid .offset5 {
- margin-left: 45.58011049723757%;
- *margin-left: 45.47372751851417%;
- }
- .row-fluid .offset5:first-child {
- margin-left: 42.81767955801105%;
- *margin-left: 42.71129657928765%;
- }
- .row-fluid .offset4 {
- margin-left: 37.01657458563536%;
- *margin-left: 36.91019160691196%;
- }
- .row-fluid .offset4:first-child {
- margin-left: 34.25414364640884%;
- *margin-left: 34.14776066768544%;
- }
- .row-fluid .offset3 {
- margin-left: 28.45303867403315%;
- *margin-left: 28.346655695309746%;
- }
- .row-fluid .offset3:first-child {
- margin-left: 25.69060773480663%;
- *margin-left: 25.584224756083227%;
- }
- .row-fluid .offset2 {
- margin-left: 19.88950276243094%;
- *margin-left: 19.783119783707537%;
- }
- .row-fluid .offset2:first-child {
- margin-left: 17.12707182320442%;
- *margin-left: 17.02068884448102%;
- }
- .row-fluid .offset1 {
- margin-left: 11.32596685082873%;
- *margin-left: 11.219583872105325%;
- }
- .row-fluid .offset1:first-child {
- margin-left: 8.56353591160221%;
- *margin-left: 8.457152932878806%;
- }
- input,
- textarea,
- .uneditable-input {
- margin-left: 0;
- }
- .controls-row [class*="span"] + [class*="span"] {
- margin-left: 20px;
- }
- input.span12, textarea.span12, .uneditable-input.span12 {
- width: 710px;
- }
- input.span11, textarea.span11, .uneditable-input.span11 {
- width: 648px;
- }
- input.span10, textarea.span10, .uneditable-input.span10 {
- width: 586px;
- }
- input.span9, textarea.span9, .uneditable-input.span9 {
- width: 524px;
- }
- input.span8, textarea.span8, .uneditable-input.span8 {
- width: 462px;
- }
- input.span7, textarea.span7, .uneditable-input.span7 {
- width: 400px;
- }
- input.span6, textarea.span6, .uneditable-input.span6 {
- width: 338px;
- }
- input.span5, textarea.span5, .uneditable-input.span5 {
- width: 276px;
- }
- input.span4, textarea.span4, .uneditable-input.span4 {
- width: 214px;
- }
- input.span3, textarea.span3, .uneditable-input.span3 {
- width: 152px;
- }
- input.span2, textarea.span2, .uneditable-input.span2 {
- width: 90px;
- }
- input.span1, textarea.span1, .uneditable-input.span1 {
- width: 28px;
- }
-}
- at media (min-width: 1200px) {
- .row {
- margin-left: -30px;
- *zoom: 1;
- }
- .row:before,
- .row:after {
- display: table;
- content: "";
- line-height: 0;
- }
- .row:after {
- clear: both;
- }
- [class*="span"] {
- float: left;
- margin-left: 30px;
- }
- .container,
- .navbar-static-top .container,
- .navbar-fixed-top .container,
- .navbar-fixed-bottom .container {
- width: 1170px;
- }
- .span12 {
- width: 1170px;
- }
- .span11 {
- width: 1070px;
- }
- .span10 {
- width: 970px;
- }
- .span9 {
- width: 870px;
- }
- .span8 {
- width: 770px;
- }
- .span7 {
- width: 670px;
- }
- .span6 {
- width: 570px;
- }
- .span5 {
- width: 470px;
- }
- .span4 {
- width: 370px;
- }
- .span3 {
- width: 270px;
- }
- .span2 {
- width: 170px;
- }
- .span1 {
- width: 70px;
- }
- .offset12 {
- margin-left: 1230px;
- }
- .offset11 {
- margin-left: 1130px;
- }
- .offset10 {
- margin-left: 1030px;
- }
- .offset9 {
- margin-left: 930px;
- }
- .offset8 {
- margin-left: 830px;
- }
- .offset7 {
- margin-left: 730px;
- }
- .offset6 {
- margin-left: 630px;
- }
- .offset5 {
- margin-left: 530px;
- }
- .offset4 {
- margin-left: 430px;
- }
- .offset3 {
- margin-left: 330px;
- }
- .offset2 {
- margin-left: 230px;
- }
- .offset1 {
- margin-left: 130px;
- }
- .row-fluid {
- width: 100%;
- *zoom: 1;
- }
- .row-fluid:before,
- .row-fluid:after {
- display: table;
- content: "";
- line-height: 0;
- }
- .row-fluid:after {
- clear: both;
- }
- .row-fluid [class*="span"] {
- display: block;
- width: 100%;
- min-height: 30px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- float: left;
- margin-left: 2.564102564102564%;
- *margin-left: 2.5109110747408616%;
- }
- .row-fluid [class*="span"]:first-child {
- margin-left: 0;
- }
- .row-fluid .span12 {
- width: 100%;
- *width: 99.94680851063829%;
- }
- .row-fluid .span11 {
- width: 91.45299145299145%;
- *width: 91.39979996362975%;
- }
- .row-fluid .span10 {
- width: 82.90598290598291%;
- *width: 82.8527914166212%;
- }
- .row-fluid .span9 {
- width: 74.35897435897436%;
- *width: 74.30578286961266%;
- }
- .row-fluid .span8 {
- width: 65.81196581196582%;
- *width: 65.75877432260411%;
- }
- .row-fluid .span7 {
- width: 57.26495726495726%;
- *width: 57.21176577559556%;
- }
- .row-fluid .span6 {
- width: 48.717948717948715%;
- *width: 48.664757228587014%;
- }
- .row-fluid .span5 {
- width: 40.17094017094017%;
- *width: 40.11774868157847%;
- }
- .row-fluid .span4 {
- width: 31.623931623931625%;
- *width: 31.570740134569924%;
- }
- .row-fluid .span3 {
- width: 23.076923076923077%;
- *width: 23.023731587561375%;
- }
- .row-fluid .span2 {
- width: 14.52991452991453%;
- *width: 14.476723040552828%;
- }
- .row-fluid .span1 {
- width: 5.982905982905983%;
- *width: 5.929714493544281%;
- }
- .row-fluid .offset12 {
- margin-left: 105.12820512820512%;
- *margin-left: 105.02182214948171%;
- }
- .row-fluid .offset12:first-child {
- margin-left: 102.56410256410257%;
- *margin-left: 102.45771958537915%;
- }
- .row-fluid .offset11 {
- margin-left: 96.58119658119658%;
- *margin-left: 96.47481360247316%;
- }
- .row-fluid .offset11:first-child {
- margin-left: 94.01709401709402%;
- *margin-left: 93.91071103837061%;
- }
- .row-fluid .offset10 {
- margin-left: 88.03418803418803%;
- *margin-left: 87.92780505546462%;
- }
- .row-fluid .offset10:first-child {
- margin-left: 85.47008547008548%;
- *margin-left: 85.36370249136206%;
- }
- .row-fluid .offset9 {
- margin-left: 79.48717948717949%;
- *margin-left: 79.38079650845607%;
- }
- .row-fluid .offset9:first-child {
- margin-left: 76.92307692307693%;
- *margin-left: 76.81669394435352%;
- }
- .row-fluid .offset8 {
- margin-left: 70.94017094017094%;
- *margin-left: 70.83378796144753%;
- }
- .row-fluid .offset8:first-child {
- margin-left: 68.37606837606839%;
- *margin-left: 68.26968539734497%;
- }
- .row-fluid .offset7 {
- margin-left: 62.393162393162385%;
- *margin-left: 62.28677941443899%;
- }
- .row-fluid .offset7:first-child {
- margin-left: 59.82905982905982%;
- *margin-left: 59.72267685033642%;
- }
- .row-fluid .offset6 {
- margin-left: 53.84615384615384%;
- *margin-left: 53.739770867430444%;
- }
- .row-fluid .offset6:first-child {
- margin-left: 51.28205128205128%;
- *margin-left: 51.175668303327875%;
- }
- .row-fluid .offset5 {
- margin-left: 45.299145299145295%;
- *margin-left: 45.1927623204219%;
- }
- .row-fluid .offset5:first-child {
- margin-left: 42.73504273504273%;
- *margin-left: 42.62865975631933%;
- }
- .row-fluid .offset4 {
- margin-left: 36.75213675213675%;
- *margin-left: 36.645753773413354%;
- }
- .row-fluid .offset4:first-child {
- margin-left: 34.18803418803419%;
- *margin-left: 34.081651209310785%;
- }
- .row-fluid .offset3 {
- margin-left: 28.205128205128204%;
- *margin-left: 28.0987452264048%;
- }
- .row-fluid .offset3:first-child {
- margin-left: 25.641025641025642%;
- *margin-left: 25.53464266230224%;
- }
- .row-fluid .offset2 {
- margin-left: 19.65811965811966%;
- *margin-left: 19.551736679396257%;
- }
- .row-fluid .offset2:first-child {
- margin-left: 17.094017094017094%;
- *margin-left: 16.98763411529369%;
- }
- .row-fluid .offset1 {
- margin-left: 11.11111111111111%;
- *margin-left: 11.004728132387708%;
- }
- .row-fluid .offset1:first-child {
- margin-left: 8.547008547008547%;
- *margin-left: 8.440625568285142%;
- }
- input,
- textarea,
- .uneditable-input {
- margin-left: 0;
- }
- .controls-row [class*="span"] + [class*="span"] {
- margin-left: 30px;
- }
- input.span12, textarea.span12, .uneditable-input.span12 {
- width: 1156px;
- }
- input.span11, textarea.span11, .uneditable-input.span11 {
- width: 1056px;
- }
- input.span10, textarea.span10, .uneditable-input.span10 {
- width: 956px;
- }
- input.span9, textarea.span9, .uneditable-input.span9 {
- width: 856px;
- }
- input.span8, textarea.span8, .uneditable-input.span8 {
- width: 756px;
- }
- input.span7, textarea.span7, .uneditable-input.span7 {
- width: 656px;
- }
- input.span6, textarea.span6, .uneditable-input.span6 {
- width: 556px;
- }
- input.span5, textarea.span5, .uneditable-input.span5 {
- width: 456px;
- }
- input.span4, textarea.span4, .uneditable-input.span4 {
- width: 356px;
- }
- input.span3, textarea.span3, .uneditable-input.span3 {
- width: 256px;
- }
- input.span2, textarea.span2, .uneditable-input.span2 {
- width: 156px;
- }
- input.span1, textarea.span1, .uneditable-input.span1 {
- width: 56px;
- }
- .thumbnails {
- margin-left: -30px;
- }
- .thumbnails > li {
- margin-left: 30px;
- }
- .row-fluid .thumbnails {
- margin-left: 0;
- }
-}
- at media (max-width: 979px) {
- body {
- padding-top: 0;
- }
- .navbar-fixed-top,
- .navbar-fixed-bottom {
- position: static;
- }
- .navbar-fixed-top {
- margin-bottom: 20px;
- }
- .navbar-fixed-bottom {
- margin-top: 20px;
- }
- .navbar-fixed-top .navbar-inner,
- .navbar-fixed-bottom .navbar-inner {
- padding: 5px;
- }
- .navbar .container {
- width: auto;
- padding: 0;
- }
- .navbar .brand {
- padding-left: 10px;
- padding-right: 10px;
- margin: 0 0 0 -5px;
- }
- .nav-collapse {
- clear: both;
- }
- .nav-collapse .nav {
- float: none;
- margin: 0 0 10px;
- }
- .nav-collapse .nav > li {
- float: none;
- }
- .nav-collapse .nav > li > a {
- margin-bottom: 2px;
- }
- .nav-collapse .nav > .divider-vertical {
- display: none;
- }
- .nav-collapse .nav .nav-header {
- color: #0e84b5;
- text-shadow: none;
- }
- .nav-collapse .nav > li > a,
- .nav-collapse .dropdown-menu a {
- padding: 9px 15px;
- font-weight: bold;
- color: #0e84b5;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
- }
- .nav-collapse .btn {
- padding: 4px 10px 4px;
- font-weight: normal;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- }
- .nav-collapse .dropdown-menu li + li a {
- margin-bottom: 2px;
- }
- .nav-collapse .nav > li > a:hover,
- .nav-collapse .dropdown-menu a:hover {
- background-color: #ffffff;
- }
- .navbar-inverse .nav-collapse .nav > li > a:hover,
- .navbar-inverse .nav-collapse .dropdown-menu a:hover {
- background-color: #111111;
- }
- .nav-collapse.in .btn-group {
- margin-top: 5px;
- padding: 0;
- }
- .nav-collapse .dropdown-menu {
- position: static;
- top: auto;
- left: auto;
- float: none;
- display: block;
- max-width: none;
- margin: 0 15px;
- padding: 0;
- background-color: transparent;
- border: none;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
- }
- .nav-collapse .dropdown-menu:before,
- .nav-collapse .dropdown-menu:after {
- display: none;
- }
- .nav-collapse .dropdown-menu .divider {
- display: none;
- }
- .nav-collapse .navbar-form,
- .nav-collapse .navbar-search {
- float: none;
- padding: 10px 15px;
- margin: 10px 0;
- border-top: 1px solid #ffffff;
- border-bottom: 1px solid #ffffff;
- -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
- -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
- box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
- }
- .navbar .nav-collapse .nav.pull-right {
- float: none;
- margin-left: 0;
- }
- .nav-collapse,
- .nav-collapse.collapse {
- overflow: hidden;
- height: 0;
- }
- .navbar .btn-navbar {
- display: block;
- }
- .navbar-static .navbar-inner {
- padding-left: 10px;
- padding-right: 10px;
- }
-}
- at media (min-width: 980px) {
- .nav-collapse.collapse {
- height: auto !important;
- overflow: visible !important;
- }
-}
-
-.footer {
- background-color: #eee;
-}
-
-.quick-links {
- background-color: #EEEEEE;
-}
-
-.quick-links strong {
- color: #999999;
-}
diff --git a/doc/_themes/bootstrap/static/bootstrap-engineauth.min.css b/doc/_themes/bootstrap/static/bootstrap-engineauth.min.css
deleted file mode 100755
index 188425a..0000000
--- a/doc/_themes/bootstrap/static/bootstrap-engineauth.min.css
+++ /dev/null
@@ -1,829 +0,0 @@
-/*!
- * Bootstrap v2.1.0
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */
-.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0;}
-.clearfix:after{clear:both;}
-.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;}
-.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}
-article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;}
-audio,canvas,video{display:inline-block;*display:inline;*zoom:1;}
-audio:not([controls]){display:none;}
-html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
-a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
-a:hover,a:active{outline:0;}
-sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;}
-sup{top:-0.5em;}
-sub{bottom:-0.25em;}
-img{max-width:100%;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic;}
-#map_canvas img{max-width:none;}
-button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;}
-button,input{*overflow:visible;line-height:normal;}
-button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;}
-button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;}
-input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield;}
-input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;}
-textarea{overflow:auto;vertical-align:top;}
-body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333333;background-color:#ffffff;}
-a{color:#0e84b5;text-decoration:none;}
-a:hover{color:#f26a1e;text-decoration:underline;}
-.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
-.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);}
-.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px;}
-.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;}
-.row:after{clear:both;}
-[class*="span"]{float:left;margin-left:20px;}
-.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;}
-.span12{width:940px;}
-.span11{width:860px;}
-.span10{width:780px;}
-.span9{width:700px;}
-.span8{width:620px;}
-.span7{width:540px;}
-.span6{width:460px;}
-.span5{width:380px;}
-.span4{width:300px;}
-.span3{width:220px;}
-.span2{width:140px;}
-.span1{width:60px;}
-.offset12{margin-left:980px;}
-.offset11{margin-left:900px;}
-.offset10{margin-left:820px;}
-.offset9{margin-left:740px;}
-.offset8{margin-left:660px;}
-.offset7{margin-left:580px;}
-.offset6{margin-left:500px;}
-.offset5{margin-left:420px;}
-.offset4{margin-left:340px;}
-.offset3{margin-left:260px;}
-.offset2{margin-left:180px;}
-.offset1{margin-left:100px;}
-.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;}
-.row-fluid:after{clear:both;}
-.row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;}
-.row-fluid [class*="span"]:first-child{margin-left:0;}
-.row-fluid .span12{width:100%;*width:99.94680851063829%;}
-.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%;}
-.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%;}
-.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%;}
-.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%;}
-.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%;}
-.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%;}
-.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%;}
-.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%;}
-.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%;}
-.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%;}
-.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%;}
-.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%;}
-.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%;}
-.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%;}
-.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%;}
-.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%;}
-.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%;}
-.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%;}
-.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%;}
-.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%;}
-.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%;}
-.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%;}
-.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%;}
-.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%;}
-.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%;}
-.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%;}
-.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%;}
-.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%;}
-.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%;}
-.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%;}
-.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%;}
-.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%;}
-.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%;}
-.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%;}
-.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%;}
-[class*="span"].hide,.row-fluid [class*="span"].hide{display:none;}
-[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right;}
-.container{margin-right:auto;margin-left:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";line-height:0;}
-.container:after{clear:both;}
-.container-fluid{padding-right:20px;padding-left:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0;}
-.container-fluid:after{clear:both;}
-p{margin:0 0 10px;}
-.lead{margin-bottom:20px;font-size:20px;font-weight:200;line-height:30px;}
-small{font-size:85%;}
-strong{font-weight:bold;}
-em{font-style:italic;}
-cite{font-style:normal;}
-.muted{color:#999999;}
-h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:normal;line-height:1;color:inherit;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999999;}
-h1{font-size:36px;line-height:40px;}
-h2{font-size:30px;line-height:40px;}
-h3{font-size:24px;line-height:40px;}
-h4{font-size:18px;line-height:20px;}
-h5{font-size:14px;line-height:20px;}
-h6{font-size:12px;line-height:20px;}
-h1 small{font-size:24px;}
-h2 small{font-size:18px;}
-h3 small{font-size:14px;}
-h4 small{font-size:14px;}
-.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eeeeee;}
-ul,ol{padding:0;margin:0 0 10px 25px;}
-ul ul,ul ol,ol ol,ol ul{margin-bottom:0;}
-li{line-height:20px;}
-ul.unstyled,ol.unstyled{margin-left:0;list-style:none;}
-dl{margin-bottom:20px;}
-dt,dd{line-height:20px;}
-dt{font-weight:bold;}
-dd{margin-left:10px;}
-.dl-horizontal dt{float:left;width:120px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
-.dl-horizontal dd{margin-left:130px;}
-hr{margin:20px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;}
-abbr[title]{cursor:help;border-bottom:1px dotted #999999;}
-abbr.initialism{font-size:90%;text-transform:uppercase;}
-blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px;}
-blockquote small{display:block;line-height:20px;color:#999999;}blockquote small:before{content:'\2014 \00A0';}
-blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;}
-blockquote.pull-right small:before{content:'';}
-blockquote.pull-right small:after{content:'\00A0 \2014';}
-q:before,q:after,blockquote:before,blockquote:after{content:"";}
-address{display:block;margin-bottom:20px;font-style:normal;line-height:20px;}
-code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
-code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;}
-pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}pre.prettyprint{margin-bottom:20px;}
-pre code{padding:0;color:inherit;background-color:transparent;border:0;}
-.pre-scrollable{max-height:340px;overflow-y:scroll;}
-.label,.badge{font-size:11.844px;font-weight:bold;line-height:14px;color:#ffffff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;}
-.label{padding:1px 4px 2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
-.badge{padding:1px 9px 2px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;}
-a.label:hover,a.badge:hover{color:#ffffff;text-decoration:none;cursor:pointer;}
-.label-important,.badge-important{background-color:#b94a48;}
-.label-important[href],.badge-important[href]{background-color:#953b39;}
-.label-warning,.badge-warning{background-color:#f89406;}
-.label-warning[href],.badge-warning[href]{background-color:#c67605;}
-.label-success,.badge-success{background-color:#468847;}
-.label-success[href],.badge-success[href]{background-color:#356635;}
-.label-info,.badge-info{background-color:#3a87ad;}
-.label-info[href],.badge-info[href]{background-color:#2d6987;}
-.label-inverse,.badge-inverse{background-color:#333333;}
-.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a;}
-.btn .label,.btn .badge{position:relative;top:-1px;}
-.btn-mini .label,.btn-mini .badge{top:0;}
-table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0;}
-.table{width:100%;margin-bottom:20px;}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;}
-.table th{font-weight:bold;}
-.table thead th{vertical-align:bottom;}
-.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0;}
-.table tbody+tbody{border-top:2px solid #dddddd;}
-.table-condensed th,.table-condensed td{padding:4px 5px;}
-.table-bordered{border:1px solid #dddddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th,.table-bordered td{border-left:1px solid #dddddd;}
-.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;}
-.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px;}
-.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px;}
-.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;}
-.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child,.table-bordered tfoot:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;}
-.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px;}
-.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-right-topleft:4px;}
-.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;}
-.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5;}
-table [class*=span],.row-fluid table [class*=span]{display:table-cell;float:none;margin-left:0;}
-table .span1{float:none;width:44px;margin-left:0;}
-table .span2{float:none;width:124px;margin-left:0;}
-table .span3{float:none;width:204px;margin-left:0;}
-table .span4{float:none;width:284px;margin-left:0;}
-table .span5{float:none;width:364px;margin-left:0;}
-table .span6{float:none;width:444px;margin-left:0;}
-table .span7{float:none;width:524px;margin-left:0;}
-table .span8{float:none;width:604px;margin-left:0;}
-table .span9{float:none;width:684px;margin-left:0;}
-table .span10{float:none;width:764px;margin-left:0;}
-table .span11{float:none;width:844px;margin-left:0;}
-table .span12{float:none;width:924px;margin-left:0;}
-table .span13{float:none;width:1004px;margin-left:0;}
-table .span14{float:none;width:1084px;margin-left:0;}
-table .span15{float:none;width:1164px;margin-left:0;}
-table .span16{float:none;width:1244px;margin-left:0;}
-table .span17{float:none;width:1324px;margin-left:0;}
-table .span18{float:none;width:1404px;margin-left:0;}
-table .span19{float:none;width:1484px;margin-left:0;}
-table .span20{float:none;width:1564px;margin-left:0;}
-table .span21{float:none;width:1644px;margin-left:0;}
-table .span22{float:none;width:1724px;margin-left:0;}
-table .span23{float:none;width:1804px;margin-left:0;}
-table .span24{float:none;width:1884px;margin-left:0;}
-.table tbody tr.success td{background-color:#dff0d8;}
-.table tbody tr.error td{background-color:#f2dede;}
-.table tbody tr.info td{background-color:#d9edf7;}
-form{margin:0 0 20px;}
-fieldset{padding:0;margin:0;border:0;}
-legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333333;border:0;border-bottom:1px solid #e5e5e5;}legend small{font-size:15px;color:#999999;}
-label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px;}
-input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;}
-label{display:block;margin-bottom:5px;}
-select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:9px;font-size:14px;line-height:20px;color:#555555;-webkit-border-radius:3px;-moz-border-radius:3px;border- [...]
-input,textarea{width:210px;}
-textarea{height:auto;}
-textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#ffffff;border:1px solid #cccccc;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset [...]
-input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;line-height:normal;cursor:pointer;}
-input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto;}
-select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px;}
-select{width:220px;border:1px solid #bbb;background-color:#ffffff;}
-select[multiple],select[size]{height:auto;}
-select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
-.uneditable-input,.uneditable-textarea{color:#999999;background-color:#fcfcfc;border-color:#cccccc;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;}
-.uneditable-input{overflow:hidden;white-space:nowrap;}
-.uneditable-textarea{width:auto;height:auto;}
-input:-moz-placeholder,textarea:-moz-placeholder{color:#999999;}
-input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999999;}
-input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999999;}
-.radio,.checkbox{min-height:18px;padding-left:18px;}
-.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;}
-.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;}
-.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;}
-.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;}
-.input-mini{width:60px;}
-.input-small{width:90px;}
-.input-medium{width:150px;}
-.input-large{width:210px;}
-.input-xlarge{width:270px;}
-.input-xxlarge{width:530px;}
-input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0;}
-.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block;}
-input,textarea,.uneditable-input{margin-left:0;}
-.controls-row [class*="span"]+[class*="span"]{margin-left:20px;}
-input.span12, textarea.span12, .uneditable-input.span12{width:926px;}
-input.span11, textarea.span11, .uneditable-input.span11{width:846px;}
-input.span10, textarea.span10, .uneditable-input.span10{width:766px;}
-input.span9, textarea.span9, .uneditable-input.span9{width:686px;}
-input.span8, textarea.span8, .uneditable-input.span8{width:606px;}
-input.span7, textarea.span7, .uneditable-input.span7{width:526px;}
-input.span6, textarea.span6, .uneditable-input.span6{width:446px;}
-input.span5, textarea.span5, .uneditable-input.span5{width:366px;}
-input.span4, textarea.span4, .uneditable-input.span4{width:286px;}
-input.span3, textarea.span3, .uneditable-input.span3{width:206px;}
-input.span2, textarea.span2, .uneditable-input.span2{width:126px;}
-input.span1, textarea.span1, .uneditable-input.span1{width:46px;}
-.controls-row{*zoom:1;}.controls-row:before,.controls-row:after{display:table;content:"";line-height:0;}
-.controls-row:after{clear:both;}
-.controls-row [class*="span"]{float:left;}
-input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eeeeee;}
-input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent;}
-.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;}
-.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.warning .checkbox:focus,.control-group.warning .radio:focus,.control-group.warning input:focus,.control-group.warning select:focus [...]
-.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;}
-.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;}
-.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.error .checkbox:focus,.control-group.error .radio:focus,.control-group.error input:focus,.control-group.error select:focus,.control-group.er [...]
-.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;}
-.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;}
-.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.success .checkbox:focus,.control-group.success .radio:focus,.control-group.success input:focus,.control-group.success select:focus [...]
-.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;}
-input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;}
-.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1;}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0;}
-.form-actions:after{clear:both;}
-.help-block,.help-inline{color:#595959;}
-.help-block{display:block;margin-bottom:10px;}
-.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;}
-.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap;}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;font-size:14px;vertical-align:top;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-pr [...]
-.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#eeeeee;border:1px solid #ccc;}
-.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn{margin-left:-1px;vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
-.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546;}
-.input-prepend .add-on,.input-prepend .btn{margin-right:-1px;}
-.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
-.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
-.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
-.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
-.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
-.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
-input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
-.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
-.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;}
-.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;}
-.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;}
-.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;}
-.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.fo [...]
-.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;}
-.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block;}
-.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0;}
-.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;}
-.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0;}
-.control-group{margin-bottom:10px;}
-legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate;}
-.form-horizontal .control-group{margin-bottom:20px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";line-height:0;}
-.form-horizontal .control-group:after{clear:both;}
-.form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right;}
-.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:160px;*margin-left:0;}.form-horizontal .controls:first-child{*padding-left:160px;}
-.form-horizontal .help-block{margin-top:10px;margin-bottom:0;}
-.form-horizontal .form-actions{padding-left:160px;}
-.btn{display:inline-block;*display:inline;*zoom:1;padding:4px 14px;margin-bottom:0;font-size:14px;line-height:20px;*line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333333;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);backgroun [...]
-.btn:active,.btn.active{background-color:#cccccc \9;}
-.btn:first-child{*margin-left:0;}
-.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;}
-.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
-.btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);}
-.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
-.btn-large{padding:9px 14px;font-size:16px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
-.btn-large [class^="icon-"]{margin-top:2px;}
-.btn-small{padding:3px 9px;font-size:12px;line-height:18px;}
-.btn-small [class^="icon-"]{margin-top:0;}
-.btn-mini{padding:2px 6px;font-size:11px;line-height:16px;}
-.btn-block{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}
-.btn-block+.btn-block{margin-top:5px;}
-.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255, 255, 255, 0.75);}
-.btn{border-color:#c5c5c5;border-color:rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);}
-.btn-primary{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e6eb5;background-image:-moz-linear-gradient(top, #0e84b5, #0e4cb5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0e84b5), to(#0e4cb5));background-image:-webkit-linear-gradient(top, #0e84b5, #0e4cb5);background-image:-o-linear-gradient(top, #0e84b5, #0e4cb5);background-image:linear-gradient(to bottom, #0e84b5, #0e4cb5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gr [...]
-.btn-primary:active,.btn-primary.active{background-color:#0a3886 \9;}
-.btn-warning{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gr [...]
-.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;}
-.btn-danger{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(to bottom, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gra [...]
-.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;}
-.btn-success{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(to bottom, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gr [...]
-.btn-success:active,.btn-success.active{background-color:#408140 \9;}
-.btn-info{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(to bottom, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradi [...]
-.btn-info:active,.btn-info.active{background-color:#24748c \9;}
-.btn-inverse{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#363636;background-image:-moz-linear-gradient(top, #444444, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));background-image:-webkit-linear-gradient(top, #444444, #222222);background-image:-o-linear-gradient(top, #444444, #222222);background-image:linear-gradient(to bottom, #444444, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gr [...]
-.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9;}
-button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;}
-button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;}
-button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;}
-button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;}
-.btn-link,.btn-link:active{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
-.btn-link{border-color:transparent;cursor:pointer;color:#0e84b5;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
-.btn-link:hover{color:#f26a1e;text-decoration:underline;background-color:transparent;}
-[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;margin-top:1px;}
-.icon-white,.nav>.active>a>[class^="icon-"],.nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png");}
-.icon-glass{background-position:0 0;}
-.icon-music{background-position:-24px 0;}
-.icon-search{background-position:-48px 0;}
-.icon-envelope{background-position:-72px 0;}
-.icon-heart{background-position:-96px 0;}
-.icon-star{background-position:-120px 0;}
-.icon-star-empty{background-position:-144px 0;}
-.icon-user{background-position:-168px 0;}
-.icon-film{background-position:-192px 0;}
-.icon-th-large{background-position:-216px 0;}
-.icon-th{background-position:-240px 0;}
-.icon-th-list{background-position:-264px 0;}
-.icon-ok{background-position:-288px 0;}
-.icon-remove{background-position:-312px 0;}
-.icon-zoom-in{background-position:-336px 0;}
-.icon-zoom-out{background-position:-360px 0;}
-.icon-off{background-position:-384px 0;}
-.icon-signal{background-position:-408px 0;}
-.icon-cog{background-position:-432px 0;}
-.icon-trash{background-position:-456px 0;}
-.icon-home{background-position:0 -24px;}
-.icon-file{background-position:-24px -24px;}
-.icon-time{background-position:-48px -24px;}
-.icon-road{background-position:-72px -24px;}
-.icon-download-alt{background-position:-96px -24px;}
-.icon-download{background-position:-120px -24px;}
-.icon-upload{background-position:-144px -24px;}
-.icon-inbox{background-position:-168px -24px;}
-.icon-play-circle{background-position:-192px -24px;}
-.icon-repeat{background-position:-216px -24px;}
-.icon-refresh{background-position:-240px -24px;}
-.icon-list-alt{background-position:-264px -24px;}
-.icon-lock{background-position:-287px -24px;}
-.icon-flag{background-position:-312px -24px;}
-.icon-headphones{background-position:-336px -24px;}
-.icon-volume-off{background-position:-360px -24px;}
-.icon-volume-down{background-position:-384px -24px;}
-.icon-volume-up{background-position:-408px -24px;}
-.icon-qrcode{background-position:-432px -24px;}
-.icon-barcode{background-position:-456px -24px;}
-.icon-tag{background-position:0 -48px;}
-.icon-tags{background-position:-25px -48px;}
-.icon-book{background-position:-48px -48px;}
-.icon-bookmark{background-position:-72px -48px;}
-.icon-print{background-position:-96px -48px;}
-.icon-camera{background-position:-120px -48px;}
-.icon-font{background-position:-144px -48px;}
-.icon-bold{background-position:-167px -48px;}
-.icon-italic{background-position:-192px -48px;}
-.icon-text-height{background-position:-216px -48px;}
-.icon-text-width{background-position:-240px -48px;}
-.icon-align-left{background-position:-264px -48px;}
-.icon-align-center{background-position:-288px -48px;}
-.icon-align-right{background-position:-312px -48px;}
-.icon-align-justify{background-position:-336px -48px;}
-.icon-list{background-position:-360px -48px;}
-.icon-indent-left{background-position:-384px -48px;}
-.icon-indent-right{background-position:-408px -48px;}
-.icon-facetime-video{background-position:-432px -48px;}
-.icon-picture{background-position:-456px -48px;}
-.icon-pencil{background-position:0 -72px;}
-.icon-map-marker{background-position:-24px -72px;}
-.icon-adjust{background-position:-48px -72px;}
-.icon-tint{background-position:-72px -72px;}
-.icon-edit{background-position:-96px -72px;}
-.icon-share{background-position:-120px -72px;}
-.icon-check{background-position:-144px -72px;}
-.icon-move{background-position:-168px -72px;}
-.icon-step-backward{background-position:-192px -72px;}
-.icon-fast-backward{background-position:-216px -72px;}
-.icon-backward{background-position:-240px -72px;}
-.icon-play{background-position:-264px -72px;}
-.icon-pause{background-position:-288px -72px;}
-.icon-stop{background-position:-312px -72px;}
-.icon-forward{background-position:-336px -72px;}
-.icon-fast-forward{background-position:-360px -72px;}
-.icon-step-forward{background-position:-384px -72px;}
-.icon-eject{background-position:-408px -72px;}
-.icon-chevron-left{background-position:-432px -72px;}
-.icon-chevron-right{background-position:-456px -72px;}
-.icon-plus-sign{background-position:0 -96px;}
-.icon-minus-sign{background-position:-24px -96px;}
-.icon-remove-sign{background-position:-48px -96px;}
-.icon-ok-sign{background-position:-72px -96px;}
-.icon-question-sign{background-position:-96px -96px;}
-.icon-info-sign{background-position:-120px -96px;}
-.icon-screenshot{background-position:-144px -96px;}
-.icon-remove-circle{background-position:-168px -96px;}
-.icon-ok-circle{background-position:-192px -96px;}
-.icon-ban-circle{background-position:-216px -96px;}
-.icon-arrow-left{background-position:-240px -96px;}
-.icon-arrow-right{background-position:-264px -96px;}
-.icon-arrow-up{background-position:-289px -96px;}
-.icon-arrow-down{background-position:-312px -96px;}
-.icon-share-alt{background-position:-336px -96px;}
-.icon-resize-full{background-position:-360px -96px;}
-.icon-resize-small{background-position:-384px -96px;}
-.icon-plus{background-position:-408px -96px;}
-.icon-minus{background-position:-433px -96px;}
-.icon-asterisk{background-position:-456px -96px;}
-.icon-exclamation-sign{background-position:0 -120px;}
-.icon-gift{background-position:-24px -120px;}
-.icon-leaf{background-position:-48px -120px;}
-.icon-fire{background-position:-72px -120px;}
-.icon-eye-open{background-position:-96px -120px;}
-.icon-eye-close{background-position:-120px -120px;}
-.icon-warning-sign{background-position:-144px -120px;}
-.icon-plane{background-position:-168px -120px;}
-.icon-calendar{background-position:-192px -120px;}
-.icon-random{background-position:-216px -120px;width:16px;}
-.icon-comment{background-position:-240px -120px;}
-.icon-magnet{background-position:-264px -120px;}
-.icon-chevron-up{background-position:-288px -120px;}
-.icon-chevron-down{background-position:-313px -119px;}
-.icon-retweet{background-position:-336px -120px;}
-.icon-shopping-cart{background-position:-360px -120px;}
-.icon-folder-close{background-position:-384px -120px;}
-.icon-folder-open{background-position:-408px -120px;width:16px;}
-.icon-resize-vertical{background-position:-432px -119px;}
-.icon-resize-horizontal{background-position:-456px -118px;}
-.icon-hdd{background-position:0 -144px;}
-.icon-bullhorn{background-position:-24px -144px;}
-.icon-bell{background-position:-48px -144px;}
-.icon-certificate{background-position:-72px -144px;}
-.icon-thumbs-up{background-position:-96px -144px;}
-.icon-thumbs-down{background-position:-120px -144px;}
-.icon-hand-right{background-position:-144px -144px;}
-.icon-hand-left{background-position:-168px -144px;}
-.icon-hand-up{background-position:-192px -144px;}
-.icon-hand-down{background-position:-216px -144px;}
-.icon-circle-arrow-right{background-position:-240px -144px;}
-.icon-circle-arrow-left{background-position:-264px -144px;}
-.icon-circle-arrow-up{background-position:-288px -144px;}
-.icon-circle-arrow-down{background-position:-312px -144px;}
-.icon-globe{background-position:-336px -144px;}
-.icon-wrench{background-position:-360px -144px;}
-.icon-tasks{background-position:-384px -144px;}
-.icon-filter{background-position:-408px -144px;}
-.icon-briefcase{background-position:-432px -144px;}
-.icon-fullscreen{background-position:-456px -144px;}
-.btn-group{position:relative;font-size:0;white-space:nowrap;*margin-left:.3em;}.btn-group:first-child{*margin-left:0;}
-.btn-group+.btn-group{margin-left:5px;}
-.btn-toolbar{font-size:0;margin-top:10px;margin-bottom:10px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;}
-.btn-toolbar .btn+.btn,.btn-toolbar .btn-group+.btn,.btn-toolbar .btn+.btn-group{margin-left:5px;}
-.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
-.btn-group>.btn+.btn{margin-left:-1px;}
-.btn-group>.btn,.btn-group>.dropdown-menu{font-size:14px;}
-.btn-group>.btn-mini{font-size:11px;}
-.btn-group>.btn-small{font-size:12px;}
-.btn-group>.btn-large{font-size:16px;}
-.btn-group>.btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
-.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
-.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;}
-.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;}
-.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2;}
-.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;}
-.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);*padding-top:5px;*padding-bottom:5px;}
-.btn-group>.btn-mini+.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:2px;*padding-bottom:2px;}
-.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px;}
-.btn-group>.btn-large+.dropdown-toggle{padding-left:12px;padding-right:12px;*padding-top:7px;*padding-bottom:7px;}
-.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);}
-.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6;}
-.btn-group.open .btn-primary.dropdown-toggle{background-color:#0e4cb5;}
-.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406;}
-.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f;}
-.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351;}
-.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4;}
-.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222222;}
-.btn .caret{margin-top:8px;margin-left:0;}
-.btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px;}
-.btn-large .caret{border-left-width:5px;border-right-width:5px;border-top-width:5px;}
-.dropup .btn-large .caret{border-bottom:5px solid #000000;border-top:0;}
-.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}
-.btn-group-vertical{display:inline-block;*display:inline;*zoom:1;}
-.btn-group-vertical .btn{display:block;float:none;width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
-.btn-group-vertical .btn+.btn{margin-left:0;margin-top:-1px;}
-.btn-group-vertical .btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}
-.btn-group-vertical .btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}
-.btn-group-vertical .btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0;}
-.btn-group-vertical .btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;}
-.nav{margin-left:0;margin-bottom:20px;list-style:none;}
-.nav>li>a{display:block;}
-.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;}
-.nav>.pull-right{float:right;}
-.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;}
-.nav li+.nav-header{margin-top:9px;}
-.nav-list{padding-left:15px;padding-right:15px;margin-bottom:0;}
-.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}
-.nav-list>li>a{padding:3px 15px;}
-.nav-list>.active>a,.nav-list>.active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0e84b5;}
-.nav-list [class^="icon-"]{margin-right:2px;}
-.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;}
-.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";line-height:0;}
-.nav-tabs:after,.nav-pills:after{clear:both;}
-.nav-tabs>li,.nav-pills>li{float:left;}
-.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;}
-.nav-tabs{border-bottom:1px solid #ddd;}
-.nav-tabs>li{margin-bottom:-1px;}
-.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;}
-.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;}
-.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
-.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#ffffff;background-color:#0e84b5;}
-.nav-stacked>li{float:none;}
-.nav-stacked>li>a{margin-right:0;}
-.nav-tabs.nav-stacked{border-bottom:0;}
-.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
-.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;}
-.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
-.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;}
-.nav-pills.nav-stacked>li>a{margin-bottom:3px;}
-.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;}
-.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;}
-.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
-.nav .dropdown-toggle .caret{border-top-color:#0e84b5;border-bottom-color:#0e84b5;margin-top:6px;}
-.nav .dropdown-toggle:hover .caret{border-top-color:#f26a1e;border-bottom-color:#f26a1e;}
-.nav-tabs .dropdown-toggle .caret{margin-top:8px;}
-.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff;}
-.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;}
-.nav>.dropdown.active>a:hover{cursor:pointer;}
-.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;}
-.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:1;filter:alpha(opacity=100);}
-.tabs-stacked .open>a:hover{border-color:#999999;}
-.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";line-height:0;}
-.tabbable:after{clear:both;}
-.tab-content{overflow:auto;}
-.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0;}
-.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;}
-.tab-content>.active,.pill-content>.active{display:block;}
-.tabs-below>.nav-tabs{border-top:1px solid #ddd;}
-.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0;}
-.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below>.nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;}
-.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd;}
-.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none;}
-.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;}
-.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;}
-.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
-.tabs-left>.nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;}
-.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;}
-.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;}
-.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
-.tabs-right>.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;}
-.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;}
-.nav>.disabled>a{color:#999999;}
-.nav>.disabled>a:hover{text-decoration:none;background-color:transparent;cursor:default;}
-.navbar{overflow:visible;margin-bottom:20px;color:#0e84b5;*position:relative;*z-index:2;}
-.navbar-inner{min-height:40px;padding-left:20px;padding-right:20px;background-color:#ffffff;background-image:-moz-linear-gradient(top, #ffffff, #ffffff);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#ffffff));background-image:-webkit-linear-gradient(top, #ffffff, #ffffff);background-image:-o-linear-gradient(top, #ffffff, #ffffff);background-image:linear-gradient(to bottom, #ffffff, #ffffff);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gra [...]
-.navbar .container{width:auto;}
-.nav-collapse.collapse{height:auto;}
-.navbar .brand{float:left;display:block;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#0e84b5;text-shadow:0 1px 0 #ffffff;}.navbar .brand:hover{text-decoration:none;}
-.navbar-text{margin-bottom:0;line-height:40px;}
-.navbar-link{color:#0e84b5;}.navbar-link:hover{color:#f26a1e;}
-.navbar .divider-vertical{height:40px;margin:0 9px;border-left:1px solid #ffffff;border-right:1px solid #ffffff;}
-.navbar .btn,.navbar .btn-group{margin-top:6px;}
-.navbar .btn-group .btn{margin:0;}
-.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0;}
-.navbar-form:after{clear:both;}
-.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;}
-.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0;}
-.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;}
-.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;}
-.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0;}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
-.navbar-static-top{position:static;width:100%;margin-bottom:0;}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
-.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0;}
-.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner,.navbar-static-top .navbar-inner{border:0;}
-.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
-.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;}
-.navbar-fixed-top{top:0;}
-.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);box-shadow:inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);}
-.navbar-fixed-bottom{bottom:0;}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);box-shadow:inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);}
-.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;}
-.navbar .nav.pull-right{float:right;}
-.navbar .nav>li{float:left;}
-.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#0e84b5;text-decoration:none;text-shadow:0 1px 0 #ffffff;}
-.navbar .nav .dropdown-toggle .caret{margin-top:8px;}
-.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#f26a1e;text-decoration:none;}
-.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#f26a1e;text-decoration:none;background-color:#f2f2f2;-webkit-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);-moz-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);}
-.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#f2f2f2;background-image:-moz-linear-gradient(top, #f2f2f2, #f2f2f2);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#f2f2f2));background-image:-webkit-linear-gradient(top, #f2f2f2, #f2f2f2);background-image:-o-linear-gradient(top, #f2f2f2, #f2f2f2);background-image:linear-gradient(to bottom, #f2f2f [...]
-.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#d9d9d9 \9;}
-.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);}
-.btn-navbar .icon-bar+.icon-bar{margin-top:3px;}
-.navbar .nav>li>.dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;}
-.navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;}
-.navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0, 0, 0, 0.2);border-bottom:0;bottom:-7px;top:auto;}
-.navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #ffffff;border-bottom:0;bottom:-6px;top:auto;}
-.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#f2f2f2;color:#f26a1e;}
-.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#0e84b5;border-bottom-color:#0e84b5;}
-.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#f26a1e;border-bottom-color:#f26a1e;}
-.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{left:auto;right:0;}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px;}
-.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px;}
-.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;}
-.navbar-inverse{color:#999999;}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top, #222222, #111111);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));background-image:-webkit-linear-gradient(top, #222222, #111111);background-image:-o-linear-gradient(top, #222222, #111111);background-image:linear-gradient(to bottom, #222222, #111111);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient( [...]
-.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999999;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover{color:#ffffff;}
-.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:transparent;color:#ffffff;}
-.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#ffffff;background-color:#111111;}
-.navbar-inverse .navbar-link{color:#999999;}.navbar-inverse .navbar-link:hover{color:#ffffff;}
-.navbar-inverse .divider-vertical{border-left-color:#111111;border-right-color:#222222;}
-.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{background-color:#111111;color:#ffffff;}
-.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999999;border-bottom-color:#999999;}
-.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}
-.navbar-inverse .navbar-search .search-query{color:#ffffff;background-color:#515151;border-color:#111111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#cccccc;}
-.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#cccccc;}
-.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#cccccc;}
-.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;}
-.navbar-inverse .btn-navbar{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e0e0e;background-image:-moz-linear-gradient(top, #151515, #040404);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));background-image:-webkit-linear-gradient(top, #151515, #040404);background-image:-o-linear-gradient(top, #151515, #040404);background-image:linear-gradient(to bottom, #151515, #040404);background-repeat:repeat-x;filter:progid:DXImageTransfo [...]
-.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000000 \9;}
-.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.breadcrumb li{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 0 #ffffff;}
-.breadcrumb .divider{padding:0 5px;color:#ccc;}
-.breadcrumb .active{color:#999999;}
-.pagination{height:40px;margin:20px 0;}
-.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);}
-.pagination li{display:inline;}
-.pagination a,.pagination span{float:left;padding:0 14px;line-height:38px;text-decoration:none;background-color:#ffffff;border:1px solid #dddddd;border-left-width:0;}
-.pagination a:hover,.pagination .active a,.pagination .active span{background-color:#f5f5f5;}
-.pagination .active a,.pagination .active span{color:#999999;cursor:default;}
-.pagination .disabled span,.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;}
-.pagination li:first-child a,.pagination li:first-child span{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
-.pagination li:last-child a,.pagination li:last-child span{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
-.pagination-centered{text-align:center;}
-.pagination-right{text-align:right;}
-.pager{margin:20px 0;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";line-height:0;}
-.pager:after{clear:both;}
-.pager li{display:inline;}
-.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
-.pager a:hover{text-decoration:none;background-color:#f5f5f5;}
-.pager .next a{float:right;}
-.pager .previous a{float:left;}
-.pager .disabled a,.pager .disabled a:hover{color:#999999;background-color:#fff;cursor:default;}
-.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";line-height:0;}
-.thumbnails:after{clear:both;}
-.row-fluid .thumbnails{margin-left:0;}
-.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px;}
-.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;}
-a.thumbnail:hover{border-color:#0e84b5;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);}
-.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;}
-.thumbnail .caption{padding:9px;color:#555555;}
-.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;color:#c09853;}
-.alert h4{margin:0;}
-.alert .close{position:relative;top:-2px;right:-21px;line-height:20px;}
-.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847;}
-.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48;}
-.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad;}
-.alert-block{padding-top:14px;padding-bottom:14px;}
-.alert-block>p,.alert-block>ul{margin-bottom:0;}
-.alert-block p+p{margin-top:5px;}
- at -webkit-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-o-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0 [...]
-.progress .bar{width:0%;height:100%;color:#ffffff;float:left;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(to bottom, #149bdf, #0480be);bac [...]
-.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);}
-.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, [...]
-.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;}
-.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(to bottom, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f [...]
-.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, t [...]
-.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(to bottom, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=' [...]
-.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, [...]
-.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(to bottom, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc [...]
-.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, trans [...]
-.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=' [...]
-.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, [...]
-.hero-unit{padding:60px;margin-bottom:30px;background-color:#eeeeee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;color:inherit;letter-spacing:-1px;}
-.hero-unit p{font-size:18px;font-weight:200;line-height:30px;color:inherit;}
-.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);}
-.tooltip.top{margin-top:-3px;}
-.tooltip.right{margin-left:3px;}
-.tooltip.bottom{margin-top:3px;}
-.tooltip.left{margin-left:-3px;}
-.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
-.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid;}
-.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000;}
-.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000;}
-.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000;}
-.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000;}
-.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;background-color:#ffffff;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);}.popover.top{margin-bo [...]
-.popover.right{margin-left:10px;}
-.popover.bottom{margin-top:10px;}
-.popover.left{margin-right:10px;}
-.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0;}
-.popover-content{padding:9px 14px;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;}
-.popover .arrow,.popover .arrow:after{position:absolute;display:inline-block;width:0;height:0;border-color:transparent;border-style:solid;}
-.popover .arrow:after{content:"";z-index:-1;}
-.popover.top .arrow{bottom:-10px;left:50%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#ffffff;}.popover.top .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0, 0, 0, 0.25);bottom:-1px;left:-11px;}
-.popover.right .arrow{top:50%;left:-10px;margin-top:-10px;border-width:10px 10px 10px 0;border-right-color:#ffffff;}.popover.right .arrow:after{border-width:11px 11px 11px 0;border-right-color:rgba(0, 0, 0, 0.25);bottom:-11px;left:-1px;}
-.popover.bottom .arrow{top:-10px;left:50%;margin-left:-10px;border-width:0 10px 10px;border-bottom-color:#ffffff;}.popover.bottom .arrow:after{border-width:0 11px 11px;border-bottom-color:rgba(0, 0, 0, 0.25);top:-1px;left:-11px;}
-.popover.left .arrow{top:50%;right:-10px;margin-top:-10px;border-width:10px 0 10px 10px;border-left-color:#ffffff;}.popover.left .arrow:after{border-width:11px 0 11px 11px;border-left-color:rgba(0, 0, 0, 0.25);bottom:-11px;right:-1px;}
-.modal-open .dropdown-menu{z-index:2050;}
-.modal-open .dropdown.open{*z-index:2050;}
-.modal-open .popover{z-index:2060;}
-.modal-open .tooltip{z-index:2080;}
-.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;}
-.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);}
-.modal{position:fixed;top:50%;left:50%;z-index:1050;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-cli [...]
-.modal.fade.in{top:50%;}
-.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;}
-.modal-header h3{margin:0;line-height:30px;}
-.modal-body{overflow-y:auto;max-height:400px;padding:15px;}
-.modal-form{margin-bottom:0;}
-.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0;}
-.modal-footer:after{clear:both;}
-.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0;}
-.modal-footer .btn-group .btn+.btn{margin-left:-1px;}
-.dropup,.dropdown{position:relative;}
-.dropdown-toggle{*margin-bottom:-3px;}
-.dropdown-toggle:active,.open .dropdown-toggle{outline:0;}
-.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000000;border-right:4px solid transparent;border-left:4px solid transparent;content:"";}
-.dropdown .caret{margin-top:8px;margin-left:2px;}
-.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#ffffff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-ba [...]
-.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;}
-.dropdown-menu a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333333;white-space:nowrap;}
-.dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a{text-decoration:none;color:#ffffff;background-color:#0e84b5;background-color:#0d7dac;background-image:-moz-linear-gradient(top, #0e84b5, #0c739d);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0e84b5), to(#0c739d));background-image:-webkit-linear-gradient(top, #0e84b5, #0c739d);background-image:-o-linear-gradient(top, #0e84b5, #0c739d);background-image:linear-gradient(to bottom, #0e84b5, #0c739d); [...]
-.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;outline:0;background-color:#0e84b5;background-color:#0d7dac;background-image:-moz-linear-gradient(top, #0e84b5, #0c739d);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0e84b5), to(#0c739d));background-image:-webkit-linear-gradient(top, #0e84b5, #0c739d);background-image:-o-linear-gradient(top, #0e84b5, #0c739d);background-image:linear-gradient(to bottom, #0e84b5, #0c739d);background-r [...]
-.dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999999;}
-.dropdown-menu .disabled>a:hover{text-decoration:none;background-color:transparent;cursor:default;}
-.open{*z-index:1000;}.open >.dropdown-menu{display:block;}
-.pull-right>.dropdown-menu{right:0;left:auto;}
-.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000000;content:"\2191";}
-.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px;}
-.dropdown-submenu{position:relative;}
-.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;}
-.dropdown-submenu:hover .dropdown-menu{display:block;}
-.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#cccccc;margin-top:5px;margin-right:-10px;}
-.dropdown-submenu:hover>a:after{border-left-color:#ffffff;}
-.dropdown .dropdown-menu .nav-header{padding-left:20px;padding-right:20px;}
-.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
-.accordion{margin-bottom:20px;}
-.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
-.accordion-heading{border-bottom:0;}
-.accordion-heading .accordion-toggle{display:block;padding:8px 15px;}
-.accordion-toggle{cursor:pointer;}
-.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;}
-.carousel{position:relative;margin-bottom:20px;line-height:1;}
-.carousel-inner{overflow:hidden;width:100%;position:relative;}
-.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;}
-.carousel .item>img{display:block;line-height:1;}
-.carousel .active,.carousel .next,.carousel .prev{display:block;}
-.carousel .active{left:0;}
-.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;}
-.carousel .next{left:100%;}
-.carousel .prev{left:-100%;}
-.carousel .next.left,.carousel .prev.right{left:0;}
-.carousel .active.left{left:-100%;}
-.carousel .active.right{left:100%;}
-.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;}
-.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);}
-.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:15px;background:#333333;background:rgba(0, 0, 0, 0.75);}
-.carousel-caption h4,.carousel-caption p{color:#ffffff;line-height:20px;}
-.carousel-caption h4{margin:0 0 5px;}
-.carousel-caption p{margin-bottom:0;}
-.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);}
-.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
-.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
-.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;cursor:pointer;opacity:0.4;filter:alpha(opacity=40);}
-button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none;}
-.pull-right{float:right;}
-.pull-left{float:left;}
-.hide{display:none;}
-.show{display:block;}
-.invisible{visibility:hidden;}
-.affix{position:fixed;}
-.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;}.fade.in{opacity:1;}
-.collapse{position:relative;height:0;overflow:hidden;overflow:visible \9;-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;}.collapse.in{height:auto;}
-.hidden{display:none;visibility:hidden;}
-.visible-phone{display:none !important;}
-.visible-tablet{display:none !important;}
-.hidden-desktop{display:none !important;}
-.visible-desktop{display:inherit !important;}
- at media (min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important ;} .visible-tablet{display:inherit !important;} .hidden-tablet{display:none !important;}}@media (max-width:767px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important;} .visible-phone{display:inherit !important;} .hidden-phone{display:none !important;}}@media (max-width:767px){body{padding-left:20px;padding-right:20px;} .nav [...]
-
-.footer {
- background-color: #eee;
-}
-
-.quick-links {
- background-color: #EEEEEE;
-}
-
-.quick-links strong {
- color: #999999;
-}
diff --git a/doc/_themes/bootstrap/static/bootstrap-responsive.css b/doc/_themes/bootstrap/static/bootstrap-responsive.css
deleted file mode 100644
index daafa91..0000000
--- a/doc/_themes/bootstrap/static/bootstrap-responsive.css
+++ /dev/null
@@ -1,1040 +0,0 @@
-/*!
- * Bootstrap Responsive v2.1.0
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */
-
-.clearfix {
- *zoom: 1;
-}
-
-.clearfix:before,
-.clearfix:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.clearfix:after {
- clear: both;
-}
-
-.hide-text {
- font: 0/0 a;
- color: transparent;
- text-shadow: none;
- background-color: transparent;
- border: 0;
-}
-
-.input-block-level {
- display: block;
- width: 100%;
- min-height: 30px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-
-.hidden {
- display: none;
- visibility: hidden;
-}
-
-.visible-phone {
- display: none !important;
-}
-
-.visible-tablet {
- display: none !important;
-}
-
-.hidden-desktop {
- display: none !important;
-}
-
-.visible-desktop {
- display: inherit !important;
-}
-
- at media (min-width: 768px) and (max-width: 979px) {
- .hidden-desktop {
- display: inherit !important;
- }
- .visible-desktop {
- display: none !important ;
- }
- .visible-tablet {
- display: inherit !important;
- }
- .hidden-tablet {
- display: none !important;
- }
-}
-
- at media (max-width: 767px) {
- .hidden-desktop {
- display: inherit !important;
- }
- .visible-desktop {
- display: none !important;
- }
- .visible-phone {
- display: inherit !important;
- }
- .hidden-phone {
- display: none !important;
- }
-}
-
- at media (min-width: 1200px) {
- .row {
- margin-left: -30px;
- *zoom: 1;
- }
- .row:before,
- .row:after {
- display: table;
- line-height: 0;
- content: "";
- }
- .row:after {
- clear: both;
- }
- [class*="span"] {
- float: left;
- margin-left: 30px;
- }
- .container,
- .navbar-static-top .container,
- .navbar-fixed-top .container,
- .navbar-fixed-bottom .container {
- width: 1170px;
- }
- .span12 {
- width: 1170px;
- }
- .span11 {
- width: 1070px;
- }
- .span10 {
- width: 970px;
- }
- .span9 {
- width: 870px;
- }
- .span8 {
- width: 770px;
- }
- .span7 {
- width: 670px;
- }
- .span6 {
- width: 570px;
- }
- .span5 {
- width: 470px;
- }
- .span4 {
- width: 370px;
- }
- .span3 {
- width: 270px;
- }
- .span2 {
- width: 170px;
- }
- .span1 {
- width: 70px;
- }
- .offset12 {
- margin-left: 1230px;
- }
- .offset11 {
- margin-left: 1130px;
- }
- .offset10 {
- margin-left: 1030px;
- }
- .offset9 {
- margin-left: 930px;
- }
- .offset8 {
- margin-left: 830px;
- }
- .offset7 {
- margin-left: 730px;
- }
- .offset6 {
- margin-left: 630px;
- }
- .offset5 {
- margin-left: 530px;
- }
- .offset4 {
- margin-left: 430px;
- }
- .offset3 {
- margin-left: 330px;
- }
- .offset2 {
- margin-left: 230px;
- }
- .offset1 {
- margin-left: 130px;
- }
- .row-fluid {
- width: 100%;
- *zoom: 1;
- }
- .row-fluid:before,
- .row-fluid:after {
- display: table;
- line-height: 0;
- content: "";
- }
- .row-fluid:after {
- clear: both;
- }
- .row-fluid [class*="span"] {
- display: block;
- float: left;
- width: 100%;
- min-height: 30px;
- margin-left: 2.564102564102564%;
- *margin-left: 2.5109110747408616%;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- }
- .row-fluid [class*="span"]:first-child {
- margin-left: 0;
- }
- .row-fluid .span12 {
- width: 100%;
- *width: 99.94680851063829%;
- }
- .row-fluid .span11 {
- width: 91.45299145299145%;
- *width: 91.39979996362975%;
- }
- .row-fluid .span10 {
- width: 82.90598290598291%;
- *width: 82.8527914166212%;
- }
- .row-fluid .span9 {
- width: 74.35897435897436%;
- *width: 74.30578286961266%;
- }
- .row-fluid .span8 {
- width: 65.81196581196582%;
- *width: 65.75877432260411%;
- }
- .row-fluid .span7 {
- width: 57.26495726495726%;
- *width: 57.21176577559556%;
- }
- .row-fluid .span6 {
- width: 48.717948717948715%;
- *width: 48.664757228587014%;
- }
- .row-fluid .span5 {
- width: 40.17094017094017%;
- *width: 40.11774868157847%;
- }
- .row-fluid .span4 {
- width: 31.623931623931625%;
- *width: 31.570740134569924%;
- }
- .row-fluid .span3 {
- width: 23.076923076923077%;
- *width: 23.023731587561375%;
- }
- .row-fluid .span2 {
- width: 14.52991452991453%;
- *width: 14.476723040552828%;
- }
- .row-fluid .span1 {
- width: 5.982905982905983%;
- *width: 5.929714493544281%;
- }
- .row-fluid .offset12 {
- margin-left: 105.12820512820512%;
- *margin-left: 105.02182214948171%;
- }
- .row-fluid .offset12:first-child {
- margin-left: 102.56410256410257%;
- *margin-left: 102.45771958537915%;
- }
- .row-fluid .offset11 {
- margin-left: 96.58119658119658%;
- *margin-left: 96.47481360247316%;
- }
- .row-fluid .offset11:first-child {
- margin-left: 94.01709401709402%;
- *margin-left: 93.91071103837061%;
- }
- .row-fluid .offset10 {
- margin-left: 88.03418803418803%;
- *margin-left: 87.92780505546462%;
- }
- .row-fluid .offset10:first-child {
- margin-left: 85.47008547008548%;
- *margin-left: 85.36370249136206%;
- }
- .row-fluid .offset9 {
- margin-left: 79.48717948717949%;
- *margin-left: 79.38079650845607%;
- }
- .row-fluid .offset9:first-child {
- margin-left: 76.92307692307693%;
- *margin-left: 76.81669394435352%;
- }
- .row-fluid .offset8 {
- margin-left: 70.94017094017094%;
- *margin-left: 70.83378796144753%;
- }
- .row-fluid .offset8:first-child {
- margin-left: 68.37606837606839%;
- *margin-left: 68.26968539734497%;
- }
- .row-fluid .offset7 {
- margin-left: 62.393162393162385%;
- *margin-left: 62.28677941443899%;
- }
- .row-fluid .offset7:first-child {
- margin-left: 59.82905982905982%;
- *margin-left: 59.72267685033642%;
- }
- .row-fluid .offset6 {
- margin-left: 53.84615384615384%;
- *margin-left: 53.739770867430444%;
- }
- .row-fluid .offset6:first-child {
- margin-left: 51.28205128205128%;
- *margin-left: 51.175668303327875%;
- }
- .row-fluid .offset5 {
- margin-left: 45.299145299145295%;
- *margin-left: 45.1927623204219%;
- }
- .row-fluid .offset5:first-child {
- margin-left: 42.73504273504273%;
- *margin-left: 42.62865975631933%;
- }
- .row-fluid .offset4 {
- margin-left: 36.75213675213675%;
- *margin-left: 36.645753773413354%;
- }
- .row-fluid .offset4:first-child {
- margin-left: 34.18803418803419%;
- *margin-left: 34.081651209310785%;
- }
- .row-fluid .offset3 {
- margin-left: 28.205128205128204%;
- *margin-left: 28.0987452264048%;
- }
- .row-fluid .offset3:first-child {
- margin-left: 25.641025641025642%;
- *margin-left: 25.53464266230224%;
- }
- .row-fluid .offset2 {
- margin-left: 19.65811965811966%;
- *margin-left: 19.551736679396257%;
- }
- .row-fluid .offset2:first-child {
- margin-left: 17.094017094017094%;
- *margin-left: 16.98763411529369%;
- }
- .row-fluid .offset1 {
- margin-left: 11.11111111111111%;
- *margin-left: 11.004728132387708%;
- }
- .row-fluid .offset1:first-child {
- margin-left: 8.547008547008547%;
- *margin-left: 8.440625568285142%;
- }
- input,
- textarea,
- .uneditable-input {
- margin-left: 0;
- }
- .controls-row [class*="span"] + [class*="span"] {
- margin-left: 30px;
- }
- input.span12,
- textarea.span12,
- .uneditable-input.span12 {
- width: 1156px;
- }
- input.span11,
- textarea.span11,
- .uneditable-input.span11 {
- width: 1056px;
- }
- input.span10,
- textarea.span10,
- .uneditable-input.span10 {
- width: 956px;
- }
- input.span9,
- textarea.span9,
- .uneditable-input.span9 {
- width: 856px;
- }
- input.span8,
- textarea.span8,
- .uneditable-input.span8 {
- width: 756px;
- }
- input.span7,
- textarea.span7,
- .uneditable-input.span7 {
- width: 656px;
- }
- input.span6,
- textarea.span6,
- .uneditable-input.span6 {
- width: 556px;
- }
- input.span5,
- textarea.span5,
- .uneditable-input.span5 {
- width: 456px;
- }
- input.span4,
- textarea.span4,
- .uneditable-input.span4 {
- width: 356px;
- }
- input.span3,
- textarea.span3,
- .uneditable-input.span3 {
- width: 256px;
- }
- input.span2,
- textarea.span2,
- .uneditable-input.span2 {
- width: 156px;
- }
- input.span1,
- textarea.span1,
- .uneditable-input.span1 {
- width: 56px;
- }
- .thumbnails {
- margin-left: -30px;
- }
- .thumbnails > li {
- margin-left: 30px;
- }
- .row-fluid .thumbnails {
- margin-left: 0;
- }
-}
-
- at media (min-width: 768px) and (max-width: 979px) {
- .row {
- margin-left: -20px;
- *zoom: 1;
- }
- .row:before,
- .row:after {
- display: table;
- line-height: 0;
- content: "";
- }
- .row:after {
- clear: both;
- }
- [class*="span"] {
- float: left;
- margin-left: 20px;
- }
- .container,
- .navbar-static-top .container,
- .navbar-fixed-top .container,
- .navbar-fixed-bottom .container {
- width: 724px;
- }
- .span12 {
- width: 724px;
- }
- .span11 {
- width: 662px;
- }
- .span10 {
- width: 600px;
- }
- .span9 {
- width: 538px;
- }
- .span8 {
- width: 476px;
- }
- .span7 {
- width: 414px;
- }
- .span6 {
- width: 352px;
- }
- .span5 {
- width: 290px;
- }
- .span4 {
- width: 228px;
- }
- .span3 {
- width: 166px;
- }
- .span2 {
- width: 104px;
- }
- .span1 {
- width: 42px;
- }
- .offset12 {
- margin-left: 764px;
- }
- .offset11 {
- margin-left: 702px;
- }
- .offset10 {
- margin-left: 640px;
- }
- .offset9 {
- margin-left: 578px;
- }
- .offset8 {
- margin-left: 516px;
- }
- .offset7 {
- margin-left: 454px;
- }
- .offset6 {
- margin-left: 392px;
- }
- .offset5 {
- margin-left: 330px;
- }
- .offset4 {
- margin-left: 268px;
- }
- .offset3 {
- margin-left: 206px;
- }
- .offset2 {
- margin-left: 144px;
- }
- .offset1 {
- margin-left: 82px;
- }
- .row-fluid {
- width: 100%;
- *zoom: 1;
- }
- .row-fluid:before,
- .row-fluid:after {
- display: table;
- line-height: 0;
- content: "";
- }
- .row-fluid:after {
- clear: both;
- }
- .row-fluid [class*="span"] {
- display: block;
- float: left;
- width: 100%;
- min-height: 30px;
- margin-left: 2.7624309392265194%;
- *margin-left: 2.709239449864817%;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- }
- .row-fluid [class*="span"]:first-child {
- margin-left: 0;
- }
- .row-fluid .span12 {
- width: 100%;
- *width: 99.94680851063829%;
- }
- .row-fluid .span11 {
- width: 91.43646408839778%;
- *width: 91.38327259903608%;
- }
- .row-fluid .span10 {
- width: 82.87292817679558%;
- *width: 82.81973668743387%;
- }
- .row-fluid .span9 {
- width: 74.30939226519337%;
- *width: 74.25620077583166%;
- }
- .row-fluid .span8 {
- width: 65.74585635359117%;
- *width: 65.69266486422946%;
- }
- .row-fluid .span7 {
- width: 57.18232044198895%;
- *width: 57.12912895262725%;
- }
- .row-fluid .span6 {
- width: 48.61878453038674%;
- *width: 48.56559304102504%;
- }
- .row-fluid .span5 {
- width: 40.05524861878453%;
- *width: 40.00205712942283%;
- }
- .row-fluid .span4 {
- width: 31.491712707182323%;
- *width: 31.43852121782062%;
- }
- .row-fluid .span3 {
- width: 22.92817679558011%;
- *width: 22.87498530621841%;
- }
- .row-fluid .span2 {
- width: 14.3646408839779%;
- *width: 14.311449394616199%;
- }
- .row-fluid .span1 {
- width: 5.801104972375691%;
- *width: 5.747913483013988%;
- }
- .row-fluid .offset12 {
- margin-left: 105.52486187845304%;
- *margin-left: 105.41847889972962%;
- }
- .row-fluid .offset12:first-child {
- margin-left: 102.76243093922652%;
- *margin-left: 102.6560479605031%;
- }
- .row-fluid .offset11 {
- margin-left: 96.96132596685082%;
- *margin-left: 96.8549429881274%;
- }
- .row-fluid .offset11:first-child {
- margin-left: 94.1988950276243%;
- *margin-left: 94.09251204890089%;
- }
- .row-fluid .offset10 {
- margin-left: 88.39779005524862%;
- *margin-left: 88.2914070765252%;
- }
- .row-fluid .offset10:first-child {
- margin-left: 85.6353591160221%;
- *margin-left: 85.52897613729868%;
- }
- .row-fluid .offset9 {
- margin-left: 79.8342541436464%;
- *margin-left: 79.72787116492299%;
- }
- .row-fluid .offset9:first-child {
- margin-left: 77.07182320441989%;
- *margin-left: 76.96544022569647%;
- }
- .row-fluid .offset8 {
- margin-left: 71.2707182320442%;
- *margin-left: 71.16433525332079%;
- }
- .row-fluid .offset8:first-child {
- margin-left: 68.50828729281768%;
- *margin-left: 68.40190431409427%;
- }
- .row-fluid .offset7 {
- margin-left: 62.70718232044199%;
- *margin-left: 62.600799341718584%;
- }
- .row-fluid .offset7:first-child {
- margin-left: 59.94475138121547%;
- *margin-left: 59.838368402492065%;
- }
- .row-fluid .offset6 {
- margin-left: 54.14364640883978%;
- *margin-left: 54.037263430116376%;
- }
- .row-fluid .offset6:first-child {
- margin-left: 51.38121546961326%;
- *margin-left: 51.27483249088986%;
- }
- .row-fluid .offset5 {
- margin-left: 45.58011049723757%;
- *margin-left: 45.47372751851417%;
- }
- .row-fluid .offset5:first-child {
- margin-left: 42.81767955801105%;
- *margin-left: 42.71129657928765%;
- }
- .row-fluid .offset4 {
- margin-left: 37.01657458563536%;
- *margin-left: 36.91019160691196%;
- }
- .row-fluid .offset4:first-child {
- margin-left: 34.25414364640884%;
- *margin-left: 34.14776066768544%;
- }
- .row-fluid .offset3 {
- margin-left: 28.45303867403315%;
- *margin-left: 28.346655695309746%;
- }
- .row-fluid .offset3:first-child {
- margin-left: 25.69060773480663%;
- *margin-left: 25.584224756083227%;
- }
- .row-fluid .offset2 {
- margin-left: 19.88950276243094%;
- *margin-left: 19.783119783707537%;
- }
- .row-fluid .offset2:first-child {
- margin-left: 17.12707182320442%;
- *margin-left: 17.02068884448102%;
- }
- .row-fluid .offset1 {
- margin-left: 11.32596685082873%;
- *margin-left: 11.219583872105325%;
- }
- .row-fluid .offset1:first-child {
- margin-left: 8.56353591160221%;
- *margin-left: 8.457152932878806%;
- }
- input,
- textarea,
- .uneditable-input {
- margin-left: 0;
- }
- .controls-row [class*="span"] + [class*="span"] {
- margin-left: 20px;
- }
- input.span12,
- textarea.span12,
- .uneditable-input.span12 {
- width: 710px;
- }
- input.span11,
- textarea.span11,
- .uneditable-input.span11 {
- width: 648px;
- }
- input.span10,
- textarea.span10,
- .uneditable-input.span10 {
- width: 586px;
- }
- input.span9,
- textarea.span9,
- .uneditable-input.span9 {
- width: 524px;
- }
- input.span8,
- textarea.span8,
- .uneditable-input.span8 {
- width: 462px;
- }
- input.span7,
- textarea.span7,
- .uneditable-input.span7 {
- width: 400px;
- }
- input.span6,
- textarea.span6,
- .uneditable-input.span6 {
- width: 338px;
- }
- input.span5,
- textarea.span5,
- .uneditable-input.span5 {
- width: 276px;
- }
- input.span4,
- textarea.span4,
- .uneditable-input.span4 {
- width: 214px;
- }
- input.span3,
- textarea.span3,
- .uneditable-input.span3 {
- width: 152px;
- }
- input.span2,
- textarea.span2,
- .uneditable-input.span2 {
- width: 90px;
- }
- input.span1,
- textarea.span1,
- .uneditable-input.span1 {
- width: 28px;
- }
-}
-
- at media (max-width: 767px) {
- body {
- padding-right: 20px;
- padding-left: 20px;
- }
- .navbar-fixed-top,
- .navbar-fixed-bottom {
- margin-right: -20px;
- margin-left: -20px;
- }
- .container-fluid {
- padding: 0;
- }
- .dl-horizontal dt {
- float: none;
- width: auto;
- clear: none;
- text-align: left;
- }
- .dl-horizontal dd {
- margin-left: 0;
- }
- .container {
- width: auto;
- }
- .row-fluid {
- width: 100%;
- }
- .row,
- .thumbnails {
- margin-left: 0;
- }
- .thumbnails > li {
- float: none;
- margin-left: 0;
- }
- [class*="span"],
- .row-fluid [class*="span"] {
- display: block;
- float: none;
- width: auto;
- margin-left: 0;
- }
- .span12,
- .row-fluid .span12 {
- width: 100%;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- }
- .input-large,
- .input-xlarge,
- .input-xxlarge,
- input[class*="span"],
- select[class*="span"],
- textarea[class*="span"],
- .uneditable-input {
- display: block;
- width: 100%;
- min-height: 30px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- }
- .input-prepend input,
- .input-append input,
- .input-prepend input[class*="span"],
- .input-append input[class*="span"] {
- display: inline-block;
- width: auto;
- }
- .modal {
- position: fixed;
- top: 20px;
- right: 20px;
- left: 20px;
- width: auto;
- margin: 0;
- }
- .modal.fade.in {
- top: auto;
- }
-}
-
- at media (max-width: 480px) {
- .nav-collapse {
- -webkit-transform: translate3d(0, 0, 0);
- }
- .page-header h1 small {
- display: block;
- line-height: 20px;
- }
- input[type="checkbox"],
- input[type="radio"] {
- border: 1px solid #ccc;
- }
- .form-horizontal .control-group > label {
- float: none;
- width: auto;
- padding-top: 0;
- text-align: left;
- }
- .form-horizontal .controls {
- margin-left: 0;
- }
- .form-horizontal .control-list {
- padding-top: 0;
- }
- .form-horizontal .form-actions {
- padding-right: 10px;
- padding-left: 10px;
- }
- .modal {
- top: 10px;
- right: 10px;
- left: 10px;
- }
- .modal-header .close {
- padding: 10px;
- margin: -10px;
- }
- .carousel-caption {
- position: static;
- }
-}
-
- at media (max-width: 979px) {
- body {
- padding-top: 0;
- }
- .navbar-fixed-top,
- .navbar-fixed-bottom {
- position: static;
- }
- .navbar-fixed-top {
- margin-bottom: 20px;
- }
- .navbar-fixed-bottom {
- margin-top: 20px;
- }
- .navbar-fixed-top .navbar-inner,
- .navbar-fixed-bottom .navbar-inner {
- padding: 5px;
- }
- .navbar .container {
- width: auto;
- padding: 0;
- }
- .navbar .brand {
- padding-right: 10px;
- padding-left: 10px;
- margin: 0 0 0 -5px;
- }
- .nav-collapse {
- clear: both;
- }
- .nav-collapse .nav {
- float: none;
- margin: 0 0 10px;
- }
- .nav-collapse .nav > li {
- float: none;
- }
- .nav-collapse .nav > li > a {
- margin-bottom: 2px;
- }
- .nav-collapse .nav > .divider-vertical {
- display: none;
- }
- .nav-collapse .nav .nav-header {
- color: #555555;
- text-shadow: none;
- }
- .nav-collapse .nav > li > a,
- .nav-collapse .dropdown-menu a {
- padding: 9px 15px;
- font-weight: bold;
- color: #555555;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
- }
- .nav-collapse .btn {
- padding: 4px 10px 4px;
- font-weight: normal;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- }
- .nav-collapse .dropdown-menu li + li a {
- margin-bottom: 2px;
- }
- .nav-collapse .nav > li > a:hover,
- .nav-collapse .dropdown-menu a:hover {
- background-color: #f2f2f2;
- }
- .navbar-inverse .nav-collapse .nav > li > a:hover,
- .navbar-inverse .nav-collapse .dropdown-menu a:hover {
- background-color: #111111;
- }
- .nav-collapse.in .btn-group {
- padding: 0;
- margin-top: 5px;
- }
- .nav-collapse .dropdown-menu {
- position: static;
- top: auto;
- left: auto;
- display: block;
- float: none;
- max-width: none;
- padding: 0;
- margin: 0 15px;
- background-color: transparent;
- border: none;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
- }
- .nav-collapse .dropdown-menu:before,
- .nav-collapse .dropdown-menu:after {
- display: none;
- }
- .nav-collapse .dropdown-menu .divider {
- display: none;
- }
- .nav-collapse .navbar-form,
- .nav-collapse .navbar-search {
- float: none;
- padding: 10px 15px;
- margin: 10px 0;
- border-top: 1px solid #f2f2f2;
- border-bottom: 1px solid #f2f2f2;
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
- -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
- }
- .navbar .nav-collapse .nav.pull-right {
- float: none;
- margin-left: 0;
- }
- .nav-collapse,
- .nav-collapse.collapse {
- height: 0;
- overflow: hidden;
- }
- .navbar .btn-navbar {
- display: block;
- }
- .navbar-static .navbar-inner {
- padding-right: 10px;
- padding-left: 10px;
- }
-}
-
- at media (min-width: 980px) {
- .nav-collapse.collapse {
- height: auto !important;
- overflow: visible !important;
- }
-}
diff --git a/doc/_themes/bootstrap/static/bootstrap-responsive.min.css b/doc/_themes/bootstrap/static/bootstrap-responsive.min.css
deleted file mode 100644
index ab59da3..0000000
--- a/doc/_themes/bootstrap/static/bootstrap-responsive.min.css
+++ /dev/null
@@ -1,9 +0,0 @@
-/*!
- * Bootstrap Responsive v2.1.0
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{displa [...]
diff --git a/doc/_themes/bootstrap/static/bootstrap-sapling.css b/doc/_themes/bootstrap/static/bootstrap-sapling.css
deleted file mode 100644
index c50510a..0000000
--- a/doc/_themes/bootstrap/static/bootstrap-sapling.css
+++ /dev/null
@@ -1,6484 +0,0 @@
-/*!
- * vendor/styles/bootstrap v2.0.3
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-nav,
-section {
- display: block;
-}
-audio,
-canvas,
-video {
- display: inline-block;
- *display: inline;
- *zoom: 1;
-}
-audio:not([controls]) {
- display: none;
-}
-html {
- font-size: 100%;
- -webkit-text-size-adjust: 100%;
- -ms-text-size-adjust: 100%;
-}
-a:focus {
- outline: thin dotted #333;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-a:hover,
-a:active {
- outline: 0;
-}
-sub,
-sup {
- position: relative;
- font-size: 75%;
- line-height: 0;
- vertical-align: baseline;
-}
-sup {
- top: -0.5em;
-}
-sub {
- bottom: -0.25em;
-}
-img {
- max-width: 100%;
- height: auto;
- vertical-align: middle;
- border: 0;
- -ms-interpolation-mode: bicubic;
-}
-#map_canvas img {
- max-width: none;
-}
-button,
-input,
-select,
-textarea {
- margin: 0;
- font-size: 100%;
- vertical-align: middle;
-}
-button,
-input {
- *overflow: visible;
- line-height: normal;
-}
-button::-moz-focus-inner,
-input::-moz-focus-inner {
- padding: 0;
- border: 0;
-}
-button,
-input[type="button"],
-input[type="reset"],
-input[type="submit"] {
- cursor: pointer;
- -webkit-appearance: button;
-}
-input[type="search"] {
- -webkit-box-sizing: content-box;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
- -webkit-appearance: textfield;
-}
-input[type="search"]::-webkit-search-decoration,
-input[type="search"]::-webkit-search-cancel-button {
- -webkit-appearance: none;
-}
-textarea {
- overflow: auto;
- vertical-align: top;
-}
-.clearfix {
- *zoom: 1;
-}
-.clearfix:before,
-.clearfix:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.clearfix:after {
- clear: both;
-}
-.hide-text {
- font: 0/0 a;
- color: transparent;
- text-shadow: none;
- background-color: transparent;
- border: 0;
-}
-.input-block-level {
- display: block;
- width: 100%;
- min-height: 30px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-body {
- margin: 0;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 14px;
- line-height: 20px;
- color: #1f444b;
- background-color: #ffffff;
-}
-a {
- color: #6e8f4a;
- text-decoration: none;
-}
-a:hover {
- color: #f26a1e;
- text-decoration: underline;
-}
-.img-rounded {
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
-}
-.img-polaroid {
- padding: 4px;
- background-color: #fff;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, 0.2);
- -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
- -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-}
-.img-circle {
- -webkit-border-radius: 500px;
- -moz-border-radius: 500px;
- border-radius: 500px;
-}
-.row {
- margin-left: -20px;
- *zoom: 1;
-}
-.row:before,
-.row:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.row:after {
- clear: both;
-}
-[class*="span"] {
- float: left;
- margin-left: 20px;
-}
-.container,
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
- width: 940px;
-}
-.span12 {
- width: 940px;
-}
-.span11 {
- width: 860px;
-}
-.span10 {
- width: 780px;
-}
-.span9 {
- width: 700px;
-}
-.span8 {
- width: 620px;
-}
-.span7 {
- width: 540px;
-}
-.span6 {
- width: 460px;
-}
-.span5 {
- width: 380px;
-}
-.span4 {
- width: 300px;
-}
-.span3 {
- width: 220px;
-}
-.span2 {
- width: 140px;
-}
-.span1 {
- width: 60px;
-}
-.offset12 {
- margin-left: 980px;
-}
-.offset11 {
- margin-left: 900px;
-}
-.offset10 {
- margin-left: 820px;
-}
-.offset9 {
- margin-left: 740px;
-}
-.offset8 {
- margin-left: 660px;
-}
-.offset7 {
- margin-left: 580px;
-}
-.offset6 {
- margin-left: 500px;
-}
-.offset5 {
- margin-left: 420px;
-}
-.offset4 {
- margin-left: 340px;
-}
-.offset3 {
- margin-left: 260px;
-}
-.offset2 {
- margin-left: 180px;
-}
-.offset1 {
- margin-left: 100px;
-}
-.row-fluid {
- width: 100%;
- *zoom: 1;
-}
-.row-fluid:before,
-.row-fluid:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.row-fluid:after {
- clear: both;
-}
-.row-fluid [class*="span"] {
- display: block;
- width: 100%;
- min-height: 30px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- float: left;
- margin-left: 2.127659574468085%;
- *margin-left: 2.074468085106383%;
-}
-.row-fluid [class*="span"]:first-child {
- margin-left: 0;
-}
-.row-fluid .span12 {
- width: 100%;
- *width: 99.94680851063829%;
-}
-.row-fluid .span11 {
- width: 91.48936170212765%;
- *width: 91.43617021276594%;
-}
-.row-fluid .span10 {
- width: 82.97872340425532%;
- *width: 82.92553191489361%;
-}
-.row-fluid .span9 {
- width: 74.46808510638297%;
- *width: 74.41489361702126%;
-}
-.row-fluid .span8 {
- width: 65.95744680851064%;
- *width: 65.90425531914893%;
-}
-.row-fluid .span7 {
- width: 57.44680851063829%;
- *width: 57.39361702127659%;
-}
-.row-fluid .span6 {
- width: 48.93617021276595%;
- *width: 48.88297872340425%;
-}
-.row-fluid .span5 {
- width: 40.42553191489362%;
- *width: 40.37234042553192%;
-}
-.row-fluid .span4 {
- width: 31.914893617021278%;
- *width: 31.861702127659576%;
-}
-.row-fluid .span3 {
- width: 23.404255319148934%;
- *width: 23.351063829787233%;
-}
-.row-fluid .span2 {
- width: 14.893617021276595%;
- *width: 14.840425531914894%;
-}
-.row-fluid .span1 {
- width: 6.382978723404255%;
- *width: 6.329787234042553%;
-}
-.row-fluid .offset12 {
- margin-left: 104.25531914893617%;
- *margin-left: 104.14893617021275%;
-}
-.row-fluid .offset12:first-child {
- margin-left: 102.12765957446808%;
- *margin-left: 102.02127659574467%;
-}
-.row-fluid .offset11 {
- margin-left: 95.74468085106382%;
- *margin-left: 95.6382978723404%;
-}
-.row-fluid .offset11:first-child {
- margin-left: 93.61702127659574%;
- *margin-left: 93.51063829787232%;
-}
-.row-fluid .offset10 {
- margin-left: 87.23404255319149%;
- *margin-left: 87.12765957446807%;
-}
-.row-fluid .offset10:first-child {
- margin-left: 85.1063829787234%;
- *margin-left: 84.99999999999999%;
-}
-.row-fluid .offset9 {
- margin-left: 78.72340425531914%;
- *margin-left: 78.61702127659572%;
-}
-.row-fluid .offset9:first-child {
- margin-left: 76.59574468085106%;
- *margin-left: 76.48936170212764%;
-}
-.row-fluid .offset8 {
- margin-left: 70.2127659574468%;
- *margin-left: 70.10638297872339%;
-}
-.row-fluid .offset8:first-child {
- margin-left: 68.08510638297872%;
- *margin-left: 67.9787234042553%;
-}
-.row-fluid .offset7 {
- margin-left: 61.70212765957446%;
- *margin-left: 61.59574468085106%;
-}
-.row-fluid .offset7:first-child {
- margin-left: 59.574468085106375%;
- *margin-left: 59.46808510638297%;
-}
-.row-fluid .offset6 {
- margin-left: 53.191489361702125%;
- *margin-left: 53.085106382978715%;
-}
-.row-fluid .offset6:first-child {
- margin-left: 51.063829787234035%;
- *margin-left: 50.95744680851063%;
-}
-.row-fluid .offset5 {
- margin-left: 44.68085106382979%;
- *margin-left: 44.57446808510638%;
-}
-.row-fluid .offset5:first-child {
- margin-left: 42.5531914893617%;
- *margin-left: 42.4468085106383%;
-}
-.row-fluid .offset4 {
- margin-left: 36.170212765957444%;
- *margin-left: 36.06382978723405%;
-}
-.row-fluid .offset4:first-child {
- margin-left: 34.04255319148936%;
- *margin-left: 33.93617021276596%;
-}
-.row-fluid .offset3 {
- margin-left: 27.659574468085104%;
- *margin-left: 27.5531914893617%;
-}
-.row-fluid .offset3:first-child {
- margin-left: 25.53191489361702%;
- *margin-left: 25.425531914893618%;
-}
-.row-fluid .offset2 {
- margin-left: 19.148936170212764%;
- *margin-left: 19.04255319148936%;
-}
-.row-fluid .offset2:first-child {
- margin-left: 17.02127659574468%;
- *margin-left: 16.914893617021278%;
-}
-.row-fluid .offset1 {
- margin-left: 10.638297872340425%;
- *margin-left: 10.53191489361702%;
-}
-.row-fluid .offset1:first-child {
- margin-left: 8.51063829787234%;
- *margin-left: 8.404255319148938%;
-}
-[class*="span"].hide,
-.row-fluid [class*="span"].hide {
- display: none;
-}
-[class*="span"].pull-right,
-.row-fluid [class*="span"].pull-right {
- float: right;
-}
-.container {
- margin-right: auto;
- margin-left: auto;
- *zoom: 1;
-}
-.container:before,
-.container:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.container:after {
- clear: both;
-}
-.container-fluid {
- padding-right: 20px;
- padding-left: 20px;
- *zoom: 1;
-}
-.container-fluid:before,
-.container-fluid:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.container-fluid:after {
- clear: both;
-}
-p {
- margin: 0 0 10px;
-}
-.lead {
- margin-bottom: 20px;
- font-size: 20px;
- font-weight: 200;
- line-height: 30px;
-}
-small {
- font-size: 85%;
-}
-strong {
- font-weight: bold;
-}
-em {
- font-style: italic;
-}
-cite {
- font-style: normal;
-}
-.muted {
- color: #999999;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- margin: 10px 0;
- font-family: inherit;
- font-weight: bold;
- line-height: 1;
- color: inherit;
- text-rendering: optimizelegibility;
-}
-h1 small,
-h2 small,
-h3 small,
-h4 small,
-h5 small,
-h6 small {
- font-weight: normal;
- line-height: 1;
- color: #999999;
-}
-h1 {
- font-size: 36px;
- line-height: 40px;
-}
-h2 {
- font-size: 30px;
- line-height: 40px;
-}
-h3 {
- font-size: 24px;
- line-height: 40px;
-}
-h4 {
- font-size: 18px;
- line-height: 20px;
-}
-h5 {
- font-size: 14px;
- line-height: 20px;
-}
-h6 {
- font-size: 12px;
- line-height: 20px;
-}
-h1 small {
- font-size: 24px;
-}
-h2 small {
- font-size: 18px;
-}
-h3 small {
- font-size: 14px;
-}
-h4 small {
- font-size: 14px;
-}
-.page-header {
- padding-bottom: 9px;
- margin: 20px 0 30px;
- border-bottom: 1px solid #eeeeee;
-}
-ul,
-ol {
- padding: 0;
- margin: 0 0 10px 25px;
-}
-ul ul,
-ul ol,
-ol ol,
-ol ul {
- margin-bottom: 0;
-}
-li {
- line-height: 20px;
-}
-ul.unstyled,
-ol.unstyled {
- margin-left: 0;
- list-style: none;
-}
-dl {
- margin-bottom: 20px;
-}
-dt,
-dd {
- line-height: 20px;
-}
-dt {
- font-weight: bold;
-}
-dd {
- margin-left: 10px;
-}
-.dl-horizontal dt {
- float: left;
- width: 120px;
- clear: left;
- text-align: right;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-.dl-horizontal dd {
- margin-left: 130px;
-}
-hr {
- margin: 20px 0;
- border: 0;
- border-top: 1px solid #eeeeee;
- border-bottom: 1px solid #ffffff;
-}
-abbr[title] {
- cursor: help;
- border-bottom: 1px dotted #999999;
-}
-abbr.initialism {
- font-size: 90%;
- text-transform: uppercase;
-}
-blockquote {
- padding: 0 0 0 15px;
- margin: 0 0 20px;
- border-left: 5px solid #eeeeee;
-}
-blockquote p {
- margin-bottom: 0;
- font-size: 16px;
- font-weight: 300;
- line-height: 25px;
-}
-blockquote small {
- display: block;
- line-height: 20px;
- color: #999999;
-}
-blockquote small:before {
- content: '\2014 \00A0';
-}
-blockquote.pull-right {
- float: right;
- padding-right: 15px;
- padding-left: 0;
- border-right: 5px solid #eeeeee;
- border-left: 0;
-}
-blockquote.pull-right p,
-blockquote.pull-right small {
- text-align: right;
-}
-blockquote.pull-right small:before {
- content: '';
-}
-blockquote.pull-right small:after {
- content: '\00A0 \2014';
-}
-q:before,
-q:after,
-blockquote:before,
-blockquote:after {
- content: "";
-}
-address {
- display: block;
- margin-bottom: 20px;
- font-style: normal;
- line-height: 20px;
-}
-code,
-pre {
- padding: 0 3px 2px;
- font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
- font-size: 12px;
- color: #333333;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
-}
-code {
- padding: 2px 4px;
- color: #d14;
- background-color: #f7f7f9;
- border: 1px solid #e1e1e8;
-}
-pre {
- display: block;
- padding: 9.5px;
- margin: 0 0 10px;
- font-size: 13px;
- line-height: 20px;
- word-break: break-all;
- word-wrap: break-word;
- white-space: pre;
- white-space: pre-wrap;
- background-color: #f5f5f5;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, 0.15);
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-pre.prettyprint {
- margin-bottom: 20px;
-}
-pre code {
- padding: 0;
- color: inherit;
- background-color: transparent;
- border: 0;
-}
-.pre-scrollable {
- max-height: 340px;
- overflow-y: scroll;
-}
-form {
- margin: 0 0 20px;
-}
-fieldset {
- padding: 0;
- margin: 0;
- border: 0;
-}
-legend {
- display: block;
- width: 100%;
- padding: 0;
- margin-bottom: 20px;
- font-size: 21px;
- line-height: 40px;
- color: #333333;
- border: 0;
- border-bottom: 1px solid #e5e5e5;
-}
-legend small {
- font-size: 15px;
- color: #999999;
-}
-label,
-input,
-button,
-select,
-textarea {
- font-size: 14px;
- font-weight: normal;
- line-height: 20px;
-}
-input,
-button,
-select,
-textarea {
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-}
-label {
- display: block;
- margin-bottom: 5px;
-}
-select,
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
- display: inline-block;
- height: 20px;
- padding: 4px 6px;
- margin-bottom: 9px;
- font-size: 14px;
- line-height: 20px;
- color: #555555;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
-}
-input,
-textarea {
- width: 210px;
-}
-textarea {
- height: auto;
-}
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
- background-color: #ffffff;
- border: 1px solid #cccccc;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -webkit-transition: border linear .2s, box-shadow linear .2s;
- -moz-transition: border linear .2s, box-shadow linear .2s;
- -o-transition: border linear .2s, box-shadow linear .2s;
- transition: border linear .2s, box-shadow linear .2s;
-}
-textarea:focus,
-input[type="text"]:focus,
-input[type="password"]:focus,
-input[type="datetime"]:focus,
-input[type="datetime-local"]:focus,
-input[type="date"]:focus,
-input[type="month"]:focus,
-input[type="time"]:focus,
-input[type="week"]:focus,
-input[type="number"]:focus,
-input[type="email"]:focus,
-input[type="url"]:focus,
-input[type="search"]:focus,
-input[type="tel"]:focus,
-input[type="color"]:focus,
-.uneditable-input:focus {
- border-color: rgba(82, 168, 236, 0.8);
- outline: 0;
- outline: thin dotted \9;
- /* IE6-9 */
-
- -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
- -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
- box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
-}
-input[type="radio"],
-input[type="checkbox"] {
- margin: 4px 0 0;
- *margin-top: 0;
- /* IE7 */
-
- margin-top: 1px \9;
- /* IE8-9 */
-
- line-height: normal;
- cursor: pointer;
-}
-input[type="file"],
-input[type="image"],
-input[type="submit"],
-input[type="reset"],
-input[type="button"],
-input[type="radio"],
-input[type="checkbox"] {
- width: auto;
-}
-select,
-input[type="file"] {
- height: 30px;
- /* In IE7, the height of the select element cannot be changed by height, only font-size */
-
- *margin-top: 4px;
- /* For IE7, add top margin to align select with labels */
-
- line-height: 30px;
-}
-select {
- width: 220px;
- border: 1px solid #bbb;
- background-color: #ffffff;
-}
-select[multiple],
-select[size] {
- height: auto;
-}
-select:focus,
-input[type="file"]:focus,
-input[type="radio"]:focus,
-input[type="checkbox"]:focus {
- outline: thin dotted #333;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-.uneditable-input,
-.uneditable-textarea {
- color: #999999;
- background-color: #fcfcfc;
- border-color: #cccccc;
- -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
- -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
- cursor: not-allowed;
-}
-.uneditable-input {
- overflow: hidden;
- white-space: nowrap;
-}
-.uneditable-textarea {
- width: auto;
- height: auto;
-}
-input:-moz-placeholder,
-textarea:-moz-placeholder {
- color: #999999;
-}
-input:-ms-input-placeholder,
-textarea:-ms-input-placeholder {
- color: #999999;
-}
-input::-webkit-input-placeholder,
-textarea::-webkit-input-placeholder {
- color: #999999;
-}
-.radio,
-.checkbox {
- min-height: 18px;
- padding-left: 18px;
-}
-.radio input[type="radio"],
-.checkbox input[type="checkbox"] {
- float: left;
- margin-left: -18px;
-}
-.controls > .radio:first-child,
-.controls > .checkbox:first-child {
- padding-top: 5px;
-}
-.radio.inline,
-.checkbox.inline {
- display: inline-block;
- padding-top: 5px;
- margin-bottom: 0;
- vertical-align: middle;
-}
-.radio.inline + .radio.inline,
-.checkbox.inline + .checkbox.inline {
- margin-left: 10px;
-}
-.input-mini {
- width: 60px;
-}
-.input-small {
- width: 90px;
-}
-.input-medium {
- width: 150px;
-}
-.input-large {
- width: 210px;
-}
-.input-xlarge {
- width: 270px;
-}
-.input-xxlarge {
- width: 530px;
-}
-input[class*="span"],
-select[class*="span"],
-textarea[class*="span"],
-.uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"] {
- float: none;
- margin-left: 0;
-}
-.input-append input[class*="span"],
-.input-append .uneditable-input[class*="span"],
-.input-prepend input[class*="span"],
-.input-prepend .uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"],
-.row-fluid .input-prepend [class*="span"],
-.row-fluid .input-append [class*="span"] {
- display: inline-block;
-}
-input,
-textarea,
-.uneditable-input {
- margin-left: 0;
-}
-.controls-row [class*="span"] + [class*="span"] {
- margin-left: 20px;
-}
-input.span12, textarea.span12, .uneditable-input.span12 {
- width: 926px;
-}
-input.span11, textarea.span11, .uneditable-input.span11 {
- width: 846px;
-}
-input.span10, textarea.span10, .uneditable-input.span10 {
- width: 766px;
-}
-input.span9, textarea.span9, .uneditable-input.span9 {
- width: 686px;
-}
-input.span8, textarea.span8, .uneditable-input.span8 {
- width: 606px;
-}
-input.span7, textarea.span7, .uneditable-input.span7 {
- width: 526px;
-}
-input.span6, textarea.span6, .uneditable-input.span6 {
- width: 446px;
-}
-input.span5, textarea.span5, .uneditable-input.span5 {
- width: 366px;
-}
-input.span4, textarea.span4, .uneditable-input.span4 {
- width: 286px;
-}
-input.span3, textarea.span3, .uneditable-input.span3 {
- width: 206px;
-}
-input.span2, textarea.span2, .uneditable-input.span2 {
- width: 126px;
-}
-input.span1, textarea.span1, .uneditable-input.span1 {
- width: 46px;
-}
-.controls-row {
- *zoom: 1;
-}
-.controls-row:before,
-.controls-row:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.controls-row:after {
- clear: both;
-}
-.controls-row [class*="span"] {
- float: left;
-}
-input[disabled],
-select[disabled],
-textarea[disabled],
-input[readonly],
-select[readonly],
-textarea[readonly] {
- cursor: not-allowed;
- background-color: #eeeeee;
-}
-input[type="radio"][disabled],
-input[type="checkbox"][disabled],
-input[type="radio"][readonly],
-input[type="checkbox"][readonly] {
- background-color: transparent;
-}
-.control-group.warning > label,
-.control-group.warning .help-block,
-.control-group.warning .help-inline {
- color: #c09853;
-}
-.control-group.warning .checkbox,
-.control-group.warning .radio,
-.control-group.warning input,
-.control-group.warning select,
-.control-group.warning textarea {
- color: #c09853;
- border-color: #c09853;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.control-group.warning .checkbox:focus,
-.control-group.warning .radio:focus,
-.control-group.warning input:focus,
-.control-group.warning select:focus,
-.control-group.warning textarea:focus {
- border-color: #a47e3c;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-}
-.control-group.warning .input-prepend .add-on,
-.control-group.warning .input-append .add-on {
- color: #c09853;
- background-color: #fcf8e3;
- border-color: #c09853;
-}
-.control-group.error > label,
-.control-group.error .help-block,
-.control-group.error .help-inline {
- color: #b94a48;
-}
-.control-group.error .checkbox,
-.control-group.error .radio,
-.control-group.error input,
-.control-group.error select,
-.control-group.error textarea {
- color: #b94a48;
- border-color: #b94a48;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.control-group.error .checkbox:focus,
-.control-group.error .radio:focus,
-.control-group.error input:focus,
-.control-group.error select:focus,
-.control-group.error textarea:focus {
- border-color: #953b39;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-}
-.control-group.error .input-prepend .add-on,
-.control-group.error .input-append .add-on {
- color: #b94a48;
- background-color: #f2dede;
- border-color: #b94a48;
-}
-.control-group.success > label,
-.control-group.success .help-block,
-.control-group.success .help-inline {
- color: #468847;
-}
-.control-group.success .checkbox,
-.control-group.success .radio,
-.control-group.success input,
-.control-group.success select,
-.control-group.success textarea {
- color: #468847;
- border-color: #468847;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.control-group.success .checkbox:focus,
-.control-group.success .radio:focus,
-.control-group.success input:focus,
-.control-group.success select:focus,
-.control-group.success textarea:focus {
- border-color: #356635;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-}
-.control-group.success .input-prepend .add-on,
-.control-group.success .input-append .add-on {
- color: #468847;
- background-color: #dff0d8;
- border-color: #468847;
-}
-input:focus:required:invalid,
-textarea:focus:required:invalid,
-select:focus:required:invalid {
- color: #b94a48;
- border-color: #ee5f5b;
-}
-input:focus:required:invalid:focus,
-textarea:focus:required:invalid:focus,
-select:focus:required:invalid:focus {
- border-color: #e9322d;
- -webkit-box-shadow: 0 0 6px #f8b9b7;
- -moz-box-shadow: 0 0 6px #f8b9b7;
- box-shadow: 0 0 6px #f8b9b7;
-}
-.form-actions {
- padding: 19px 20px 20px;
- margin-top: 20px;
- margin-bottom: 20px;
- background-color: #f5f5f5;
- border-top: 1px solid #e5e5e5;
- *zoom: 1;
-}
-.form-actions:before,
-.form-actions:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.form-actions:after {
- clear: both;
-}
-.help-block,
-.help-inline {
- color: #357581;
-}
-.help-block {
- display: block;
- margin-bottom: 10px;
-}
-.help-inline {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
-
- *zoom: 1;
- vertical-align: middle;
- padding-left: 5px;
-}
-.input-append,
-.input-prepend {
- margin-bottom: 5px;
- font-size: 0;
- white-space: nowrap;
-}
-.input-append input,
-.input-prepend input,
-.input-append select,
-.input-prepend select,
-.input-append .uneditable-input,
-.input-prepend .uneditable-input {
- position: relative;
- margin-bottom: 0;
- *margin-left: 0;
- font-size: 14px;
- vertical-align: top;
- -webkit-border-radius: 0 3px 3px 0;
- -moz-border-radius: 0 3px 3px 0;
- border-radius: 0 3px 3px 0;
-}
-.input-append input:focus,
-.input-prepend input:focus,
-.input-append select:focus,
-.input-prepend select:focus,
-.input-append .uneditable-input:focus,
-.input-prepend .uneditable-input:focus {
- z-index: 2;
-}
-.input-append .add-on,
-.input-prepend .add-on {
- display: inline-block;
- width: auto;
- height: 20px;
- min-width: 16px;
- padding: 4px 5px;
- font-size: 14px;
- font-weight: normal;
- line-height: 20px;
- text-align: center;
- text-shadow: 0 1px 0 #ffffff;
- background-color: #eeeeee;
- border: 1px solid #ccc;
-}
-.input-append .add-on,
-.input-prepend .add-on,
-.input-append .btn,
-.input-prepend .btn {
- margin-left: -1px;
- vertical-align: top;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-.input-append .active,
-.input-prepend .active {
- background-color: #a9dba9;
- border-color: #46a546;
-}
-.input-prepend .add-on,
-.input-prepend .btn {
- margin-right: -1px;
-}
-.input-prepend .add-on:first-child,
-.input-prepend .btn:first-child {
- -webkit-border-radius: 3px 0 0 3px;
- -moz-border-radius: 3px 0 0 3px;
- border-radius: 3px 0 0 3px;
-}
-.input-append input,
-.input-append select,
-.input-append .uneditable-input {
- -webkit-border-radius: 3px 0 0 3px;
- -moz-border-radius: 3px 0 0 3px;
- border-radius: 3px 0 0 3px;
-}
-.input-append .add-on:last-child,
-.input-append .btn:last-child {
- -webkit-border-radius: 0 3px 3px 0;
- -moz-border-radius: 0 3px 3px 0;
- border-radius: 0 3px 3px 0;
-}
-.input-prepend.input-append input,
-.input-prepend.input-append select,
-.input-prepend.input-append .uneditable-input {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-.input-prepend.input-append .add-on:first-child,
-.input-prepend.input-append .btn:first-child {
- margin-right: -1px;
- -webkit-border-radius: 3px 0 0 3px;
- -moz-border-radius: 3px 0 0 3px;
- border-radius: 3px 0 0 3px;
-}
-.input-prepend.input-append .add-on:last-child,
-.input-prepend.input-append .btn:last-child {
- margin-left: -1px;
- -webkit-border-radius: 0 3px 3px 0;
- -moz-border-radius: 0 3px 3px 0;
- border-radius: 0 3px 3px 0;
-}
-input.search-query {
- padding-right: 14px;
- padding-right: 4px \9;
- padding-left: 14px;
- padding-left: 4px \9;
- /* IE7-8 doesn't have border-radius, so don't indent the padding */
-
- margin-bottom: 0;
- -webkit-border-radius: 15px;
- -moz-border-radius: 15px;
- border-radius: 15px;
-}
-/* Allow for input prepend/append in search forms */
-.form-search .input-append .search-query,
-.form-search .input-prepend .search-query {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-.form-search .input-append .search-query {
- -webkit-border-radius: 14px 0 0 14px;
- -moz-border-radius: 14px 0 0 14px;
- border-radius: 14px 0 0 14px;
-}
-.form-search .input-append .btn {
- -webkit-border-radius: 0 14px 14px 0;
- -moz-border-radius: 0 14px 14px 0;
- border-radius: 0 14px 14px 0;
-}
-.form-search .input-prepend .search-query {
- -webkit-border-radius: 0 14px 14px 0;
- -moz-border-radius: 0 14px 14px 0;
- border-radius: 0 14px 14px 0;
-}
-.form-search .input-prepend .btn {
- -webkit-border-radius: 14px 0 0 14px;
- -moz-border-radius: 14px 0 0 14px;
- border-radius: 14px 0 0 14px;
-}
-.form-search input,
-.form-inline input,
-.form-horizontal input,
-.form-search textarea,
-.form-inline textarea,
-.form-horizontal textarea,
-.form-search select,
-.form-inline select,
-.form-horizontal select,
-.form-search .help-inline,
-.form-inline .help-inline,
-.form-horizontal .help-inline,
-.form-search .uneditable-input,
-.form-inline .uneditable-input,
-.form-horizontal .uneditable-input,
-.form-search .input-prepend,
-.form-inline .input-prepend,
-.form-horizontal .input-prepend,
-.form-search .input-append,
-.form-inline .input-append,
-.form-horizontal .input-append {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
-
- *zoom: 1;
- margin-bottom: 0;
- vertical-align: middle;
-}
-.form-search .hide,
-.form-inline .hide,
-.form-horizontal .hide {
- display: none;
-}
-.form-search label,
-.form-inline label,
-.form-search .btn-group,
-.form-inline .btn-group {
- display: inline-block;
-}
-.form-search .input-append,
-.form-inline .input-append,
-.form-search .input-prepend,
-.form-inline .input-prepend {
- margin-bottom: 0;
-}
-.form-search .radio,
-.form-search .checkbox,
-.form-inline .radio,
-.form-inline .checkbox {
- padding-left: 0;
- margin-bottom: 0;
- vertical-align: middle;
-}
-.form-search .radio input[type="radio"],
-.form-search .checkbox input[type="checkbox"],
-.form-inline .radio input[type="radio"],
-.form-inline .checkbox input[type="checkbox"] {
- float: left;
- margin-right: 3px;
- margin-left: 0;
-}
-.control-group {
- margin-bottom: 10px;
-}
-legend + .control-group {
- margin-top: 20px;
- -webkit-margin-top-collapse: separate;
-}
-.form-horizontal .control-group {
- margin-bottom: 20px;
- *zoom: 1;
-}
-.form-horizontal .control-group:before,
-.form-horizontal .control-group:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.form-horizontal .control-group:after {
- clear: both;
-}
-.form-horizontal .control-label {
- float: left;
- width: 140px;
- padding-top: 5px;
- text-align: right;
-}
-.form-horizontal .controls {
- *display: inline-block;
- *padding-left: 20px;
- margin-left: 160px;
- *margin-left: 0;
-}
-.form-horizontal .controls:first-child {
- *padding-left: 160px;
-}
-.form-horizontal .help-block {
- margin-top: 10px;
- margin-bottom: 0;
-}
-.form-horizontal .form-actions {
- padding-left: 160px;
-}
-table {
- max-width: 100%;
- background-color: transparent;
- border-collapse: collapse;
- border-spacing: 0;
-}
-.table {
- width: 100%;
- margin-bottom: 20px;
-}
-.table th,
-.table td {
- padding: 8px;
- line-height: 20px;
- text-align: left;
- vertical-align: top;
- border-top: 1px solid #dddddd;
-}
-.table th {
- font-weight: bold;
-}
-.table thead th {
- vertical-align: bottom;
-}
-.table caption + thead tr:first-child th,
-.table caption + thead tr:first-child td,
-.table colgroup + thead tr:first-child th,
-.table colgroup + thead tr:first-child td,
-.table thead:first-child tr:first-child th,
-.table thead:first-child tr:first-child td {
- border-top: 0;
-}
-.table tbody + tbody {
- border-top: 2px solid #dddddd;
-}
-.table-condensed th,
-.table-condensed td {
- padding: 4px 5px;
-}
-.table-bordered {
- border: 1px solid #dddddd;
- border-collapse: separate;
- *border-collapse: collapse;
- border-left: 0;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-.table-bordered th,
-.table-bordered td {
- border-left: 1px solid #dddddd;
-}
-.table-bordered caption + thead tr:first-child th,
-.table-bordered caption + tbody tr:first-child th,
-.table-bordered caption + tbody tr:first-child td,
-.table-bordered colgroup + thead tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child td,
-.table-bordered thead:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child td {
- border-top: 0;
-}
-.table-bordered thead:first-child tr:first-child th:first-child,
-.table-bordered tbody:first-child tr:first-child td:first-child {
- -webkit-border-top-left-radius: 4px;
- border-top-left-radius: 4px;
- -moz-border-radius-topleft: 4px;
-}
-.table-bordered thead:first-child tr:first-child th:last-child,
-.table-bordered tbody:first-child tr:first-child td:last-child {
- -webkit-border-top-right-radius: 4px;
- border-top-right-radius: 4px;
- -moz-border-radius-topright: 4px;
-}
-.table-bordered thead:last-child tr:last-child th:first-child,
-.table-bordered tbody:last-child tr:last-child td:first-child,
-.table-bordered tfoot:last-child tr:last-child td:first-child {
- -webkit-border-radius: 0 0 0 4px;
- -moz-border-radius: 0 0 0 4px;
- border-radius: 0 0 0 4px;
- -webkit-border-bottom-left-radius: 4px;
- border-bottom-left-radius: 4px;
- -moz-border-radius-bottomleft: 4px;
-}
-.table-bordered thead:last-child tr:last-child th:last-child,
-.table-bordered tbody:last-child tr:last-child td:last-child,
-.table-bordered tfoot:last-child tr:last-child td:last-child {
- -webkit-border-bottom-right-radius: 4px;
- border-bottom-right-radius: 4px;
- -moz-border-radius-bottomright: 4px;
-}
-.table-bordered caption + thead tr:first-child th:first-child,
-.table-bordered caption + tbody tr:first-child td:first-child,
-.table-bordered colgroup + thead tr:first-child th:first-child,
-.table-bordered colgroup + tbody tr:first-child td:first-child {
- -webkit-border-top-left-radius: 4px;
- border-top-left-radius: 4px;
- -moz-border-radius-topleft: 4px;
-}
-.table-bordered caption + thead tr:first-child th:last-child,
-.table-bordered caption + tbody tr:first-child td:last-child,
-.table-bordered colgroup + thead tr:first-child th:last-child,
-.table-bordered colgroup + tbody tr:first-child td:last-child {
- -webkit-border-top-right-radius: 4px;
- border-top-right-radius: 4px;
- -moz-border-right-topleft: 4px;
-}
-.table-striped tbody tr:nth-child(odd) td,
-.table-striped tbody tr:nth-child(odd) th {
- background-color: #f9f9f9;
-}
-.table-hover tbody tr:hover td,
-.table-hover tbody tr:hover th {
- background-color: #f5f5f5;
-}
-table [class*=span],
-.row-fluid table [class*=span] {
- display: table-cell;
- float: none;
- margin-left: 0;
-}
-table .span1 {
- float: none;
- width: 44px;
- margin-left: 0;
-}
-table .span2 {
- float: none;
- width: 124px;
- margin-left: 0;
-}
-table .span3 {
- float: none;
- width: 204px;
- margin-left: 0;
-}
-table .span4 {
- float: none;
- width: 284px;
- margin-left: 0;
-}
-table .span5 {
- float: none;
- width: 364px;
- margin-left: 0;
-}
-table .span6 {
- float: none;
- width: 444px;
- margin-left: 0;
-}
-table .span7 {
- float: none;
- width: 524px;
- margin-left: 0;
-}
-table .span8 {
- float: none;
- width: 604px;
- margin-left: 0;
-}
-table .span9 {
- float: none;
- width: 684px;
- margin-left: 0;
-}
-table .span10 {
- float: none;
- width: 764px;
- margin-left: 0;
-}
-table .span11 {
- float: none;
- width: 844px;
- margin-left: 0;
-}
-table .span12 {
- float: none;
- width: 924px;
- margin-left: 0;
-}
-table .span13 {
- float: none;
- width: 1004px;
- margin-left: 0;
-}
-table .span14 {
- float: none;
- width: 1084px;
- margin-left: 0;
-}
-table .span15 {
- float: none;
- width: 1164px;
- margin-left: 0;
-}
-table .span16 {
- float: none;
- width: 1244px;
- margin-left: 0;
-}
-table .span17 {
- float: none;
- width: 1324px;
- margin-left: 0;
-}
-table .span18 {
- float: none;
- width: 1404px;
- margin-left: 0;
-}
-table .span19 {
- float: none;
- width: 1484px;
- margin-left: 0;
-}
-table .span20 {
- float: none;
- width: 1564px;
- margin-left: 0;
-}
-table .span21 {
- float: none;
- width: 1644px;
- margin-left: 0;
-}
-table .span22 {
- float: none;
- width: 1724px;
- margin-left: 0;
-}
-table .span23 {
- float: none;
- width: 1804px;
- margin-left: 0;
-}
-table .span24 {
- float: none;
- width: 1884px;
- margin-left: 0;
-}
-.table tbody tr.success td {
- background-color: #dff0d8;
-}
-.table tbody tr.error td {
- background-color: #f2dede;
-}
-.table tbody tr.info td {
- background-color: #d9edf7;
-}
-[class^="icon-"],
-[class*=" icon-"] {
- display: inline-block;
- width: 14px;
- height: 14px;
- *margin-right: .3em;
- line-height: 14px;
- vertical-align: text-top;
- background-image: url("../img/glyphicons-halflings.png");
- background-position: 14px 14px;
- background-repeat: no-repeat;
- margin-top: 1px;
-}
-/* White icons with optional class, or on hover/active states of certain elements */
-.icon-white,
-.nav > .active > a > [class^="icon-"],
-.nav > .active > a > [class*=" icon-"],
-.dropdown-menu > li > a:hover > [class^="icon-"],
-.dropdown-menu > li > a:hover > [class*=" icon-"],
-.dropdown-menu > .active > a > [class^="icon-"],
-.dropdown-menu > .active > a > [class*=" icon-"] {
- background-image: url("../img/glyphicons-halflings-white.png");
-}
-.icon-glass {
- background-position: 0 0;
-}
-.icon-music {
- background-position: -24px 0;
-}
-.icon-search {
- background-position: -48px 0;
-}
-.icon-envelope {
- background-position: -72px 0;
-}
-.icon-heart {
- background-position: -96px 0;
-}
-.icon-star {
- background-position: -120px 0;
-}
-.icon-star-empty {
- background-position: -144px 0;
-}
-.icon-user {
- background-position: -168px 0;
-}
-.icon-film {
- background-position: -192px 0;
-}
-.icon-th-large {
- background-position: -216px 0;
-}
-.icon-th {
- background-position: -240px 0;
-}
-.icon-th-list {
- background-position: -264px 0;
-}
-.icon-ok {
- background-position: -288px 0;
-}
-.icon-remove {
- background-position: -312px 0;
-}
-.icon-zoom-in {
- background-position: -336px 0;
-}
-.icon-zoom-out {
- background-position: -360px 0;
-}
-.icon-off {
- background-position: -384px 0;
-}
-.icon-signal {
- background-position: -408px 0;
-}
-.icon-cog {
- background-position: -432px 0;
-}
-.icon-trash {
- background-position: -456px 0;
-}
-.icon-home {
- background-position: 0 -24px;
-}
-.icon-file {
- background-position: -24px -24px;
-}
-.icon-time {
- background-position: -48px -24px;
-}
-.icon-road {
- background-position: -72px -24px;
-}
-.icon-download-alt {
- background-position: -96px -24px;
-}
-.icon-download {
- background-position: -120px -24px;
-}
-.icon-upload {
- background-position: -144px -24px;
-}
-.icon-inbox {
- background-position: -168px -24px;
-}
-.icon-play-circle {
- background-position: -192px -24px;
-}
-.icon-repeat {
- background-position: -216px -24px;
-}
-.icon-refresh {
- background-position: -240px -24px;
-}
-.icon-list-alt {
- background-position: -264px -24px;
-}
-.icon-lock {
- background-position: -287px -24px;
-}
-.icon-flag {
- background-position: -312px -24px;
-}
-.icon-headphones {
- background-position: -336px -24px;
-}
-.icon-volume-off {
- background-position: -360px -24px;
-}
-.icon-volume-down {
- background-position: -384px -24px;
-}
-.icon-volume-up {
- background-position: -408px -24px;
-}
-.icon-qrcode {
- background-position: -432px -24px;
-}
-.icon-barcode {
- background-position: -456px -24px;
-}
-.icon-tag {
- background-position: 0 -48px;
-}
-.icon-tags {
- background-position: -25px -48px;
-}
-.icon-book {
- background-position: -48px -48px;
-}
-.icon-bookmark {
- background-position: -72px -48px;
-}
-.icon-print {
- background-position: -96px -48px;
-}
-.icon-camera {
- background-position: -120px -48px;
-}
-.icon-font {
- background-position: -144px -48px;
-}
-.icon-bold {
- background-position: -167px -48px;
-}
-.icon-italic {
- background-position: -192px -48px;
-}
-.icon-text-height {
- background-position: -216px -48px;
-}
-.icon-text-width {
- background-position: -240px -48px;
-}
-.icon-align-left {
- background-position: -264px -48px;
-}
-.icon-align-center {
- background-position: -288px -48px;
-}
-.icon-align-right {
- background-position: -312px -48px;
-}
-.icon-align-justify {
- background-position: -336px -48px;
-}
-.icon-list {
- background-position: -360px -48px;
-}
-.icon-indent-left {
- background-position: -384px -48px;
-}
-.icon-indent-right {
- background-position: -408px -48px;
-}
-.icon-facetime-video {
- background-position: -432px -48px;
-}
-.icon-picture {
- background-position: -456px -48px;
-}
-.icon-pencil {
- background-position: 0 -72px;
-}
-.icon-map-marker {
- background-position: -24px -72px;
-}
-.icon-adjust {
- background-position: -48px -72px;
-}
-.icon-tint {
- background-position: -72px -72px;
-}
-.icon-edit {
- background-position: -96px -72px;
-}
-.icon-share {
- background-position: -120px -72px;
-}
-.icon-check {
- background-position: -144px -72px;
-}
-.icon-move {
- background-position: -168px -72px;
-}
-.icon-step-backward {
- background-position: -192px -72px;
-}
-.icon-fast-backward {
- background-position: -216px -72px;
-}
-.icon-backward {
- background-position: -240px -72px;
-}
-.icon-play {
- background-position: -264px -72px;
-}
-.icon-pause {
- background-position: -288px -72px;
-}
-.icon-stop {
- background-position: -312px -72px;
-}
-.icon-forward {
- background-position: -336px -72px;
-}
-.icon-fast-forward {
- background-position: -360px -72px;
-}
-.icon-step-forward {
- background-position: -384px -72px;
-}
-.icon-eject {
- background-position: -408px -72px;
-}
-.icon-chevron-left {
- background-position: -432px -72px;
-}
-.icon-chevron-right {
- background-position: -456px -72px;
-}
-.icon-plus-sign {
- background-position: 0 -96px;
-}
-.icon-minus-sign {
- background-position: -24px -96px;
-}
-.icon-remove-sign {
- background-position: -48px -96px;
-}
-.icon-ok-sign {
- background-position: -72px -96px;
-}
-.icon-question-sign {
- background-position: -96px -96px;
-}
-.icon-info-sign {
- background-position: -120px -96px;
-}
-.icon-screenshot {
- background-position: -144px -96px;
-}
-.icon-remove-circle {
- background-position: -168px -96px;
-}
-.icon-ok-circle {
- background-position: -192px -96px;
-}
-.icon-ban-circle {
- background-position: -216px -96px;
-}
-.icon-arrow-left {
- background-position: -240px -96px;
-}
-.icon-arrow-right {
- background-position: -264px -96px;
-}
-.icon-arrow-up {
- background-position: -289px -96px;
-}
-.icon-arrow-down {
- background-position: -312px -96px;
-}
-.icon-share-alt {
- background-position: -336px -96px;
-}
-.icon-resize-full {
- background-position: -360px -96px;
-}
-.icon-resize-small {
- background-position: -384px -96px;
-}
-.icon-plus {
- background-position: -408px -96px;
-}
-.icon-minus {
- background-position: -433px -96px;
-}
-.icon-asterisk {
- background-position: -456px -96px;
-}
-.icon-exclamation-sign {
- background-position: 0 -120px;
-}
-.icon-gift {
- background-position: -24px -120px;
-}
-.icon-leaf {
- background-position: -48px -120px;
-}
-.icon-fire {
- background-position: -72px -120px;
-}
-.icon-eye-open {
- background-position: -96px -120px;
-}
-.icon-eye-close {
- background-position: -120px -120px;
-}
-.icon-warning-sign {
- background-position: -144px -120px;
-}
-.icon-plane {
- background-position: -168px -120px;
-}
-.icon-calendar {
- background-position: -192px -120px;
-}
-.icon-random {
- background-position: -216px -120px;
- width: 16px;
-}
-.icon-comment {
- background-position: -240px -120px;
-}
-.icon-magnet {
- background-position: -264px -120px;
-}
-.icon-chevron-up {
- background-position: -288px -120px;
-}
-.icon-chevron-down {
- background-position: -313px -119px;
-}
-.icon-retweet {
- background-position: -336px -120px;
-}
-.icon-shopping-cart {
- background-position: -360px -120px;
-}
-.icon-folder-close {
- background-position: -384px -120px;
-}
-.icon-folder-open {
- background-position: -408px -120px;
- width: 16px;
-}
-.icon-resize-vertical {
- background-position: -432px -119px;
-}
-.icon-resize-horizontal {
- background-position: -456px -118px;
-}
-.icon-hdd {
- background-position: 0 -144px;
-}
-.icon-bullhorn {
- background-position: -24px -144px;
-}
-.icon-bell {
- background-position: -48px -144px;
-}
-.icon-certificate {
- background-position: -72px -144px;
-}
-.icon-thumbs-up {
- background-position: -96px -144px;
-}
-.icon-thumbs-down {
- background-position: -120px -144px;
-}
-.icon-hand-right {
- background-position: -144px -144px;
-}
-.icon-hand-left {
- background-position: -168px -144px;
-}
-.icon-hand-up {
- background-position: -192px -144px;
-}
-.icon-hand-down {
- background-position: -216px -144px;
-}
-.icon-circle-arrow-right {
- background-position: -240px -144px;
-}
-.icon-circle-arrow-left {
- background-position: -264px -144px;
-}
-.icon-circle-arrow-up {
- background-position: -288px -144px;
-}
-.icon-circle-arrow-down {
- background-position: -312px -144px;
-}
-.icon-globe {
- background-position: -336px -144px;
-}
-.icon-wrench {
- background-position: -360px -144px;
-}
-.icon-tasks {
- background-position: -384px -144px;
-}
-.icon-filter {
- background-position: -408px -144px;
-}
-.icon-briefcase {
- background-position: -432px -144px;
-}
-.icon-fullscreen {
- background-position: -456px -144px;
-}
-/* Font Awesome
- the iconic font designed for use with Twitter Bootstrap
- -------------------------------------------------------
- The full suite of pictographic icons, examples, and documentation
- can be found at: http://fortawesome.github.com/Font-Awesome/
-
- License
- -------------------------------------------------------
- The Font Awesome webfont, CSS, and LESS files are licensed under CC BY 3.0:
- http://creativecommons.org/licenses/by/3.0/ A mention of
- 'Font Awesome - http://fortawesome.github.com/Font-Awesome' in human-readable
- source code is considered acceptable attribution (most common on the web).
- If human readable source code is not available to the end user, a mention in
- an 'About' or 'Credits' screen is considered acceptable (most common in desktop
- or mobile software).
-
- Contact
- -------------------------------------------------------
- Email: dave at davegandy.com
- Twitter: http://twitter.com/fortaweso_me
- Work: Lead Product Designer @ http://kyruus.com
-
- */
- at font-face {
- font-family: 'FontAwesome';
- src: url('../font/fontawesome-webfont.eot');
- src: url('../font/fontawesome-webfont.eot?#iefix') format('embedded-opentype'), url('../font/fontawesome-webfont.woff') format('woff'), url('../font/fontawesome-webfont.ttf') format('truetype'), url('../font/fontawesome-webfont.svg#FontAwesome') format('svg');
- font-weight: normal;
- font-style: normal;
-}
-/* Font Awesome styles
- ------------------------------------------------------- */
-[class^="icon-"]:before,
-[class*=" icon-"]:before {
- font-family: FontAwesome;
- font-weight: normal;
- font-style: normal;
- display: inline-block;
- text-decoration: inherit;
-}
-a [class^="icon-"],
-a [class*=" icon-"] {
- display: inline-block;
- text-decoration: inherit;
-}
-/* makes the font 33% larger relative to the icon container */
-.icon-large:before {
- vertical-align: middle;
- font-size: 1.3333333333333333em;
-}
-.btn [class^="icon-"],
-.nav-tabs [class^="icon-"],
-.btn [class*=" icon-"],
-.nav-tabs [class*=" icon-"] {
- /* keeps button heights with and without icons the same */
-
- line-height: .9em;
-}
-li [class^="icon-"],
-li [class*=" icon-"] {
- display: inline-block;
- width: 1.25em;
- text-align: center;
-}
-li .icon-large:before,
-li .icon-large:before {
- /* 1.5 increased font size for icon-large * 1.25 width */
-
- width: 1.875em;
-}
-ul.icons {
- list-style-type: none;
- margin-left: 2em;
- text-indent: -0.8em;
-}
-ul.icons li [class^="icon-"],
-ul.icons li [class*=" icon-"] {
- width: .8em;
-}
-ul.icons li .icon-large:before,
-ul.icons li .icon-large:before {
- /* 1.5 increased font size for icon-large * 1.25 width */
-
- vertical-align: initial;
-}
-/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
- readers do not read off random characters that represent icons */
-.icon-glass:before {
- content: "\f000";
-}
-.icon-music:before {
- content: "\f001";
-}
-.icon-search:before {
- content: "\f002";
-}
-.icon-envelope:before {
- content: "\f003";
-}
-.icon-heart:before {
- content: "\f004";
-}
-.icon-star:before {
- content: "\f005";
-}
-.icon-star-empty:before {
- content: "\f006";
-}
-.icon-user:before {
- content: "\f007";
-}
-.icon-film:before {
- content: "\f008";
-}
-.icon-th-large:before {
- content: "\f009";
-}
-.icon-th:before {
- content: "\f00a";
-}
-.icon-th-list:before {
- content: "\f00b";
-}
-.icon-ok:before {
- content: "\f00c";
-}
-.icon-remove:before {
- content: "\f00d";
-}
-.icon-zoom-in:before {
- content: "\f00e";
-}
-.icon-zoom-out:before {
- content: "\f010";
-}
-.icon-off:before {
- content: "\f011";
-}
-.icon-signal:before {
- content: "\f012";
-}
-.icon-cog:before {
- content: "\f013";
-}
-.icon-trash:before {
- content: "\f014";
-}
-.icon-home:before {
- content: "\f015";
-}
-.icon-file:before {
- content: "\f016";
-}
-.icon-time:before {
- content: "\f017";
-}
-.icon-road:before {
- content: "\f018";
-}
-.icon-download-alt:before {
- content: "\f019";
-}
-.icon-download:before {
- content: "\f01a";
-}
-.icon-upload:before {
- content: "\f01b";
-}
-.icon-inbox:before {
- content: "\f01c";
-}
-.icon-play-circle:before {
- content: "\f01d";
-}
-.icon-repeat:before {
- content: "\f01e";
-}
-/* \f020 is not a valid unicode character. all shifted one down */
-.icon-refresh:before {
- content: "\f021";
-}
-.icon-list-alt:before {
- content: "\f022";
-}
-.icon-lock:before {
- content: "\f023";
-}
-.icon-flag:before {
- content: "\f024";
-}
-.icon-headphones:before {
- content: "\f025";
-}
-.icon-volume-off:before {
- content: "\f026";
-}
-.icon-volume-down:before {
- content: "\f027";
-}
-.icon-volume-up:before {
- content: "\f028";
-}
-.icon-qrcode:before {
- content: "\f029";
-}
-.icon-barcode:before {
- content: "\f02a";
-}
-.icon-tag:before {
- content: "\f02b";
-}
-.icon-tags:before {
- content: "\f02c";
-}
-.icon-book:before {
- content: "\f02d";
-}
-.icon-bookmark:before {
- content: "\f02e";
-}
-.icon-print:before {
- content: "\f02f";
-}
-.icon-camera:before {
- content: "\f030";
-}
-.icon-font:before {
- content: "\f031";
-}
-.icon-bold:before {
- content: "\f032";
-}
-.icon-italic:before {
- content: "\f033";
-}
-.icon-text-height:before {
- content: "\f034";
-}
-.icon-text-width:before {
- content: "\f035";
-}
-.icon-align-left:before {
- content: "\f036";
-}
-.icon-align-center:before {
- content: "\f037";
-}
-.icon-align-right:before {
- content: "\f038";
-}
-.icon-align-justify:before {
- content: "\f039";
-}
-.icon-list:before {
- content: "\f03a";
-}
-.icon-indent-left:before {
- content: "\f03b";
-}
-.icon-indent-right:before {
- content: "\f03c";
-}
-.icon-facetime-video:before {
- content: "\f03d";
-}
-.icon-picture:before {
- content: "\f03e";
-}
-.icon-pencil:before {
- content: "\f040";
-}
-.icon-map-marker:before {
- content: "\f041";
-}
-.icon-adjust:before {
- content: "\f042";
-}
-.icon-tint:before {
- content: "\f043";
-}
-.icon-edit:before {
- content: "\f044";
-}
-.icon-share:before {
- content: "\f045";
-}
-.icon-check:before {
- content: "\f046";
-}
-.icon-move:before {
- content: "\f047";
-}
-.icon-step-backward:before {
- content: "\f048";
-}
-.icon-fast-backward:before {
- content: "\f049";
-}
-.icon-backward:before {
- content: "\f04a";
-}
-.icon-play:before {
- content: "\f04b";
-}
-.icon-pause:before {
- content: "\f04c";
-}
-.icon-stop:before {
- content: "\f04d";
-}
-.icon-forward:before {
- content: "\f04e";
-}
-.icon-fast-forward:before {
- content: "\f050";
-}
-.icon-step-forward:before {
- content: "\f051";
-}
-.icon-eject:before {
- content: "\f052";
-}
-.icon-chevron-left:before {
- content: "\f053";
-}
-.icon-chevron-right:before {
- content: "\f054";
-}
-.icon-plus-sign:before {
- content: "\f055";
-}
-.icon-minus-sign:before {
- content: "\f056";
-}
-.icon-remove-sign:before {
- content: "\f057";
-}
-.icon-ok-sign:before {
- content: "\f058";
-}
-.icon-question-sign:before {
- content: "\f059";
-}
-.icon-info-sign:before {
- content: "\f05a";
-}
-.icon-screenshot:before {
- content: "\f05b";
-}
-.icon-remove-circle:before {
- content: "\f05c";
-}
-.icon-ok-circle:before {
- content: "\f05d";
-}
-.icon-ban-circle:before {
- content: "\f05e";
-}
-.icon-arrow-left:before {
- content: "\f060";
-}
-.icon-arrow-right:before {
- content: "\f061";
-}
-.icon-arrow-up:before {
- content: "\f062";
-}
-.icon-arrow-down:before {
- content: "\f063";
-}
-.icon-share-alt:before {
- content: "\f064";
-}
-.icon-resize-full:before {
- content: "\f065";
-}
-.icon-resize-small:before {
- content: "\f066";
-}
-.icon-plus:before {
- content: "\f067";
-}
-.icon-minus:before {
- content: "\f068";
-}
-.icon-asterisk:before {
- content: "\f069";
-}
-.icon-exclamation-sign:before {
- content: "\f06a";
-}
-.icon-gift:before {
- content: "\f06b";
-}
-.icon-leaf:before {
- content: "\f06c";
-}
-.icon-fire:before {
- content: "\f06d";
-}
-.icon-eye-open:before {
- content: "\f06e";
-}
-.icon-eye-close:before {
- content: "\f070";
-}
-.icon-warning-sign:before {
- content: "\f071";
-}
-.icon-plane:before {
- content: "\f072";
-}
-.icon-calendar:before {
- content: "\f073";
-}
-.icon-random:before {
- content: "\f074";
-}
-.icon-comment:before {
- content: "\f075";
-}
-.icon-magnet:before {
- content: "\f076";
-}
-.icon-chevron-up:before {
- content: "\f077";
-}
-.icon-chevron-down:before {
- content: "\f078";
-}
-.icon-retweet:before {
- content: "\f079";
-}
-.icon-shopping-cart:before {
- content: "\f07a";
-}
-.icon-folder-close:before {
- content: "\f07b";
-}
-.icon-folder-open:before {
- content: "\f07c";
-}
-.icon-resize-vertical:before {
- content: "\f07d";
-}
-.icon-resize-horizontal:before {
- content: "\f07e";
-}
-.icon-bar-chart:before {
- content: "\f080";
-}
-.icon-twitter-sign:before {
- content: "\f081";
-}
-.icon-facebook-sign:before {
- content: "\f082";
-}
-.icon-camera-retro:before {
- content: "\f083";
-}
-.icon-key:before {
- content: "\f084";
-}
-.icon-cogs:before {
- content: "\f085";
-}
-.icon-comments:before {
- content: "\f086";
-}
-.icon-thumbs-up:before {
- content: "\f087";
-}
-.icon-thumbs-down:before {
- content: "\f088";
-}
-.icon-star-half:before {
- content: "\f089";
-}
-.icon-heart-empty:before {
- content: "\f08a";
-}
-.icon-signout:before {
- content: "\f08b";
-}
-.icon-linkedin-sign:before {
- content: "\f08c";
-}
-.icon-pushpin:before {
- content: "\f08d";
-}
-.icon-external-link:before {
- content: "\f08e";
-}
-.icon-signin:before {
- content: "\f090";
-}
-.icon-trophy:before {
- content: "\f091";
-}
-.icon-github-sign:before {
- content: "\f092";
-}
-.icon-upload-alt:before {
- content: "\f093";
-}
-.icon-lemon:before {
- content: "\f094";
-}
-.icon-phone:before {
- content: "\f095";
-}
-.icon-check-empty:before {
- content: "\f096";
-}
-.icon-bookmark-empty:before {
- content: "\f097";
-}
-.icon-phone-sign:before {
- content: "\f098";
-}
-.icon-twitter:before {
- content: "\f099";
-}
-.icon-facebook:before {
- content: "\f09a";
-}
-.icon-github:before {
- content: "\f09b";
-}
-.icon-unlock:before {
- content: "\f09c";
-}
-.icon-credit-card:before {
- content: "\f09d";
-}
-.icon-rss:before {
- content: "\f09e";
-}
-.icon-hdd:before {
- content: "\f0a0";
-}
-.icon-bullhorn:before {
- content: "\f0a1";
-}
-.icon-bell:before {
- content: "\f0a2";
-}
-.icon-certificate:before {
- content: "\f0a3";
-}
-.icon-hand-right:before {
- content: "\f0a4";
-}
-.icon-hand-left:before {
- content: "\f0a5";
-}
-.icon-hand-up:before {
- content: "\f0a6";
-}
-.icon-hand-down:before {
- content: "\f0a7";
-}
-.icon-circle-arrow-left:before {
- content: "\f0a8";
-}
-.icon-circle-arrow-right:before {
- content: "\f0a9";
-}
-.icon-circle-arrow-up:before {
- content: "\f0aa";
-}
-.icon-circle-arrow-down:before {
- content: "\f0ab";
-}
-.icon-globe:before {
- content: "\f0ac";
-}
-.icon-wrench:before {
- content: "\f0ad";
-}
-.icon-tasks:before {
- content: "\f0ae";
-}
-.icon-filter:before {
- content: "\f0b0";
-}
-.icon-briefcase:before {
- content: "\f0b1";
-}
-.icon-fullscreen:before {
- content: "\f0b2";
-}
-.icon-group:before {
- content: "\f0c0";
-}
-.icon-link:before {
- content: "\f0c1";
-}
-.icon-cloud:before {
- content: "\f0c2";
-}
-.icon-beaker:before {
- content: "\f0c3";
-}
-.icon-cut:before {
- content: "\f0c4";
-}
-.icon-copy:before {
- content: "\f0c5";
-}
-.icon-paper-clip:before {
- content: "\f0c6";
-}
-.icon-save:before {
- content: "\f0c7";
-}
-.icon-sign-blank:before {
- content: "\f0c8";
-}
-.icon-reorder:before {
- content: "\f0c9";
-}
-.icon-list-ul:before {
- content: "\f0ca";
-}
-.icon-list-ol:before {
- content: "\f0cb";
-}
-.icon-strikethrough:before {
- content: "\f0cc";
-}
-.icon-underline:before {
- content: "\f0cd";
-}
-.icon-table:before {
- content: "\f0ce";
-}
-.icon-magic:before {
- content: "\f0d0";
-}
-.icon-truck:before {
- content: "\f0d1";
-}
-.icon-pinterest:before {
- content: "\f0d2";
-}
-.icon-pinterest-sign:before {
- content: "\f0d3";
-}
-.icon-google-plus-sign:before {
- content: "\f0d4";
-}
-.icon-google-plus:before {
- content: "\f0d5";
-}
-.icon-money:before {
- content: "\f0d6";
-}
-.icon-caret-down:before {
- content: "\f0d7";
-}
-.icon-caret-up:before {
- content: "\f0d8";
-}
-.icon-caret-left:before {
- content: "\f0d9";
-}
-.icon-caret-right:before {
- content: "\f0da";
-}
-.icon-columns:before {
- content: "\f0db";
-}
-.icon-sort:before {
- content: "\f0dc";
-}
-.icon-sort-down:before {
- content: "\f0dd";
-}
-.icon-sort-up:before {
- content: "\f0de";
-}
-.icon-envelope-alt:before {
- content: "\f0e0";
-}
-.icon-linkedin:before {
- content: "\f0e1";
-}
-.icon-undo:before {
- content: "\f0e2";
-}
-.icon-legal:before {
- content: "\f0e3";
-}
-.icon-dashboard:before {
- content: "\f0e4";
-}
-.icon-comment-alt:before {
- content: "\f0e5";
-}
-.icon-comments-alt:before {
- content: "\f0e6";
-}
-.icon-bolt:before {
- content: "\f0e7";
-}
-.icon-sitemap:before {
- content: "\f0e8";
-}
-.icon-umbrella:before {
- content: "\f0e9";
-}
-.icon-paste:before {
- content: "\f0ea";
-}
-.icon-user-md:before {
- content: "\f200";
-}
-.dropup,
-.dropdown {
- position: relative;
-}
-.dropdown-toggle {
- *margin-bottom: -3px;
-}
-.dropdown-toggle:active,
-.open .dropdown-toggle {
- outline: 0;
-}
-.caret {
- display: inline-block;
- width: 0;
- height: 0;
- vertical-align: top;
- border-top: 4px solid #000000;
- border-right: 4px solid transparent;
- border-left: 4px solid transparent;
- content: "";
-}
-.dropdown .caret {
- margin-top: 8px;
- margin-left: 2px;
-}
-.dropdown-menu {
- position: absolute;
- top: 100%;
- left: 0;
- z-index: 1000;
- display: none;
- float: left;
- min-width: 160px;
- padding: 5px 0;
- margin: 2px 0 0;
- list-style: none;
- background-color: #ffffff;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, 0.2);
- *border-right-width: 2px;
- *border-bottom-width: 2px;
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
- -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding;
- background-clip: padding-box;
-}
-.dropdown-menu.pull-right {
- right: 0;
- left: auto;
-}
-.dropdown-menu .divider {
- *width: 100%;
- height: 1px;
- margin: 9px 1px;
- *margin: -5px 0 5px;
- overflow: hidden;
- background-color: #e5e5e5;
- border-bottom: 1px solid #ffffff;
-}
-.dropdown-menu a {
- display: block;
- padding: 3px 20px;
- clear: both;
- font-weight: normal;
- line-height: 20px;
- color: #333333;
- white-space: nowrap;
-}
-.dropdown-menu li > a:hover,
-.dropdown-menu li > a:focus,
-.dropdown-submenu:hover > a {
- text-decoration: none;
- color: #ffffff;
- background-color: #6e8f4a;
- background-color: #698847;
- background-image: -moz-linear-gradient(top, #6e8f4a, #617e41);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#6e8f4a), to(#617e41));
- background-image: -webkit-linear-gradient(top, #6e8f4a, #617e41);
- background-image: -o-linear-gradient(top, #6e8f4a, #617e41);
- background-image: linear-gradient(to bottom, #6e8f4a, #617e41);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff6e8f4a', endColorstr='#ff617e41', GradientType=0);
-}
-.dropdown-menu .active > a,
-.dropdown-menu .active > a:hover {
- color: #ffffff;
- text-decoration: none;
- outline: 0;
- background-color: #6e8f4a;
- background-color: #698847;
- background-image: -moz-linear-gradient(top, #6e8f4a, #617e41);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#6e8f4a), to(#617e41));
- background-image: -webkit-linear-gradient(top, #6e8f4a, #617e41);
- background-image: -o-linear-gradient(top, #6e8f4a, #617e41);
- background-image: linear-gradient(to bottom, #6e8f4a, #617e41);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff6e8f4a', endColorstr='#ff617e41', GradientType=0);
-}
-.dropdown-menu .disabled > a,
-.dropdown-menu .disabled > a:hover {
- color: #999999;
-}
-.dropdown-menu .disabled > a:hover {
- text-decoration: none;
- background-color: transparent;
- cursor: default;
-}
-.open {
- *z-index: 1000;
-}
-.open > .dropdown-menu {
- display: block;
-}
-.pull-right > .dropdown-menu {
- right: 0;
- left: auto;
-}
-.dropup .caret,
-.navbar-fixed-bottom .dropdown .caret {
- border-top: 0;
- border-bottom: 4px solid #000000;
- content: "\2191";
-}
-.dropup .dropdown-menu,
-.navbar-fixed-bottom .dropdown .dropdown-menu {
- top: auto;
- bottom: 100%;
- margin-bottom: 1px;
-}
-.dropdown-submenu {
- position: relative;
-}
-.dropdown-submenu > .dropdown-menu {
- top: 0;
- left: 100%;
- margin-top: -6px;
- margin-left: -1px;
- -webkit-border-radius: 0 6px 6px 6px;
- -moz-border-radius: 0 6px 6px 6px;
- border-radius: 0 6px 6px 6px;
-}
-.dropdown-submenu:hover .dropdown-menu {
- display: block;
-}
-.dropdown-submenu > a:after {
- display: block;
- content: " ";
- float: right;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
- border-width: 5px 0 5px 5px;
- border-left-color: #cccccc;
- margin-top: 5px;
- margin-right: -10px;
-}
-.dropdown-submenu:hover > a:after {
- border-left-color: #ffffff;
-}
-.dropdown .dropdown-menu .nav-header {
- padding-left: 20px;
- padding-right: 20px;
-}
-.typeahead {
- margin-top: 2px;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-.well {
- min-height: 20px;
- padding: 19px;
- margin-bottom: 20px;
- background-color: #f5f5f5;
- border: 1px solid #e3e3e3;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-}
-.well blockquote {
- border-color: #ddd;
- border-color: rgba(0, 0, 0, 0.15);
-}
-.well-large {
- padding: 24px;
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
-}
-.well-small {
- padding: 9px;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
-}
-.fade {
- opacity: 0;
- -webkit-transition: opacity 0.15s linear;
- -moz-transition: opacity 0.15s linear;
- -o-transition: opacity 0.15s linear;
- transition: opacity 0.15s linear;
-}
-.fade.in {
- opacity: 1;
-}
-.collapse {
- position: relative;
- height: 0;
- overflow: hidden;
- overflow: visible \9;
- -webkit-transition: height 0.35s ease;
- -moz-transition: height 0.35s ease;
- -o-transition: height 0.35s ease;
- transition: height 0.35s ease;
-}
-.collapse.in {
- height: auto;
-}
-.close {
- float: right;
- font-size: 20px;
- font-weight: bold;
- line-height: 20px;
- color: #000000;
- text-shadow: 0 1px 0 #ffffff;
- opacity: 0.2;
- filter: alpha(opacity=20);
-}
-.close:hover {
- color: #000000;
- text-decoration: none;
- cursor: pointer;
- opacity: 0.4;
- filter: alpha(opacity=40);
-}
-button.close {
- padding: 0;
- cursor: pointer;
- background: transparent;
- border: 0;
- -webkit-appearance: none;
-}
-.btn {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
-
- *zoom: 1;
- padding: 4px 14px;
- margin-bottom: 0;
- font-size: 14px;
- line-height: 20px;
- *line-height: 20px;
- text-align: center;
- vertical-align: middle;
- cursor: pointer;
- color: #333333;
- text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
- background-color: #f5f5f5;
- background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
- background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
- background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
- background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
- border-color: #e6e6e6 #e6e6e6 #bfbfbf;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #e6e6e6;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- border: 1px solid #bbbbbb;
- *border: 0;
- border-bottom-color: #a2a2a2;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- *margin-left: .3em;
- -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
- -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
- box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
-}
-.btn:hover,
-.btn:active,
-.btn.active,
-.btn.disabled,
-.btn[disabled] {
- color: #333333;
- background-color: #e6e6e6;
- *background-color: #d9d9d9;
-}
-.btn:active,
-.btn.active {
- background-color: #cccccc \9;
-}
-.btn:first-child {
- *margin-left: 0;
-}
-.btn:hover {
- color: #333333;
- text-decoration: none;
- background-color: #e6e6e6;
- *background-color: #d9d9d9;
- /* Buttons in IE7 don't get borders, so darken on hover */
-
- background-position: 0 -15px;
- -webkit-transition: background-position 0.1s linear;
- -moz-transition: background-position 0.1s linear;
- -o-transition: background-position 0.1s linear;
- transition: background-position 0.1s linear;
-}
-.btn:focus {
- outline: thin dotted #333;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-.btn.active,
-.btn:active {
- background-color: #e6e6e6;
- background-color: #d9d9d9 \9;
- background-image: none;
- outline: 0;
- -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
- -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
- box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
-}
-.btn.disabled,
-.btn[disabled] {
- cursor: default;
- background-color: #e6e6e6;
- background-image: none;
- opacity: 0.65;
- filter: alpha(opacity=65);
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
-}
-.btn-large {
- padding: 9px 14px;
- font-size: 16px;
- line-height: normal;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
-}
-.btn-large [class^="icon-"] {
- margin-top: 2px;
-}
-.btn-small {
- padding: 3px 9px;
- font-size: 12px;
- line-height: 18px;
-}
-.btn-small [class^="icon-"] {
- margin-top: 0;
-}
-.btn-mini {
- padding: 2px 6px;
- font-size: 11px;
- line-height: 16px;
-}
-.btn-block {
- display: block;
- width: 100%;
- padding-left: 0;
- padding-right: 0;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-.btn-block + .btn-block {
- margin-top: 5px;
-}
-.btn-primary.active,
-.btn-warning.active,
-.btn-danger.active,
-.btn-success.active,
-.btn-info.active,
-.btn-inverse.active {
- color: rgba(255, 255, 255, 0.75);
-}
-.btn {
- border-color: #c5c5c5;
- border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);
-}
-.btn-primary {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #658f4a;
- background-image: -moz-linear-gradient(top, #6e8f4a, #578f4a);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#6e8f4a), to(#578f4a));
- background-image: -webkit-linear-gradient(top, #6e8f4a, #578f4a);
- background-image: -o-linear-gradient(top, #6e8f4a, #578f4a);
- background-image: linear-gradient(to bottom, #6e8f4a, #578f4a);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff6e8f4a', endColorstr='#ff578f4a', GradientType=0);
- border-color: #578f4a #578f4a #385d30;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #578f4a;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-primary:hover,
-.btn-primary:active,
-.btn-primary.active,
-.btn-primary.disabled,
-.btn-primary[disabled] {
- color: #ffffff;
- background-color: #578f4a;
- *background-color: #4d7e41;
-}
-.btn-primary:active,
-.btn-primary.active {
- background-color: #436d39 \9;
-}
-.btn-warning {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #faa732;
- background-image: -moz-linear-gradient(top, #fbb450, #f89406);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
- background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
- background-image: -o-linear-gradient(top, #fbb450, #f89406);
- background-image: linear-gradient(to bottom, #fbb450, #f89406);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
- border-color: #f89406 #f89406 #ad6704;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #f89406;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-warning:hover,
-.btn-warning:active,
-.btn-warning.active,
-.btn-warning.disabled,
-.btn-warning[disabled] {
- color: #ffffff;
- background-color: #f89406;
- *background-color: #df8505;
-}
-.btn-warning:active,
-.btn-warning.active {
- background-color: #c67605 \9;
-}
-.btn-danger {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #da4f49;
- background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
- background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
- background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
- background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
- border-color: #bd362f #bd362f #802420;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #bd362f;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-danger:hover,
-.btn-danger:active,
-.btn-danger.active,
-.btn-danger.disabled,
-.btn-danger[disabled] {
- color: #ffffff;
- background-color: #bd362f;
- *background-color: #a9302a;
-}
-.btn-danger:active,
-.btn-danger.active {
- background-color: #942a25 \9;
-}
-.btn-success {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #5bb75b;
- background-image: -moz-linear-gradient(top, #62c462, #51a351);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
- background-image: -webkit-linear-gradient(top, #62c462, #51a351);
- background-image: -o-linear-gradient(top, #62c462, #51a351);
- background-image: linear-gradient(to bottom, #62c462, #51a351);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
- border-color: #51a351 #51a351 #387038;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #51a351;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-success:hover,
-.btn-success:active,
-.btn-success.active,
-.btn-success.disabled,
-.btn-success[disabled] {
- color: #ffffff;
- background-color: #51a351;
- *background-color: #499249;
-}
-.btn-success:active,
-.btn-success.active {
- background-color: #408140 \9;
-}
-.btn-info {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #49afcd;
- background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
- background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
- background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
- background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
- border-color: #2f96b4 #2f96b4 #1f6377;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #2f96b4;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-info:hover,
-.btn-info:active,
-.btn-info.active,
-.btn-info.disabled,
-.btn-info[disabled] {
- color: #ffffff;
- background-color: #2f96b4;
- *background-color: #2a85a0;
-}
-.btn-info:active,
-.btn-info.active {
- background-color: #24748c \9;
-}
-.btn-inverse {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #363636;
- background-image: -moz-linear-gradient(top, #444444, #222222);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
- background-image: -webkit-linear-gradient(top, #444444, #222222);
- background-image: -o-linear-gradient(top, #444444, #222222);
- background-image: linear-gradient(to bottom, #444444, #222222);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
- border-color: #222222 #222222 #000000;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #222222;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.btn-inverse:hover,
-.btn-inverse:active,
-.btn-inverse.active,
-.btn-inverse.disabled,
-.btn-inverse[disabled] {
- color: #ffffff;
- background-color: #222222;
- *background-color: #151515;
-}
-.btn-inverse:active,
-.btn-inverse.active {
- background-color: #080808 \9;
-}
-button.btn,
-input[type="submit"].btn {
- *padding-top: 3px;
- *padding-bottom: 3px;
-}
-button.btn::-moz-focus-inner,
-input[type="submit"].btn::-moz-focus-inner {
- padding: 0;
- border: 0;
-}
-button.btn.btn-large,
-input[type="submit"].btn.btn-large {
- *padding-top: 7px;
- *padding-bottom: 7px;
-}
-button.btn.btn-small,
-input[type="submit"].btn.btn-small {
- *padding-top: 3px;
- *padding-bottom: 3px;
-}
-button.btn.btn-mini,
-input[type="submit"].btn.btn-mini {
- *padding-top: 1px;
- *padding-bottom: 1px;
-}
-.btn-link,
-.btn-link:active {
- background-color: transparent;
- background-image: none;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
-}
-.btn-link {
- border-color: transparent;
- cursor: pointer;
- color: #6e8f4a;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-.btn-link:hover {
- color: #f26a1e;
- text-decoration: underline;
- background-color: transparent;
-}
-.btn-group {
- position: relative;
- font-size: 0;
- white-space: nowrap;
- *margin-left: .3em;
-}
-.btn-group:first-child {
- *margin-left: 0;
-}
-.btn-group + .btn-group {
- margin-left: 5px;
-}
-.btn-toolbar {
- font-size: 0;
- margin-top: 10px;
- margin-bottom: 10px;
-}
-.btn-toolbar .btn-group {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
-
- *zoom: 1;
-}
-.btn-toolbar .btn + .btn,
-.btn-toolbar .btn-group + .btn,
-.btn-toolbar .btn + .btn-group {
- margin-left: 5px;
-}
-.btn-group > .btn {
- position: relative;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-.btn-group > .btn + .btn {
- margin-left: -1px;
-}
-.btn-group > .btn,
-.btn-group > .dropdown-menu {
- font-size: 14px;
-}
-.btn-group > .btn-mini {
- font-size: 11px;
-}
-.btn-group > .btn-small {
- font-size: 12px;
-}
-.btn-group > .btn-large {
- font-size: 16px;
-}
-.btn-group > .btn:first-child {
- margin-left: 0;
- -webkit-border-top-left-radius: 4px;
- -moz-border-radius-topleft: 4px;
- border-top-left-radius: 4px;
- -webkit-border-bottom-left-radius: 4px;
- -moz-border-radius-bottomleft: 4px;
- border-bottom-left-radius: 4px;
-}
-.btn-group > .btn:last-child,
-.btn-group > .dropdown-toggle {
- -webkit-border-top-right-radius: 4px;
- -moz-border-radius-topright: 4px;
- border-top-right-radius: 4px;
- -webkit-border-bottom-right-radius: 4px;
- -moz-border-radius-bottomright: 4px;
- border-bottom-right-radius: 4px;
-}
-.btn-group > .btn.large:first-child {
- margin-left: 0;
- -webkit-border-top-left-radius: 6px;
- -moz-border-radius-topleft: 6px;
- border-top-left-radius: 6px;
- -webkit-border-bottom-left-radius: 6px;
- -moz-border-radius-bottomleft: 6px;
- border-bottom-left-radius: 6px;
-}
-.btn-group > .btn.large:last-child,
-.btn-group > .large.dropdown-toggle {
- -webkit-border-top-right-radius: 6px;
- -moz-border-radius-topright: 6px;
- border-top-right-radius: 6px;
- -webkit-border-bottom-right-radius: 6px;
- -moz-border-radius-bottomright: 6px;
- border-bottom-right-radius: 6px;
-}
-.btn-group > .btn:hover,
-.btn-group > .btn:focus,
-.btn-group > .btn:active,
-.btn-group > .btn.active {
- z-index: 2;
-}
-.btn-group .dropdown-toggle:active,
-.btn-group.open .dropdown-toggle {
- outline: 0;
-}
-.btn-group > .btn + .dropdown-toggle {
- padding-left: 8px;
- padding-right: 8px;
- -webkit-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
- -moz-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
- box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
- *padding-top: 5px;
- *padding-bottom: 5px;
-}
-.btn-group > .btn-mini + .dropdown-toggle {
- padding-left: 5px;
- padding-right: 5px;
- *padding-top: 2px;
- *padding-bottom: 2px;
-}
-.btn-group > .btn-small + .dropdown-toggle {
- *padding-top: 5px;
- *padding-bottom: 4px;
-}
-.btn-group > .btn-large + .dropdown-toggle {
- padding-left: 12px;
- padding-right: 12px;
- *padding-top: 7px;
- *padding-bottom: 7px;
-}
-.btn-group.open .dropdown-toggle {
- background-image: none;
- -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
- -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
- box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
-}
-.btn-group.open .btn.dropdown-toggle {
- background-color: #e6e6e6;
-}
-.btn-group.open .btn-primary.dropdown-toggle {
- background-color: #578f4a;
-}
-.btn-group.open .btn-warning.dropdown-toggle {
- background-color: #f89406;
-}
-.btn-group.open .btn-danger.dropdown-toggle {
- background-color: #bd362f;
-}
-.btn-group.open .btn-success.dropdown-toggle {
- background-color: #51a351;
-}
-.btn-group.open .btn-info.dropdown-toggle {
- background-color: #2f96b4;
-}
-.btn-group.open .btn-inverse.dropdown-toggle {
- background-color: #222222;
-}
-.btn .caret {
- margin-top: 8px;
- margin-left: 0;
-}
-.btn-mini .caret,
-.btn-small .caret,
-.btn-large .caret {
- margin-top: 6px;
-}
-.btn-large .caret {
- border-left-width: 5px;
- border-right-width: 5px;
- border-top-width: 5px;
-}
-.dropup .btn-large .caret {
- border-bottom: 5px solid #000000;
- border-top: 0;
-}
-.btn-primary .caret,
-.btn-warning .caret,
-.btn-danger .caret,
-.btn-info .caret,
-.btn-success .caret,
-.btn-inverse .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
-}
-.btn-group-vertical {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
-
- *zoom: 1;
-}
-.btn-group-vertical .btn {
- display: block;
- float: none;
- width: 100%;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-.btn-group-vertical .btn + .btn {
- margin-left: 0;
- margin-top: -1px;
-}
-.btn-group-vertical .btn:first-child {
- -webkit-border-radius: 4px 4px 0 0;
- -moz-border-radius: 4px 4px 0 0;
- border-radius: 4px 4px 0 0;
-}
-.btn-group-vertical .btn:last-child {
- -webkit-border-radius: 0 0 4px 4px;
- -moz-border-radius: 0 0 4px 4px;
- border-radius: 0 0 4px 4px;
-}
-.btn-group-vertical .btn-large:first-child {
- -webkit-border-radius: 6px 6px 0 0;
- -moz-border-radius: 6px 6px 0 0;
- border-radius: 6px 6px 0 0;
-}
-.btn-group-vertical .btn-large:last-child {
- -webkit-border-radius: 0 0 6px 6px;
- -moz-border-radius: 0 0 6px 6px;
- border-radius: 0 0 6px 6px;
-}
-.alert {
- padding: 8px 35px 8px 14px;
- margin-bottom: 20px;
- text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
- background-color: #fcf8e3;
- border: 1px solid #fbeed5;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- color: #c09853;
-}
-.alert h4 {
- margin: 0;
-}
-.alert .close {
- position: relative;
- top: -2px;
- right: -21px;
- line-height: 20px;
-}
-.alert-success {
- background-color: #dff0d8;
- border-color: #d6e9c6;
- color: #468847;
-}
-.alert-danger,
-.alert-error {
- background-color: #f2dede;
- border-color: #eed3d7;
- color: #b94a48;
-}
-.alert-info {
- background-color: #d9edf7;
- border-color: #bce8f1;
- color: #3a87ad;
-}
-.alert-block {
- padding-top: 14px;
- padding-bottom: 14px;
-}
-.alert-block > p,
-.alert-block > ul {
- margin-bottom: 0;
-}
-.alert-block p + p {
- margin-top: 5px;
-}
-.nav {
- margin-left: 0;
- margin-bottom: 20px;
- list-style: none;
-}
-.nav > li > a {
- display: block;
-}
-.nav > li > a:hover {
- text-decoration: none;
- background-color: #eeeeee;
-}
-.nav > .pull-right {
- float: right;
-}
-.nav-header {
- display: block;
- padding: 3px 15px;
- font-size: 11px;
- font-weight: bold;
- line-height: 20px;
- color: #999999;
- text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
- text-transform: uppercase;
-}
-.nav li + .nav-header {
- margin-top: 9px;
-}
-.nav-list {
- padding-left: 15px;
- padding-right: 15px;
- margin-bottom: 0;
-}
-.nav-list > li > a,
-.nav-list .nav-header {
- margin-left: -15px;
- margin-right: -15px;
- text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-}
-.nav-list > li > a {
- padding: 3px 15px;
-}
-.nav-list > .active > a,
-.nav-list > .active > a:hover {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
- background-color: #6e8f4a;
-}
-.nav-list [class^="icon-"] {
- margin-right: 2px;
-}
-.nav-list .divider {
- *width: 100%;
- height: 1px;
- margin: 9px 1px;
- *margin: -5px 0 5px;
- overflow: hidden;
- background-color: #e5e5e5;
- border-bottom: 1px solid #ffffff;
-}
-.nav-tabs,
-.nav-pills {
- *zoom: 1;
-}
-.nav-tabs:before,
-.nav-pills:before,
-.nav-tabs:after,
-.nav-pills:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.nav-tabs:after,
-.nav-pills:after {
- clear: both;
-}
-.nav-tabs > li,
-.nav-pills > li {
- float: left;
-}
-.nav-tabs > li > a,
-.nav-pills > li > a {
- padding-right: 12px;
- padding-left: 12px;
- margin-right: 2px;
- line-height: 14px;
-}
-.nav-tabs {
- border-bottom: 1px solid #ddd;
-}
-.nav-tabs > li {
- margin-bottom: -1px;
-}
-.nav-tabs > li > a {
- padding-top: 8px;
- padding-bottom: 8px;
- line-height: 20px;
- border: 1px solid transparent;
- -webkit-border-radius: 4px 4px 0 0;
- -moz-border-radius: 4px 4px 0 0;
- border-radius: 4px 4px 0 0;
-}
-.nav-tabs > li > a:hover {
- border-color: #eeeeee #eeeeee #dddddd;
-}
-.nav-tabs > .active > a,
-.nav-tabs > .active > a:hover {
- color: #555555;
- background-color: #ffffff;
- border: 1px solid #ddd;
- border-bottom-color: transparent;
- cursor: default;
-}
-.nav-pills > li > a {
- padding-top: 8px;
- padding-bottom: 8px;
- margin-top: 2px;
- margin-bottom: 2px;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
-}
-.nav-pills > .active > a,
-.nav-pills > .active > a:hover {
- color: #ffffff;
- background-color: #6e8f4a;
-}
-.nav-stacked > li {
- float: none;
-}
-.nav-stacked > li > a {
- margin-right: 0;
-}
-.nav-tabs.nav-stacked {
- border-bottom: 0;
-}
-.nav-tabs.nav-stacked > li > a {
- border: 1px solid #ddd;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-.nav-tabs.nav-stacked > li:first-child > a {
- -webkit-border-top-right-radius: 4px;
- -moz-border-radius-topright: 4px;
- border-top-right-radius: 4px;
- -webkit-border-top-left-radius: 4px;
- -moz-border-radius-topleft: 4px;
- border-top-left-radius: 4px;
-}
-.nav-tabs.nav-stacked > li:last-child > a {
- -webkit-border-bottom-right-radius: 4px;
- -moz-border-radius-bottomright: 4px;
- border-bottom-right-radius: 4px;
- -webkit-border-bottom-left-radius: 4px;
- -moz-border-radius-bottomleft: 4px;
- border-bottom-left-radius: 4px;
-}
-.nav-tabs.nav-stacked > li > a:hover {
- border-color: #ddd;
- z-index: 2;
-}
-.nav-pills.nav-stacked > li > a {
- margin-bottom: 3px;
-}
-.nav-pills.nav-stacked > li:last-child > a {
- margin-bottom: 1px;
-}
-.nav-tabs .dropdown-menu {
- -webkit-border-radius: 0 0 6px 6px;
- -moz-border-radius: 0 0 6px 6px;
- border-radius: 0 0 6px 6px;
-}
-.nav-pills .dropdown-menu {
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
-}
-.nav .dropdown-toggle .caret {
- border-top-color: #6e8f4a;
- border-bottom-color: #6e8f4a;
- margin-top: 6px;
-}
-.nav .dropdown-toggle:hover .caret {
- border-top-color: #f26a1e;
- border-bottom-color: #f26a1e;
-}
-/* move down carets for tabs */
-.nav-tabs .dropdown-toggle .caret {
- margin-top: 8px;
-}
-.nav .active .dropdown-toggle .caret {
- border-top-color: #fff;
- border-bottom-color: #fff;
-}
-.nav-tabs .active .dropdown-toggle .caret {
- border-top-color: #555555;
- border-bottom-color: #555555;
-}
-.nav > .dropdown.active > a:hover {
- cursor: pointer;
-}
-.nav-tabs .open .dropdown-toggle,
-.nav-pills .open .dropdown-toggle,
-.nav > li.dropdown.open.active > a:hover {
- color: #ffffff;
- background-color: #999999;
- border-color: #999999;
-}
-.nav li.dropdown.open .caret,
-.nav li.dropdown.open.active .caret,
-.nav li.dropdown.open a:hover .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
- opacity: 1;
- filter: alpha(opacity=100);
-}
-.tabs-stacked .open > a:hover {
- border-color: #999999;
-}
-.tabbable {
- *zoom: 1;
-}
-.tabbable:before,
-.tabbable:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.tabbable:after {
- clear: both;
-}
-.tab-content {
- overflow: auto;
-}
-.tabs-below > .nav-tabs,
-.tabs-right > .nav-tabs,
-.tabs-left > .nav-tabs {
- border-bottom: 0;
-}
-.tab-content > .tab-pane,
-.pill-content > .pill-pane {
- display: none;
-}
-.tab-content > .active,
-.pill-content > .active {
- display: block;
-}
-.tabs-below > .nav-tabs {
- border-top: 1px solid #ddd;
-}
-.tabs-below > .nav-tabs > li {
- margin-top: -1px;
- margin-bottom: 0;
-}
-.tabs-below > .nav-tabs > li > a {
- -webkit-border-radius: 0 0 4px 4px;
- -moz-border-radius: 0 0 4px 4px;
- border-radius: 0 0 4px 4px;
-}
-.tabs-below > .nav-tabs > li > a:hover {
- border-bottom-color: transparent;
- border-top-color: #ddd;
-}
-.tabs-below > .nav-tabs > .active > a,
-.tabs-below > .nav-tabs > .active > a:hover {
- border-color: transparent #ddd #ddd #ddd;
-}
-.tabs-left > .nav-tabs > li,
-.tabs-right > .nav-tabs > li {
- float: none;
-}
-.tabs-left > .nav-tabs > li > a,
-.tabs-right > .nav-tabs > li > a {
- min-width: 74px;
- margin-right: 0;
- margin-bottom: 3px;
-}
-.tabs-left > .nav-tabs {
- float: left;
- margin-right: 19px;
- border-right: 1px solid #ddd;
-}
-.tabs-left > .nav-tabs > li > a {
- margin-right: -1px;
- -webkit-border-radius: 4px 0 0 4px;
- -moz-border-radius: 4px 0 0 4px;
- border-radius: 4px 0 0 4px;
-}
-.tabs-left > .nav-tabs > li > a:hover {
- border-color: #eeeeee #dddddd #eeeeee #eeeeee;
-}
-.tabs-left > .nav-tabs .active > a,
-.tabs-left > .nav-tabs .active > a:hover {
- border-color: #ddd transparent #ddd #ddd;
- *border-right-color: #ffffff;
-}
-.tabs-right > .nav-tabs {
- float: right;
- margin-left: 19px;
- border-left: 1px solid #ddd;
-}
-.tabs-right > .nav-tabs > li > a {
- margin-left: -1px;
- -webkit-border-radius: 0 4px 4px 0;
- -moz-border-radius: 0 4px 4px 0;
- border-radius: 0 4px 4px 0;
-}
-.tabs-right > .nav-tabs > li > a:hover {
- border-color: #eeeeee #eeeeee #eeeeee #dddddd;
-}
-.tabs-right > .nav-tabs .active > a,
-.tabs-right > .nav-tabs .active > a:hover {
- border-color: #ddd #ddd #ddd transparent;
- *border-left-color: #ffffff;
-}
-.nav > .disabled > a {
- color: #999999;
-}
-.nav > .disabled > a:hover {
- text-decoration: none;
- background-color: transparent;
- cursor: default;
-}
-.navbar {
- overflow: visible;
- margin-bottom: 20px;
- color: #1f444b;
- *position: relative;
- *z-index: 2;
-}
-.navbar-inner {
- min-height: 70px;
- padding-left: 20px;
- padding-right: 20px;
- background-color: #e9e7e0;
- background-image: -moz-linear-gradient(top, #edece6, #e2e1d7);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#edece6), to(#e2e1d7));
- background-image: -webkit-linear-gradient(top, #edece6, #e2e1d7);
- background-image: -o-linear-gradient(top, #edece6, #e2e1d7);
- background-image: linear-gradient(to bottom, #edece6, #e2e1d7);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffedece6', endColorstr='#ffe2e1d7', GradientType=0);
- border: 1px solid #c9c6b4;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
- -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-}
-.navbar .container {
- width: auto;
-}
-.nav-collapse.collapse {
- height: auto;
-}
-.navbar .brand {
- float: left;
- display: block;
- padding: 25px 20px 25px;
- margin-left: -20px;
- font-size: 20px;
- font-weight: 200;
- color: #1f444b;
- text-shadow: 0 1px 0 #edece6;
-}
-.navbar .brand:hover {
- text-decoration: none;
-}
-.navbar-text {
- margin-bottom: 0;
- line-height: 70px;
-}
-.navbar-link {
- color: #1f444b;
-}
-.navbar-link:hover {
- color: #f26a1e;
-}
-.navbar .divider-vertical {
- height: 70px;
- margin: 0 9px;
- border-left: 1px solid #e2e1d7;
- border-right: 1px solid #edece6;
-}
-.navbar .btn,
-.navbar .btn-group {
- margin-top: 21px;
-}
-.navbar .btn-group .btn {
- margin: 0;
-}
-.navbar-form {
- margin-bottom: 0;
- *zoom: 1;
-}
-.navbar-form:before,
-.navbar-form:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.navbar-form:after {
- clear: both;
-}
-.navbar-form input,
-.navbar-form select,
-.navbar-form .radio,
-.navbar-form .checkbox {
- margin-top: 20px;
-}
-.navbar-form input,
-.navbar-form select,
-.navbar-form .btn {
- display: inline-block;
- margin-bottom: 0;
-}
-.navbar-form input[type="image"],
-.navbar-form input[type="checkbox"],
-.navbar-form input[type="radio"] {
- margin-top: 3px;
-}
-.navbar-form .input-append,
-.navbar-form .input-prepend {
- margin-top: 6px;
- white-space: nowrap;
-}
-.navbar-form .input-append input,
-.navbar-form .input-prepend input {
- margin-top: 0;
-}
-.navbar-search {
- position: relative;
- float: left;
- margin-top: 20px;
- margin-bottom: 0;
-}
-.navbar-search .search-query {
- margin-bottom: 0;
- padding: 4px 14px;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 13px;
- font-weight: normal;
- line-height: 1;
- -webkit-border-radius: 15px;
- -moz-border-radius: 15px;
- border-radius: 15px;
-}
-.navbar-static-top {
- position: static;
- width: 100%;
- margin-bottom: 0;
-}
-.navbar-static-top .navbar-inner {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-.navbar-fixed-top,
-.navbar-fixed-bottom {
- position: fixed;
- right: 0;
- left: 0;
- z-index: 1030;
- margin-bottom: 0;
-}
-.navbar-fixed-top .navbar-inner,
-.navbar-fixed-bottom .navbar-inner,
-.navbar-static-top .navbar-inner {
- border: 0;
-}
-.navbar-fixed-top .navbar-inner,
-.navbar-fixed-bottom .navbar-inner {
- padding-left: 0;
- padding-right: 0;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
- width: 940px;
-}
-.navbar-fixed-top {
- top: 0;
-}
-.navbar-fixed-top .navbar-inner,
-.navbar-static-top .navbar-inner {
- -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);
- -moz-box-shadow: inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);
- box-shadow: inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);
-}
-.navbar-fixed-bottom {
- bottom: 0;
-}
-.navbar-fixed-bottom .navbar-inner {
- -webkit-box-shadow: inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);
- -moz-box-shadow: inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);
- box-shadow: inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);
-}
-.navbar .nav {
- position: relative;
- left: 0;
- display: block;
- float: left;
- margin: 0 10px 0 0;
-}
-.navbar .nav.pull-right {
- float: right;
-}
-.navbar .nav > li {
- float: left;
-}
-.navbar .nav > li > a {
- float: none;
- padding: 25px 15px 25px;
- color: #1f444b;
- text-decoration: none;
- text-shadow: 0 1px 0 #edece6;
-}
-.navbar .nav .dropdown-toggle .caret {
- margin-top: 8px;
-}
-.navbar .nav > li > a:focus,
-.navbar .nav > li > a:hover {
- background-color: transparent;
- color: #f26a1e;
- text-decoration: none;
-}
-.navbar .nav > .active > a,
-.navbar .nav > .active > a:hover,
-.navbar .nav > .active > a:focus {
- color: #f26a1e;
- text-decoration: none;
- background-color: #d8d5c8;
- -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
- -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
- box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-}
-.navbar .btn-navbar {
- display: none;
- float: right;
- padding: 7px 10px;
- margin-left: 5px;
- margin-right: 5px;
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #dedcd1;
- background-image: -moz-linear-gradient(top, #e2e1d7, #d8d5c8);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#e2e1d7), to(#d8d5c8));
- background-image: -webkit-linear-gradient(top, #e2e1d7, #d8d5c8);
- background-image: -o-linear-gradient(top, #e2e1d7, #d8d5c8);
- background-image: linear-gradient(to bottom, #e2e1d7, #d8d5c8);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe2e1d7', endColorstr='#ffd8d5c8', GradientType=0);
- border-color: #d8d5c8 #d8d5c8 #b8b49c;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #d8d5c8;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
- -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
- box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
-}
-.navbar .btn-navbar:hover,
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active,
-.navbar .btn-navbar.disabled,
-.navbar .btn-navbar[disabled] {
- color: #ffffff;
- background-color: #d8d5c8;
- *background-color: #cdcaba;
-}
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active {
- background-color: #c2bfab \9;
-}
-.navbar .btn-navbar .icon-bar {
- display: block;
- width: 18px;
- height: 2px;
- background-color: #f5f5f5;
- -webkit-border-radius: 1px;
- -moz-border-radius: 1px;
- border-radius: 1px;
- -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
- -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
- box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-}
-.btn-navbar .icon-bar + .icon-bar {
- margin-top: 3px;
-}
-.navbar .nav > li > .dropdown-menu:before {
- content: '';
- display: inline-block;
- border-left: 7px solid transparent;
- border-right: 7px solid transparent;
- border-bottom: 7px solid #ccc;
- border-bottom-color: rgba(0, 0, 0, 0.2);
- position: absolute;
- top: -7px;
- left: 9px;
-}
-.navbar .nav > li > .dropdown-menu:after {
- content: '';
- display: inline-block;
- border-left: 6px solid transparent;
- border-right: 6px solid transparent;
- border-bottom: 6px solid #ffffff;
- position: absolute;
- top: -6px;
- left: 10px;
-}
-.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
- border-top: 7px solid #ccc;
- border-top-color: rgba(0, 0, 0, 0.2);
- border-bottom: 0;
- bottom: -7px;
- top: auto;
-}
-.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
- border-top: 6px solid #ffffff;
- border-bottom: 0;
- bottom: -6px;
- top: auto;
-}
-.navbar .nav li.dropdown.open > .dropdown-toggle,
-.navbar .nav li.dropdown.active > .dropdown-toggle,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle {
- background-color: #d8d5c8;
- color: #f26a1e;
-}
-.navbar .nav li.dropdown > .dropdown-toggle .caret {
- border-top-color: #1f444b;
- border-bottom-color: #1f444b;
-}
-.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
- border-top-color: #f26a1e;
- border-bottom-color: #f26a1e;
-}
-.navbar .pull-right > li > .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right {
- left: auto;
- right: 0;
-}
-.navbar .pull-right > li > .dropdown-menu:before,
-.navbar .nav > li > .dropdown-menu.pull-right:before {
- left: auto;
- right: 12px;
-}
-.navbar .pull-right > li > .dropdown-menu:after,
-.navbar .nav > li > .dropdown-menu.pull-right:after {
- left: auto;
- right: 13px;
-}
-.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
- left: auto;
- right: 100%;
- margin-left: 0;
- margin-right: -1px;
- -webkit-border-radius: 6px 0 6px 6px;
- -moz-border-radius: 6px 0 6px 6px;
- border-radius: 6px 0 6px 6px;
-}
-.navbar-inverse {
- color: #999999;
-}
-.navbar-inverse .navbar-inner {
- background-color: #1b1b1b;
- background-image: -moz-linear-gradient(top, #222222, #111111);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
- background-image: -webkit-linear-gradient(top, #222222, #111111);
- background-image: -o-linear-gradient(top, #222222, #111111);
- background-image: linear-gradient(to bottom, #222222, #111111);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
- border-color: #252525;
-}
-.navbar-inverse .brand,
-.navbar-inverse .nav > li > a {
- color: #999999;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-}
-.navbar-inverse .brand:hover,
-.navbar-inverse .nav > li > a:hover {
- color: #ffffff;
-}
-.navbar-inverse .nav > li > a:focus,
-.navbar-inverse .nav > li > a:hover {
- background-color: transparent;
- color: #ffffff;
-}
-.navbar-inverse .nav .active > a,
-.navbar-inverse .nav .active > a:hover,
-.navbar-inverse .nav .active > a:focus {
- color: #ffffff;
- background-color: #111111;
-}
-.navbar-inverse .navbar-link {
- color: #999999;
-}
-.navbar-inverse .navbar-link:hover {
- color: #ffffff;
-}
-.navbar-inverse .divider-vertical {
- border-left-color: #111111;
- border-right-color: #222222;
-}
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
- background-color: #111111;
- color: #ffffff;
-}
-.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
- border-top-color: #999999;
- border-bottom-color: #999999;
-}
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
-}
-.navbar-inverse .navbar-search .search-query {
- color: #ffffff;
- background-color: #515151;
- border-color: #111111;
- -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
- -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
- box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
- -webkit-transition: none;
- -moz-transition: none;
- -o-transition: none;
- transition: none;
-}
-.navbar-inverse .navbar-search .search-query:-moz-placeholder {
- color: #cccccc;
-}
-.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
- color: #cccccc;
-}
-.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
- color: #cccccc;
-}
-.navbar-inverse .navbar-search .search-query:focus,
-.navbar-inverse .navbar-search .search-query.focused {
- padding: 5px 15px;
- color: #333333;
- text-shadow: 0 1px 0 #ffffff;
- background-color: #ffffff;
- border: 0;
- -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
- -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
- box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
- outline: 0;
-}
-.navbar-inverse .btn-navbar {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #0e0e0e;
- background-image: -moz-linear-gradient(top, #151515, #040404);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
- background-image: -webkit-linear-gradient(top, #151515, #040404);
- background-image: -o-linear-gradient(top, #151515, #040404);
- background-image: linear-gradient(to bottom, #151515, #040404);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
- border-color: #040404 #040404 #000000;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #040404;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-.navbar-inverse .btn-navbar:hover,
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active,
-.navbar-inverse .btn-navbar.disabled,
-.navbar-inverse .btn-navbar[disabled] {
- color: #ffffff;
- background-color: #040404;
- *background-color: #000000;
-}
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active {
- background-color: #000000 \9;
-}
-.pagination {
- height: 40px;
- margin: 20px 0;
-}
-.pagination ul {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
-
- *zoom: 1;
- margin-left: 0;
- margin-bottom: 0;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-.pagination li {
- display: inline;
-}
-.pagination a,
-.pagination span {
- float: left;
- padding: 0 14px;
- line-height: 38px;
- text-decoration: none;
- background-color: #ffffff;
- border: 1px solid #dddddd;
- border-left-width: 0;
-}
-.pagination a:hover,
-.pagination .active a,
-.pagination .active span {
- background-color: #f5f5f5;
-}
-.pagination .active a,
-.pagination .active span {
- color: #999999;
- cursor: default;
-}
-.pagination .disabled span,
-.pagination .disabled a,
-.pagination .disabled a:hover {
- color: #999999;
- background-color: transparent;
- cursor: default;
-}
-.pagination li:first-child a,
-.pagination li:first-child span {
- border-left-width: 1px;
- -webkit-border-radius: 3px 0 0 3px;
- -moz-border-radius: 3px 0 0 3px;
- border-radius: 3px 0 0 3px;
-}
-.pagination li:last-child a,
-.pagination li:last-child span {
- -webkit-border-radius: 0 3px 3px 0;
- -moz-border-radius: 0 3px 3px 0;
- border-radius: 0 3px 3px 0;
-}
-.pagination-centered {
- text-align: center;
-}
-.pagination-right {
- text-align: right;
-}
-.pager {
- margin: 20px 0;
- list-style: none;
- text-align: center;
- *zoom: 1;
-}
-.pager:before,
-.pager:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.pager:after {
- clear: both;
-}
-.pager li {
- display: inline;
-}
-.pager a {
- display: inline-block;
- padding: 5px 14px;
- background-color: #fff;
- border: 1px solid #ddd;
- -webkit-border-radius: 15px;
- -moz-border-radius: 15px;
- border-radius: 15px;
-}
-.pager a:hover {
- text-decoration: none;
- background-color: #f5f5f5;
-}
-.pager .next a {
- float: right;
-}
-.pager .previous a {
- float: left;
-}
-.pager .disabled a,
-.pager .disabled a:hover {
- color: #999999;
- background-color: #fff;
- cursor: default;
-}
-.modal-open .dropdown-menu {
- z-index: 2050;
-}
-.modal-open .dropdown.open {
- *z-index: 2050;
-}
-.modal-open .popover {
- z-index: 2060;
-}
-.modal-open .tooltip {
- z-index: 2080;
-}
-.modal-backdrop {
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 1040;
- background-color: #000000;
-}
-.modal-backdrop.fade {
- opacity: 0;
-}
-.modal-backdrop,
-.modal-backdrop.fade.in {
- opacity: 0.8;
- filter: alpha(opacity=80);
-}
-.modal {
- position: fixed;
- top: 50%;
- left: 50%;
- z-index: 1050;
- overflow: auto;
- width: 560px;
- margin: -250px 0 0 -280px;
- background-color: #ffffff;
- border: 1px solid #999;
- border: 1px solid rgba(0, 0, 0, 0.3);
- *border: 1px solid #999;
- /* IE6-7 */
-
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
- -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
- -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
- box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding-box;
- background-clip: padding-box;
-}
-.modal.fade {
- -webkit-transition: opacity .3s linear, top .3s ease-out;
- -moz-transition: opacity .3s linear, top .3s ease-out;
- -o-transition: opacity .3s linear, top .3s ease-out;
- transition: opacity .3s linear, top .3s ease-out;
- top: -25%;
-}
-.modal.fade.in {
- top: 50%;
-}
-.modal-header {
- padding: 9px 15px;
- border-bottom: 1px solid #eee;
-}
-.modal-header .close {
- margin-top: 2px;
-}
-.modal-header h3 {
- margin: 0;
- line-height: 30px;
-}
-.modal-body {
- overflow-y: auto;
- max-height: 400px;
- padding: 15px;
-}
-.modal-form {
- margin-bottom: 0;
-}
-.modal-footer {
- padding: 14px 15px 15px;
- margin-bottom: 0;
- text-align: right;
- background-color: #f5f5f5;
- border-top: 1px solid #ddd;
- -webkit-border-radius: 0 0 6px 6px;
- -moz-border-radius: 0 0 6px 6px;
- border-radius: 0 0 6px 6px;
- -webkit-box-shadow: inset 0 1px 0 #ffffff;
- -moz-box-shadow: inset 0 1px 0 #ffffff;
- box-shadow: inset 0 1px 0 #ffffff;
- *zoom: 1;
-}
-.modal-footer:before,
-.modal-footer:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.modal-footer:after {
- clear: both;
-}
-.modal-footer .btn + .btn {
- margin-left: 5px;
- margin-bottom: 0;
-}
-.modal-footer .btn-group .btn + .btn {
- margin-left: -1px;
-}
-.tooltip {
- position: absolute;
- z-index: 1030;
- display: block;
- visibility: visible;
- padding: 5px;
- font-size: 11px;
- opacity: 0;
- filter: alpha(opacity=0);
-}
-.tooltip.in {
- opacity: 0.8;
- filter: alpha(opacity=80);
-}
-.tooltip.top {
- margin-top: -3px;
-}
-.tooltip.right {
- margin-left: 3px;
-}
-.tooltip.bottom {
- margin-top: 3px;
-}
-.tooltip.left {
- margin-left: -3px;
-}
-.tooltip-inner {
- max-width: 200px;
- padding: 3px 8px;
- color: #ffffff;
- text-align: center;
- text-decoration: none;
- background-color: #000000;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-.tooltip-arrow {
- position: absolute;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
-}
-.tooltip.top .tooltip-arrow {
- bottom: 0;
- left: 50%;
- margin-left: -5px;
- border-width: 5px 5px 0;
- border-top-color: #000000;
-}
-.tooltip.right .tooltip-arrow {
- top: 50%;
- left: 0;
- margin-top: -5px;
- border-width: 5px 5px 5px 0;
- border-right-color: #000000;
-}
-.tooltip.left .tooltip-arrow {
- top: 50%;
- right: 0;
- margin-top: -5px;
- border-width: 5px 0 5px 5px;
- border-left-color: #000000;
-}
-.tooltip.bottom .tooltip-arrow {
- top: 0;
- left: 50%;
- margin-left: -5px;
- border-width: 0 5px 5px;
- border-bottom-color: #000000;
-}
-.popover {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 1010;
- display: none;
- width: 236px;
- padding: 1px;
- background-color: #ffffff;
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding;
- background-clip: padding-box;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, 0.2);
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
- -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-}
-.popover.top {
- margin-bottom: 10px;
-}
-.popover.right {
- margin-left: 10px;
-}
-.popover.bottom {
- margin-top: 10px;
-}
-.popover.left {
- margin-right: 10px;
-}
-.popover-title {
- margin: 0;
- padding: 8px 14px;
- font-size: 14px;
- font-weight: normal;
- line-height: 18px;
- background-color: #f7f7f7;
- border-bottom: 1px solid #ebebeb;
- -webkit-border-radius: 5px 5px 0 0;
- -moz-border-radius: 5px 5px 0 0;
- border-radius: 5px 5px 0 0;
-}
-.popover-content {
- padding: 9px 14px;
-}
-.popover-content p,
-.popover-content ul,
-.popover-content ol {
- margin-bottom: 0;
-}
-.popover .arrow,
-.popover .arrow:after {
- position: absolute;
- display: inline-block;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
-}
-.popover .arrow:after {
- content: "";
- z-index: -1;
-}
-.popover.top .arrow {
- bottom: -10px;
- left: 50%;
- margin-left: -10px;
- border-width: 10px 10px 0;
- border-top-color: #ffffff;
-}
-.popover.top .arrow:after {
- border-width: 11px 11px 0;
- border-top-color: rgba(0, 0, 0, 0.25);
- bottom: -1px;
- left: -11px;
-}
-.popover.right .arrow {
- top: 50%;
- left: -10px;
- margin-top: -10px;
- border-width: 10px 10px 10px 0;
- border-right-color: #ffffff;
-}
-.popover.right .arrow:after {
- border-width: 11px 11px 11px 0;
- border-right-color: rgba(0, 0, 0, 0.25);
- bottom: -11px;
- left: -1px;
-}
-.popover.bottom .arrow {
- top: -10px;
- left: 50%;
- margin-left: -10px;
- border-width: 0 10px 10px;
- border-bottom-color: #ffffff;
-}
-.popover.bottom .arrow:after {
- border-width: 0 11px 11px;
- border-bottom-color: rgba(0, 0, 0, 0.25);
- top: -1px;
- left: -11px;
-}
-.popover.left .arrow {
- top: 50%;
- right: -10px;
- margin-top: -10px;
- border-width: 10px 0 10px 10px;
- border-left-color: #ffffff;
-}
-.popover.left .arrow:after {
- border-width: 11px 0 11px 11px;
- border-left-color: rgba(0, 0, 0, 0.25);
- bottom: -11px;
- right: -1px;
-}
-.thumbnails {
- margin-left: -20px;
- list-style: none;
- *zoom: 1;
-}
-.thumbnails:before,
-.thumbnails:after {
- display: table;
- content: "";
- line-height: 0;
-}
-.thumbnails:after {
- clear: both;
-}
-.row-fluid .thumbnails {
- margin-left: 0;
-}
-.thumbnails > li {
- float: left;
- margin-bottom: 20px;
- margin-left: 20px;
-}
-.thumbnail {
- display: block;
- padding: 4px;
- line-height: 20px;
- border: 1px solid #ddd;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
- -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
- -webkit-transition: all 0.2s ease-in-out;
- -moz-transition: all 0.2s ease-in-out;
- -o-transition: all 0.2s ease-in-out;
- transition: all 0.2s ease-in-out;
-}
-a.thumbnail:hover {
- border-color: #6e8f4a;
- -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
- -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
- box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-}
-.thumbnail > img {
- display: block;
- max-width: 100%;
- margin-left: auto;
- margin-right: auto;
-}
-.thumbnail .caption {
- padding: 9px;
- color: #555555;
-}
-.label,
-.badge {
- font-size: 11.844px;
- font-weight: bold;
- line-height: 14px;
- color: #ffffff;
- vertical-align: baseline;
- white-space: nowrap;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #999999;
-}
-.label {
- padding: 1px 4px 2px;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
-}
-.badge {
- padding: 1px 9px 2px;
- -webkit-border-radius: 9px;
- -moz-border-radius: 9px;
- border-radius: 9px;
-}
-a.label:hover,
-a.badge:hover {
- color: #ffffff;
- text-decoration: none;
- cursor: pointer;
-}
-.label-important,
-.badge-important {
- background-color: #b94a48;
-}
-.label-important[href],
-.badge-important[href] {
- background-color: #953b39;
-}
-.label-warning,
-.badge-warning {
- background-color: #f89406;
-}
-.label-warning[href],
-.badge-warning[href] {
- background-color: #c67605;
-}
-.label-success,
-.badge-success {
- background-color: #468847;
-}
-.label-success[href],
-.badge-success[href] {
- background-color: #356635;
-}
-.label-info,
-.badge-info {
- background-color: #3a87ad;
-}
-.label-info[href],
-.badge-info[href] {
- background-color: #2d6987;
-}
-.label-inverse,
-.badge-inverse {
- background-color: #333333;
-}
-.label-inverse[href],
-.badge-inverse[href] {
- background-color: #1a1a1a;
-}
-.btn .label,
-.btn .badge {
- position: relative;
- top: -1px;
-}
-.btn-mini .label,
-.btn-mini .badge {
- top: 0;
-}
- at -webkit-keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
- at -moz-keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
- at -ms-keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
- at -o-keyframes progress-bar-stripes {
- from {
- background-position: 0 0;
- }
- to {
- background-position: 40px 0;
- }
-}
- at keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
-.progress {
- overflow: hidden;
- height: 20px;
- margin-bottom: 20px;
- background-color: #f7f7f7;
- background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
- background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
- background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
- background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
- -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
- -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-.progress .bar {
- width: 0%;
- height: 100%;
- color: #ffffff;
- float: left;
- font-size: 12px;
- text-align: center;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #0e90d2;
- background-image: -moz-linear-gradient(top, #149bdf, #0480be);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
- background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
- background-image: -o-linear-gradient(top, #149bdf, #0480be);
- background-image: linear-gradient(to bottom, #149bdf, #0480be);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
- -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
- -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
- box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- -webkit-transition: width 0.6s ease;
- -moz-transition: width 0.6s ease;
- -o-transition: width 0.6s ease;
- transition: width 0.6s ease;
-}
-.progress .bar + .bar {
- -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
- -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
- box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
-}
-.progress-striped .bar {
- background-color: #149bdf;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- -webkit-background-size: 40px 40px;
- -moz-background-size: 40px 40px;
- -o-background-size: 40px 40px;
- background-size: 40px 40px;
-}
-.progress.active .bar {
- -webkit-animation: progress-bar-stripes 2s linear infinite;
- -moz-animation: progress-bar-stripes 2s linear infinite;
- -ms-animation: progress-bar-stripes 2s linear infinite;
- -o-animation: progress-bar-stripes 2s linear infinite;
- animation: progress-bar-stripes 2s linear infinite;
-}
-.progress-danger .bar,
-.progress .bar-danger {
- background-color: #dd514c;
- background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
- background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
-}
-.progress-danger.progress-striped .bar,
-.progress-striped .bar-danger {
- background-color: #ee5f5b;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.progress-success .bar,
-.progress .bar-success {
- background-color: #5eb95e;
- background-image: -moz-linear-gradient(top, #62c462, #57a957);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
- background-image: -webkit-linear-gradient(top, #62c462, #57a957);
- background-image: -o-linear-gradient(top, #62c462, #57a957);
- background-image: linear-gradient(to bottom, #62c462, #57a957);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
-}
-.progress-success.progress-striped .bar,
-.progress-striped .bar-success {
- background-color: #62c462;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.progress-info .bar,
-.progress .bar-info {
- background-color: #4bb1cf;
- background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
- background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
- background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
- background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
-}
-.progress-info.progress-striped .bar,
-.progress-striped .bar-info {
- background-color: #5bc0de;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.progress-warning .bar,
-.progress .bar-warning {
- background-color: #faa732;
- background-image: -moz-linear-gradient(top, #fbb450, #f89406);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
- background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
- background-image: -o-linear-gradient(top, #fbb450, #f89406);
- background-image: linear-gradient(to bottom, #fbb450, #f89406);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
-}
-.progress-warning.progress-striped .bar,
-.progress-striped .bar-warning {
- background-color: #fbb450;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-.accordion {
- margin-bottom: 20px;
-}
-.accordion-group {
- margin-bottom: 2px;
- border: 1px solid #e5e5e5;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-.accordion-heading {
- border-bottom: 0;
-}
-.accordion-heading .accordion-toggle {
- display: block;
- padding: 8px 15px;
-}
-.accordion-toggle {
- cursor: pointer;
-}
-.accordion-inner {
- padding: 9px 15px;
- border-top: 1px solid #e5e5e5;
-}
-.carousel {
- position: relative;
- margin-bottom: 20px;
- line-height: 1;
-}
-.carousel-inner {
- overflow: hidden;
- width: 100%;
- position: relative;
-}
-.carousel .item {
- display: none;
- position: relative;
- -webkit-transition: 0.6s ease-in-out left;
- -moz-transition: 0.6s ease-in-out left;
- -o-transition: 0.6s ease-in-out left;
- transition: 0.6s ease-in-out left;
-}
-.carousel .item > img {
- display: block;
- line-height: 1;
-}
-.carousel .active,
-.carousel .next,
-.carousel .prev {
- display: block;
-}
-.carousel .active {
- left: 0;
-}
-.carousel .next,
-.carousel .prev {
- position: absolute;
- top: 0;
- width: 100%;
-}
-.carousel .next {
- left: 100%;
-}
-.carousel .prev {
- left: -100%;
-}
-.carousel .next.left,
-.carousel .prev.right {
- left: 0;
-}
-.carousel .active.left {
- left: -100%;
-}
-.carousel .active.right {
- left: 100%;
-}
-.carousel-control {
- position: absolute;
- top: 40%;
- left: 15px;
- width: 40px;
- height: 40px;
- margin-top: -20px;
- font-size: 60px;
- font-weight: 100;
- line-height: 30px;
- color: #ffffff;
- text-align: center;
- background: #222222;
- border: 3px solid #ffffff;
- -webkit-border-radius: 23px;
- -moz-border-radius: 23px;
- border-radius: 23px;
- opacity: 0.5;
- filter: alpha(opacity=50);
-}
-.carousel-control.right {
- left: auto;
- right: 15px;
-}
-.carousel-control:hover {
- color: #ffffff;
- text-decoration: none;
- opacity: 0.9;
- filter: alpha(opacity=90);
-}
-.carousel-caption {
- position: absolute;
- left: 0;
- right: 0;
- bottom: 0;
- padding: 15px;
- background: #333333;
- background: rgba(0, 0, 0, 0.75);
-}
-.carousel-caption h4,
-.carousel-caption p {
- color: #ffffff;
- line-height: 20px;
-}
-.carousel-caption h4 {
- margin: 0 0 5px;
-}
-.carousel-caption p {
- margin-bottom: 0;
-}
-.hero-unit {
- padding: 60px;
- margin-bottom: 30px;
- background-color: #eeeeee;
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
-}
-.hero-unit h1 {
- margin-bottom: 0;
- font-size: 60px;
- line-height: 1;
- color: inherit;
- letter-spacing: -1px;
-}
-.hero-unit p {
- font-size: 18px;
- font-weight: 200;
- line-height: 30px;
- color: inherit;
-}
-html,
-body {
- height: 100%;
-}
-.wrapper {
- min-height: 100%;
- height: auto !important;
- height: 100%;
- margin: 0 auto -92px;
-}
-.push {
- height: 92px;
-}
-.wrapper > .container {
- padding-top: 24px;
-}
-.hidden {
- display: none;
- visibility: hidden;
-}
-.visible-phone {
- display: none !important;
-}
-.visible-tablet {
- display: none !important;
-}
-.hidden-desktop {
- display: none !important;
-}
-.visible-desktop {
- display: inherit !important;
-}
- at media (min-width: 768px) and (max-width: 979px) {
- .hidden-desktop {
- display: inherit !important;
- }
- .visible-desktop {
- display: none !important ;
- }
- .visible-tablet {
- display: inherit !important;
- }
- .hidden-tablet {
- display: none !important;
- }
-}
- at media (max-width: 767px) {
- .hidden-desktop {
- display: inherit !important;
- }
- .visible-desktop {
- display: none !important;
- }
- .visible-phone {
- display: inherit !important;
- }
- .hidden-phone {
- display: none !important;
- }
-}
- at media (min-width: 1200px) {
- .row {
- margin-left: -30px;
- *zoom: 1;
- }
- .row:before,
- .row:after {
- display: table;
- content: "";
- line-height: 0;
- }
- .row:after {
- clear: both;
- }
- [class*="span"] {
- float: left;
- margin-left: 30px;
- }
- .container,
- .navbar-static-top .container,
- .navbar-fixed-top .container,
- .navbar-fixed-bottom .container {
- width: 1170px;
- }
- .span12 {
- width: 1170px;
- }
- .span11 {
- width: 1070px;
- }
- .span10 {
- width: 970px;
- }
- .span9 {
- width: 870px;
- }
- .span8 {
- width: 770px;
- }
- .span7 {
- width: 670px;
- }
- .span6 {
- width: 570px;
- }
- .span5 {
- width: 470px;
- }
- .span4 {
- width: 370px;
- }
- .span3 {
- width: 270px;
- }
- .span2 {
- width: 170px;
- }
- .span1 {
- width: 70px;
- }
- .offset12 {
- margin-left: 1230px;
- }
- .offset11 {
- margin-left: 1130px;
- }
- .offset10 {
- margin-left: 1030px;
- }
- .offset9 {
- margin-left: 930px;
- }
- .offset8 {
- margin-left: 830px;
- }
- .offset7 {
- margin-left: 730px;
- }
- .offset6 {
- margin-left: 630px;
- }
- .offset5 {
- margin-left: 530px;
- }
- .offset4 {
- margin-left: 430px;
- }
- .offset3 {
- margin-left: 330px;
- }
- .offset2 {
- margin-left: 230px;
- }
- .offset1 {
- margin-left: 130px;
- }
- .row-fluid {
- width: 100%;
- *zoom: 1;
- }
- .row-fluid:before,
- .row-fluid:after {
- display: table;
- content: "";
- line-height: 0;
- }
- .row-fluid:after {
- clear: both;
- }
- .row-fluid [class*="span"] {
- display: block;
- width: 100%;
- min-height: 30px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- float: left;
- margin-left: 2.564102564102564%;
- *margin-left: 2.5109110747408616%;
- }
- .row-fluid [class*="span"]:first-child {
- margin-left: 0;
- }
- .row-fluid .span12 {
- width: 100%;
- *width: 99.94680851063829%;
- }
- .row-fluid .span11 {
- width: 91.45299145299145%;
- *width: 91.39979996362975%;
- }
- .row-fluid .span10 {
- width: 82.90598290598291%;
- *width: 82.8527914166212%;
- }
- .row-fluid .span9 {
- width: 74.35897435897436%;
- *width: 74.30578286961266%;
- }
- .row-fluid .span8 {
- width: 65.81196581196582%;
- *width: 65.75877432260411%;
- }
- .row-fluid .span7 {
- width: 57.26495726495726%;
- *width: 57.21176577559556%;
- }
- .row-fluid .span6 {
- width: 48.717948717948715%;
- *width: 48.664757228587014%;
- }
- .row-fluid .span5 {
- width: 40.17094017094017%;
- *width: 40.11774868157847%;
- }
- .row-fluid .span4 {
- width: 31.623931623931625%;
- *width: 31.570740134569924%;
- }
- .row-fluid .span3 {
- width: 23.076923076923077%;
- *width: 23.023731587561375%;
- }
- .row-fluid .span2 {
- width: 14.52991452991453%;
- *width: 14.476723040552828%;
- }
- .row-fluid .span1 {
- width: 5.982905982905983%;
- *width: 5.929714493544281%;
- }
- .row-fluid .offset12 {
- margin-left: 105.12820512820512%;
- *margin-left: 105.02182214948171%;
- }
- .row-fluid .offset12:first-child {
- margin-left: 102.56410256410257%;
- *margin-left: 102.45771958537915%;
- }
- .row-fluid .offset11 {
- margin-left: 96.58119658119658%;
- *margin-left: 96.47481360247316%;
- }
- .row-fluid .offset11:first-child {
- margin-left: 94.01709401709402%;
- *margin-left: 93.91071103837061%;
- }
- .row-fluid .offset10 {
- margin-left: 88.03418803418803%;
- *margin-left: 87.92780505546462%;
- }
- .row-fluid .offset10:first-child {
- margin-left: 85.47008547008548%;
- *margin-left: 85.36370249136206%;
- }
- .row-fluid .offset9 {
- margin-left: 79.48717948717949%;
- *margin-left: 79.38079650845607%;
- }
- .row-fluid .offset9:first-child {
- margin-left: 76.92307692307693%;
- *margin-left: 76.81669394435352%;
- }
- .row-fluid .offset8 {
- margin-left: 70.94017094017094%;
- *margin-left: 70.83378796144753%;
- }
- .row-fluid .offset8:first-child {
- margin-left: 68.37606837606839%;
- *margin-left: 68.26968539734497%;
- }
- .row-fluid .offset7 {
- margin-left: 62.393162393162385%;
- *margin-left: 62.28677941443899%;
- }
- .row-fluid .offset7:first-child {
- margin-left: 59.82905982905982%;
- *margin-left: 59.72267685033642%;
- }
- .row-fluid .offset6 {
- margin-left: 53.84615384615384%;
- *margin-left: 53.739770867430444%;
- }
- .row-fluid .offset6:first-child {
- margin-left: 51.28205128205128%;
- *margin-left: 51.175668303327875%;
- }
- .row-fluid .offset5 {
- margin-left: 45.299145299145295%;
- *margin-left: 45.1927623204219%;
- }
- .row-fluid .offset5:first-child {
- margin-left: 42.73504273504273%;
- *margin-left: 42.62865975631933%;
- }
- .row-fluid .offset4 {
- margin-left: 36.75213675213675%;
- *margin-left: 36.645753773413354%;
- }
- .row-fluid .offset4:first-child {
- margin-left: 34.18803418803419%;
- *margin-left: 34.081651209310785%;
- }
- .row-fluid .offset3 {
- margin-left: 28.205128205128204%;
- *margin-left: 28.0987452264048%;
- }
- .row-fluid .offset3:first-child {
- margin-left: 25.641025641025642%;
- *margin-left: 25.53464266230224%;
- }
- .row-fluid .offset2 {
- margin-left: 19.65811965811966%;
- *margin-left: 19.551736679396257%;
- }
- .row-fluid .offset2:first-child {
- margin-left: 17.094017094017094%;
- *margin-left: 16.98763411529369%;
- }
- .row-fluid .offset1 {
- margin-left: 11.11111111111111%;
- *margin-left: 11.004728132387708%;
- }
- .row-fluid .offset1:first-child {
- margin-left: 8.547008547008547%;
- *margin-left: 8.440625568285142%;
- }
- input,
- textarea,
- .uneditable-input {
- margin-left: 0;
- }
- .controls-row [class*="span"] + [class*="span"] {
- margin-left: 30px;
- }
- input.span12, textarea.span12, .uneditable-input.span12 {
- width: 1156px;
- }
- input.span11, textarea.span11, .uneditable-input.span11 {
- width: 1056px;
- }
- input.span10, textarea.span10, .uneditable-input.span10 {
- width: 956px;
- }
- input.span9, textarea.span9, .uneditable-input.span9 {
- width: 856px;
- }
- input.span8, textarea.span8, .uneditable-input.span8 {
- width: 756px;
- }
- input.span7, textarea.span7, .uneditable-input.span7 {
- width: 656px;
- }
- input.span6, textarea.span6, .uneditable-input.span6 {
- width: 556px;
- }
- input.span5, textarea.span5, .uneditable-input.span5 {
- width: 456px;
- }
- input.span4, textarea.span4, .uneditable-input.span4 {
- width: 356px;
- }
- input.span3, textarea.span3, .uneditable-input.span3 {
- width: 256px;
- }
- input.span2, textarea.span2, .uneditable-input.span2 {
- width: 156px;
- }
- input.span1, textarea.span1, .uneditable-input.span1 {
- width: 56px;
- }
- .thumbnails {
- margin-left: -30px;
- }
- .thumbnails > li {
- margin-left: 30px;
- }
- .row-fluid .thumbnails {
- margin-left: 0;
- }
-}
- at media (min-width: 768px) and (max-width: 979px) {
- .row {
- margin-left: -20px;
- *zoom: 1;
- }
- .row:before,
- .row:after {
- display: table;
- content: "";
- line-height: 0;
- }
- .row:after {
- clear: both;
- }
- [class*="span"] {
- float: left;
- margin-left: 20px;
- }
- .container,
- .navbar-static-top .container,
- .navbar-fixed-top .container,
- .navbar-fixed-bottom .container {
- width: 724px;
- }
- .span12 {
- width: 724px;
- }
- .span11 {
- width: 662px;
- }
- .span10 {
- width: 600px;
- }
- .span9 {
- width: 538px;
- }
- .span8 {
- width: 476px;
- }
- .span7 {
- width: 414px;
- }
- .span6 {
- width: 352px;
- }
- .span5 {
- width: 290px;
- }
- .span4 {
- width: 228px;
- }
- .span3 {
- width: 166px;
- }
- .span2 {
- width: 104px;
- }
- .span1 {
- width: 42px;
- }
- .offset12 {
- margin-left: 764px;
- }
- .offset11 {
- margin-left: 702px;
- }
- .offset10 {
- margin-left: 640px;
- }
- .offset9 {
- margin-left: 578px;
- }
- .offset8 {
- margin-left: 516px;
- }
- .offset7 {
- margin-left: 454px;
- }
- .offset6 {
- margin-left: 392px;
- }
- .offset5 {
- margin-left: 330px;
- }
- .offset4 {
- margin-left: 268px;
- }
- .offset3 {
- margin-left: 206px;
- }
- .offset2 {
- margin-left: 144px;
- }
- .offset1 {
- margin-left: 82px;
- }
- .row-fluid {
- width: 100%;
- *zoom: 1;
- }
- .row-fluid:before,
- .row-fluid:after {
- display: table;
- content: "";
- line-height: 0;
- }
- .row-fluid:after {
- clear: both;
- }
- .row-fluid [class*="span"] {
- display: block;
- width: 100%;
- min-height: 30px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- float: left;
- margin-left: 2.7624309392265194%;
- *margin-left: 2.709239449864817%;
- }
- .row-fluid [class*="span"]:first-child {
- margin-left: 0;
- }
- .row-fluid .span12 {
- width: 100%;
- *width: 99.94680851063829%;
- }
- .row-fluid .span11 {
- width: 91.43646408839778%;
- *width: 91.38327259903608%;
- }
- .row-fluid .span10 {
- width: 82.87292817679558%;
- *width: 82.81973668743387%;
- }
- .row-fluid .span9 {
- width: 74.30939226519337%;
- *width: 74.25620077583166%;
- }
- .row-fluid .span8 {
- width: 65.74585635359117%;
- *width: 65.69266486422946%;
- }
- .row-fluid .span7 {
- width: 57.18232044198895%;
- *width: 57.12912895262725%;
- }
- .row-fluid .span6 {
- width: 48.61878453038674%;
- *width: 48.56559304102504%;
- }
- .row-fluid .span5 {
- width: 40.05524861878453%;
- *width: 40.00205712942283%;
- }
- .row-fluid .span4 {
- width: 31.491712707182323%;
- *width: 31.43852121782062%;
- }
- .row-fluid .span3 {
- width: 22.92817679558011%;
- *width: 22.87498530621841%;
- }
- .row-fluid .span2 {
- width: 14.3646408839779%;
- *width: 14.311449394616199%;
- }
- .row-fluid .span1 {
- width: 5.801104972375691%;
- *width: 5.747913483013988%;
- }
- .row-fluid .offset12 {
- margin-left: 105.52486187845304%;
- *margin-left: 105.41847889972962%;
- }
- .row-fluid .offset12:first-child {
- margin-left: 102.76243093922652%;
- *margin-left: 102.6560479605031%;
- }
- .row-fluid .offset11 {
- margin-left: 96.96132596685082%;
- *margin-left: 96.8549429881274%;
- }
- .row-fluid .offset11:first-child {
- margin-left: 94.1988950276243%;
- *margin-left: 94.09251204890089%;
- }
- .row-fluid .offset10 {
- margin-left: 88.39779005524862%;
- *margin-left: 88.2914070765252%;
- }
- .row-fluid .offset10:first-child {
- margin-left: 85.6353591160221%;
- *margin-left: 85.52897613729868%;
- }
- .row-fluid .offset9 {
- margin-left: 79.8342541436464%;
- *margin-left: 79.72787116492299%;
- }
- .row-fluid .offset9:first-child {
- margin-left: 77.07182320441989%;
- *margin-left: 76.96544022569647%;
- }
- .row-fluid .offset8 {
- margin-left: 71.2707182320442%;
- *margin-left: 71.16433525332079%;
- }
- .row-fluid .offset8:first-child {
- margin-left: 68.50828729281768%;
- *margin-left: 68.40190431409427%;
- }
- .row-fluid .offset7 {
- margin-left: 62.70718232044199%;
- *margin-left: 62.600799341718584%;
- }
- .row-fluid .offset7:first-child {
- margin-left: 59.94475138121547%;
- *margin-left: 59.838368402492065%;
- }
- .row-fluid .offset6 {
- margin-left: 54.14364640883978%;
- *margin-left: 54.037263430116376%;
- }
- .row-fluid .offset6:first-child {
- margin-left: 51.38121546961326%;
- *margin-left: 51.27483249088986%;
- }
- .row-fluid .offset5 {
- margin-left: 45.58011049723757%;
- *margin-left: 45.47372751851417%;
- }
- .row-fluid .offset5:first-child {
- margin-left: 42.81767955801105%;
- *margin-left: 42.71129657928765%;
- }
- .row-fluid .offset4 {
- margin-left: 37.01657458563536%;
- *margin-left: 36.91019160691196%;
- }
- .row-fluid .offset4:first-child {
- margin-left: 34.25414364640884%;
- *margin-left: 34.14776066768544%;
- }
- .row-fluid .offset3 {
- margin-left: 28.45303867403315%;
- *margin-left: 28.346655695309746%;
- }
- .row-fluid .offset3:first-child {
- margin-left: 25.69060773480663%;
- *margin-left: 25.584224756083227%;
- }
- .row-fluid .offset2 {
- margin-left: 19.88950276243094%;
- *margin-left: 19.783119783707537%;
- }
- .row-fluid .offset2:first-child {
- margin-left: 17.12707182320442%;
- *margin-left: 17.02068884448102%;
- }
- .row-fluid .offset1 {
- margin-left: 11.32596685082873%;
- *margin-left: 11.219583872105325%;
- }
- .row-fluid .offset1:first-child {
- margin-left: 8.56353591160221%;
- *margin-left: 8.457152932878806%;
- }
- input,
- textarea,
- .uneditable-input {
- margin-left: 0;
- }
- .controls-row [class*="span"] + [class*="span"] {
- margin-left: 20px;
- }
- input.span12, textarea.span12, .uneditable-input.span12 {
- width: 710px;
- }
- input.span11, textarea.span11, .uneditable-input.span11 {
- width: 648px;
- }
- input.span10, textarea.span10, .uneditable-input.span10 {
- width: 586px;
- }
- input.span9, textarea.span9, .uneditable-input.span9 {
- width: 524px;
- }
- input.span8, textarea.span8, .uneditable-input.span8 {
- width: 462px;
- }
- input.span7, textarea.span7, .uneditable-input.span7 {
- width: 400px;
- }
- input.span6, textarea.span6, .uneditable-input.span6 {
- width: 338px;
- }
- input.span5, textarea.span5, .uneditable-input.span5 {
- width: 276px;
- }
- input.span4, textarea.span4, .uneditable-input.span4 {
- width: 214px;
- }
- input.span3, textarea.span3, .uneditable-input.span3 {
- width: 152px;
- }
- input.span2, textarea.span2, .uneditable-input.span2 {
- width: 90px;
- }
- input.span1, textarea.span1, .uneditable-input.span1 {
- width: 28px;
- }
-}
- at media (max-width: 767px) {
- body {
- padding-left: 20px;
- padding-right: 20px;
- }
- .navbar-fixed-top,
- .navbar-fixed-bottom {
- margin-left: -20px;
- margin-right: -20px;
- }
- .container-fluid {
- padding: 0;
- }
- .dl-horizontal dt {
- float: none;
- clear: none;
- width: auto;
- text-align: left;
- }
- .dl-horizontal dd {
- margin-left: 0;
- }
- .container {
- width: auto;
- }
- .row-fluid {
- width: 100%;
- }
- .row,
- .thumbnails {
- margin-left: 0;
- }
- .thumbnails > li {
- float: none;
- margin-left: 0;
- }
- [class*="span"],
- .row-fluid [class*="span"] {
- float: none;
- display: block;
- width: auto;
- margin-left: 0;
- }
- .span12,
- .row-fluid .span12 {
- width: 100%;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- }
- .input-large,
- .input-xlarge,
- .input-xxlarge,
- input[class*="span"],
- select[class*="span"],
- textarea[class*="span"],
- .uneditable-input {
- display: block;
- width: 100%;
- min-height: 30px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- }
- .input-prepend input,
- .input-append input,
- .input-prepend input[class*="span"],
- .input-append input[class*="span"] {
- display: inline-block;
- width: auto;
- }
- .modal {
- position: fixed;
- top: 20px;
- left: 20px;
- right: 20px;
- width: auto;
- margin: 0;
- }
- .modal.fade.in {
- top: auto;
- }
-}
- at media (max-width: 480px) {
- .nav-collapse {
- -webkit-transform: translate3d(0, 0, 0);
- }
- .page-header h1 small {
- display: block;
- line-height: 20px;
- }
- input[type="checkbox"],
- input[type="radio"] {
- border: 1px solid #ccc;
- }
- .form-horizontal .control-group > label {
- float: none;
- width: auto;
- padding-top: 0;
- text-align: left;
- }
- .form-horizontal .controls {
- margin-left: 0;
- }
- .form-horizontal .control-list {
- padding-top: 0;
- }
- .form-horizontal .form-actions {
- padding-left: 10px;
- padding-right: 10px;
- }
- .modal {
- top: 10px;
- left: 10px;
- right: 10px;
- }
- .modal-header .close {
- padding: 10px;
- margin: -10px;
- }
- .carousel-caption {
- position: static;
- }
-}
- at media (max-width: 979px) {
- body {
- padding-top: 0;
- }
- .navbar-fixed-top,
- .navbar-fixed-bottom {
- position: static;
- }
- .navbar-fixed-top {
- margin-bottom: 20px;
- }
- .navbar-fixed-bottom {
- margin-top: 20px;
- }
- .navbar-fixed-top .navbar-inner,
- .navbar-fixed-bottom .navbar-inner {
- padding: 5px;
- }
- .navbar .container {
- width: auto;
- padding: 0;
- }
- .navbar .brand {
- padding-left: 10px;
- padding-right: 10px;
- margin: 0 0 0 -5px;
- }
- .nav-collapse {
- clear: both;
- }
- .nav-collapse .nav {
- float: none;
- margin: 0 0 10px;
- }
- .nav-collapse .nav > li {
- float: none;
- }
- .nav-collapse .nav > li > a {
- margin-bottom: 2px;
- }
- .nav-collapse .nav > .divider-vertical {
- display: none;
- }
- .nav-collapse .nav .nav-header {
- color: #1f444b;
- text-shadow: none;
- }
- .nav-collapse .nav > li > a,
- .nav-collapse .dropdown-menu a {
- padding: 9px 15px;
- font-weight: bold;
- color: #1f444b;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
- }
- .nav-collapse .btn {
- padding: 4px 10px 4px;
- font-weight: normal;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- }
- .nav-collapse .dropdown-menu li + li a {
- margin-bottom: 2px;
- }
- .nav-collapse .nav > li > a:hover,
- .nav-collapse .dropdown-menu a:hover {
- background-color: #e2e1d7;
- }
- .navbar-inverse .nav-collapse .nav > li > a:hover,
- .navbar-inverse .nav-collapse .dropdown-menu a:hover {
- background-color: #111111;
- }
- .nav-collapse.in .btn-group {
- margin-top: 5px;
- padding: 0;
- }
- .nav-collapse .dropdown-menu {
- position: static;
- top: auto;
- left: auto;
- float: none;
- display: block;
- max-width: none;
- margin: 0 15px;
- padding: 0;
- background-color: transparent;
- border: none;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
- }
- .nav-collapse .dropdown-menu:before,
- .nav-collapse .dropdown-menu:after {
- display: none;
- }
- .nav-collapse .dropdown-menu .divider {
- display: none;
- }
- .nav-collapse .navbar-form,
- .nav-collapse .navbar-search {
- float: none;
- padding: 10px 15px;
- margin: 10px 0;
- border-top: 1px solid #e2e1d7;
- border-bottom: 1px solid #e2e1d7;
- -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
- -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
- box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
- }
- .navbar .nav-collapse .nav.pull-right {
- float: none;
- margin-left: 0;
- }
- .nav-collapse,
- .nav-collapse.collapse {
- overflow: hidden;
- height: 0;
- }
- .navbar .btn-navbar {
- display: block;
- }
- .navbar-static .navbar-inner {
- padding-left: 10px;
- padding-right: 10px;
- }
-}
- at media (min-width: 980px) {
- .nav-collapse.collapse {
- height: auto !important;
- overflow: visible !important;
- }
-}
-input.ng-dirty.ng-valid {
- /*.formFieldState(@successText, @successText, @successBackground);*/
-
- border-color: #468847;
-}
-input.ng-dirty.ng-invalid {
- /*.formFieldState(@errorText, @errorText, @errorBackground);*/
-
- border-color: #b94a48;
-}
-.provider-btn {
- display: inline-block;
- list-style: none;
- padding: 5px;
-}
-.provider-btn .btn img {
- width: 90px;
- height: 30px;
-}
-.password-form {
- padding-top: 20px;
- border-left: 1px solid #e5e5e5;
-}
-.password-form .form-actions {
- background-color: transparent;
- border: none;
-}
-.aeauth-form h4 {
- text-align: center;
-}
-.pull-right {
- float: right;
-}
-.pull-left {
- float: left;
-}
-.hide {
- display: none;
-}
-.show {
- display: block;
-}
-.invisible {
- visibility: hidden;
-}
-.affix {
- position: fixed;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- font-weight: normal;
- padding-bottom: .3em;
- color: #1F444B;
-}
-.nav .brand {
- padding: 0;
-}
-#user-nav {
- padding: 25px 15px 25px;
-}
-.clickable {
- cursor: pointer;
-}
-.form-actions {
- background-color: transparent;
- border: none;
-}
-.navbar .brand a:hover {
- text-decoration: none;
-}
-.nav-list .active > a,
-.nav-list .active > a:hover {
- -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
- box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
- text-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
-}
-.nav-list > li > a {
- line-height: 24px;
- padding: 3px 10px;
-}
-section header {
- padding-bottom: 12px;
-}
-.footer {
- background-color: #edece6;
- padding: 30px 0;
- border-top: 1px solid #e5e5e5;
- -webkit-box-shadow: inset 0 5px 15px rgba(0, 0, 0, 0.025);
- -moz-box-shadow: inset 0 5px 15px rgba(0, 0, 0, 0.025);
- box-shadow: inset 0 5px 15px rgba(0, 0, 0, 0.025);
-}
-
-.quick-links {
- background-color: #ECEEEF;
-}
-
-.quick-links strong {
- color: #1F444B;
-}
diff --git a/doc/_themes/bootstrap/static/jquery.js b/doc/_themes/bootstrap/static/jquery.js
deleted file mode 100644
index fa48099..0000000
--- a/doc/_themes/bootstrap/static/jquery.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery v1.7.1 jquery.com | jquery.org/license */
-(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement( [...]
- f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special [...]
- {for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.re [...]
\ No newline at end of file
diff --git a/doc/_themes/bootstrap/static/sphinx-bootstrap.css b/doc/_themes/bootstrap/static/sphinx-bootstrap.css
deleted file mode 100644
index 2e7b851..0000000
--- a/doc/_themes/bootstrap/static/sphinx-bootstrap.css
+++ /dev/null
@@ -1,188 +0,0 @@
-/* To change themes. Un-comment the theme you would like to use. */
-
- at import "bootstrap-engineauth.min.css";
-/*@import "bootstrap-default.min.css";*/
-/*@import "bootstrap-sapling.css";*/
-
- at import "bootstrap-responsive.min.css";
-
-.navbar .brand {
- font-size: 25px;
-}
-
-.logo {
- float: left;
- margin-bottom: 5px;
-}
-
-.content {
- padding-top: 25px;
-}
-
-.footer {
- /*background-color: #eee;*/
- padding: 30px 0;
- text-shadow: 0 1px 0 #fff;
- border-top: 1px solid #e5e5e5;
- -webkit-box-shadow: inset 0 5px 15px rgba(0, 0, 0, .025);
- -moz-box-shadow: inset 0 5px 15px rgba(0, 0, 0, .025);
- box-shadow: inset 0 5px 15px rgba(0, 0, 0, .025);
-}
-
-.row-odd {
- background-color: #fafafa;
-}
-
-h1, h2, h3, h4, h5, h6 {
- padding-bottom: .3em;
-}
-
-.section {
- margin-bottom: 25px;
-}
-
-code, pre {
- color: #000;
-}
-
-span.pre {
- font-family: monospace;
- color: #007000;
-}
-
-div.admonition {
- margin: 0 0 10px;
- padding: .2em .5em .2em .9em;
-}
-
-div.admonition.note {
- background-color: #fffbe0;
-}
-
-div.admonition.warning {
- background-color: #ffe0d7;
-}
-
-div.admonition p {
- margin: .5em;
- padding: 0;
-}
-p.admonition-title {
- display: none;
-}
-
-.descname {
- font-weight: bold;
-}
-
-a.headerlink {
- visibility: hidden;
-}
-
-h1:hover > a.headerlink,
-h2:hover > a.headerlink,
-h3:hover > a.headerlink,
-h4:hover > a.headerlink,
-h5:hover > a.headerlink,
-h6:hover > a.headerlink,
-dt:hover > a.headerlink {
- visibility: visible;
-}
-
-a.headerlink {
- color: #aeaeae;
- text-decoration: none;
-}
-
-a.headerlink:hover {
- color: #0E84B5;
-}
-
-.viewcode-link, .viewcode-back {
- float: right;
-}
-
-tr > td:first-child {
- font-family: monospace;
- color: #007000;
-}
-
-tr > td:nth-child(2) {
- font-family: monospace;
- color: #4070A0;
-}
-
-.quick-links {
- border-radius: 3px 3px 3px 3px;
- box-shadow: 0 1px 0 rgba(0, 0, 0, 0.03) inset;
- list-style: none outside none;
- /*margin: 43px 0 0;*/
- margin: 0;
- margin-top: 96px;
- padding: 5px 20px;
- margin-left: 310px;
- text-align: center;
- -webkit-box-shadow: inset 0 5px 15px rgba(0, 0, 0, .1);
- -moz-box-shadow: inset 0 5px 15px rgba(0, 0, 0, .1);
-}
-
-.quick-links li {
- display: inline;
- line-height: 30px;
- margin: 0 5px;
-}
-
-.quick-links .divider {
- color: #999999;
-}
-
-.quick-links strong {
- font-weight: normal;
-}
-
-.quick-links .github-btn, .quick-links .tweet-btn, .quick-links .follow-btn, .plusone-container {
- position: relative;
- top: 5px;
-}
-
-input[type="submit"] {
- display: inline-block;
- padding: 5px 14px 6px;
- font-size: 13px;
- line-height: normal;
- color: #333;
- text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
- background-color: #e6e6e6;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
- background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
- background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-repeat: no-repeat;
- border: 1px solid #ccc;
- border-bottom-color: #bbb;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
- cursor: pointer;
- -webkit-transition: 0.1s linear all;
- -moz-transition: 0.1s linear all;
- -ms-transition: 0.1s linear all;
- -o-transition: 0.1s linear all;
- transition: 0.1s linear all;
-}
-input[type="submit"]:hover {
- color: #404040;
- text-decoration: none;
- background-position: 0 -15px;
-}
-
-input[type="submit"].active, input[type="submit"]:active {
- -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
- box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
diff --git a/doc/api/cpp/bounds.rst b/doc/api/cpp/bounds.rst
index 8839919..f9b2e6e 100644
--- a/doc/api/cpp/bounds.rst
+++ b/doc/api/cpp/bounds.rst
@@ -1,8 +1,13 @@
.. _cpp-pdal-bounds:
******************************************************************************
-pdal::BOX3D
+:cpp:class:`pdal::BOX2D`
******************************************************************************
+.. doxygenclass:: pdal::BOX2D
+ :members:
+ :undoc-members:
+
.. doxygenclass:: pdal::BOX3D
:members:
+ :undoc-members:
diff --git a/doc/api/cpp/option.rst b/doc/api/cpp/filter.rst
similarity index 64%
rename from doc/api/cpp/option.rst
rename to doc/api/cpp/filter.rst
index ad93a42..071a676 100644
--- a/doc/api/cpp/option.rst
+++ b/doc/api/cpp/filter.rst
@@ -1,11 +1,12 @@
-.. _cpp-pdal-option:
+.. _cpp-pdal-filter:
******************************************************************************
-pdal::Option
+:cpp:class:`pdal::Filter`
******************************************************************************
-
-.. doxygenclass:: pdal::Option
+.. doxygenclass:: pdal::Filter
:members:
+ :undoc-members:
+
diff --git a/doc/api/cpp/index.rst b/doc/api/cpp/index.rst
index 0d51b02..254955f 100644
--- a/doc/api/cpp/index.rst
+++ b/doc/api/cpp/index.rst
@@ -10,9 +10,9 @@ C++ API
dimension
bounds
+ filter
log
metadata
- option
options
pointview
pointtable
diff --git a/doc/api/cpp/log.rst b/doc/api/cpp/log.rst
index 7443c4f..cf0993f 100644
--- a/doc/api/cpp/log.rst
+++ b/doc/api/cpp/log.rst
@@ -1,8 +1,9 @@
.. _cpp-pdal-log:
******************************************************************************
-pdal::Log
+:cpp:class:`pdal::Log`
******************************************************************************
.. doxygenclass:: pdal::Log
:members:
+ :undoc-members:
diff --git a/doc/api/cpp/metadata.rst b/doc/api/cpp/metadata.rst
index 49b1cea..3864b3b 100644
--- a/doc/api/cpp/metadata.rst
+++ b/doc/api/cpp/metadata.rst
@@ -1,11 +1,15 @@
.. _cpp-pdal-metadata:
******************************************************************************
-pdal::Metadata
+:cpp:class:`pdal::Metadata`
******************************************************************************
-
.. doxygenclass:: pdal::Metadata
:members:
+ :undoc-members:
+
+.. doxygenclass:: pdal::MetadataNode
+ :members:
+ :undoc-members:
diff --git a/doc/api/cpp/options.rst b/doc/api/cpp/options.rst
index b6c4858..b60e583 100644
--- a/doc/api/cpp/options.rst
+++ b/doc/api/cpp/options.rst
@@ -1,9 +1,10 @@
.. _cpp-pdal-options:
******************************************************************************
-pdal::Options
+:cpp:class:`pdal::Options`
******************************************************************************
.. doxygenclass:: pdal::Options
:members:
+ :undoc-members:
diff --git a/doc/api/cpp/pointtable.rst b/doc/api/cpp/pointtable.rst
index 5939286..0137b98 100644
--- a/doc/api/cpp/pointtable.rst
+++ b/doc/api/cpp/pointtable.rst
@@ -1,10 +1,11 @@
.. _cpp-pdal-pointtable:
******************************************************************************
-pdal::PointTable
+:cpp:class:`pdal::PointTable`
******************************************************************************
.. doxygenclass:: pdal::PointTable
:members:
+ :undoc-members:
diff --git a/doc/api/cpp/pointview.rst b/doc/api/cpp/pointview.rst
index 4a30ffc..a1a0787 100644
--- a/doc/api/cpp/pointview.rst
+++ b/doc/api/cpp/pointview.rst
@@ -1,11 +1,12 @@
.. _cpp-pdal-pointview:
******************************************************************************
-pdal::PointView
+:cpp:class:`pdal::PointView`
******************************************************************************
.. doxygenclass:: pdal::PointView
:members:
+ :undoc-members:
diff --git a/doc/api/cpp/reader.rst b/doc/api/cpp/reader.rst
index c644df5..4bc340a 100644
--- a/doc/api/cpp/reader.rst
+++ b/doc/api/cpp/reader.rst
@@ -10,44 +10,5 @@ format that is described via the :cpp:class:`pdal::Schema`.
.. doxygenclass:: pdal::Reader
:members:
- :sections: public*
-
-
-`ASPRS LAS`_ Reader
-------------------------------------------------------------------------------
-
-The `ASPRS LAS`_ format is a sequential binary format used to store data from
-LiDAR sensors and by LiDAR processing software for data interchange and archival.
-
-
-.. _`ASPRS LAS`: http://www.asprs.org/Committee-General/LASer-LAS-File-Format-Exchange-Activities.html
-
-.. doxygenclass:: pdal::drivers::las::Reader
- :members:
-
-OCI Reader
-------------------------------------------------------------------------------
-
-The OCI reader provides `Oracle Point Cloud`_ support to PDAL.
-
-.. _`Oracle Point Cloud`: http://docs.oracle.com/cd/B28359_01/appdev.111/b28400/sdo_pc_pkg_ref.htm
-
-.. doxygenclass:: pdal::drivers::oci::OciReader
- :members:
-
-QFIT Reader
-------------------------------------------------------------------------------
-`QFIT`_ is a format for the NASA IceBridge sea ice sensor.
-
-.. _`QFIT`: http://nsidc.org/data/ilatm1b.html
-
-.. doxygenclass:: pdal::QfitReader
- :members:
-
-TerraSolid Reader
-------------------------------------------------------------------------------
-
-.. doxygenclass:: pdal::drivers::terrasolid::Reader
- :members:
-
+ :undoc-members:
diff --git a/doc/api/cpp/stage.rst b/doc/api/cpp/stage.rst
index 4c2c307..0f2a357 100644
--- a/doc/api/cpp/stage.rst
+++ b/doc/api/cpp/stage.rst
@@ -1,14 +1,16 @@
.. _cpp-pdal-stage:
+.. index:: Stage
+
******************************************************************************
-pdal::Stage
+:cpp:class:`pdal::Stage`
******************************************************************************
-:cpp:class:`pdal::Stage` is the base class of :cpp:class:`pdal::Filter`,
-:cpp:class:`pdal::Reader`, and :cpp:class:`pdal::MultiFilter` classes that
+:cpp:class:`pdal::Stage` is the base class of :cpp:class:`pdal::Filter`,
+:cpp:class:`pdal::Reader`, and :cpp:class:`pdal::MultiFilter` classes that
implement the reading API in a PDAL pipeline.
.. doxygenclass:: pdal::Stage
:members:
- :sections: public*, protected*
+ :undoc-members:
diff --git a/doc/api/cpp/writer.rst b/doc/api/cpp/writer.rst
index 8dd9116..c35c759 100644
--- a/doc/api/cpp/writer.rst
+++ b/doc/api/cpp/writer.rst
@@ -1,11 +1,12 @@
.. _cpp-pdal-writer:
******************************************************************************
-pdal::Writer
+:cpp:class:`pdal::Writer`
******************************************************************************
.. doxygenclass:: pdal::Writer
:members:
+ :undoc-members:
diff --git a/doc/api/index.rst b/doc/api/index.rst
index cb23f00..35a8662 100644
--- a/doc/api/index.rst
+++ b/doc/api/index.rst
@@ -1,18 +1,19 @@
.. _api:
******************************************************************************
-API documentation for PDAL
+API
******************************************************************************
-PDAL's primary API is its C++ API, however, more `SWIG-based`_ are expected to
-be developed.
-
+PDAL is a C++ library, and its primary API is in that language. There is also a
+`Python API <https://pypi.python.org/pypi/PDAL>`__ that allows reading of data
+and interaction with `Numpy`_.
+
.. toctree::
:maxdepth: 2
-
+
cpp/index
-
-
-
-.. _`SWIG-based`: http://www.swig.org
+
+
+
+.. _`Numpy`: http://www.numpy.org/
diff --git a/doc/apps.rst b/doc/apps.rst
index 99873a5..5ae3592 100644
--- a/doc/apps.rst
+++ b/doc/apps.rst
@@ -1,14 +1,14 @@
.. _apps:
******************************************************************************
-PDAL Applications
+Applications
******************************************************************************
:Author: Howard Butler
:Contact: howard at hobu.co
:Date: 6/1/2015
-PDAL contains consists of a single application, called ``pdal``. The ```pdal``
+PDAL contains consists of a single application, called ``pdal``. The ``pdal``
application currently has the following subcommands:
* :ref:`delta <delta_command>`
diff --git a/doc/community.rst b/doc/community.rst
index e4a96db..3bfe967 100644
--- a/doc/community.rst
+++ b/doc/community.rst
@@ -4,24 +4,60 @@
Community
******************************************************************************
-Mailing Lists
+:Author: Howard Butler
+:Contact: howard at hobu.co
+:Date: 10/27/2015
+
+PDAL's community interacts through `Mailing List`_, `GitHub`_, and `IRC`_.
+Please feel welcome to ask questions and participate in all of the venues.
+The `Mailing List`_ communication channel is for general questions, development
+discussion, and feedback. The `GitHub`_ communication channel is for development
+activities, bug reports, and testing. The `IRC`_ channel is for real-time
+chat activities such as meetings and interactive debugging sessions.
+
+Mailing List
..............................................................................
-* pdal - http://lists.osgeo.org/mailman/listinfo/pdal
-* pdal-commits - http://lists.osgeo.org/mailman/listinfo/pdal-commits
+Developers and users of PDAL participate on the PDAL mailing list. It is OK to
+ask questions about how to use PDAL, how to integrate PDAL into your own software,
+and report issues that you might have.
+.. note::
-Bugs
+ Please remember that an email to the PDAL list is going to 100s of
+ individuals. Do your diligence the best you can on your question before
+ asking, but don't be afraid to ask. We won't bite. Promise.
+
+Subscribe
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+You can find the mailing list management page at
+
+http://lists.osgeo.org/mailman/listinfo/pdal
+
+GitHub
..............................................................................
-Visit http://github.com/PDAL/PDAL to file bugs or fork the PDAL respository and
-start hacking on it yourself.
+Visit http://github.com/PDAL/PDAL to file issues you might be having with the
+software. GitHub is also where you can obtain a current development version of the
+software in the `git`_ revision control system. The PDAL project is eager to
+take contributions in all forms, and we welcome those who are willing to roll
+up their sleeves and start filing tickets, pushing code, generating builds, and
+answering questions.
+
+.. seealso::
+
+ :ref:`development_index` provides more information on how the PDAL software
+ development activities operate.
IRC
..............................................................................
-Find the PDAL developers on IRC on #pdal at `Freenode`_.
-
+You can find some PDAL developers on IRC on #pdal at `Freenode`_. This mechanism
+is usually reserved for active meetings and other outreach with the community.
+The `Mailing List`_ and `GitHub`_ avenues are going to be more productive
+communication channels in most situations.
+.. _`git`: https://en.wikipedia.org/wiki/Git_(software)
.. _`Freenode`: http://freenode.net
diff --git a/doc/compilation/dependencies.rst b/doc/compilation/dependencies.rst
index e722e4e..4892375 100644
--- a/doc/compilation/dependencies.rst
+++ b/doc/compilation/dependencies.rst
@@ -6,22 +6,19 @@ Dependencies
:Author: Howard Butler
:Contact: howard at hobu.co
-:Date: 11/15/2013
+:Date: 11/03/2015
PDAL explicitly stands on the shoulders of giants that have come before it.
-Specifically, PDAL depends on a number of libraries to do its work including:
+Specifically, PDAL depends on a number of libraries to do its work. Most are
+not required. For optional dependencies, PDAL utilizes a dynamically-linked
+plugin architecture that loads them at runtime.
-.. contents::
- :depth: 1
- :local:
-.. note::
-
- :ref:`stage_index` contains explicit usages of the various
- stage types available to PDAL.
+Required Dependencies
+------------------------------------------------------------------------------
Boost
-------------------------------------------------------------------------------
+..............................................................................
PDAL attempts to constrain its code-love for Boost and not always try to use the
latest and the greatest, but the instinct is hard to control. Specifically, PDAL
@@ -32,10 +29,10 @@ work with some minor modifications or ``#ifdef``'ing, but the PDAL developers
currently track rather late versions of Boost.
-Boost Packages Used
-..............................................................................
+Packages Used
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-An unexhaustive list includes:
+An list includes:
* Accumulators
* Filesystem
@@ -44,19 +41,19 @@ An unexhaustive list includes:
* IO Streams
* System
* String Algorithms
-* Endian
* UUID
+
GDAL
-------------------------------------------------------------------------------
+..............................................................................
PDAL uses GDAL for spatial reference system description manipulation, and image
-reading supporting for the NITF driver, and :ref:`writers.oci` support. In conjunction with GeoTIFF_,
-GDAL is used to convert GeoTIFF keys and OGC WKT SRS description strings into
-formats required by specific drivers. While PDAL can be built without GDAL
-support, if you want SRS manipulation and description ability, you must have
-GDAL (and GeoTIFF_) linked in at compile time.
+reading supporting for the NITF driver, and :ref:`writers.oci` support. In
+conjunction with GeoTIFF_, GDAL is used to convert GeoTIFF keys and OGC WKT SRS
+description strings into formats required by specific drivers. While PDAL can
+be built without GDAL support, if you want SRS manipulation and description
+ability, you must have GDAL (and GeoTIFF_) linked in at compile time.
Obtain `GDAL`_ via whatever method is convenient. Linux platforms such as
`Debian`_ have `DebianGIS`_, Mac OS X has the `KyngChaos`_ software frameworks,
@@ -68,9 +65,12 @@ and Windows has the `OSGeo4W`_ platform.
If you are using `OSGeo4W`_ as your provider of GDAL, you must make sure
to use the GDAL 1.9 package.
-GeoTIFF
+Optional Dependencies
------------------------------------------------------------------------------
+GeoTIFF
+..............................................................................
+
PDAL uses GeoTIFF in conjunction with GDAL for GeoTIFF key support in the
LAS driver. Obtain `GeoTIFF`_ from the same place you got `GDAL`_.
@@ -88,22 +88,22 @@ LAS driver. Obtain `GeoTIFF`_ from the same place you got `GDAL`_.
not need to worry about this issue.
Proj.4
-------------------------------------------------------------------------------
+..............................................................................
Proj.4_ is the projection engine that PDAL uses for the
-:ref:`filters.reprojection` filter. It is used by GDAL.
+:ref:`filters.reprojection` filter. It is used by GDAL.
.. note::
- Proj.4 4.9.0+ is required if you need vertical datum
- transformation support. Otherwise, older versions should be
+ Proj.4 4.9.0+ is required if you need vertical datum
+ transformation support. Otherwise, older versions should be
sufficient.
libxml2
-------------------------------------------------------------------------------
+..............................................................................
-libxml2_ is used to serialize PDAL dimension descriptions into XML for the
-database drivers such as :ref:`writers.oci`, :ref:`readers.sqlite`, or
+libxml2_ is used to serialize PDAL dimension descriptions into XML for the
+database drivers such as :ref:`writers.oci`, :ref:`readers.sqlite`, or
:ref:`readers.pgpointcloud`
.. note::
@@ -111,7 +111,7 @@ database drivers such as :ref:`writers.oci`, :ref:`readers.sqlite`, or
libxml 2.7.0+ is required. Older versions may also work but are untested.
`OCI`_
-------------------------------------------------------------------------------
+..............................................................................
Obtain the `Oracle Instant Client`_ and install in a location on your system.
Be sure to install both the "Basic" and the "SDK" modules. Set your
@@ -136,7 +136,7 @@ Point Cloud read/write support.
MSVC should only require the oci.lib and oci.dll library and dlls.
Points2Grid
-------------------------------------------------------------------------------
+..............................................................................
`Points2Grid`_ is a library with a simple `CMake`-based build system that
provides simple, out-of-process interpolation of large point sets using
@@ -144,7 +144,7 @@ Boost_. It can be obtained via github.com at https://github.com/CRREL/points2gri
It is used by :ref:`writers.p2g` to output point cloud interpolation.
Hexer
-------------------------------------------------------------------------------
+..............................................................................
`Hexer`_ is a library with a simple `CMake`-based build system that
provides simple hexagon gridding of large point sets for density surface
@@ -153,11 +153,11 @@ https://github.com/hobu/hexer It is used by :ref:`filters.hexbin` to output
density surfaces and boundary approximations.
Nitro
-------------------------------------------------------------------------------
+..............................................................................
Nitro is a library that provides `NITF`_ support for PDAL to write LAS-in-NITF
-files for :ref:`writers.nitf`. PDAL can only use a fork of Nitro located at http://github.com/hobu/nitro instead
-of the mainline tree for two reasons:
+files for :ref:`writers.nitf`. PDAL can only use a fork of Nitro located at
+http://github.com/hobu/nitro instead of the mainline tree for two reasons:
1) The fork contains a simple `CMake`-based build system
2) The fork properly dynamically links on Windows to maintain LGPL compliance.
@@ -167,23 +167,38 @@ the main source tree.
LASzip
-------------------------------------------------------------------------------
+..............................................................................
`LASzip`_ is a library with a simple `CMake`-based build system that
provides periodic compression of `ASPRS LAS`_ data. It is used by the
:ref:`writers.las` and :ref:`readers.las` to provide
compressed LAS support.
+laz-perf
+..............................................................................
+
+In addition to `LASzip`_, you can use the alternative `laz-perf`_ library.
+`laz-perf`_ provides slightly faster decompression capability for typical
+LAS files. It is also used as a compression type for :ref:`writers.oci` and
+:ref:`writers.sqlite`
+
+.. _`laz-perf`: https://github.com/verma/laz-perf/
PCL
-------------------------------------------------------------------------------
+..............................................................................
The `Point Cloud Library (PCL)`_ is used by the :ref:`ground_command`,
:ref:`pcl_command`, :ref:`writers.pcd`, :ref:`readers.pcd`, and
:ref:`filters.pclblock` to provide support for various PCL-related operations.
-At the moment, PCL must be built from 1.7.2+. We do our best to keep this
-up-to-date with PCL master.
+PCL must be 1.7.2+. We do our best to keep this up-to-date with PCL master.
+
+.. note::
+ `Homebrew`_-based OSX builds use PCL 1.7.2, but you may need to switch
+ of `VTK`_ support depending on the configuration.
+
+.. _`Homebrew`: http://brew.sh
+.. _`VTK`: http://vtk.org
.. _`ASPRS LAS`: http://www.asprs.org/Committee-General/LASer-LAS-File-Format-Exchange-Activities.html
.. _`LASzip`: http://laszip.org
diff --git a/doc/compilation/index.rst b/doc/compilation/index.rst
index 18f0543..e79d330 100644
--- a/doc/compilation/index.rst
+++ b/doc/compilation/index.rst
@@ -5,13 +5,19 @@ Installation
******************************************************************************
This section describes how to build and install PDAL under Windows, Linux, and Mac.
+PDAL's numerous :ref:`dependencies` can make it a challenge to build a fully-featured
+build.
+
+.. seealso::
+ :ref:`download` contains links to installable binaries for Windows, OSX, and
+ RHEL Linux systems.
Contents:
.. toctree::
:maxdepth: 1
-
+
unix
windows
dependencies
-
\ No newline at end of file
+
diff --git a/doc/compilation/media/OSGeo4WInstallIConv.png b/doc/compilation/media/OSGeo4WInstallIConv.png
index f886b7a..a6f0c5a 100644
Binary files a/doc/compilation/media/OSGeo4WInstallIConv.png and b/doc/compilation/media/OSGeo4WInstallIConv.png differ
diff --git a/doc/compilation/unix.rst b/doc/compilation/unix.rst
index 0d2bc79..5ee9b97 100644
--- a/doc/compilation/unix.rst
+++ b/doc/compilation/unix.rst
@@ -6,27 +6,32 @@ Unix Compilation
:Author: Howard Butler
:Contact: howard at hobu.co
-:Date: 11/16/2013
+:Date: 10/27/2015
-`CMake`_ 2.8.6+ is the prescribed tool for building from source as well as
-running unit tests. `CMake`_ is a cross-platform build system that provides a
-number of benefits, and its usage ensures a single, up-to-date build system
-for all PDAL-supported operating systems and compiler platforms.
+`CMake`_ 2.8.11+ is the prescribed tool for building from source, with `CMake`_
+3.0+ being desired. `CMake`_ is a cross-platform build system that provides a
+number of benefits, and its usage ensures a single, up-to-date build system for
+all PDAL-supported operating systems and compiler platforms.
-Like a combination of autoconf/autotools, except that it actually works on
-Windows (and works without eye-stabbing pain in general), `CMake`_ is somewhat
-of a meta-building tool. It can be used to generate MSVC project files, GNU
-Makefiles, NMake files for MSVC, XCode projects on Mac OS X, and Eclipse
-projects (as well as many others). This functionality allows the PDAL project
-to avoid maintaining these build options by hand and target a single configuration
-and build platform.
+Like a combination of autoconf/autotools, except that it works on Windows with
+minimal eye-stabbing pain, `CMake`_ is somewhat of a meta-building tool. It can
+be used to generate MSVC project files, GNU Makefiles, NMake files for MSVC,
+XCode projects on Mac OS X, and Eclipse projects (as well as many others).
+This functionality allows the PDAL project to avoid maintaining these build
+options by hand and target a single configuration and build platform.
-This tutorial will describe how to build PDAL using CMake on a
-Unix platform. PDAL is known to compile on Linux 2.6's of various flavors and
-OSX Snow Leopard and Lion with XCode 4.2.
+This tutorial will describe how to build PDAL using CMake on a Unix platform.
+PDAL is known to compile on Linux 2.6's of various flavors and OSX with XCode.
-:ref:`dependencies` contains more information about specific library version
-requirements and notes about building or acquiring them.
+.. seealso::
+
+ :ref:`vagrant` contains an automated way to build PDAL and all of
+ its dependencies.
+
+.. note::
+
+ :ref:`dependencies` contains more information about specific library
+ version requirements and notes about building or acquiring them.
Using "Unix Makefiles" on Linux
..............................................................................
@@ -45,7 +50,7 @@ example, we are going to generate a "Unix Makefiles" builder
for PDAL on Mac OS X.
::
-
+
$ cd PDAL
$ mkdir makefiles
$ cd makefiles
@@ -80,12 +85,12 @@ Configure the basic core library for the "Unix Makefiles" target:
.. note::
- The ``hobu-config.sh`` shell script contains a number of common
- settings that I use to configure my `Homebrew`-based Macintosh
+ The ``./cmake/examples/hobu-config.sh`` shell script contains a number of common
+ settings that I use to configure my `Homebrew`-based Macintosh
system.
.. _`Homebrew`: http://brew.sh/
-
+
Issue the `make` command
------------------------------------------------------------------------------
@@ -98,9 +103,9 @@ configured.
Run ``make install`` and test your installation with a :ref:`pdal_test` command
-------------------------------------------------------------------------------
-``make install`` will install the :ref:`utilities <apps>` in the location
-that was specified for 'CMAKE_INSTALL_PREFIX'. Once installed, ensure that
-you can run `pdal info`.
+``make install`` will install the :ref:`utilities <apps>` in the location that
+was specified for 'CMAKE_INSTALL_PREFIX'. Once installed, ensure that you can
+run `pdal info`.
.. _configure_optional_libraries:
@@ -135,18 +140,18 @@ substituting accordingly, to values that match your system layout.
.. _`DebianGIS`: http://wiki.debian.org/DebianGis
.. _`Debian`: http://www.debian.org
.. _`KyngChaos`: http://www.kyngchaos.com/software/unixport
-.. _`OSGeo4W`: http://trac.osgeo.org/osgeo4w/
+.. _`OSGeo4W`: http://trac.osgeo.org/osgeo4w/
CCMake and cmake-gui
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. warning::
-
- The following was just swiped from the libLAS compilation document
- and it has not been updated for PDAL. The basics should be the same, however.
+
+ The following was just swiped from the libLAS compilation document
+ and it has not been updated for PDAL. The basics should be the same, however.
Please ask on the :ref:`mailing list<community>` if you run into any issues.
-
+
While `CMake`_ can be run from the command-line, and this is the preferred
way for many individuals, it can be much easier to run CMake from a GUI.
Now that we have a basic library building, we will use CMake's GUIs to
@@ -154,27 +159,28 @@ help us configure the rest of the optional components of the library. Run
``ccmake ../`` for the `Curses`_ interface or ``cmake-gui ../`` for a GUI
version.
-
+
.. figure:: media/ccmake-osx-start.png
:alt: Running CCMake in OS X
- Running the `Curses`_ `CMake`_ interface. This interface is available to
- all unix-like operating systems.
-
+ Running the `Curses`_ `CMake`_ interface. This interface is available to
+ all unix-like operating systems.
+
.. note::
- If your arrow keys are not working with in CCMake, use CTRL-N and
+
+ If your arrow keys are not working with in CCMake, use CTRL-N and
CTRL-P to move back and forth between the options.
.. figure:: media/cmake-gui-osx-start.png
:alt: Running cmake-gui in OS X
- Running the cmake-gui `CMake`_ interface. This interface is available
+ Running the cmake-gui `CMake`_ interface. This interface is available
on Linux, Windows, and Mac OS X.
-Build and install
+Build and install
------------------------------------------------------------------------------
-Once you have configured your additional libraries, you can install the
+Once you have configured your additional libraries, you can install the
software. The main pieces that will be installed are:
* PDAL headers (typically in a location ./include/pdal/...)
@@ -201,7 +207,7 @@ Prepare a build directory
CMake allows you to generate different builders for a project, and in this
example, we are going to generate an "Xcode" builder for PDAL on Mac OS X.
-Additionally, we're going to use an alternative compiler -- `LLVM`_ -- which
+Additionally, we're going to use an alternative compiler -- `LLVM`_ -- which
under certain situations can produce much faster code on Mac OS X.
::
@@ -241,9 +247,9 @@ Configure the basic core library for the Xcode build:
-- Build files have been written to: /Users/hobu/hg/PDAL-cmake/xcode
-Alternatively, if you have `KyngChaos`_ frameworks for `GDAL`_ and
-`GeoTIFF`_ installed, you can provide locations for those as part of your
-``cmake`` invocation:
+Alternatively, if you have `KyngChaos`_ frameworks for `GDAL`_ and `GeoTIFF`_
+installed, you can provide locations for those as part of your ``cmake``
+invocation:
::
@@ -253,9 +259,13 @@ Alternatively, if you have `KyngChaos`_ frameworks for `GDAL`_ and
-D GEOTIFF_LIBRARY=/Library/Frameworks/UnixImageIO.framework/unix/lib/libgeotiff.dylib \
..
-
-::
-
+.. note::
+
+ I recommend that you use in `Homebrew`_ for `GDAL`_ and friends. Its configuration
+ is featureful and up-to-date.
+
+::
+
$ open PDAL.xcodeproj/
.. figure:: media/xcode-start.png
@@ -264,9 +274,9 @@ Alternatively, if you have `KyngChaos`_ frameworks for `GDAL`_ and
Set default command for XCode
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Set the default executable for the project to be ``lasinfo`` by opening the
-"Executables" tree, choosing "lasinfo," and clicking the bubble next to
-the "Executable name" in the right-hand panel.
+Set the default executable for the project to be ``lasinfo`` by opening the
+"Executables" tree, choosing "lasinfo," and clicking the bubble next to
+the "Executable name" in the right-hand panel.
.. figure:: media/xcode-set-default-executable.png
:alt: Setting the default executable
@@ -287,14 +297,14 @@ location of our test file. This is similar to the :ref:`same command
Configure :ref:`Optional Libraries <dependencies>`
------------------------------------------------------------------------------
-As :ref:`before <configure_optional_libraries>`, use ``ccmake ../`` or ``cmake-gui ../`` to
+As :ref:`before <configure_optional_libraries>`, use ``ccmake ../`` or ``cmake-gui ../`` to
configure your :ref:`dependencies`.
.. figure:: media/cmake-gui-osx-configured.png
:alt: Configuring optional libraries with CMake GUI
-
-
+
+
.. _`CMake`: http://www.cmake.org/
.. _`CTest`: http://cmake.org/cmake/help/ctest-2-8-docs.html
.. _`CMake 2.8.0+`: http://www.cmake.org/cmake/help/cmake-2-8-docs.html
diff --git a/doc/compilation/windows.rst b/doc/compilation/windows.rst
index 5d5da4a..fc742f3 100644
--- a/doc/compilation/windows.rst
+++ b/doc/compilation/windows.rst
@@ -8,6 +8,21 @@ Building Under Windows
:Contact: unknown at lizardtech dot com
:Date: 3/19/2012
+.. note::
+
+ `OSGeo4W`_ contains a pre-built up-to-date 64 bit Windows binary. It
+ is fully-featured, and if you do not need anything custom, it is likely
+ the fastest way to get going.
+
+.. seealso::
+
+ :ref:`vagrant` contains an automated way to build PDAL and all of
+ its dependencies on Unix. If you just want to apply PDAL commandline
+ operations to data, this mechanism is likely to be much faster than
+ compiling your own.
+
+.. _`OSGeo4W`: https://trac.osgeo.org/osgeo4w/
+
Most Users
------------------------------------------------------------------------------
diff --git a/doc/conf.py b/doc/conf.py
index 85886ef..0231f2a 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -13,6 +13,8 @@
import sys, os, re
+import sphinx_bootstrap_theme
+
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
@@ -25,10 +27,12 @@ import sys, os, re
# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
-extensions = ['breathe', 'sphinx.ext.autodoc','rst2pdf.pdfbuilder']
+extensions = ['breathe', 'sphinx.ext.autodoc', 'rst2pdf.pdfbuilder', 'sphinx.ext.pngmath','rst2pdf.pdfbuilder']
+
+# disqus_shortname = 'pdal'
# Add any paths that contain templates here, relative to this directory.
-# templates_path = ['_templates']
+templates_path = ['_templates']
# The suffix of source filenames.
source_suffix = '.rst'
@@ -37,11 +41,13 @@ source_suffix = '.rst'
#source_encoding = 'utf-8-sig'
# The master toctree document.
-master_doc = 'docs'
+master_doc = 'index'
# General information about the project.
project = u'PDAL'
-copyright = u'2015, Howard Butler, Michael Gerlek and others'
+
+import datetime
+copyright = str(datetime.datetime.now().year)
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
@@ -71,6 +77,7 @@ def read_version(filename):
return '%s'%(version)
release = read_version('../CMakeLists.txt')
+version = release
# The language for content autogenerated by Sphinx. Refer to documentation
@@ -119,17 +126,82 @@ html_theme = 'bootstrap'
# further. For a list of options available for each theme, see the
# documentation.
html_theme_options = {
- 'analytics_code': 'UA-00000000-1',
- 'github_user': 'PDAL',
- 'github_repo': 'PDAL',
- 'twitter_username': 'pointcloudpipe',
- 'home_url': 'http://pdal.io',
- 'disqus_shortname': 'pdal',
+# 'analytics_code': 'UA-00000000-1',
+# 'github_user': 'PDAL',
+# 'github_repo': 'PDAL',
+# # 'twitter_username': 'pointcloudpipe',
+# 'home_url': 'http://pdal.io',
+# 'disqus_shortname': 'pdal',
+}
+
+html_theme_options = {
+ # Navigation bar title. (Default: ``project`` value)
+ 'navbar_title': "",
+
+ # Tab name for entire site. (Default: "Site")
+ 'navbar_site_name': "Docs",
+
+ # A list of tuples containing pages or urls to link to.
+ # Valid tuples should be in the following forms:
+ # (name, page) # a link to a page
+ # (name, "/aa/bb", 1) # a link to an arbitrary relative url
+ # (name, "http://example.com", True) # arbitrary absolute url
+ # Note the "1" or "True" value above as the third argument to indicate
+ # an arbitrary url.
+ 'navbar_links': [
+ ("Download", "download"),
+ ("GitHub", "https://github.com/PDAL/PDAL", True),
+ ],
+
+ # Render the next and previous page links in navbar. (Default: true)
+ 'navbar_sidebarrel': True,
+
+ # Render the current pages TOC in the navbar. (Default: true)
+ 'navbar_pagenav': True,
+
+ # Tab name for the current pages TOC. (Default: "Page")
+ 'navbar_pagenav_name': "Here",
+
+ # Global TOC depth for "site" navbar tab. (Default: 1)
+ # Switching to -1 shows all levels.
+ 'globaltoc_depth': 2,
+
+ # Include hidden TOCs in Site navbar?
+ #
+ # Note: If this is "false", you cannot have mixed ``:hidden:`` and
+ # non-hidden ``toctree`` directives in the same page, or else the build
+ # will break.
+ #
+ # Values: "true" (default) or "false"
+ 'globaltoc_includehidden': "true",
+
+ # HTML navbar class (Default: "navbar") to attach to <div> element.
+ # For black navbar, do "navbar navbar-inverse"
+ 'navbar_class': "navbar",
+
+ # Fix navigation bar to top of page?
+ # Values: "true" (default) or "false"
+ 'navbar_fixed_top': "true",
+
+ # Location of link to source.
+ # Options are "nav" (default), "footer" or anything else to exclude.
+ 'source_link_position': "nav",
+
+ # Bootswatch (http://bootswatch.com/) theme.
+ #
+ # Options are nothing (default) or the name of a valid theme
+ # such as "amelia" or "cosmo".
+ 'bootswatch_theme': "cerulean",
+
+ # Choose Bootstrap version.
+ # Values: "3" (default) or "2" (in quotes)
+ 'bootstrap_version': "3",
}
# Add any paths that contain custom themes here, relative to this directory.
html_theme_path = ['./_themes']
+html_theme_path = sphinx_bootstrap_theme.get_html_theme_path()
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
html_title = "pdal.io"
@@ -139,12 +211,12 @@ html_short_title = "Documentation"
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
-html_logo = './_static/pdal_logo.png'
+# html_logo = './_static/pdal_logo_small.png'
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
-#html_favicon = None
+html_favicon = './_static/logo/favicon.ico'
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
@@ -160,11 +232,11 @@ html_last_updated_fmt = '%b %d, %Y'
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
-html_sidebars = {
- '**': ['localtoc.html', 'relations.html' ],
-"index":["indexsidebar.html",'searchbox.html'],
-"docs":['searchbox.html']
-}
+# html_sidebars = {
+# '**': ['localtoc.html', 'relations.html' ],
+# "index":["indexsidebar.html",'searchbox.html'],
+# "docs":['searchbox.html']
+# }
# Additional templates that should be rendered to pages, maps page names to
# template names.
@@ -180,7 +252,7 @@ html_sidebars = {
#html_split_index = False
# If true, links to the reST sources are added to the pages.
-#html_show_sourcelink = True
+html_show_sourcelink = False
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True
@@ -305,3 +377,10 @@ breathe_diagram = {
'no-link' : False
}
+pdf_documents = [
+ ('index', u'PDAL-'+release, u'PDAL Documentation', u'Howard Butler\\Michael Gerlek\\The PDAL Development Team'),
+]
+pdf_stylesheets = ['sphinx','kerning','a4']
+pdf_break_level = 3
+pdf_toc_depth = 5
+pdf_default_dpi = 144
diff --git a/doc/development/conventions.rst b/doc/development/conventions.rst
index 50cc14c..8511bf6 100644
--- a/doc/development/conventions.rst
+++ b/doc/development/conventions.rst
@@ -1,8 +1,8 @@
.. _development_conventions:
-==================
+================================================================================
Coding Conventions
-==================
+================================================================================
To the extent possible and reasonable, we value consistency of source code
formatting, class and variable naming, and so forth.
@@ -24,8 +24,8 @@ Our conventions are:
* spaces, not tabs
-* indent to four (4) spaces ("Four shalt be the number thou shalt count,
- and the number of the counting shall be four. Three shalt thou not count,
+* indent to four (4) spaces ("Four shalt be the number thou shalt count,
+ and the number of the counting shall be four. Three shalt thou not count,
neither count thou five...")
* braces shall be on their own lines, like this::
@@ -35,7 +35,7 @@ Our conventions are:
foo();
}
-* copyright header on every file
+* copyright header, license, and author(s) on every file
* two spaces between major units, e.g. function bodies
@@ -50,7 +50,7 @@ Naming Conventions
* member variables should be prefixed with "m\_", followed by the name in
lowerCamelCase -- for example, "m_numberOfPoints"
-* there should be only one class per file, and the name of the file should
+* there should be only one class per file, and the name of the file should
match the class name -- that is, class PointData should live in files
PointData.hpp and PointData.cpp
@@ -60,21 +60,21 @@ Other Conventions
* the use of getter and setter methods is preferred to exposing member
variables
-
-* Surround all code with "namespace pdal {...}"; where justifiable, you
+
+* Surround all code with "namespace pdal {...}"; where justifiable, you
may introduce a nested namespace.
-
-* Use exceptions for exceptional events that are not going to be handled
+
+* Use exceptions for exceptional events that are not going to be handled
directly within the context of where the event occurs. Avoid status
- codes. See exceptions.hpp for a set of pdal-specific exception types
- you may throw. (See Note on error handling)
+ codes. See pdal_error.hpp for a set of pdal-specific exception types
+ you may throw.
* Describe use of "debug" and "verbose" settings.
* Don't put member function bodies in the class declaration in the
header file, unless clearly justified for performance reasons.
Use the "inline" keyword in these cases(?).
-
+
* Use const.
* Don't put "using" declarations in headers.
@@ -86,7 +86,7 @@ Layout/Organization of Source Tree
==================================
* public headers in ./include
-
+
* private headers alongside source files in src/
* ...
@@ -109,13 +109,14 @@ Layout/Organization of Source Tree
* Exception to the above: source files (.cpp) should #include their
corresponding .hpp file first. This assures that the header is including
all the files it needs to.
-
+
* Don't #include a file where a simple forward declaration will do.
(Note: this only applies to pdal files; don't forward declare from system
or 3rd party headers.)
* Don't include a file unless it actually is required to compile the source unit.
-* Include guards should spell out the full path, like this:
- #ifndef INCLUDED_DRIVERS_FAUX_READER_ITERATOR_HPP
-
+* Don't use manual include guards. All reasonable compilers support the once pragma::
+
+ #pragma once
+
diff --git a/doc/development/docs.rst b/doc/development/docs.rst
index 1bf2ff8..1d93e9c 100644
--- a/doc/development/docs.rst
+++ b/doc/development/docs.rst
@@ -1,41 +1,106 @@
.. _development_docs:
-====
+================================================================================
Docs
-====
+================================================================================
-Building the Documentation
-==========================
+Requirements
+================================================================================
-To build the PDAL documentation yourself, you need to install sphinx_, breathe_, and other python dependencies, preferably with PyPI_.
-If you have `pip installed <http://www.pip-installer.org/en/latest/installing.html>`_, install the documentation dependencies with:
+To build the PDAL documentation yourself, you need to install the following
+items:
+
+* Sphinx_
+* Breathe_
+* `sphinx_bootstrap_theme`_
+* `Doxygen`_
+* `Latex`_
+* `dvipng`_
+
+.. _`dvipng`: https://en.wikipedia.org/wiki/Dvipng
+.. _`sphinx_bootstrap_theme`: https://pypi.python.org/pypi/sphinx-bootstrap-theme/
+.. _`Latex`: https://en.wikipedia.org/wiki/LaTeX
+
+Sphinx, Breathe_ and Bootstrap
+--------------------------------------------------------------------------------
+
+Python dependencies should be installed from PyPI_ with ``pip`` or
+``easy_install``.
.. code-block:: bash
- (sudo) pip install sphinx breathe rst2pdf
+ (sudo) pip install sphinx breathe rst2pdf sphinx_bootstrap_theme
+
+.. note::
+
+ If you are installing these packages to a system-wide directory, you may need
+ the **sudo** in front of the **pip**, though it might be better that instead
+ you use `virtual environments`_ instead of installing the packages system-wide.
+
+Doxygen
+--------------------------------------------------------------------------------
+
+The PDAL documentation also depends on `Doxygen`_, which can be installed from
+source or from binaries from the `doxygen website
+<http://www.stack.nl/~dimitri/doxygen/download.html>`_. If you are on Max OS X
+and use `homebrew`_, you can install doxygen with a simple ``brew install
+doxygen``.
+
+Latex
+--------------------------------------------------------------------------------
+
+`Latex`_ is used for equation editing inside of Sphinx. It is used to generate
+figures and graphs.
+
+dvipng
+--------------------------------------------------------------------------------
-If you are installing these packages to a system-wide directory, you may need the **sudo** in front of the **pip**, though it might be better that instead you use `virtual environments`_ instead of installing the packages system-wide.
+For math output, we depend on `dvipng`_ to turn `Latex`_ output into math PNGs.
-The PDAL documentation also depends on `doxygen`_, which can be installed from source or from binaries from the `doxygen website <http://www.stack.nl/~dimitri/doxygen/download.html>`_.
-If you are on Max OS X and use `homebrew`_, you can install doxygen with a simple ``brew install doxygen``.
+Generation
+================================================================================
-Once you have installed all the doc dependencies, you can then build the documentation itself.
-The :file:`doc/` directory in the PDAL source tree contains a Makefile which can be used to build all documentation.
-For a list of the output formats supported by Sphinx, simply type ``make``.
-For example, to build html documentation:
+Once you have installed all the doc dependencies, you can then build the
+documentation itself. The :file:`doc/` directory in the PDAL source tree
+contains a Makefile which can be used to build all documentation. For a list
+of the output formats supported by Sphinx, simply type ``make``. For example,
+to build html documentation:
.. code-block:: bash
cd doc
make doxygen html
-The html docs will be placed in :file:`doc/build/html/`.
-The ``make doxygen`` is necessary to re-generate the API documentation from the source code.
+The html docs will be placed in :file:`doc/build/html/`. The ``make doxygen``
+is necessary to re-generate the API documentation from the source code using
+`Breathe`_ and `Sphinx`_.
+
+
+
+
+Website
+================================================================================
+
+The http://pdal.io website is regenerated from the master branch at the following
+cron schedule:
+
+::
+
+ 30 2,8,12,16,20 * * * /home/pdal/periodic/pdal.sh
+
+It is generated by a `Digital Ocean`_ droplet that uses the ``PDAL-docs`` `GitHub`_
+user to write to the https://github.com/PDAL/pdal.github.io repository. The website
+is then served via `GitHub Pages`_.
+
+.. _`GitHub Pages`: https://pages.github.com/
+.. _`GitHub`: http://github.com/PDAL/PDAL
+
+.. _`Digital Ocean`: digitalocean.com
-.. _sphinx: http://sphinx-doc.org/
-.. _breathe: https://github.com/michaeljones/breathe
+.. _Sphinx: http://sphinx-doc.org/
+.. _Breathe: https://github.com/michaeljones/breathe
.. _virtual environments: https://pypi.python.org/pypi/virtualenv
.. _pypi: https://pypi.python.org/pypi
-.. _doxygen: http://www.stack.nl/~dimitri/doxygen/
+.. _Doxygen: http://www.stack.nl/~dimitri/doxygen/
.. _homebrew: http://mxcl.github.io/homebrew/
diff --git a/doc/development/errorhandling.rst b/doc/development/errorhandling.rst
index 947f336..e4c0a7d 100644
--- a/doc/development/errorhandling.rst
+++ b/doc/development/errorhandling.rst
@@ -1,19 +1,17 @@
.. _development_errorhandling:
-=========================
+================================================================================
Errors and Error Handling
-=========================
+================================================================================
Exceptions
-==========
-
-* throw exceptions, don't use status codes
-
-* use the pdal_error hiearchy (list)
+================================================================================
+PDAL typically throws a ``std::runtime_error`` for error conditions that is
+catchable as ``pdal::pdal_error``.
PDAL Position on (Non)conformance
-==================================
+================================================================================
PDAL proudly and unabashedly supports formal standards/specifications for
file formats. We recognize, however, that in some cases files will not
@@ -22,20 +20,20 @@ carelessness.
When reading files that are not formatted correctly:
-* PDAL may try to compensate for the error. This is typically done when as
+* PDAL may try to compensate for the error. This is typically done when as
a practical matter the market needs support for well-known or pervasive,
but nonetheless "broken", upstream implementations.
-* PDAL may explicitly reject such files. This is typically done where we do
- not wish to continue to promote or support mistakes that should be fixed
+* PDAL may explicitly reject such files. This is typically done where we do
+ not wish to continue to promote or support mistakes that should be fixed
upstream.
-PDAL will always write correctly formatted files. In some cases, however,
+PDAL will strive to write correctly formatted files. In some cases, however,
PDAL may choose to offer as an option the ability to break the standard if,
as a practical matter, doing so would significantly aid the market. Such an
option would never be the default behavior, however.
For files that are conformant but which lie, such as the extents in the
-header being wrong, we will generally offer both the ability to propagate
+header being wrong, we will generally offer both the ability to propagate
the "wrong" information and the ability to helpfully correct it on the fly;
the latter is generally our default position.
diff --git a/doc/development/goals.rst b/doc/development/goals.rst
index e89ef61..4718537 100644
--- a/doc/development/goals.rst
+++ b/doc/development/goals.rst
@@ -1,29 +1,32 @@
.. _development_goals:
-=============
+================================================================================
Project Goals
-=============
-
-1. PDAL is a library which provides APIs for reading, writing, and
- processing geospatial point cloud data of various formats. Additionally, some
- command line tools are provided. As GDAL is to 2D pixels, PDAL is to
- multidimensional points.
-
-2. From a market perspective, PDAL is "version 2" of libLAS. The actual
+================================================================================
+
+1. PDAL is a library which provides APIs for reading, writing, and
+ processing geospatial point cloud data of various formats. Additionally, some
+ command line tools are provided. As `GDAL`_ is to 2D pixels, `OGR`_ is to
+ geospatial vector geometry, PDAL is to multidimensional points.
+
+2. From a market perspective, PDAL is "version 2" of libLAS. The actual
code base will be different, however, and the APIs will not be
compatible.
-3. The PDAL implementation has high performance, yet the API remains
- flexible. We recognize that these two goals will conflict at times and
+3. The PDAL implementation has high performance, yet the API remains
+ flexible. We recognize that these two goals will conflict at times and
will weigh the tradeoffs pragmatically.
-
-4. The architecture of a PDAL-based workflow will be a pipeline of
+
+4. The architecture of a PDAL-based workflow will be a pipeline of
connected stages, each stage being either a data source (such as a file
reader), a filter (such as a point thinner), or data sink (such as a
file writer).
-5. The PDAL library will be in C++, but will have SWIG bindings for languages
- like Python and C#. PDAL will support multiple platforms, specifically
+5. The PDAL library will be written in C++. PDAL will support multiple platforms, specifically
Windows, Linux, and Mac.
-6. PDAL is open source and is released under a BSD license.
+6. PDAL is open source and is released under a BSD license. See :ref:`license` for
+ more information.
+
+.. _`GDAL`: http://gdal.org
+.. _`OGR`: http://gdal.org/ogr/
diff --git a/doc/development/index.rst b/doc/development/index.rst
index 22575b8..456f1d6 100644
--- a/doc/development/index.rst
+++ b/doc/development/index.rst
@@ -1,7 +1,7 @@
.. _development_index:
******************************************************************************
-Development
+Development
******************************************************************************
The design, architecture, and implementation of PDAL is captured in this
@@ -15,23 +15,26 @@ Editorial comments, and points yet to be resolved, are noted in the text
The proper spelling of the project name is PDAL, in uppercase. It is
pronounced to rhyme with "GDAL".
-Contents:
+
+Build and Test Status
+------------------------------------------------------------------------------
+
+.. |travis|
+.. |appveyor|
+
+.. |travis| image:: https://travis-ci.org/PDAL/PDAL.png?branch=master
+ :target: https://travis-ci.org/PDAL/PDAL
+
+.. |appveyor| image:: https://ci.appveyor.com/api/projects/status/github/pdal/pdal?branch=master&svg=true
+ :target: https://ci.appveyor.com/project/hobu/pdal
.. toctree::
:maxdepth: 2
-
+
conventions
docs
errorhandling
goals
testing
- usecases
-
-
-Indices and tables
-==================
-
-* :ref:`genindex`
-* :ref:`modindex`
-* :ref:`search`
+
diff --git a/doc/development/testing.rst b/doc/development/testing.rst
index d614bab..d3cab6a 100644
--- a/doc/development/testing.rst
+++ b/doc/development/testing.rst
@@ -1,32 +1,37 @@
.. _pdal_test:
-=======
+================================================================================
Testing
-=======
+================================================================================
Unit Tests
-==========
+================================================================================
A unit test framework is provided, with the goal that all (nontrivial) classes
will have unit tests. At the very least, each new class should have a
corresponding unit test file stubbed in, even if there aren't any tests yet.
-Our unit tests also include testing of each of the command line apps and
-(known) plugins.
+* Our unit tests also include testing of the command line :ref:`apps` and
+ (known) :ref:`plugins <stage_index>`.
-We use the Google C++ Test Framework.
+* We use the `Google C++ Test Framework`_, but a local copy of it is
+ embedded in the PDAL source tree, and you don't have to have it available
+ as a dependency.
-Unit tests for features that are configuration-dependent, e.g. laszip
-compression, should be put under the same ``#ifdef`` guards as the classes
-being tested.
+.. _`Google C++ Test Framework`: https://code.google.com/p/googletest/
-The Support class, in the ``./test/unit`` directory, provides some functions
-for comparing files, etc, that are useful in writing test cases.
+* Unit tests for features that are configuration-dependent, e.g. laszip
+ compression, should be put under the same ``#ifdef`` guards as the classes
+ being tested.
-Unit tests should not be long-running. (As of this writing, a full test run
-executes 163 tests in under 10 seconds in Debug mode on mpg's little laptop.
-This is good.)
+* The Support class, in the ``./test/unit`` directory, provides some functions
+ for comparing files, etc, that are useful in writing test cases.
+
+* Unit tests should not be long-running.
+
+Running the Tests
+================================================================================
To run all unit tests, issue the following command from your build directory::
@@ -37,116 +42,267 @@ To run all unit tests, issue the following command from your build directory::
Depending on the which optional components you've chose to build, your output
should resemble the following::
- Test project /path/to/pdal/build
- Start 1: pdal_base_test
- 1/10 Test #1: pdal_base_test ................... Passed 3.13 sec
- Start 2: pdal_io_test
- 2/10 Test #2: pdal_io_test ..................... Passed 1.19 sec
- Start 3: pdal_filters_test
- 3/10 Test #3: pdal_filters_test ................ Passed 6.27 sec
- Start 4: pdal_plang_test
- 4/10 Test #4: pdal_plang_test .................. Passed 1.32 sec
- Start 5: pc2pc_test
- 5/10 Test #5: pc2pc_test ....................... Passed 5.62 sec
- Start 6: xml_schema_test
- 6/10 Test #6: xml_schema_test .................. Passed 0.02 sec
- Start 7: hexbintest
- 7/10 Test #7: hexbintest ....................... Passed 1.15 sec
- Start 8: icetest
- 8/10 Test #8: icetest .......................... Passed 1.12 sec
- Start 9: nitftest
- 9/10 Test #9: nitftest ......................... Passed 1.28 sec
- Start 10: pcltest
- 10/10 Test #10: pcltest .......................... Passed 1.47 sec
-
- 100% tests passed, 0 tests failed out of 10
-
- Total Test time (real) = 22.61 sec
+ Test project /Users/hobu/dev/git/pdal
+ Start 1: pdal_bounds_test
+ 1/61 Test #1: pdal_bounds_test ................... Passed 0.02 sec
+ Start 2: pdal_config_test
+ 2/61 Test #2: pdal_config_test ................... Passed 0.02 sec
+ Start 3: pdal_file_utils_test
+ 3/61 Test #3: pdal_file_utils_test ............... Passed 0.02 sec
+ Start 4: pdal_georeference_test
+ 4/61 Test #4: pdal_georeference_test ............. Passed 0.02 sec
+ Start 5: pdal_kdindex_test
+ 5/61 Test #5: pdal_kdindex_test .................. Passed 0.03 sec
+ Start 6: pdal_log_test
+ 6/61 Test #6: pdal_log_test ...................... Passed 0.03 sec
+ Start 7: pdal_metadata_test
+ 7/61 Test #7: pdal_metadata_test ................. Passed 0.02 sec
+ Start 8: pdal_options_test
+ 8/61 Test #8: pdal_options_test .................. Passed 0.02 sec
+ Start 9: pdal_pdalutils_test
+ 9/61 Test #9: pdal_pdalutils_test ................ Passed 0.02 sec
+ Start 10: pdal_pipeline_manager_test
+ 10/61 Test #10: pdal_pipeline_manager_test ......... Passed 0.03 sec
+ Start 11: pdal_point_view_test
+ 11/61 Test #11: pdal_point_view_test ............... Passed 2.03 sec
+ Start 12: pdal_point_table_test
+ 12/61 Test #12: pdal_point_table_test .............. Passed 0.03 sec
+ Start 13: pdal_spatial_reference_test
+ 13/61 Test #13: pdal_spatial_reference_test ........ Passed 0.07 sec
+ Start 14: pdal_support_test
+ 14/61 Test #14: pdal_support_test .................. Passed 0.02 sec
+ Start 15: pdal_user_callback_test
+ 15/61 Test #15: pdal_user_callback_test ............ Passed 0.02 sec
+ Start 16: pdal_utils_test
+ 16/61 Test #16: pdal_utils_test .................... Passed 0.02 sec
+ Start 17: pdal_lazperf_test
+ 17/61 Test #17: pdal_lazperf_test .................. Passed 0.04 sec
+ Start 18: pdal_io_bpf_test
+ 18/61 Test #18: pdal_io_bpf_test ................... Passed 0.20 sec
+ Start 19: pdal_io_buffer_test
+ 19/61 Test #19: pdal_io_buffer_test ................ Passed 0.02 sec
+ Start 20: pdal_io_faux_test
+ 20/61 Test #20: pdal_io_faux_test .................. Passed 0.04 sec
+ Start 21: pdal_io_ilvis2_test
+ 21/61 Test #21: pdal_io_ilvis2_test ................ Passed 0.06 sec
+ Start 22: pdal_io_las_reader_test
+ 22/61 Test #22: pdal_io_las_reader_test ............ Passed 0.49 sec
+ Start 23: pdal_io_las_writer_test
+ 23/61 Test #23: pdal_io_las_writer_test ............ Passed 2.27 sec
+ Start 24: pdal_io_optech_test
+ 24/61 Test #24: pdal_io_optech_test ................ Passed 0.03 sec
+ Start 25: pdal_io_ply_reader_test
+ 25/61 Test #25: pdal_io_ply_reader_test ............ Passed 0.03 sec
+ Start 26: pdal_io_ply_writer_test
+ 26/61 Test #26: pdal_io_ply_writer_test ............ Passed 0.02 sec
+ Start 27: pdal_io_qfit_test
+ 27/61 Test #27: pdal_io_qfit_test .................. Passed 0.03 sec
+ Start 28: pdal_io_sbet_reader_test
+ 28/61 Test #28: pdal_io_sbet_reader_test ........... Passed 0.04 sec
+ Start 29: pdal_io_sbet_writer_test
+ 29/61 Test #29: pdal_io_sbet_writer_test ........... Passed 0.03 sec
+ Start 30: pdal_io_terrasolid_test
+ 30/61 Test #30: pdal_io_terrasolid_test ............ Passed 0.03 sec
+ Start 31: pdal_filters_chipper_test
+ 31/61 Test #31: pdal_filters_chipper_test .......... Passed 0.03 sec
+ Start 32: pdal_filters_colorization_test
+ 32/61 Test #32: pdal_filters_colorization_test ..... Passed 11.40 sec
+ Start 33: pdal_filters_crop_test
+ 33/61 Test #33: pdal_filters_crop_test ............. Passed 0.04 sec
+ Start 34: pdal_filters_decimation_test
+ 34/61 Test #34: pdal_filters_decimation_test ....... Passed 0.02 sec
+ Start 35: pdal_filters_divider_test
+ 35/61 Test #35: pdal_filters_divider_test .......... Passed 0.03 sec
+ Start 36: pdal_filters_ferry_test
+ 36/61 Test #36: pdal_filters_ferry_test ............ Passed 0.04 sec
+ Start 37: pdal_filters_merge_test
+ 37/61 Test #37: pdal_filters_merge_test ............ Passed 0.03 sec
+ Start 38: pdal_filters_reprojection_test
+ 38/61 Test #38: pdal_filters_reprojection_test ..... Passed 0.03 sec
+ Start 39: pdal_filters_range_test
+ 39/61 Test #39: pdal_filters_range_test ............ Passed 0.05 sec
+ Start 40: pdal_filters_randomize_test
+ 40/61 Test #40: pdal_filters_randomize_test ........ Passed 0.02 sec
+ Start 41: pdal_filters_sort_test
+ 41/61 Test #41: pdal_filters_sort_test ............. Passed 0.39 sec
+ Start 42: pdal_filters_splitter_test
+ 42/61 Test #42: pdal_filters_splitter_test ......... Passed 0.03 sec
+ Start 43: pdal_filters_stats_test
+ 43/61 Test #43: pdal_filters_stats_test ............ Passed 0.03 sec
+ Start 44: pdal_filters_transformation_test
+ 44/61 Test #44: pdal_filters_transformation_test ... Passed 0.03 sec
+ Start 45: pdal_merge_test
+ 45/61 Test #45: pdal_merge_test .................... Passed 0.07 sec
+ Start 46: pc2pc_test
+ 46/61 Test #46: pc2pc_test ......................... Passed 0.15 sec
+ Start 47: xml_schema_test
+ 47/61 Test #47: xml_schema_test .................... Passed 0.02 sec
+ Start 48: pdal_filters_attribute_test
+ 48/61 Test #48: pdal_filters_attribute_test ........ Passed 0.09 sec
+ Start 49: pdal_plugins_cpd_kernel_test
+ 49/61 Test #49: pdal_plugins_cpd_kernel_test .......***Exception: Other 0.08 sec
+ Start 50: hexbintest
+ 50/61 Test #50: hexbintest ......................... Passed 0.03 sec
+ Start 51: icetest
+ 51/61 Test #51: icetest ............................ Passed 0.04 sec
+ Start 52: mrsidtest
+ 52/61 Test #52: mrsidtest .......................... Passed 0.06 sec
+ Start 53: pdal_io_nitf_writer_test
+ 53/61 Test #53: pdal_io_nitf_writer_test ........... Passed 0.08 sec
+ Start 54: pdal_io_nitf_reader_test
+ 54/61 Test #54: pdal_io_nitf_reader_test ........... Passed 0.04 sec
+ Start 55: ocitest
+ 55/61 Test #55: ocitest ............................***Failed 0.06 sec
+ Start 56: pcltest
+ 56/61 Test #56: pcltest ............................ Passed 0.28 sec
+ Start 57: pgpointcloudtest
+ 57/61 Test #57: pgpointcloudtest ................... Passed 1.66 sec
+ Start 58: plangtest
+ 58/61 Test #58: plangtest .......................... Passed 0.14 sec
+ Start 59: python_predicate_test
+ 59/61 Test #59: python_predicate_test .............. Passed 0.16 sec
+ Start 60: python_programmable_test
+ 60/61 Test #60: python_programmable_test ........... Passed 0.15 sec
+ Start 61: sqlitetest
+ 61/61 Test #61: sqlitetest ......................... Passed 0.55 sec
+
+ 97% tests passed, 2 tests failed out of 61
+
+ Total Test time (real) = 21.57 sec
+
+ The following tests FAILED:
+ 49 - pdal_plugins_cpd_kernel_test (OTHER_FAULT)
+ 55 - ocitest (Failed)
For a more verbose output, use the ``-V`` flag. Or, to run an individual test
suite, use ``-R <suite name>``. For example::
- $ ctest -V -R pdal_io_test
+ $ ctest -V -R pdal_io_bpf_test
Should produce output similar to::
- UpdateCTestConfiguration from :/path/to/pdal/build/DartConfiguration.tcl
- UpdateCTestConfiguration from :/path/to/pdal/build/DartConfiguration.tcl
- Test project /path/to/pdal/build
- Constructing a list of tests
- Done constructing a list of tests
- Checking test dependency graph...
- Checking test dependency graph end
- test 2
- Start 2: pdal_io_test
-
- 2: Test command: /path/to/pdal/build/bin/pdal_io_test
- 2: Test timeout computed to be: 9.99988e+06
- 2: Running main() from gtest_main.cc
- 2: [==========] Running 28 tests from 8 test cases.
- 2: [----------] Global test environment set-up.
- 2: [----------] 7 tests from BPFTest
- 2: [ RUN ] BPFTest.test_point_major
- 2: [ OK ] BPFTest.test_point_major (8 ms)
- 2: [ RUN ] BPFTest.test_dim_major
- 2: [ OK ] BPFTest.test_dim_major (2 ms)
- 2: [ RUN ] BPFTest.test_byte_major
- 2: [ OK ] BPFTest.test_byte_major (3 ms)
- 2: [ RUN ] BPFTest.test_point_major_zlib
- 2: [ OK ] BPFTest.test_point_major_zlib (4 ms)
- 2: [ RUN ] BPFTest.test_dim_major_zlib
- 2: [ OK ] BPFTest.test_dim_major_zlib (3 ms)
- 2: [ RUN ] BPFTest.test_byte_major_zlib
- 2: [ OK ] BPFTest.test_byte_major_zlib (4 ms)
- 2: [ RUN ] BPFTest.inspect
- 2: [ OK ] BPFTest.inspect (0 ms)
- 2: [----------] 7 tests from BPFTest (24 ms total)
- 2:
- ...
- 2:
- 2: [----------] Global test environment tear-down
- 2: [==========] 28 tests from 8 test cases ran. (1195 ms total)
- 2: [ PASSED ] 28 tests.
- 1/1 Test #2: pdal_io_test ..................... Passed 1.24 sec
-
- The following tests passed:
- pdal_io_test
-
- 100% tests passed, 0 tests failed out of 1
-
- Total Test time (real) = 1.24 sec
-
-Alternately, one can run individual unit tests directly::
+ UpdateCTestConfiguration from :/Users/hobu/dev/git/pdal/DartConfiguration.tcl
+ UpdateCTestConfiguration from :/Users/hobu/dev/git/pdal/DartConfiguration.tcl
+ Test project /Users/hobu/dev/git/pdal
+ Constructing a list of tests
+ Done constructing a list of tests
+ Checking test dependency graph...
+ Checking test dependency graph end
+ test 18
+ Start 18: pdal_io_bpf_test
+
+ 18: Test command: /Users/hobu/dev/git/pdal/bin/pdal_io_bpf_test
+ 18: Environment variables:
+ 18: PDAL_DRIVER_PATH=/Users/hobu/dev/git/pdal/lib
+ 18: Test timeout computed to be: 9.99988e+06
+ 18: [==========] Running 20 tests from 1 test case.
+ 18: [----------] Global test environment set-up.
+ 18: [----------] 20 tests from BPFTest
+ 18: [ RUN ] BPFTest.test_point_major
+ 18: [ OK ] BPFTest.test_point_major (8 ms)
+ 18: [ RUN ] BPFTest.test_dim_major
+ 18: [ OK ] BPFTest.test_dim_major (3 ms)
+ 18: [ RUN ] BPFTest.test_byte_major
+ 18: [ OK ] BPFTest.test_byte_major (4 ms)
+ 18: [ RUN ] BPFTest.test_point_major_zlib
+ 18: [ OK ] BPFTest.test_point_major_zlib (6 ms)
+ 18: [ RUN ] BPFTest.test_dim_major_zlib
+ 18: [ OK ] BPFTest.test_dim_major_zlib (4 ms)
+ 18: [ RUN ] BPFTest.test_byte_major_zlib
+ 18: [ OK ] BPFTest.test_byte_major_zlib (5 ms)
+ 18: [ RUN ] BPFTest.roundtrip_byte
+ 18: [ OK ] BPFTest.roundtrip_byte (15 ms)
+ 18: [ RUN ] BPFTest.roundtrip_dimension
+ 18: [ OK ] BPFTest.roundtrip_dimension (10 ms)
+ 18: [ RUN ] BPFTest.roundtrip_point
+ 18: [ OK ] BPFTest.roundtrip_point (11 ms)
+ 18: [ RUN ] BPFTest.roundtrip_byte_compression
+ 18: [ OK ] BPFTest.roundtrip_byte_compression (16 ms)
+ 18: [ RUN ] BPFTest.roundtrip_dimension_compression
+ 18: [ OK ] BPFTest.roundtrip_dimension_compression (13 ms)
+ 18: [ RUN ] BPFTest.roundtrip_point_compression
+ 18: [ OK ] BPFTest.roundtrip_point_compression (14 ms)
+ 18: [ RUN ] BPFTest.roundtrip_scaling
+ 18: [ OK ] BPFTest.roundtrip_scaling (10 ms)
+ 18: [ RUN ] BPFTest.extra_bytes
+ 18: [ OK ] BPFTest.extra_bytes (15 ms)
+ 18: [ RUN ] BPFTest.bundled
+ 18: [ OK ] BPFTest.bundled (17 ms)
+ 18: [ RUN ] BPFTest.inspect
+ 18: [ OK ] BPFTest.inspect (1 ms)
+ 18: [ RUN ] BPFTest.mueller
+ 18: [ OK ] BPFTest.mueller (0 ms)
+ 18: [ RUN ] BPFTest.flex
+ 18: [ OK ] BPFTest.flex (9 ms)
+ 18: [ RUN ] BPFTest.flex2
+ 18: [ OK ] BPFTest.flex2 (7 ms)
+ 18: [ RUN ] BPFTest.outputdims
+ 18: [ OK ] BPFTest.outputdims (14 ms)
+ 18: [----------] 20 tests from BPFTest (182 ms total)
+ 18:
+ 18: [----------] Global test environment tear-down
+ 18: [==========] 20 tests from 1 test case ran. (182 ms total)
+ 18: [ PASSED ] 20 tests.
+ 1/1 Test #18: pdal_io_bpf_test ................. Passed 0.20 sec
+
+ The following tests passed:
+ pdal_io_bpf_test
+
+ 100% tests passed, 0 tests failed out of 1
+
$ bin/pdal_io_test
Again, the output should resemble the following::
- Running main() from gtest_main.cc
- [==========] Running 28 tests from 8 test cases.
- [----------] Global test environment set-up.
- [----------] 7 tests from BPFTest
- [ RUN ] BPFTest.test_point_major
- [ OK ] BPFTest.test_point_major (5 ms)
- [ RUN ] BPFTest.test_dim_major
- [ OK ] BPFTest.test_dim_major (2 ms)
- [ RUN ] BPFTest.test_byte_major
- [ OK ] BPFTest.test_byte_major (3 ms)
- [ RUN ] BPFTest.test_point_major_zlib
- [ OK ] BPFTest.test_point_major_zlib (4 ms)
- [ RUN ] BPFTest.test_dim_major_zlib
- [ OK ] BPFTest.test_dim_major_zlib (3 ms)
- [ RUN ] BPFTest.test_byte_major_zlib
- [ OK ] BPFTest.test_byte_major_zlib (3 ms)
- [ RUN ] BPFTest.inspect
- [ OK ] BPFTest.inspect (0 ms)
- [----------] 7 tests from BPFTest (21 ms total)
-
- ...
-
- [----------] Global test environment tear-down
- [==========] 28 tests from 8 test cases ran. (1180 ms total)
- [ PASSED ] 28 tests.
+ [==========] Running 20 tests from 1 test case.
+ [----------] Global test environment set-up.
+ [----------] 20 tests from BPFTest
+ [ RUN ] BPFTest.test_point_major
+ [ OK ] BPFTest.test_point_major (7 ms)
+ [ RUN ] BPFTest.test_dim_major
+ [ OK ] BPFTest.test_dim_major (3 ms)
+ [ RUN ] BPFTest.test_byte_major
+ [ OK ] BPFTest.test_byte_major (4 ms)
+ [ RUN ] BPFTest.test_point_major_zlib
+ [ OK ] BPFTest.test_point_major_zlib (5 ms)
+ [ RUN ] BPFTest.test_dim_major_zlib
+ [ OK ] BPFTest.test_dim_major_zlib (5 ms)
+ [ RUN ] BPFTest.test_byte_major_zlib
+ [ OK ] BPFTest.test_byte_major_zlib (6 ms)
+ [ RUN ] BPFTest.roundtrip_byte
+ [ OK ] BPFTest.roundtrip_byte (17 ms)
+ [ RUN ] BPFTest.roundtrip_dimension
+ [ OK ] BPFTest.roundtrip_dimension (10 ms)
+ [ RUN ] BPFTest.roundtrip_point
+ [ OK ] BPFTest.roundtrip_point (11 ms)
+ [ RUN ] BPFTest.roundtrip_byte_compression
+ [ OK ] BPFTest.roundtrip_byte_compression (15 ms)
+ [ RUN ] BPFTest.roundtrip_dimension_compression
+ [ OK ] BPFTest.roundtrip_dimension_compression (14 ms)
+ [ RUN ] BPFTest.roundtrip_point_compression
+ [ OK ] BPFTest.roundtrip_point_compression (14 ms)
+ [ RUN ] BPFTest.roundtrip_scaling
+ [ OK ] BPFTest.roundtrip_scaling (11 ms)
+ [ RUN ] BPFTest.extra_bytes
+ [ OK ] BPFTest.extra_bytes (16 ms)
+ [ RUN ] BPFTest.bundled
+ [ OK ] BPFTest.bundled (17 ms)
+ [ RUN ] BPFTest.inspect
+ [ OK ] BPFTest.inspect (1 ms)
+ [ RUN ] BPFTest.mueller
+ [ OK ] BPFTest.mueller (0 ms)
+ [ RUN ] BPFTest.flex
+ [ OK ] BPFTest.flex (8 ms)
+ [ RUN ] BPFTest.flex2
+ [ OK ] BPFTest.flex2 (7 ms)
+ [ RUN ] BPFTest.outputdims
+ [ OK ] BPFTest.outputdims (14 ms)
+ [----------] 20 tests from BPFTest (185 ms total)
+
+ [----------] Global test environment tear-down
+ [==========] 20 tests from 1 test case ran. (185 ms total)
+ [ PASSED ] 20 tests.
This invocation allows us to alter Google Test's default behavior. For more on
the available flags type::
diff --git a/doc/development/usecases.rst b/doc/development/usecases.rst
deleted file mode 100644
index bad513d..0000000
--- a/doc/development/usecases.rst
+++ /dev/null
@@ -1,99 +0,0 @@
-.. _development_usecases:
-
-================================
-Use Cases
-================================
-
-This document lists some use cases that we would like PDAL to be able to
-satisfy. We are speaking here about PDAL at the API level, and not the
-command line apps that come with it (although in many cases the apps will
-directly address these use cases).
-
-Note we have the cases explicitly numbered, so we can refer back to them
-from elsewhere.
-
-Many of these cases these use cases are composable (such as 1a and 3a).
-
-This list is intended to be representative of workflows we want to target,
-but is by no means intended to be an exhaustive list.
-
-
-The Use Cases
-=============
-
-1. straight format conversion
-
- a. convert an ASCII file to LAS
-
- b. compress LAS to lossless LAZ
-
-2. mosaicking and demosaicking
-
- a. user has a set of N tiles and wants to merge them into 1 file
-
- b. user has 1 large file and wants to chop up into N files, based on
- a given bbox size or a given target file size (or point count)
-
-3. basic filtering/processing operations
-
- a. crop a file to a given spatial extent
-
- b. remove points with a given classification
-
- c. decimate the file (discard 9 of every 10 points)
-
- d. ...
-
-4. info and metadata
-
- a. display (or dump to XML) the properties of the point cloud (extents,
- number of points, etc)
-
- b. display/dump the spatial reference system of the file
-
- c. display/dump any metadata in the file, such as creation date, weather
- conditions, etc
-
- d. collect and display statistics about the file, such as the elevation
- distribution, point density, etc
-
-5. projection
-
- a. assign an SRS to a file that does not have one (or overwrite the
- existing one)
-
- b. reproject the points in a file to a new SRS
-
-6. indexing and caching
-
- a. construct a spatial index for a point cloud, such that points within a
- relatively small given region can quickly be accessed
-
- b. merge (mosaic) two files that are both indexed
-
- c. given a file, allow for repeated access to a point during a single run
- without additional I/O
-
-7. DEM construction, rasterization, colorization
-
- a. given an XYZ point cloud, produce a regular XY grid of the Z elevation
- points
-
- b. similar to 7a, but colorize each point based on a given color ramp and
- the elevation height Z
-
-8. 3D visualization
-
- a. basic, static display of a point cloud
-
- b. same as (a), but with colorization of Z, simple filtering, etc
-
- c. use indexing and caching (6a and 6c) to provide useful interactive
- behaviour
-
- d. given a DEM and a raster, display the raster draped over the surface
-
-9. Fixup, Cleanup
-
- a. given a file with an incorrect header (such as incorrect extents),
- create a file with the header corrected by otherwise identical
diff --git a/doc/docbuild/Dockerfile b/doc/docbuild/Dockerfile
new file mode 100644
index 0000000..475441d
--- /dev/null
+++ b/doc/docbuild/Dockerfile
@@ -0,0 +1,28 @@
+FROM ubuntu:15.10
+
+RUN apt-get -y update && apt-get install -y python-dev python-pip
+RUN apt-get install -y g++
+RUN apt-get install -y doxygen dvipng
+RUN apt-get install -y cmake libjpeg8-dev zlib1g-dev texlive-latex-base texlive-latex-extra
+RUN apt-get install -y git
+RUN apt-get install -y graphviz
+
+RUN pip install Sphinx rst2pdf breathe sphinx_bootstrap_theme awscli
+
+RUN useradd pdal
+RUN mkdir /home/pdal&& chown -R pdal: /home/pdal
+
+RUN mkdir /root/.ssh
+RUN ssh-keyscan github.com >> /root/.ssh/known_hosts
+WORKDIR /home/pdal
+RUN git clone https://github.com/PDAL/PDAL.git pdal
+RUN git config --global push.default matching
+RUN git config --global user.email "pdal at hobu.net"
+RUN git config --global user.name "PDAL Automated Dockerfile"
+
+VOLUME /data
+
+ADD run.sh /home/pdal/run.sh
+
+# docker run --rm --volumes-from docbuild pdal-doc-build ls -al /data
+# docker create -v $(pwd)/output:/data --name docbuild pdal-doc-build
diff --git a/doc/docbuild/run.sh b/doc/docbuild/run.sh
new file mode 100755
index 0000000..ef51575
--- /dev/null
+++ b/doc/docbuild/run.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+BUILDDIR=/data
+cd /home/pdal/pdal
+git pull
+cd doc
+make doxygen BUILDDIR=$BUILDDIR
+make html BUILDDIR=$BUILDDIR
diff --git a/doc/docs.rst b/doc/docs.rst
deleted file mode 100644
index 7dd4e25..0000000
--- a/doc/docs.rst
+++ /dev/null
@@ -1,34 +0,0 @@
-.. _docs:
-
-******************************************************************************
-PDAL Documentation
-******************************************************************************
-
-
-Contents:
-
-.. toctree::
- :maxdepth: 2
-
- download
- compilation/index
- commandline/index
- apps
- stages/index
- pipeline
- vagranttutorial
- community
- faq
- development/index
- tutorial/index
- api/index
- metadata
- copyright
-
-Indices and tables
-==================
-
-* :ref:`genindex`
-* :ref:`modindex`
-* :ref:`search`
-
diff --git a/doc/download.rst b/doc/download.rst
index ee3f43f..a79978e 100644
--- a/doc/download.rst
+++ b/doc/download.rst
@@ -8,16 +8,20 @@ Download
Current Release(s)
------------------------------------------------------------------------------
-* **2015-09-10** `PDAL-1.0.0-src.tar.gz`_ (`md5`_)
+* **2015-09-11** `PDAL-1.0.1-src.tar.gz`_ (`md5`_)
-.. _`PDAL-1.0.0-src.tar.gz`: http://download.osgeo.org/pdal/PDAL-1.0.0-src.tar.gz
-.. _`md5`: http://download.osgeo.org/pdal/PDAL-1.0.0-src.tar.gz.md5
+.. _`PDAL-1.0.1-src.tar.gz`: http://download.osgeo.org/pdal/PDAL-1.0.1-src.tar.gz
+.. _`md5`: http://download.osgeo.org/pdal/PDAL-1.0.1-src.tar.gz.md5
.. _`DebianGIS`: http://wiki.debian.org/DebianGis
Past Releases
------------------------------------------------------------------------------
+* **2015-09-10** `PDAL-1.0.0-src.tar.gz`_
+
+.. _`PDAL-1.0.0-src.tar.gz`: http://download.osgeo.org/pdal/PDAL-1.0.0-src.tar.gz
+
.. _source:
@@ -35,8 +39,11 @@ You can obtain a copy of the active source code by issuing the following command
Binaries
------------------------------------------------------------------------------
-A 1.0.0 release of PDAL is available via `OSGeo4W`_, however it is only
-64-bit at this time.
+Windows
+................................................................................
+
+A 1.0.1 release of PDAL is available via `OSGeo4W`_. It is only 64-bit at this
+time.
RPMs
................................................................................
diff --git a/doc/faq.rst b/doc/faq.rst
index f4a660c..bfe1969 100644
--- a/doc/faq.rst
+++ b/doc/faq.rst
@@ -4,6 +4,8 @@
FAQ
******************************************************************************
+.. index:: pronounce
+
* How do you pronounce PDAL?
The proper spelling of the project name is PDAL, in uppercase. It is
@@ -30,6 +32,11 @@ FAQ
under an open source license (this applies to the whole library and
all command line tools).
+ .. seealso::
+
+ :ref:`apps` describes application operations you can
+ achieve with PDAL.
+
* Is there any compatibility with libLAS's LAS Utility Applications or LAStools?
No. The the command line interface was developed from scratch with
diff --git a/doc/index.rst b/doc/index.rst
index c8c5e4d..8f3167f 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -4,42 +4,80 @@
PDAL - Point Data Abstraction Library
******************************************************************************
-PDAL is a `BSD licensed`_ library for translating and manipulating `point cloud
-data`_ of various formats. PDAL can be used to read, write and translate
-point cloud data in many formats. Support is included for input files of
-LAS, LAZ, SBET, BPF, QFIT and others. PDAL can also read from and write to
-databases that support point cloud storage, including Oracle, Postgres
-and SQLite.
+.. image:: ./_static/pdal_logo.png
+ :alt: PDAL logo
+ :align: right
-PDAL should not be confused with `PCL`_ (Point Cloud Library). PCL is a
-library specifically designed
-to provide algorithmic analysis and modification of point clouds. PDAL
-provides a limited interface to the facilities of PCL, but does not in
-general attempt to duplicate its capabilites. See :ref:`filters.pclblock`
-for more background
+PDAL is a C++ `BSD`_ library for translating and manipulating `point cloud data`_.
+It is very much like the `GDAL`_ library which handles raster and vector data.
+See :ref:`readers` and :ref:`writers` for data formats PDAL supports, and see
+:ref:`filters` for filtering operations that you can apply with PDAL.
+
+In addition to the library code, PDAL provides a suite of command-line
+applications that users can conveniently use to process, filter, translate, and
+query point cloud data. See :ref:`apps` for more information.
+
+
+Documentation
+=================
+
+.. toctree::
+ :maxdepth: 2
+
+ download
+ compilation/index
+ apps
+ community
+ stages/index
+ tutorial/index
+ vagrant
+ pipeline
+ faq
+ development/index
+ api/index
+ metadata
+ copyright
Developers and Sponsorship
------------------------------------------------------------------------------
PDAL is developed by `Howard Butler`_, `Michael Gerlek`_, `Andrew Bell`_,
-`Brad Chambers`_ and others.
+`Brad Chambers`_ and `others`_.
+
+PDAL's development is supported in coordination with efforts by the `U.S. Army
+Cold Regions Research and Engineering Laboratory`_.
+
+
+.. note::
+
+ PDAL should not be confused with `PCL`_ (Point Cloud Library). PCL is a
+ library specifically designed to provide algorithmic analysis and
+ modification of point clouds. PDAL provides a limited interface to the
+ facilities of PCL, but does not in general attempt to duplicate its
+ capabilites. PDAL is focused more on data access and translation than
+ PCL. See :ref:`filters.pclblock` for more background.
+
+
+
+
+Indices and tables
+==================
-PDAL's development is in coordination with efforts by the
-`U.S. Army Cold Regions Research and Engineering Laboratory`_.
+* :ref:`genindex`
+* :ref:`search`
-.. _`Aerial Services, Inc`: http://www.asi-gis.com/
-.. _`Point Cloud Library (PCL)`: http://pointclouds.org
+.. _`PCL`: http://pointclouds.org
.. _`GDAL`: http://www.gdal.org
-.. _`BSD licensed`: http://www.opensource.org/licenses/bsd-license.php
+.. _`BSD`: http://www.opensource.org/licenses/bsd-license.php
.. _`point cloud data`: http://en.wikipedia.org/wiki/Point_cloud
.. _`LIDAR`: http://en.wikipedia.org/wiki/LIDAR
.. _`U.S. Army Cold Regions Research and Engineering Laboratory` : http://www.crrel.usace.army.mil/
-.. _`PDL`: http://pointclouds.org
-.. _`Howard Butler`: http://hobu.co
-.. _`Andrew Bell`: http://hobu.co
-.. _`Michael Gerlek`: http://www.radiantblue.com
-.. _`Brad Chambers`: http://www.radiantblue.com
+.. _`Howard Butler`: http://github.com/hobu
+.. _`Andrew Bell`: http://github.com/abellgithub
+.. _`Michael Gerlek`: http://github.com/mpgerlek
+.. _`Brad Chambers`: http://github.com/chambbj
+.. _`others`: http://github.com/PDAL/PDAL/graphs/contributors
diff --git a/doc/metadata.rst b/doc/metadata.rst
index e362ff5..7882f5c 100644
--- a/doc/metadata.rst
+++ b/doc/metadata.rst
@@ -152,7 +152,7 @@ A more interesting metadata tree might come from the
}
}
-.. _metadataxml:
+.. _metadatajson:
:ref:`Pipeline` XML representation
------------------------------------------------------------------------------
diff --git a/doc/stages/filters.attribute.rst b/doc/stages/filters.attribute.rst
index b60c9cf..0e468be 100644
--- a/doc/stages/filters.attribute.rst
+++ b/doc/stages/filters.attribute.rst
@@ -4,12 +4,13 @@ filters.attribute
===================
The attribute filter allows you to set the values of a
-selected dimension. There are three possible scenarios that
-are currently supported:
+selected dimension. Two scenarios are supported:
-* Set all points in a dimension to single value
+* Set the value of a dimension of all points to single value
+ (use option 'value')
* Set points inside an OGR-readable Polygon or MultiPolygon
+ (use option 'datasource')
OGR SQL support
----------------
@@ -28,21 +29,52 @@ but that may be added in the future.
.. _`ExecuteSQL`: http://www.gdal.org/ogr__api_8h.html#a9892ecb0bf61add295bd9decdb13797a
+Example 1
+---------
-.. warning::
+In this scenario, we are altering the attributes of the dimension
+'Classification'. Points from autzen-dd.las that lie within a feature will
+have their classification to match the 'CLS' field associated with that
+feature.
- If no `datasource` is given, it is assumed that the query
- is setting all of the values for the given dimension to the
- `value` option.
+.. code-block:: xml
-Example
--------
+ <?xml version="2.0" encoding="utf-8"?>
+ <Pipeline version="1.0">
+ <Writer type="writers.las">
+ <Option name="filename">
+ attributed.las
+ </Option>
+ <Option name="forward">
+ all
+ </Option>
+ <Filter type="filters.attribute">
+ <Option name="dimension">
+ Classification
+ </Option>
+ <Option name="datasource">
+ ./test/data/autzen/attributes.shp
+ </Option>
+ <Option name="layer">
+ attributes
+ </Option>
+ <Option name="column">
+ CLS
+ </Option>
+ <Reader type="readers.las">
+ <Option name="filename">
+ ../autzen/autzen-dd.las
+ </Option>
+ </Reader>
+ </Filter>
+ </Writer>
+ </Pipeline>
-In this scenario, we are altering the attributes of three
-dimensions -- `Classification`, `PointSourceId`, and `Intensity`. The
-`PointSourceId` will simply be set to the single value `26`, while
-`Classification` and `Intensity` will have their values set when the
-candidate point is inside a polygon with that polygon's attribute.
+Example 2
+---------
+
+This pipeline sets the PointSourceId of all points from 'autzen-dd.las'
+to the value '26'.
.. code-block:: xml
@@ -52,48 +84,59 @@ candidate point is inside a polygon with that polygon's attribute.
<Option name="filename">
attributed.las
</Option>
- <Option name="scale_x">
- 0.0000001
- </Option>
- <Option name="scale_y">
- 0.0000001
+ <Option name="forward">
+ all
</Option>
<Filter type="filters.attribute">
<Option name="dimension">
- Classification
- <Options>
- <Option name="datasource">
- ./test/data/autzen/attributes.shp
- </Option>
- <Option name="layer">
- attributes
- </Option>
- <Option name="column">
- CLS
- </Option>
- </Options>
+ PointSourceId
+ </Option>
+ <Option name="value">
+ 26
</Option>
+ <Option name="datasource">
+ ./test/data/autzen/attributes.shp
+ </Option>
+ <Reader type="readers.las">
+ <Option name="filename">
+ ../autzen/autzen-dd.las
+ </Option>
+ </Reader>
+ </Filter>
+ </Writer>
+ </Pipeline>
+
+Example 3
+--------------------------------------------------------------------------------
+
+This example sets the Intensity attribute to ``CLS`` values read from the
+`OGR SQL`_ query.
+
+.. _`OGR SQL`: http://www.gdal.org/ogr_sql_sqlite.html
+
+.. code-block:: xml
+
+ <?xml version="2.0" encoding="utf-8"?>
+ <Pipeline version="1.0">
+ <Writer type="writers.las">
+ <Option name="filename">
+ attributed.las
+ </Option>
+ <Option name="forward">
+ all
+ </Option>
+ <Filter type="filters.attribute">
<Option name="dimension">
Intensity
- <Options>
- <Option name="datasource">
- ./test/data/autzen/attributes.shp
- </Option>
- <Option name="query">
- SELECT CLS FROM attributes where cls!=6
- </Option>
- <Option name="column">
- CLS
- </Option>
- </Options>
</Option>
- <Option name="dimension">
- PointSourceId
- <Options>
- <Option name="value">
- 26
- </Option>
- </Options>
+ <Option name="datasource">
+ ./test/data/autzen/attributes.shp
+ </Option>
+ <Option name="query">
+ SELECT CLS FROM attributes where cls != 6
+ </Option>
+ <Option name="column">
+ CLS
</Option>
<Reader type="readers.las">
<Option name="filename">
@@ -104,24 +147,26 @@ candidate point is inside a polygon with that polygon's attribute.
</Writer>
</Pipeline>
-
Options
-------
dimension
- A dimension Option with an Options block containing at least a "value"
- Option to set all points.
+ Name of the dimension whose value should be altered. [Default: none]
- * value: The value to set all points to for the given dimension
+value
+ Value to apply to the dimension. [Default: none]
- * datasource: OGR-readable datasource for Polygon or MultiPolygon data
+datasource
+ OGR-readable datasource for Polygon or MultiPolygon data. [Default: none]
- * column: The column from which to read the attribute. If none is
- specified, the first column is used.
+column
+ The OGR datasource column from which to read the attribute.
+ [Default: first column]
- * query: The OGR SQL query to execute on the datasource to fetch
- geometry and attributes.
+query
+ OGR SQL query to execute on the datasource to fetch geometry and attributes.
+ [Default: none]
- * layer: The data source's layer to use. If none is specified, the
- first one is used.
+layer
+ The data source's layer to use. [Defalt: first layer]
diff --git a/doc/stages/filters.chipper.rst b/doc/stages/filters.chipper.rst
index 77803a9..0fb44b8 100644
--- a/doc/stages/filters.chipper.rst
+++ b/doc/stages/filters.chipper.rst
@@ -7,6 +7,11 @@ The chipper filter takes a single large point cloud and converts it into a set
of smaller clouds, or chips. The chips are all spatially contiguous and
non-overlapping, so the result is a an irregular tiling of the input data.
+.. seealso::
+
+ :ref:`split_command` utilizes the :ref:`filters.chipper` to split
+ data by capacity.
+
.. figure:: filters.chipper.img1.png
:scale: 100 %
:alt: Points before chipping
@@ -19,10 +24,10 @@ non-overlapping, so the result is a an irregular tiling of the input data.
:alt: Points after chipping
After chipping, the points are tiled into smaller contiguous chips.
-
+
Chipping is usually applied to data read from files (which produce one large
stream of points) before the points are written to a database (which prefer
-data segmented into smaller blocks).
+data segmented into smaller blocks).
Example
-------
@@ -49,4 +54,4 @@ capacity
How many points to fit into each chip. The number of points in each chip will
not exceed this value, and will sometimes be less than it. [Default:
**5000**]
-
+
diff --git a/doc/stages/filters.colorization.rst b/doc/stages/filters.colorization.rst
index 64bc0be..cffcd69 100644
--- a/doc/stages/filters.colorization.rst
+++ b/doc/stages/filters.colorization.rst
@@ -20,26 +20,8 @@ The bands of the raster to apply to each are selected using the "band" option, a
<Writer type="writers.las">
<Option name="filename">colorized.las</Option>
<Filter type="filters.colorization">
- <Option name="dimension">
- Red
- <Options>
- <Option name="band">1</Option>
- <Option name="scale">1.0</Option>
- </Options>
- </Option>
- <Option name="dimension">
- Green
- <Options>
- <Option name="band">2</Option>
- <Option name="scale">1.0</Option>
- </Options>
- </Option>
- <Option name="dimension">
- Blue
- <Options>
- <Option name="band">3</Option>
- <Option name="scale">256</Option>
- </Options>
+ <Option name="dimensions">
+ Red:1:1.0, Blue, Green::256.0
</Option>
<Option name="raster">aerial.tif</Option>
<Reader type="readers.las">
@@ -50,6 +32,61 @@ The bands of the raster to apply to each are selected using the "band" option, a
</Pipeline>
+Considerations
+--------------------------------------------------------------------------------
+
+Certain data configurations can cause degenerate filter behavior. One significant
+knob to adjust is the ``GDAL_CACHEMAX`` environment variable. One driver which
+can have issues is when a `TIFF`_ file is striped vs. tiled. GDAL's data access
+in that situation is likely to cause lots of re-reading if the cache isn't large
+enough.
+
+Consider a striped TIFF file of 286mb:
+
+::
+
+ -rw-r-----@ 1 hobu staff 286M Oct 29 16:58 orth-striped.tif
+
+::
+
+ <?xml version="1.0" encoding="utf-8"?>
+ <Pipeline version="1.0">
+ <Writer type="writers.las">
+ <Option name="filename">coloured-striped.las</Option>
+ <Filter type="filters.colorization">
+ <Option name="raster">orth-striped.tif</Option>
+ <Reader type="readers.las">
+ <Option name="filename">colourless.laz</Option>
+ </Reader>
+ </Filter>
+ </Writer>
+ </Pipeline>
+
+Simple application of the :ref:`filters.colorization` using the striped `TIFF`_
+with a 268mb :ref:`readers.las` file will take nearly 1:54.
+
+.. _`TIFF`: http://www.gdal.org/frmt_gtiff.html
+
+::
+
+ [hobu at pyro knudsen (master)]$ time ~/dev/git/pdal/bin/pdal pipeline -i striped.xml
+
+ real 1m53.477s
+ user 1m20.018s
+ sys 0m33.397s
+
+
+Setting the ``GDAL_CACHEMAX`` variable to a size larger than the TIFF file
+dramatically speeds up the color fetching:
+
+::
+
+ [hobu at pyro knudsen (master)]$ export GDAL_CACHEMAX=500
+ [hobu at pyro knudsen (master)]$ time ~/dev/git/pdal/bin/pdal pipeline striped.xml
+
+ real 0m19.034s
+ user 0m15.557s
+ sys 0m1.102s
Options
-------
@@ -57,20 +94,13 @@ Options
raster
The raster file to read the band from. Any format supported by `GDAL`_ may be read.
-dimension
- A dimension to populate with values from the raster file. There may be multiple dimension options declared. The dimension name should be supplied, and an options list indicating the raster band to read from and the scaling to apply.
-
- band
- The raster band from which to read values for this dimension.
-
- scale
- The scaling factor to apply to the value read from the raster. [Default: **1.0**]
-
-x_dim
- The point dimension to use for the x dimension [Default: **X**]
-
-y_dim
- The point dimension to use for the y dimension [Default: **Y**]
-
+dimensions
+ A comma separated list of dimensions to populate with values from the raster
+ file. The format of each dimension is <name>:<band_number>:<scale_factor>.
+ Either or both of band number and scale factor may be omitted as may ':'
+ separators if the data is not ambiguous. If not supplied, band numbers
+ begin at 1 and increment from the band number of the previous dimension.
+ If not supplied, the scaling factor is 1.0.
+ [Default: "Red:1:1.0, Green:2:1.0, Blue:3:1.0"]
.. _GDAL: http://gdal.org
diff --git a/doc/stages/filters.dartsample.rst b/doc/stages/filters.dartsample.rst
new file mode 100644
index 0000000..ddff730
--- /dev/null
+++ b/doc/stages/filters.dartsample.rst
@@ -0,0 +1,24 @@
+.. _filters.dartthrowing:
+
+===============================================================================
+filters.dartthrowing
+===============================================================================
+
+The practice of performing Poisson sampling via "Dart Throwing" was introduced in the mid-1980's by [Cook1986]_ and [Dippe1985]_, and has been applied to point clouds in other software [Mesh2009]_. Our implementation is a brute force approach that randomly selects points from the input ``PointView``, adding them to the output ``PointView`` subject to the minimum distance constraint (the ``radius``). The full layout (i.e., the dimensions) of the input ``PointView`` is kept in tact (the sa [...]
+
+.. seealso::
+
+ :ref:`filters.decimation` and :ref:`filters.voxelgrid` also perform
+ decimation.
+
+.. [Cook1986] Cook, Robert L. "Stochastic sampling in computer graphics." *ACM Transactions on Graphics (TOG)* 5.1 (1986): 51-72.
+
+.. [Dippe1985] Dippé, Mark AZ, and Erling Henry Wold. "Antialiasing through stochastic sampling." *ACM Siggraph Computer Graphics* 19.3 (1985): 69-78.
+
+.. [Mesh2009] ALoopingIcon. "Meshing Point Clouds." *MESHLAB STUFF*. n.p., 7 Sept. 2009. Web. 13 Nov. 2015.
+
+Options
+-------------------------------------------------------------------------------
+
+radius
+ Minimum distance between samples. [Default: **1.0**]
diff --git a/doc/stages/filters.decimation.rst b/doc/stages/filters.decimation.rst
index 49efc22..c6c8f77 100644
--- a/doc/stages/filters.decimation.rst
+++ b/doc/stages/filters.decimation.rst
@@ -1,9 +1,12 @@
-.. _filters_decimation:
+.. _filters.decimation:
filters.decimation
==================
-The decimation filter takes a stream of points and steps through it, taking only every Nth point. With a step of 2, the filter takes every second point, for a reduction of 50%. With a step of 10, the filter takes every tenth point, for a reduction of 90%.
+The decimation filter takes a stream of points and steps through it, taking
+only every Nth point. With a step of 2, the filter takes every second point,
+for a reduction of 50%. With a step of 10, the filter takes every tenth point,
+for a reduction of 90%.
Example
-------
@@ -23,11 +26,15 @@ Example
</Writer>
</Pipeline>
+.. seealso::
+
+ :ref:`filters.voxelgrid` provides grid-style point decimation.
+
Options
-------
step
How many points to skip between each sample point? A step of 1 will skip no point, and leave the stream unchanged. A step of 100 will reduce the stream by 99%. [Default: **1**]
-
+
offset
Start sampling with what point? [Default: **0**]
diff --git a/doc/stages/filters.divider.rst b/doc/stages/filters.divider.rst
new file mode 100644
index 0000000..636f04e
--- /dev/null
+++ b/doc/stages/filters.divider.rst
@@ -0,0 +1,55 @@
+.. _filters.divider:
+
+filters.divider
+===============================================================================
+
+The divider filter breaks a point view into a set of smaller point views
+based on simple criteria. The number of subsets can be specified explicitly,
+or one can specify a maximum point count for each subset. Additionally,
+points can be placed into each subset sequentially (as they appear in the
+input) or in round-robin fashion.
+
+Normally points are divided into subsets to facilitate output by writers
+that support creating multiple output files with a template (LAS and BPF
+are notable examples).
+
+Example
+-------
+
+This pipeline will create 10 output files from the input file readers.las.
+
+.. code-block:: xml
+
+ <?xml version="1.0" encoding="utf-8"?>
+ <Pipeline version="1.0">
+ <Writer type="writers.las">
+ <Option name="filename">out_#.las</Option>
+ <Filter type="filters.divider">
+ <Option name="count">10</Option>
+ <Reader type="readers.las">
+ <Option name="filename">example.las</Option>
+ </Reader>
+ </Filter>
+ </Writer>
+ </Pipeline>
+
+Options
+-------
+
+mode
+ A mode of 'partition' will write sequential points to an output view until
+ the view meets its predetermined size. 'round_robin' mode will iterate
+ through the output views as it writes sequential points.
+ [Default: 'partition']
+
+count
+ Number of output views. [Default: none]
+
+capacity
+ Maximum number of points in each output view. Views will contain
+ approximately equal numbers of points. [Default: none]
+
+.. warning::
+
+ You must specify exactly one of either 'count' or 'capacity'.
+
diff --git a/doc/stages/filters.ferry.rst b/doc/stages/filters.ferry.rst
index 3a9c5af..b9acfb5 100644
--- a/doc/stages/filters.ferry.rst
+++ b/doc/stages/filters.ferry.rst
@@ -1,7 +1,7 @@
.. _filters.ferry:
filters.ferry
-============
+================================================================================
The ferry filter is used to stash intermediate variables as part of
processing data. For example, a common scenario is to keep both the
@@ -39,21 +39,8 @@ processing, can then operate on these data.
0.0000001
</Option>
<Filter type="filters.ferry">
- <Option name="dimension">
- X
- <Options>
- <Option name="to">
- StatePlaneX
- </Option>
- </Options>
- </Option>
- <Option name="dimension">
- Y
- <Options>
- <Option name="to">
- StatePlaneY
- </Option>
- </Options>
+ <Option name="dimensions">
+ X = StatePlaneX, Y=StatePlaneY
</Option>
<Reader type="readers.las">
<Option name="filename">
@@ -71,10 +58,9 @@ processing, can then operate on these data.
Options
-------
-dimension
- A dimension Option with an Options block containing at least a "to" dimension
- name. If the "to" dimension already exists, it will be used. If it does not,
- it will be created as a dimension of type `double`.
-
- * to: The dimension to copy the data to. The data are currently read as
- doubles and put into the output dimension as double.
+dimensions
+ A list of dimensions whose values should be copied to the specified
+ dimensions.
+ The format of the option is <from>=<to>, <from>=<to>,... Spaces are ignored.
+ 'from' dimensions must exist and have been created by a reader or filter.
+ 'to' dimensions will be created if necessary.
diff --git a/doc/stages/filters.greedyprojection.rst b/doc/stages/filters.greedyprojection.rst
new file mode 100644
index 0000000..7482a99
--- /dev/null
+++ b/doc/stages/filters.greedyprojection.rst
@@ -0,0 +1,20 @@
+.. _filters.greedyprojection:
+
+===============================================================================
+filters.greedyprojection
+===============================================================================
+
+The Greedy Projection filter passes data through the Point Cloud Library
+(`PCL`_) GreedyProjectionTriangulation algorithm.
+
+GreedyProjectionTriangulation is an implementation of a greedy triangulation
+algorithm for 3D points based on local 2D projections. It assumes locally smooth
+surfaces and relatively smooth transitions between areas with different point
+densities.
+
+.. _`PCL`: http://www.pointclouds.org
+
+Options
+-------------------------------------------------------------------------------
+
+None at the moment. Relying on defaults within PCL.
diff --git a/doc/stages/filters.gridprojection.rst b/doc/stages/filters.gridprojection.rst
new file mode 100644
index 0000000..783c0b7
--- /dev/null
+++ b/doc/stages/filters.gridprojection.rst
@@ -0,0 +1,20 @@
+.. _filters.gridprojection:
+
+===============================================================================
+filters.gridprojection
+===============================================================================
+
+The Grid Projection filter passes data through the Point Cloud Library (`PCL`_)
+GridProjection algorithm.
+
+GridProjection is an implementation of the surface reconstruction method
+described in [Li2010]_.
+
+.. [Li2010] Li, Ruosi, et al. "Polygonizing extremal surfaces with manifold guarantees." Proceedings of the 14th ACM Symposium on Solid and Physical Modeling. ACM, 2010.
+
+.. _`PCL`: http://www.pointclouds.org
+
+Options
+-------------------------------------------------------------------------------
+
+None at the moment. Relying on defaults within PCL.
diff --git a/doc/stages/filters.ground.rst b/doc/stages/filters.ground.rst
new file mode 100644
index 0000000..25ff08f
--- /dev/null
+++ b/doc/stages/filters.ground.rst
@@ -0,0 +1,42 @@
+.. _filters.ground:
+
+===============================================================================
+filters.ground
+===============================================================================
+
+The Ground filter passes data through the Point Cloud Library (`PCL`_)
+ProgressiveMorphologicalFilter algorithm.
+
+ProgressiveMorphologicalFilter is an implementation of the method described in
+[Zhang2003]_.
+
+.. [Zhang2003] Zhang, Keqi, et al. "A progressive morphological filter for removing nonground measurements from airborne LIDAR data." Geoscience and Remote Sensing, IEEE Transactions on 41.4 (2003): 872-882.
+
+.. _`PCL`: http://www.pointclouds.org
+
+Options
+-------------------------------------------------------------------------------
+
+maxWindowSize
+ Maximum window size. [Default: **33**]
+
+slope
+ Slope. [Default: **1.0**]
+
+max_distance
+ Maximum distance. [Default: **2.5**]
+
+initial_distance
+ Initial distance. [Default: **0.15**]
+
+cell_size
+ Cell Size. [Default: **1**]
+
+classify
+ Apply classification labels? [Default: **true**]
+
+extract
+ Extract ground returns? [Default: **false**]
+
+approximate
+ Use approximate algorithm? [Default:: **false**]
diff --git a/doc/stages/filters.height.rst b/doc/stages/filters.height.rst
new file mode 100644
index 0000000..19136cd
--- /dev/null
+++ b/doc/stages/filters.height.rst
@@ -0,0 +1,12 @@
+.. _filters.height:
+
+===============================================================================
+filters.height
+===============================================================================
+
+The Height filter takes as input a point cloud with a Classification dimension, with ground points assigned the classification label of 2 (per LAS specification). It returns a point cloud with a new dimension ``Height`` that contains the normalized height value.
+
+Options
+-------------------------------------------------------------------------------
+
+None
diff --git a/doc/stages/filters.hexbin.rst b/doc/stages/filters.hexbin.rst
index 86547aa..7f420fd 100644
--- a/doc/stages/filters.hexbin.rst
+++ b/doc/stages/filters.hexbin.rst
@@ -61,8 +61,6 @@ Example
file-output.las
</Option>
<Filter type="filters.hexbin">
- <Option name="x_dim">readers.las.X</Option>
- <Option name="y_dim">readers.las.Y</Option>
<Option name="threshold">10</Option>
<Reader type="readers.las">
<Option name="filename">
@@ -77,14 +75,10 @@ Example
Options
-------
-x_dim
- The name of the dimension to use as the X coordinate in the cropping process. [Default: **X**]
-
-y_dim
- The name of the dimension to use as the Y coordinate in the cropping process. [Default: **Y**]
-
edge_size
- If not set, the hexbin filter will estimate a hex size based on a sample of the data. If set, hexbin will use the provided size in constructing the hexbins to test.
+ If not set, the hexbin filter will estimate a hex size based on a sample of
+ the data. If set, hexbin will use the provided size in constructing the
+ hexbins to test.
sample_size
How many points to sample when automatically calculating the edge size? [Default: **5000**]
diff --git a/doc/stages/filters.merge.rst b/doc/stages/filters.merge.rst
index 3aee80d..08ea7b3 100644
--- a/doc/stages/filters.merge.rst
+++ b/doc/stages/filters.merge.rst
@@ -1,13 +1,13 @@
.. _filters.merge:
filters.merge
-============
+===============================================================================
The merge filter combines input from multiple sources into a single output.
No checks are made to ensure that points from the various sources have similar
dimensions or are generally compatible. Notably, dimensions are not
initialized when points merged from various sources do not have dimensions in
-common.
+common.
Example
-------
diff --git a/doc/stages/filters.mortonorder.rst b/doc/stages/filters.mortonorder.rst
index a24e0ff..60e8e4b 100644
--- a/doc/stages/filters.mortonorder.rst
+++ b/doc/stages/filters.mortonorder.rst
@@ -1,7 +1,7 @@
.. _filters.mortonorder:
filters.mortonorder
-===========
+================================================================================
Sorts the XY data using `Morton ordering`_.
diff --git a/doc/stages/filters.movingleastsquares.rst b/doc/stages/filters.movingleastsquares.rst
new file mode 100644
index 0000000..ef829e3
--- /dev/null
+++ b/doc/stages/filters.movingleastsquares.rst
@@ -0,0 +1,22 @@
+.. _filters.movingleastsquares:
+
+===============================================================================
+filters.movingleastsquares
+===============================================================================
+
+The Moving Least Squares filter passes data through the Point Cloud Library
+(`PCL`_) MovingLeastSquares algorithm.
+
+MovingLeastSquares is an implementation of the MLS (Moving Least Squares)
+algorithm for data smoothing and improved normal estimation described in
+[Alexa2003]_. It also contains methods for upsampling the resulting cloud based
+on the parametric fit.
+
+.. [Alexa2003] Alexa, Marc, et al. "Computing and rendering point set surfaces." Visualization and Computer Graphics, IEEE Transactions on 9.1 (2003): 3-15.
+
+.. _`PCL`: http://www.pointclouds.org
+
+Options
+-------------------------------------------------------------------------------
+
+None at the moment. Relying on defaults within PCL.
diff --git a/doc/stages/filters.poisson.rst b/doc/stages/filters.poisson.rst
new file mode 100644
index 0000000..3326448
--- /dev/null
+++ b/doc/stages/filters.poisson.rst
@@ -0,0 +1,23 @@
+.. _filters.poisson:
+
+===============================================================================
+filters.poisson
+===============================================================================
+
+The Poisson filter passes data through the Point Cloud Library (`PCL`_) Poisson
+surface reconstruction algorithm.
+
+Poisson is an implementation of the method described in [Kazhdan2006]_.
+
+.. [Kazhdan2006] Kazhdan, Michael, Matthew Bolitho, and Hugues Hoppe. "Poisson surface reconstruction." Proceedings of the fourth Eurographics symposium on Geometry processing. Vol. 7. 2006.
+
+.. _`PCL`: http://www.pointclouds.org
+
+Options
+-------------------------------------------------------------------------------
+
+depth
+ Maximum depth of the tree used for reconstruction. [Default: **8**]
+
+point_weight
+ Importance of interpolation of point samples in the screened Poisson equation. [Default: **4.0**]
diff --git a/doc/stages/filters.predicate.rst b/doc/stages/filters.predicate.rst
index 4c50ec2..707375e 100644
--- a/doc/stages/filters.predicate.rst
+++ b/doc/stages/filters.predicate.rst
@@ -3,7 +3,10 @@
filters.predicate
=================
-Like the ref:`filters.programmable` filter, the predicate filter applies a `Python`_ function to a stream of points. Points can be retained/removed from the stream by setting true/false values into a special "Mask" dimension in the output point array.
+Like the :ref:`filters.programmable` filter, the predicate filter applies a
+`Python`_ function to a stream of points. Points can be retained/removed from
+the stream by setting true/false values into a special "Mask" dimension in the
+output point array.
.. code-block:: python
@@ -26,7 +29,23 @@ Like the ref:`filters.programmable` filter, the predicate filter applies a `Pyth
outs['Mask'] = keep
return True
-The example above sets the "mask" to true for points that are in classifications 1 or 2 and to false otherwise, causing points that are not classified 1 or 2 to be dropped from the point stream.
+The example above sets the "mask" to true for points that are in
+classifications 1 or 2 and to false otherwise, causing points that are not
+classified 1 or 2 to be dropped from the point stream.
+
+.. note::
+
+ :ref:`filters.range` is a specialized filter that implements the exact
+ functionality described in this Python operation. It is likely to be
+ much faster than Python, but not as flexible. :ref:`filters.predicate` and
+ :ref:`filters.programmable` are tools you can use for prototyping
+ point stream processing operations.
+
+.. seealso::
+
+ If you want to just read a :ref:`pipeline` of operations into a numpy
+ array, the PDAL Python extension might be what you want. See it at
+ https://pypi.python.org/pypi/PDAL
Example
-------
@@ -41,29 +60,29 @@ Example
</Option>
<Filter type="filters.predicate">
<Option name="function">filter</Option>
- <Option name="module">anything</Option>
+ <Option name="module">anything</Option>
<Option name="source">
import numpy as np
-
+
def filter(ins,outs):
cls = ins['Classification']
-
+
keep_classes = [1,2]
-
+
# Use the first test for our base array.
keep = np.equal(cls, keep_classes[0])
-
+
# For 1:n, test each predicate and join back
# to our existing predicate array
for k in range(1,len(keep_classes)):
t = np.equal(cls, keep_classes[k])
keep = keep + t
-
+
outs['Mask'] = keep
return True
-
- </Option>
+
+ </Option>
<Reader type="readers.las">
<Option name="filename">
file-input.las
diff --git a/doc/stages/filters.radiusoutlier.rst b/doc/stages/filters.radiusoutlier.rst
new file mode 100644
index 0000000..65c553e
--- /dev/null
+++ b/doc/stages/filters.radiusoutlier.rst
@@ -0,0 +1,31 @@
+.. _filters.radiusoutlier:
+
+===============================================================================
+filters.radiusoutlier
+===============================================================================
+
+The Radius Outlier filter passes data through the Point Cloud Library (`PCL`_)
+RadiusOutlierRemoval algorithm.
+
+RadiusOutlierRemoval filters points in a cloud based on the number of neighbors
+they have. Iterates through the entire input once, and for each point, retrieves
+the number of neighbors within a certain radius. The point will be considered an
+outlier if it has too few neighbors, as determined by ``min_neighbors``. The
+radius can be changed using ``radius``.
+
+.. _`PCL`: http://www.pointclouds.org
+
+Options
+-------------------------------------------------------------------------------
+
+min_neighbors
+ Minimum number of neighbors in radius. [Default: **2**]
+
+radius
+ Radius. [Default: **1.0**]
+
+classify
+ Apply classification labels? [Default: **true**]
+
+extract
+ Extract ground returns? [Default: **false**]
diff --git a/doc/stages/filters.mortonorder.rst b/doc/stages/filters.randomize.rst
similarity index 60%
copy from doc/stages/filters.mortonorder.rst
copy to doc/stages/filters.randomize.rst
index a24e0ff..8f0b818 100644
--- a/doc/stages/filters.mortonorder.rst
+++ b/doc/stages/filters.randomize.rst
@@ -1,11 +1,9 @@
-.. _filters.mortonorder:
+.. _filters.randomize:
-filters.mortonorder
-===========
+filters.randomize
+=================
-Sorts the XY data using `Morton ordering`_.
-
-.. _`Morton ordering`: http://en.wikipedia.org/wiki/Z-order_curve
+The randomize filter reorders the points in a point view randomly.
Example
-------
@@ -16,9 +14,9 @@ Example
<Pipeline version="1.0">
<Writer type="writers.las">
<Option name="filename">
- sorted.las
+ randomized.las
</Option>
- <Filter type="filters.mortonorder">
+ <Filter type="filters.randomize">
<Reader type="readers.las">
<Option name="filename">
unsorted.las
@@ -28,8 +26,3 @@ Example
</Writer>
</Pipeline>
-
-
-Notes
------
-
diff --git a/doc/stages/filters.range.rst b/doc/stages/filters.range.rst
index b9775d4..f55c714 100644
--- a/doc/stages/filters.range.rst
+++ b/doc/stages/filters.range.rst
@@ -6,8 +6,8 @@ filters.range
The range filter applies rudimentary filtering to the input point cloud
based on a set of criteria on the given dimensions.
-Example
--------
+Pipeline Example
+----------------
This example passes through all points whose Z value is in the range [0,100]
and whose classification equals 2 (corresponding to ground in LAS).
@@ -21,18 +21,8 @@ and whose classification equals 2 (corresponding to ground in LAS).
filtered.las
</Option>
<Filter type="filters.range">
- <Option name="dimension">
- Z
- <Options>
- <Option name="min">0</Option>
- <Option name="max">100</Option>
- </Options>
- </Option>
- <Option name="dimension">
- Classification
- <Options>
- <Option name="equals">2</Option>
- </Options>
+ <Option name="limits">
+ Z[0:100],Classification[2:2]
</Option>
<Reader type="readers.las">
<Option name="filename">
@@ -43,16 +33,31 @@ and whose classification equals 2 (corresponding to ground in LAS).
</Writer>
</Pipeline>
+Command-line Example
+--------------------
+
+The equivalent pipeline invoked via the PDAL ``translate`` command would be
+
+.. code-block:: bash
+
+ $ pdal translate -i input.las -o filtered.las -f range --filters.range.limits="Z[0:100],Classification[2:2]"
Options
-------
-dimension
- A dimension Option with an Options block containing the range criteria.
+limits
+ A comma-separated list of :ref:`ranges`. If more than one range is
+ specified for a dimension, the criteria are treated as being logically
+ ORed together. Ranges for different dimensions are treated as being
+ logically ANDed.
+
+ Example:
- * min: The minimum allowable value (inclusive) to pass through to the filtered point cloud.
+ ::
- * max: The maximum allowable value (inclusive) to pass through to the filtered point cloud.
+ Classification[1:2], Red[1:50], Blue[25:75], Red[75:255], Classification[6:7]
- * equals: The exact value to pass through to the filtered point cloud (i.e., min = max).
+ This specification will select points that have the classification of
+ 1, 2, 6 or 7 and have a blue value or 25-75 and have a red value of
+ 1-50 or 75-255. In this case, all values are inclusive.
diff --git a/doc/stages/filters.sort.rst b/doc/stages/filters.sort.rst
index f4da854..0d9ce6b 100644
--- a/doc/stages/filters.sort.rst
+++ b/doc/stages/filters.sort.rst
@@ -3,7 +3,7 @@
filters.sort
============
-The sort filter orders a point buffer based on the values of a dimension.
+The sort filter orders a point view based on the values of a dimension.
The current filter only supports sorting based on a single dimension in
increasing order.
diff --git a/doc/stages/filters.splitter.rst b/doc/stages/filters.splitter.rst
index 28917dc..91ac6c9 100644
--- a/doc/stages/filters.splitter.rst
+++ b/doc/stages/filters.splitter.rst
@@ -1,7 +1,7 @@
.. _filters.splitter:
filters.splitter
-===============
+===============================================================================
The splitter filter breaks a point cloud into square tiles of a size that
you choose. The origin of the tiles is chosen arbitrarily unless specified
@@ -12,7 +12,7 @@ for each tile as its output.
Splitting is usually applied to data read from files (which produce one large
stream of points) before the points are written to a database (which prefer
-data segmented into smaller blocks).
+data segmented into smaller blocks).
Example
-------
@@ -40,10 +40,10 @@ Options
length
Length of the sides of the tiles that are created to hold points.
[Default: 1000]
-
+
origin_x
X Origin of the tiles. [Default: none (chosen arbitarily)]
origin_y
Y Origin of the tiles. [Default: none (chosen arbitarily)]
-
+
diff --git a/doc/stages/filters.statisticaloutlier.img1.png b/doc/stages/filters.statisticaloutlier.img1.png
new file mode 100755
index 0000000..b8289f8
Binary files /dev/null and b/doc/stages/filters.statisticaloutlier.img1.png differ
diff --git a/doc/stages/filters.statisticaloutlier.img2.png b/doc/stages/filters.statisticaloutlier.img2.png
new file mode 100755
index 0000000..c09efed
Binary files /dev/null and b/doc/stages/filters.statisticaloutlier.img2.png differ
diff --git a/doc/stages/filters.statisticaloutlier.rst b/doc/stages/filters.statisticaloutlier.rst
new file mode 100644
index 0000000..39d6f20
--- /dev/null
+++ b/doc/stages/filters.statisticaloutlier.rst
@@ -0,0 +1,53 @@
+.. _filters.statisticaloutlier:
+
+===============================================================================
+filters.statisticaloutlier
+===============================================================================
+
+The Statistical Outlier filter passes data through the Point Cloud Library
+(`PCL`_) StatisticalOutlierRemoval algorithm.
+
+StatisticalOutlierRemoval uses point neighborhood statistics to filter outlier
+data. The algorithm iterates through the entire input twice. During the first
+iteration it will compute the average distance that each point has to its
+nearest k neighbors. The value of k can be set using ``mean_k``. Next, the mean
+and standard deviation of all these distances are computed in order to determine
+a distance threshold. The distance threshold will be equal to:
+:math:`mean + stddev_{mult} * stddev`. The multiplier for the standard deviation
+can be set using ``multiplier``. During the next iteration the points will be
+classified as inlier or outlier if their average neighbor distance is below or
+above this threshold respectively.
+
+.. figure:: filters.statisticaloutlier.img1.png
+ :scale: 70 %
+ :alt: Points before outlier removal
+
+ Before outlier removal, noise points can be found both above and below the scene.
+
+
+.. figure:: filters.statisticaloutlier.img2.png
+ :scale: 60 %
+ :alt: Points after outlier removal
+
+ After outlier removal, the noise points are removed.
+
+See [Rusu2008]_ for more information.
+
+.. [Rusu2008] Rusu, Radu Bogdan, et al. "Towards 3D point cloud based object maps for household environments." Robotics and Autonomous Systems 56.11 (2008): 927-941.
+
+.. _`PCL`: http://www.pointclouds.org
+
+Options
+-------------------------------------------------------------------------------
+
+mean_k
+ Mean number of neighbors. [Default: **8**]
+
+multiplier
+ Standard deviation threshold. [Default: **2.0**]
+
+classify
+ Apply classification labels? [Default: **true**]
+
+extract
+ Extract ground returns? [Default: **false**]
diff --git a/doc/stages/filters.stats.rst b/doc/stages/filters.stats.rst
index fa58692..cf64244 100644
--- a/doc/stages/filters.stats.rst
+++ b/doc/stages/filters.stats.rst
@@ -1,7 +1,7 @@
.. _filters.stats:
filters.stats
-============
+===============================================================================
The stats filter calculates the minimum, maximum and average (mean) values
of dimensions. On request it will also provide an enumeration of values of
@@ -41,7 +41,7 @@ Options
dimensions
A comma-separated list of dimensions whose statistics should be
processed. If not provided, statistics for all dimensions are calculated.
-
+
enumerate
A comma-separated list of dimensions whose values should be enumerated.
Note that this list does not add to the list of dimensions that may be
diff --git a/doc/stages/filters.transformation.rst b/doc/stages/filters.transformation.rst
index 5a9fe98..0aeea79 100644
--- a/doc/stages/filters.transformation.rst
+++ b/doc/stages/filters.transformation.rst
@@ -3,9 +3,17 @@
filters.transformation
======================
-The transformation filter applies an arbitrary rotation+translation transformation, represented as a 4x4 matrix, to each xyz triplet.
-The filter does *no* checking to ensure the matrix is a valid affine transformation — buyer beware.
+The transformation filter applies an arbitrary rotation+translation
+transformation, represented as a 4x4 matrix, to each xyz triplet.
+The filter does *no* checking to ensure the matrix is a valid affine
+transformation — buyer beware.
+
+.. note::
+
+ The transformation filter does not apply any spatial reference information
+ — if spatial reference information is desired, it must be specified on
+ another filter.
Example
-------
diff --git a/doc/stages/filters.voxelgrid.rst b/doc/stages/filters.voxelgrid.rst
new file mode 100644
index 0000000..4924653
--- /dev/null
+++ b/doc/stages/filters.voxelgrid.rst
@@ -0,0 +1,34 @@
+.. _filters.voxelgrid:
+
+===============================================================================
+filters.voxelgrid
+===============================================================================
+
+The Voxel Grid filter passes data through the Point Cloud Library (`PCL`_)
+VoxelGrid algorithm.
+
+VoxelGrid assembles a local 3D grid over a given PointCloud, and downsamples +
+filters the data. The VoxelGrid class creates a *3D voxel grid* (think about a
+voxel grid as a set of tiny 3D boxes in space) over the input point cloud data.
+Then, in each *voxel* (i.e., 3D box), all the points present will be
+approximated (i.e., *downsampled*) with their centroid. This approach is a bit
+slower than approximating them with the center of the voxel, but it represents
+the underlying surface more accurately.
+
+.. seealso::
+
+ :ref:`filters.decimation` does simple every-other-X -style decimation.
+
+.. _`PCL`: http://www.pointclouds.org
+
+Options
+-------------------------------------------------------------------------------
+
+leaf_x
+ Leaf size in X dimension. [Default: **1.0**]
+
+leaf_y
+ Leaf size in Y dimension. [Default: **1.0**]
+
+leaf_z
+ Leaf size in Z dimension. [Default: **1.0**]
diff --git a/doc/stages/index.rst b/doc/stages/index.rst
index a032f21..58c6854 100644
--- a/doc/stages/index.rst
+++ b/doc/stages/index.rst
@@ -1,74 +1,67 @@
.. _stage_index:
******************************************************************************
-Stage Reference
+Readers, Writers, and Filters
******************************************************************************
+The :cpp:class:`pdal::Stage` object encapsulates the reading, writing, and
+filtering capabilities for PDAL.
+
+.. _readers:
Readers
=======
+Readers provide data to :ref:`pipeline` operations. Readers might be a simple
+file type, like :ref:`readers.las`, a complex database like :ref:`readers.oci`, or
+a network service like :ref:`readers.greyhound`.
+
+.. note::
+
+ Readers provide :cpp:class:`pdal::Dimension` to :ref:`pipeline`. PDAL attempts
+ to normalize common dimension types, like X, Y, Z, or Intensity, which are
+ often found in LiDAR point clouds. Not all dimension types need to be fixed, however.
+ Database drivers typically return unstructured lists of dimensions.
+
.. toctree::
:maxdepth: 1
+ :glob:
+
+ readers.*
- readers.buffer
- readers.faux
- readers.geowave
- readers.greyhound
- readers.las
- readers.mrsid
- readers.nitf
- readers.oci
- readers.optech
- readers.pcd
- readers.pgpointcloud
- readers.ply
- readers.qfit
- readers.rxp
- readers.sbet
- readers.sqlite
+.. _writers:
Writers
=======
+Writers consume data provided by :ref:`readers`. Some writers can consume any
+dimension type, while others only understand fixed dimension names.
+
+.. note::
+
+ Some writers can only consume known dimension names, while PDAL doesn't
+ yet have a registery for the dimension types, you can see the
+ base dimension types at https://github.com/PDAL/PDAL/blob/master/include/pdal/Dimension.hpp
+
.. toctree::
:maxdepth: 1
+ :glob:
- writers.derivative
- writers.geowave
- writers.las
- writers.matlab
- writers.nitf
- writers.oci
- writers.ply
- writers.p2g
- writers.pcd
- writers.pgpointcloud
- writers.pclvisualizer
- writers.rialto
- writers.sqlite
- writers.text
+ writers.*
+
+.. _filters:
Filters
=======
+Filters operate on data as inline operations. They can remove, modify, reorganize,
+and add points to the data stream as it goes by. Some filters can only operate on
+dimensions they understand (consider :ref:`filters.reprojection` doing geographic
+reprojection on XYZ coordinates), while others do not interrogate the point data at
+all and simply reorganize or split data.
+
.. toctree::
:maxdepth: 1
+ :glob:
- filters.attribute
- filters.colorization
- filters.chipper
- filters.crop
- filters.decimation
- filters.ferry
- filters.hexbin
- filters.mortonorder
- filters.merge
- filters.pclblock
- filters.predicate
- filters.programmable
- filters.range
- filters.reprojection
- filters.sort
- filters.stats
- filters.transformation
+ filters.*
diff --git a/doc/stages/ranges.rst b/doc/stages/ranges.rst
new file mode 100644
index 0000000..70bccb1
--- /dev/null
+++ b/doc/stages/ranges.rst
@@ -0,0 +1,57 @@
+.. _ranges:
+
+Ranges
+======
+
+A range specification is a dimension name, followed by an optional negation
+character ('!'), and a starting and ending value separated by a colon,
+surrounded by parentheses or square brackets. Either the starting or ending
+values can be omitted. Parentheses indicate an open endpoint that doesn't
+include the adjacent value. Square brackets indicate a closed endpoint
+that includes the adjacent value.
+
+Example 1:
+----------
+
+::
+
+ Z[10:]
+
+Selects all points with a Z value greater than or equal to 10.
+
+Example 2:
+----------
+
+::
+
+ Classification[2:2]
+
+Selects all points with a classification of 2.
+
+Example 3:
+----------
+
+::
+
+ Red!(20:40]
+
+Selects all points with red values less than or equal to 20 and those with
+values greater than 40
+
+Example 4:
+----------
+
+::
+
+ Blue[:255)
+
+Selects all points with a blue value less than 255.
+
+Example 5:
+----------
+
+::
+
+ Intesity![25:25]
+
+Selects all points with an intensity not equal to 25.
diff --git a/doc/stages/readers.bpf.rst b/doc/stages/readers.bpf.rst
index 0d70e28..e6f5863 100644
--- a/doc/stages/readers.bpf.rst
+++ b/doc/stages/readers.bpf.rst
@@ -1,7 +1,8 @@
.. _readers.bpf:
+******************************************************************************
readers.bpf
-===========
+******************************************************************************
BPF is an NGA specification for point cloud data. The specification can be
found at https://nsgreg.nga.mil/doc/view?i=4202 The **BPF Reader** supports
@@ -16,7 +17,7 @@ Data that follows the standard header but precedes point data is taken to
be metadata and is UTF-encoded and added to the reader's metadata.
Example
--------
+------------------------------------------------------------------------------
.. code-block:: xml
@@ -31,7 +32,7 @@ Example
</Pipeline>
Options
--------
+------------------------------------------------------------------------------
filename
BPF file to read [Required]
diff --git a/doc/stages/readers.buffer.rst b/doc/stages/readers.buffer.rst
index 7dc11fa..4afc03d 100644
--- a/doc/stages/readers.buffer.rst
+++ b/doc/stages/readers.buffer.rst
@@ -1,9 +1,9 @@
-.. _readers.buffer.
+.. _readers.buffer:
readers.buffer
==============
-The `readers.buffer`_ stage is a special stage that allows
+The :ref:`readers.buffer` stage is a special stage that allows
you to read data from your own PointView rather than
fetching the data from a specific reader. In the :ref:`writing` example,
it is used to take a simple listing of points and turn them into an
@@ -13,7 +13,7 @@ LAS file.
Example
-------
-See :ref:`writing` for an example usage scenario for `readers.buffer`.
+See :ref:`writing` for an example usage scenario for :ref:`readers.buffer`.
Options
-------
diff --git a/doc/stages/readers.gdal.rst b/doc/stages/readers.gdal.rst
new file mode 100644
index 0000000..69f7f94
--- /dev/null
+++ b/doc/stages/readers.gdal.rst
@@ -0,0 +1,78 @@
+.. _readers.gdal:
+
+readers.gdal
+================================================================================
+
+The `GDAL`_ reader reads `GDAL readable raster`_ data sources as point clouds.
+
+.. _`GDAL`: http://gdal.org
+.. _`GDAL readable raster`: http://www.gdal.org/formats_list.html
+
+Each pixel is given an X and Y coordinate (and corresponding PDAL dimensions)
+that are center pixel, and each band is represented by "band-1", "band-2", or
+"band-n". The user must know what the bands correspond to, and use
+:ref:`filters.ferry` to copy data into known dimensions as needed.
+
+
+.. note::
+
+ :ref:`filters.ferry` is needed because raster data do not map to
+ typical dimension names. For output to formats such as :ref:`LAS <writers.las>`,
+ this mapping is required.
+
+
+Basic Example
+--------------------------------------------------------------------------------
+
+.. code-block:: xml
+
+ <?xml version="1.0"?>
+ <Pipeline version="1.0">
+ <Writer type="writers.text">
+ <Option name="filename">
+ out.asc
+ </Option>
+ <Reader type="readers.gdal">
+ <Option name="filename">
+ /Users/hobu/dev/git/pdal/test/data/autzen/autzen.jpg
+ </Option>
+ </Reader>
+ </Writer>
+ </Pipeline>
+
+LAS Example
+--------------------------------------------------------------------------------
+
+The following example writes a JPG as an `ASPRS LAS`_ file.
+
+.. _`ASPRS LAS`: http://www.asprs.org/Committee-General/LASer-LAS-File-Format-Exchange-Activities.html
+
+.. code-block:: xml
+
+ <?xml version="1.0"?>
+ <Pipeline version="1.0">
+ <Writer type="writers.las">
+ <Option name="filename">
+ out.las
+ </Option>
+ <Filter type="filters.ferry">
+ <Option name="dimensions">
+ Red=band-1, Green=band-2, Blue=band-3
+ </Option>
+ <Reader type="readers.gdal">
+ <Option name="filename">
+ /Users/hobu/dev/git/pdal/test/data/autzen/autzen.jpg
+ </Option>
+ </Reader>
+ </Filter>
+ </Writer>
+ </Pipeline>
+
+
+Options
+--------------------------------------------------------------------------------
+
+filename
+ GDALOpen'able raster file to read [Required]
+
+
diff --git a/doc/stages/readers.geowave.rst b/doc/stages/readers.geowave.rst
index f991da5..c6dab35 100644
--- a/doc/stages/readers.geowave.rst
+++ b/doc/stages/readers.geowave.rst
@@ -1,9 +1,13 @@
.. _readers.geowave:
readers.geowave
-============
+===============================================================================
-The **GeoWave reader** uses `GeoWave`_ to read from Accumulo. GeoWave entries are stored using EPSG:4326. Instructions for configuring the GeoWave plugin can be found `here`_
+.. index:: GeoWave
+
+The **GeoWave reader** uses `GeoWave`_ to read from Accumulo. GeoWave entries
+are stored using `EPSG:4326 <http://epsg.io/4326/>`__. Instructions for
+configuring the GeoWave plugin can be found `here`_.
Example
-------
@@ -15,14 +19,14 @@ Example
<Writer type="writers.text">
<Option name="filename">outputfile.txt</Option>
<Reader type="readers.geowave">
- <Option name="zookeeperUrl">zookeeper1:2181,zookeeper2:2181,zookeeper3:2181</Option>
- <Option name="instanceName">GeoWave</Option>
+ <Option name="zookeeper_url">zookeeper1:2181,zookeeper2:2181,zookeeper3:2181</Option>
+ <Option name="instance_name">GeoWave</Option>
<Option name="username">user</Option>
<Option name="password">pass</Option>
- <Option name="tableNamespace">PDAL_Table</Option>
- <Option name="featureTypeName">PDAL_Point</Option>
- <Option name="dataAdapter">FeatureCollectionDataAdapter</Option>
- <Option name="pointsPerEntry">5000u</Option>
+ <Option name="table_namespace">PDAL_Table</Option>
+ <Option name="feature_type_name">PDAL_Point</Option>
+ <Option name="data_adapter">FeatureCollectionDataAdapter</Option>
+ <Option name="points_per_entry">5000u</Option>
<Option name="bounds">([0,1000000],[0,1000000],[0,100])</Option>
</Reader>
</Writer>
@@ -32,11 +36,11 @@ Example
Options
-------
-zookeeperUrl
+zookeeper_url
The comma-delimited URLs for all zookeeper servers, this will be directly used to instantiate a ZookeeperInstance. [Required]
-instanceName
- The zookeeper instance name, this will be directly used to instantiate a ZookeeperInstance. [Required]
+instance_name
+ the zookeeper instance name, this will be directly used to instantiate a ZookeeperInstance. [Required]
username
The username for the account to establish an Accumulo connector. [Required]
@@ -44,20 +48,20 @@ username
password
The password for the account to establish an Accumulo connector. [Required]
-tableNamespace
+table_namespace
The table name to be used when interacting with GeoWave. [Required]
-featureTypeName
+feature_type_name
The feature type name to be used when ineracting GeoWave. [Default: PDAL_Point]
-dataAdapter
+data_adapter
FeatureCollectionDataAdapter stores multiple points per Accumulo entry. FeatureDataAdapter stores a single point per Accumulo entry. [Default: FeatureCollectionDataAdapter]
-pointsPerEntry
+points_per_entry
Sets the maximum number of points per Accumulo entry when using FeatureCollectionDataAdapter. [Default: 5000u]
bounds
- The extent of the bounding rectangle to use to query points, expressed as a string, eg: “([xmin,xmax],[ymin,ymax],[zmin,zmax])”. [Default: unit cube]
+ The extent of the bounding rectangle to use to query points, expressed as a string, eg: “([xmin,xmax],[ymin,ymax],[zmin,zmax])”. [Default: unit cube]
.. _GeoWave: https://ngageoint.github.io/geowave/
diff --git a/doc/stages/readers.greyhound.rst b/doc/stages/readers.greyhound.rst
index 04b3b5d..d3ff780 100644
--- a/doc/stages/readers.greyhound.rst
+++ b/doc/stages/readers.greyhound.rst
@@ -17,7 +17,7 @@ Example
<Option name="spatialreference">EPSG:26910</Option>
<Reader type="readers.greyhound">
<Option name="url">greyhound.organization.com:8080</Option>
- <Option name="pipelineId">a87d0a50e03a880c75e9f872c925f984</Option>
+ <Option name="pipeline_id">a87d0a50e03a880c75e9f872c925f984</Option>
</Reader>
</Writer>
</Pipeline>
@@ -28,7 +28,7 @@ Options
url
Greyhound server URL string. [Required]
-pipelineId
+pipeline_id
Greyhound pipelineId to read. [Required]
diff --git a/doc/stages/readers.ilvis2.metadata.png b/doc/stages/readers.ilvis2.metadata.png
new file mode 100644
index 0000000..c4d1dec
Binary files /dev/null and b/doc/stages/readers.ilvis2.metadata.png differ
diff --git a/doc/stages/readers.ilvis2.rst b/doc/stages/readers.ilvis2.rst
new file mode 100644
index 0000000..5144fb5
--- /dev/null
+++ b/doc/stages/readers.ilvis2.rst
@@ -0,0 +1,39 @@
+.. _readers.ilvis2:
+
+readers.ilvis2
+===============
+
+The **ILVIS2 reader** read from files in the ILVIS2 format. See http://nsidc.org/data/docs/daac/icebridge/ilvis2/index.html
+for more information
+
+
+.. figure:: readers.ilvis2.metadata.png
+
+ Dimensions provided by the ILVIS2 reader
+
+Example
+-------
+
+.. code-block:: xml
+
+ <?xml version="1.0" encoding="utf-8"?>
+ <Pipeline version="1.0">
+ <Writer type="writers.las">
+ <Option name="filename">output.las</Option>
+ <Reader type="readers.ilvis2">
+ <Option name="filename">
+ ILVIS2_GL2009_0414_R1401_042504.TXT
+ </Option>
+ </Reader>
+ </Writer>
+ </Pipeline>
+
+Options
+-------
+
+filename
+ File to read from [Required]
+
+mapping
+ Which ILVIS2 field type to map to X, Y, Z dimensions
+ 'LOW', 'CENTROID', or 'HIGH' ['CENTROID']
diff --git a/doc/stages/readers.las.rst b/doc/stages/readers.las.rst
index 0a46294..5c58879 100644
--- a/doc/stages/readers.las.rst
+++ b/doc/stages/readers.las.rst
@@ -7,15 +7,43 @@ The **LAS Reader** supports reading from `LAS format`_ files, the standard
interchange format for LIDAR data. The reader does NOT support point formats
containing waveform data (4, 5, 9 and 10).
-The reader will accept version 1.4 LAS files and will interpret the extra bytes
-VLR (User ID: LASF_Spec, Record ID: 4) if present. Two dimensions are
-created for each
-extra byte field with types 11 - 20, "0" and "1" being appended to the field
-name to create the dimension names. Three dimensions are created for each
-extra byte field with types 21-30, "0", "1" and "2" being appended to the field
-name to create the dimension names. Field type 0 is understood, but the data
-associated with field type 0 is ignored (no PDAL dimension is created). The
-presence of this VLR overrides the **extra_dims** option.
+The reader also supports compressed LAS files, known as LAZ files or
+`LASzip`_ files.
+In order to use compresed LAS, your version of PDAL must be built with one of
+the two supported decompressors, `LASzip`_ or `LAZperf`_. See the
+`compression`_ option below for more information.
+
+.. _LASzip: http://www.laszip.org
+.. _LAZperf: https://github.com/verma/laz-perf
+
+.. note::
+
+ LAS stores X, Y and Z dimensions as scaled integers. Users converting an
+ input LAS file to an output LAS file will frequently want to use the same
+ scale factors and offsets in the output file as existed in the input
+ file in order to
+ maintain the precision of the data. Use the 'forward' option on the
+ :ref:`writers.las` to facilitate transfer of header information from
+ source to destination LAS/LAZ files.
+
+.. note::
+
+ LAS 1.4 files can contain datatypes that are actually arrays rather than
+ individual dimensions. Since PDAL doesn't support these datatypes, it
+ must map them into datatypes it supports. This is done by appending the
+ array index to the name of the datatype. For example, datatypes 11 - 20
+ are two dimensional array types and if a field had the name Foo for
+ datatype 11, PDAL would create the dimensions Foo0 and Foo1 to hold the
+ values associated with LAS field Foo. Similarly, datatypes 21 - 30 are
+ three dimensional arrays and a field of type 21 with the name Bar would
+ cause PDAL to create dimensions Bar0, Bar1 and Bar2. See the information
+ on the extra bytes VLR in the `LAS Specification`_ for more information
+ on the extra bytes VLR and array datatypes.
+
+.. note::
+ LAS 1.4 files that use the extra bytes VLR and datatype 0 will be accepted,
+ but the data associated with a dimension of datatype 0 will be ignored
+ (no PDAL dimension will be created).
Example
-------
@@ -35,15 +63,24 @@ Example
Options
-------
-filename
- LAS file to read [Required]
+_`filename`
+ LAS file to read [Required]
-extra_dims
+_`extra_dims`
Extra dimensions to be read as part of each point beyond those specified by
the LAS point format. The format of the option is
<dimension_name>=<type>, ... where type is one of:
- int8, int16, int32, int64, uint8, uint16, uint32, uint64, float, double
- '_t' may be added to any of the type names as well (e.g., uint32_t)
+ int8, int16, int32, int64, uint8, uint16, uint32, uint64, float, double
+ '_t' may be added to any of the type names as well (e.g., uint32_t). NOTE:
+ the presence of an extra bytes VLR causes when reading a version 1.4 LAS
+ file causes this option to be ignored.
.. _LAS format: http://asprs.org/Committee-General/LASer-LAS-File-Format-Exchange-Activities.html
-
+.. _LAS Specification: http://www.asprs.org/a/society/committees/standards/LAS_1_4_r13.pdf
+
+_`compression`
+ May be set to "lazperf" or "laszip" to choose either the LazPerf decompressor
+ or the LasZip decompressor for LAZ files. PDAL must have been build with
+ support for the decompressor being requested. The LazPerf decompressor
+ doesn't support version 1 LAZ files or version 1.4 of LAS.
+ [Default: "laszip"]
diff --git a/doc/stages/readers.ply.rst b/doc/stages/readers.ply.rst
index 862ef64..14af230 100644
--- a/doc/stages/readers.ply.rst
+++ b/doc/stages/readers.ply.rst
@@ -1,4 +1,4 @@
-.. _readers.pcd:
+.. _readers.ply:
readers.ply
===========
diff --git a/doc/stages/readers.tindex.rst b/doc/stages/readers.tindex.rst
new file mode 100644
index 0000000..10d7530
--- /dev/null
+++ b/doc/stages/readers.tindex.rst
@@ -0,0 +1,125 @@
+.. _readers.tindex:
+
+readers.tindex
+================================================================================
+
+
+A `GDAL tile index`_ is an `OGR`_-readable data source of boundary information.
+PDAL provides a similar concept for PDAL-readable point cloud data. You can use
+the :ref:`tindex_command` application to generate tile index files in any
+format that `OGR`_ supports writing. Once you have the tile index, you can then
+use the :ref:`readers.tindex` driver to automatically merge and query the
+data described by the tiles.
+
+.. _`GDAL`: http://gdal.org
+.. _`OGR`: http://gdal.org/ogr/
+.. _`GDAL tile index`: http://www.gdal.org/gdaltindex.html
+
+
+
+
+
+Basic Example
+--------------------------------------------------------------------------------
+
+Given a tile index that was generated with the following scenario:
+
+::
+
+ pdal tindex index.sqlite \
+ "/Users/hobu/dev/git/pdal/test/data/las/interesting.las" \
+ -f "SQLite" \
+ --lyr_name "pdal" \
+ --t_srs "EPSG:4326"
+
+Use the following :ref:`pipeline` example to read and automatically
+merge the data.
+
+.. code-block:: xml
+
+ <?xml version="1.0"?>
+ <Pipeline version="1.0">
+ <Writer type="writers.las">
+ <Option name="filename">
+ out.las
+ </Option>
+ <Reader type="readers.tindex">
+ <Option name="sql">
+ SELECT * from pdal
+ </Option>
+ <Option name="filter_srs">
+ +proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=399999.9999999999 +y_0=0 +ellps=GRS80 +units=ft +no_defs
+ </Option>
+ <Option name="merge">
+ true
+ </Option>
+ <Option name="filename">
+ /Users/hobu/dev/git/pdal/test/temp/index.sqlite
+ </Option>
+ <Option name="where">
+ location LIKE '%nteresting.las%'
+ </Option>
+ <Option name="boundary">
+ ([635629.85, 638982.55], [848999.70 , 853535.43])
+ </Option>
+ <Option name="polygon">
+ POLYGON ((635629.85000000 848999.70000000, 635629.85000000 853535.43000000, 638982.55000000 853535.43000000, 638982.55000000 848999.70000000, 635629.85000000 848999.70000000))
+ </Option>
+ </Reader>
+ </Writer>
+ </Pipeline>
+
+
+Options
+--------------------------------------------------------------------------------
+
+filename
+ OGROpen'able raster file to read [Required]
+
+lyr_name
+ The OGR layer name for the data source to use to
+ fetch the tile index information.
+
+srs_column
+ The column in the layer that provides the SRS
+ information for the file. Use this if you wish to
+ override or set coordinate system information for
+ files.
+
+tindex_name
+ The column name that defines the file location for
+ the tile index file.
+ [Default: **location**]
+
+sql
+ `OGR SQL`_ to use to define the tile index layer.
+
+wkt
+ A geometry to pre-filter the tile index using
+ OGR
+
+boundary
+ A 2D box to pre-filter the tile index. If it is set,
+ it will override any ``wkt`` option.
+
+t_srs
+ Reproject the layer SRS, otherwise default to the
+ tile index layer's SRS.
+
+filter_srs
+ Transforms any ``wkt`` or ``boundary`` option to this
+ coordinate system before filtering or reading data.
+
+where
+ `OGR SQL`_ filter clause to use on the layer. It only
+ works in combination with tile index layers that are
+ defined with ``lyr_name``
+
+dialect
+ `OGR SQL`_ dialect to use when querying tile index layer
+ [Default: OGRSQL]
+
+.. _`OGR SQL`: http://www.gdal.org/ogr_sql.html
+
+
+
diff --git a/doc/stages/writers.bpf.rst b/doc/stages/writers.bpf.rst
index 91b3a8a..2e01816 100644
--- a/doc/stages/writers.bpf.rst
+++ b/doc/stages/writers.bpf.rst
@@ -36,7 +36,8 @@ filename
the placeholder will be replaced with an incrementing integer. If no
placeholder is found, all PointViews provided to the writer are
aggregated into a single file for output. Multiple PointViews are usually
- the result of using :ref:`filters.splitter` or :ref:`filters.chipper`.
+ the result of using :ref:`filters.splitter`, :ref:`filters.chipper` or
+ :ref:`filters.divider`.
[Required]
compression
@@ -48,8 +49,8 @@ format
* dim == Dimension-major (non-interleaved). All data for a single dimension
are stored contiguously.
- * point == Point-major (interleaved). All data for a single point are stored
- contiguously.
+ * point == Point-major (interleaved). All data for a single point
+ are stored contiguously.
* byte == Byte-major (byte-segregated). All data for a single dimension are
stored contiguously, but bytes are arranged such that the first bytes for
all points are stored contiguously, followed by the second bytes of all
@@ -82,8 +83,19 @@ offset_x, offset_y, offset_z
Offset to be subtracted from the X, Y and Z nominal values, respectively,
before the value is scaled. The special value "auto" can be specified,
which causes the writer to set the offset to the minimum value of the
- dimension. [Default: 0]
+ dimension. [Default: auto]
.. note::
written value = (nominal value - offset) / scale.
+
+ .. note::
+
+ Because BPF data is always stored in UTM, the XYZ offsets are set to
+ "auto" by default. This is to avoid truncation of the decimal digits
+ (which may occur with offsets left at 0).
+
+output_dims
+ If specified, limits the dimensions written for each point. Dimensions
+ are listed by name and separated by commas. X, Y and Z are required and
+ must be explicitly listed.
diff --git a/doc/stages/writers.geowave.rst b/doc/stages/writers.geowave.rst
index 06d921f..7e5031b 100644
--- a/doc/stages/writers.geowave.rst
+++ b/doc/stages/writers.geowave.rst
@@ -1,27 +1,31 @@
.. _writers.geowave:
writers.geowave
-============
+================================================================================
-The **GeoWave writer** uses `GeoWave`_ to write to Accumulo. GeoWave entries are stored using EPSG:4326. Instructions for configuring the GeoWave plugin can be found `here`_
+.. index:: GeoWave
+
+The **GeoWave writer** uses `GeoWave`_ to write to Accumulo. GeoWave entries
+are stored using `EPSG:4326 <http://epsg.io/4326/>`__. Instructions for
+configuring the GeoWave plugin can be found `here`_.
Example
--------
+--------------------------------------------------------------------------------
.. code-block:: xml
<?xml version="1.0" encoding="utf-8"?>
<Pipeline version="1.0">
<Writer type="writers.geowave">
- <Option name="zookeeperUrl">zookeeper1:2181,zookeeper2:2181,zookeeper3:2181</Option>
- <Option name="instanceName">GeoWave</Option>
+ <Option name="zookeeper_url">zookeeper1:2181,zookeeper2:2181,zookeeper3:2181</Option>
+ <Option name="instance_name">GeoWave</Option>
<Option name="username">user</Option>
<Option name="password">pass</Option>
- <Option name="tableNamespace">PDAL_Table</Option>
- <Option name="featureTypeName">PDAL_Point</Option>
- <Option name="dataAdapter">FeatureCollectionDataAdapter</Option>
- <Option name="pointsPerEntry">5000u</Option>
+ <Option name="table_namespace">PDAL_Table</Option>
+ <Option name="feature_type_name">PDAL_Point</Option>
+ <Option name="data_adapter">FeatureCollectionDataAdapter</Option>
+ <Option name="points_per_entry">5000u</Option>
<Filter type="filters.reprojection">
<Option name="out_srs">EPSG:4326</Option>
<Reader type="readers.qfit">
@@ -36,10 +40,10 @@ Example
Options
-------
-zookeeperUrl
+zookeeper_url
The comma-delimited URLs for all zookeeper servers, this will be directly used to instantiate a ZookeeperInstance. [Required]
-instanceName
+instance_name
The zookeeper instance name, this will be directly used to instantiate a ZookeeperInstance. [Required]
username
@@ -48,17 +52,17 @@ username
password
The password for the account to establish an Accumulo connector. [Required]
-tableNamespace
+table_namespace
The table name to be used when interacting with GeoWave. [Required]
-featureTypeName
+feature_type_name
The feature type name to be used when ineracting GeoWave. [Default: PDAL_Point]
-dataAdapter
+data_adapter
FeatureCollectionDataAdapter stores multiple points per Accumulo entry. FeatureDataAdapter stores a single point per Accumulo entry. [Default: FeatureCollectionDataAdapter]
-pointsPerEntry
- Sets the maximum number of points per Accumulo entry when using FeatureCollectionDataAdapter. [Default: 5000u]
+points_per_entry
+ Sets the maximum number of points per Accumulo entry when using FeatureCollectionDataAdapter. [Default: 5000u]
.. _GeoWave: https://ngageoint.github.io/geowave/
diff --git a/doc/stages/writers.las.rst b/doc/stages/writers.las.rst
index 2492a4a..acc982b 100644
--- a/doc/stages/writers.las.rst
+++ b/doc/stages/writers.las.rst
@@ -6,6 +6,9 @@ writers.las
The **LAS Writer** supports writing to `LAS format`_ files, the standard
interchange file format for LIDAR data.
+IMPORTANT NOTE: Scale/offset are not preserved from an input LAS file. See
+below for information on the scale/offset options and the 'forward' option.
+
Example
-------
@@ -35,7 +38,8 @@ filename
the placeholder will be replaced with an incrementing integer. If no
placeholder is found, all PointViews provided to the writer are
aggregated into a single file for output. Multiple PointViews are usually
- the result of using :ref:`filters.splitter` or :ref:`filters.chipper`.
+ the result of using :ref:`filters.splitter`, :ref:`filters.chipper` or
+ :ref:`filters.divider`.
[Required]
forward
@@ -65,7 +69,7 @@ forward
output file as necessary. Unlike header values, VLRs from multiple input
files are accumulated and each is written to the output file. Forwarded
VLRs may contain duplicate User ID/Record ID pairs.
-
+
minor_version
All LAS files are version 1, but the minor version (0 - 4) can be specified
with this option. [Default: 3]
@@ -77,18 +81,18 @@ software_id
creation_doy
Number of the day of the year (January 1 == 0, Dec 31 == 365) this file is
being created.
-
+
creation_year
Year (Gregorian) this file is being created.
-
+
dataformat_id
Controls whether information about color and time are stored with the point
information in the LAS file. [Default: 3]
-
+
* 0 == no color or time stored
* 1 == time is stored
* 2 == color is stored
- * 3 == color and time are stored
+ * 3 == color and time are stored
* 4 [Not Currently Supported]
* 5 [Not Currently Supported]
* 6 == time is stored (version 1.4+ only)
@@ -96,13 +100,13 @@ dataformat_id
* 8 == time, color and near infrared are stored (version 1.4+ only)
* 9 [Not Currently Supported]
* 10 [Not Currently Supported]
-
+
system_id
String identifying the system that created this LAS file. [Default: "PDAL"]
-
+
a_srs
The spatial reference system of the file to be written. Can be an EPSG string (eg "EPSG:268910") or a WKT string. [Default: Not set]
-
+
global_encoding
Various indicators to describe the data. See the LAS documentation. Note
that PDAL will always set bit four when creating LAS version output.
@@ -112,9 +116,10 @@ project_id
UID reserved for the user [Default: Nil UID]
compression
- Set to true to apply compression to the output, creating a LAZ file instead
- of an LAS file. Requires PDAL to have been built with compression support
- by linking with LASzip. [Default: false]
+ Set to "lazperf" or "laszip" to apply compression to the output, creating
+ a LAZ file instead of an LAS file. "lazperf" selects the LazPerf compressor
+ and "laszip" (or "true") selects the LasZip compressor. PDAL must have
+ been built with support for the requested compressor. [Default: "none"]
scale_x, scale_y, scale_z
Scale to be divided from the X, Y and Z nominal values, respectively, after
@@ -131,7 +136,7 @@ offset_x, offset_y, offset_z
dimension. [Default: 0]
Note: written value = (nominal value - offset) / scale.
-
+
filesource_id
The file source id number to use for this file (a value between
1 and 65535) [Default: 0]
@@ -145,11 +150,16 @@ extra_dims
Extra dimensions to be written as part of each point beyond those specified
by the LAS point format. The format of the option is
<dimension_name>=<type>, ... where type is one of:
- int8, int16, int32, int64, uint8, uint16, uint32, uint64, float, double
+ int8, int16, int32, int64, uint8, uint16, uint32, uint64, float, double
'_t' may be added to any of the type names as well (e.g., uint32_t). When
the version of the output file is specified as 1.4 or greater, an extra
bytes VLR (User ID: LASF_Spec, Record ID: 4), is created that describes the
extra dimensions specified by this option.
+ The special value 'all' can be used in place of a dimension/type list
+ to request
+ that all dimensions that can't be stored in the predefined LAS point
+ record get added as extra data at the end of each point record.
+
.. _LAS format: http://asprs.org/Committee-General/LASer-LAS-File-Format-Exchange-Activities.html
-
+
diff --git a/doc/stages/writers.nitf.rst b/doc/stages/writers.nitf.rst
index 3f75326..9171eab 100644
--- a/doc/stages/writers.nitf.rst
+++ b/doc/stages/writers.nitf.rst
@@ -16,8 +16,8 @@ Example
<Pipeline version="1.0">
<Writer type="writers.nitf">
<Option name="filename">mynitf.nitf</Option>
- <Option name="ONAME">James Alexander</Option>
- <Option name="OPHONE">646-322-3123</Option>
+ <Option name="oname">James Alexander</Option>
+ <Option name="ophone">646-322-3123</Option>
<Reader type="readers.las">
<Option name="filename">inputfile.las</Option>
</Reader>
@@ -35,51 +35,52 @@ filename
the placeholder will be replaced with an incrementing integer. If no
placeholder is found, all PointViews provided to the writer are
aggregated into a single file for output. Multiple PointViews are usually
- the result of using :ref:`filters.splitter` or :ref:`filters.chipper`.
+ the result of using :ref:`filters.splitter`, :ref:`filters.chipper` or
+ :ref:`filters.divider`.
-CLEVEL
+clevel
File complexity level (2 characters) [Default: **03**]
-STYPE
+stype
Standard type (4 characters) [Default: **BF01**]
-OSTAID
+ostaid
Originating station ID (10 characters) [Default: **PDAL**]
-FTITLE
+ftitle
File title (80 characters) [Default: <spaces>]
-FSCLAS
+fsclas
File security classification ('T', 'S', 'C', 'R' or 'U') [Default: **U**]
-ONAME
+oname
Originator name (24 characters) [Default: <spaces>]
-OPHONE
+ophone
Originator phone (18 characters) [Default: <spaces>]
-FSCTLH
+fsctlh
File control and handling (2 characters) [Default: <spaces>]
-FSCLSY
+fsclsy
File classification system (2 characters) [Default: <spaces>]
-IDATIM
+idatim
Image date and time (format: 'CCYYMMDDhhmmss') [Default: <spaces>]
-IID2
+iid2
Image identifier 2 (80 characters) [Default: <spaces>]
-FSCLTX
+fscltx
File classification text (43 characters) [Default: <spaces>]
-AIMIDB
- Option tag that should contain further options to complete the AIMIDB
- (Additional Image ID) TRE record [Default: None]
+aimidb
+ Comma separated list of name/value pairs to complete the AIMIDB
+ (Additional Image ID) TRE record (format name:value) [Default: None]
-ACFTB
- Option tag that should contain further options to complete the ACFTB
- (Aircraft Information) TRE record [Default: None]
+acftb
+ Comma separated list of name/value pairs to complete the ACFTB
+ (Aircraft Information) TRE record (format name:value) [Default: None]
.. _NITF: http://en.wikipedia.org/wiki/National_Imagery_Transmission_Format
diff --git a/doc/stages/writers.null.rst b/doc/stages/writers.null.rst
index 7f7d90d..bf11c95 100644
--- a/doc/stages/writers.null.rst
+++ b/doc/stages/writers.null.rst
@@ -1,4 +1,4 @@
-.. _writers.text:
+.. _writers.null:
writers.null
============
diff --git a/doc/stages/writers.oci.rst b/doc/stages/writers.oci.rst
index 415d994..b68f662 100644
--- a/doc/stages/writers.oci.rst
+++ b/doc/stages/writers.oci.rst
@@ -74,7 +74,7 @@ connection
Oracle connection string to connect to database
is3d
- Should we use 3D objects for SDO_PC PC_EXTENT, BLK_EXTENT, and indexing [Default: **false**]
+ Should we use 3D objects (include the z dimension) for SDO_PC PC_EXTENT, BLK_EXTENT, and indexing [Default: **false**]
solid
Define the point cloud's PC_EXTENT geometry gtype as (1,1007,3) instead of the normal (1,1003,3), and use gtype 3008/2008 vs 3003/2003 for BLK_EXTENT geometry values. [Default: **false**]
diff --git a/doc/stages/writers.p2g.rst b/doc/stages/writers.p2g.rst
index 52f2864..2443dba 100644
--- a/doc/stages/writers.p2g.rst
+++ b/doc/stages/writers.p2g.rst
@@ -58,25 +58,11 @@ Example
<Option name="output_format">
grid
</Option>
- <Filter type="filters.inplacereprojection">
- <Option name="out_srs">
- EPSG:26910
- </Option>
- <Option name="scale_x">
- 0.01
- </Option>
- <Option name="scale_y">
- 0.01
- </Option>
- <Reader type="readers.las">
- <Option name="filename">
- ../1.2-with-color.las
- </Option>
- <Option name="spatialreference">
- ../1.2-with-color.las.wkt
- </Option>
- </Reader>
- </Filter>
+ <Reader type="readers.las">
+ <Option name="filename">
+ .a./1.2-with-color.las
+ </Option>
+ </Reader>
</Writer>
</Pipeline>
@@ -101,3 +87,5 @@ output_type
output_format
File output format to use, one of "grid", "tif", or "asc". [Default: **grid**]
+z
+ Name of the 'z' dimension to use. [Default: 'Z']
diff --git a/doc/stages/writers.text.rst b/doc/stages/writers.text.rst
index e7e8c26..a8a4e32 100644
--- a/doc/stages/writers.text.rst
+++ b/doc/stages/writers.text.rst
@@ -3,7 +3,9 @@
writers.text
============
-The **text writer** writes out to a text file. This is useful for debugging or getting smaller files into an easily parseable format. The text writer supports both `GeoJson`_ and `CSV`_ output.
+The **text writer** writes out to a text file. This is useful for debugging or
+getting smaller files into an easily parseable format. The text writer
+supports both `GeoJSON`_ and `CSV`_ output.
Example
@@ -33,27 +35,27 @@ filename
File to write to, or "STDOUT" to write to standard out [Required]
format
- Output format to use. One of "geojson" or "csv". [Default: **csv**]
+ Output format to use. One of "geojson" or "csv". [Default: **csv**]
order
Comma-separated list of dimension names, giving the desired column order in the output file, for example "X,Y,Z,Red,Green,Blue". [Default: none]
-
+
keep_unspecified
Should we output any fields that are not specified in the dimension order? [Default: **true**]
jscallback
When producing GeoJSON, the callback allows you to wrap the data in a function, so the output can be evaluated in a <script> tag.
-
+
quote_header
When producing CSV, should the column header named by quoted? [Default: **true**]
-
+
newline
When producing CSV, what newline character should be used? (For Windows, "\\r\\n" is common.) [Default: **\\n**]
-
+
delimiter
- When producing CSV, what character to use as a delimiter? [Default: **,**]
+ When producing CSV, what character to use as a delimiter? [Default: **,**]
-.. _GeoJson: http://geojson.org
+.. _GeoJSON: http://geojson.org
.. _CSV: http://en.wikipedia.org/wiki/Comma-separated_values
diff --git a/doc/tutorial/autzen-elevation.png b/doc/tutorial/autzen-elevation.png
new file mode 100644
index 0000000..083b320
Binary files /dev/null and b/doc/tutorial/autzen-elevation.png differ
diff --git a/doc/tutorial/autzen-height.png b/doc/tutorial/autzen-height.png
new file mode 100644
index 0000000..fe5c3f2
Binary files /dev/null and b/doc/tutorial/autzen-height.png differ
diff --git a/doc/tutorial/autzen-shapes-clipped.png b/doc/tutorial/autzen-shapes-clipped.png
new file mode 100644
index 0000000..b6e4f4b
Binary files /dev/null and b/doc/tutorial/autzen-shapes-clipped.png differ
diff --git a/doc/tutorial/autzen-shapes-point-cloud.png b/doc/tutorial/autzen-shapes-point-cloud.png
new file mode 100644
index 0000000..c6fb598
Binary files /dev/null and b/doc/tutorial/autzen-shapes-point-cloud.png differ
diff --git a/doc/tutorial/autzen-shapes-to-clip.png b/doc/tutorial/autzen-shapes-to-clip.png
new file mode 100644
index 0000000..7e78580
Binary files /dev/null and b/doc/tutorial/autzen-shapes-to-clip.png differ
diff --git a/doc/tutorial/calculating-normalized-heights.rst b/doc/tutorial/calculating-normalized-heights.rst
new file mode 100644
index 0000000..0560b15
--- /dev/null
+++ b/doc/tutorial/calculating-normalized-heights.rst
@@ -0,0 +1,192 @@
+.. height:
+
+==============================
+Calculating Normalized Heights
+==============================
+
+:Author: Bradley Chambers
+:Contact: brad.chambers at gmail.com
+:Date: 11/11/2015
+
+
+This tutorial will describe the creation of a new filter for calculating normalized heights, :ref:`filters.height`.
+
+Introduction
+-------------------------------------------------------------------------------
+
+Normalized heights are a commonly used attribute of point cloud data. This can also be referred to as *height above ground* (HAG) or *above ground level* (AGL) heights. In the end, it is simply a measure of a point's relative height as opposed to its raw elevation value.
+
+The process of computing normalized heights is straightforward. First, we must have an estimate of the underlying terrain model. With this we can compute the difference between each point's elevation and the elevation of the terrain model at the same XY coordinate. The quality of the normalized heights will be a function of the quality of the terrain model, which of course depends on the quality of the ground segmentation approach and any interpolation that is required to arrive at the t [...]
+
+We will use a nearest neighbor interpolation scheme to estimate terrain elevations. While this may not be the most accurate approach, it is available in PDAL today, and we hope it will inspire you to implement your own methods!
+
+Approach
+-------------------------------------------------------------------------------
+
+For the height filter, we only assume that our input point cloud has an already existing ``Classification`` dimension with some subset of points marked as ground (``Classification=2``). This could, for example, be generated by :ref:`filters.ground` (see :ref:`pcl_ground`), but you can use whichever method you choose, as long as the ground returns are marked.
+
+.. note::
+
+ We expect ground returns to have the classification value of 2 in keeping with the ASPRS Standard LIDAR Point Classes (see http://www.asprs.org/a/society/committees/standards/LAS_1_4_r13.pdf).
+
+For the full source, please see ``HeightFilter.cpp`` in the ``plugins/pcl/filters`` folder. Below, we dissect the key aspects of the algorithm and its implementation.
+
+The bulk of our processing is actually taking place within PCL. For convenience, we've defined:
+
+.. code-block:: cpp
+
+ typedef pcl::PointCloud<pcl::PointXYZ> Cloud;
+
+Our first step is to convert the filter's incoming PDAL ``PointView`` to a PCL ``PointCloud``, which requires that we first calculate our bounds so that we can subtract our XYZ offsets in the conversion step.
+
+.. code-block:: cpp
+
+ BOX3D bounds;
+ view.calculateBounds(bounds);
+
+ Cloud::Ptr cloud_in(new Cloud);
+ pclsupport::PDALtoPCD(std::make_shared<PointView>(view), *cloud_in, bounds);
+
+Next, we will create two vectors of indices - one for ground returns, one for non-ground returns - and make our first pass through the point cloud to populate these.
+
+.. code-block:: cpp
+
+ pcl::PointIndices::Ptr ground(new pcl::PointIndices());
+ ground->indices.reserve(view.size());
+
+ std::vector<PointId> nonground;
+ nonground.reserve(view.size());
+
+ for (PointId id = 0; id < view.size(); ++id)
+ {
+ double c = view.getFieldAs<double>(Dimension::Id::Classification, id);
+
+ if (c == 2)
+ ground->indices.push_back(id);
+ else
+ nonground.push_back(id);
+ }
+
+With our ground indices identified, we can use PCL to extract the ground returns into a new ``PointCloud``.
+
+.. code-block:: cpp
+
+ pcl::ExtractIndices<pcl::PointXYZ> extract;
+ extract.setInputCloud(cloud_in);
+ extract.setIndices(ground);
+
+ Cloud::Ptr cloud_ground(new Cloud);
+ extract.setNegative(false);
+ extract.filter(*cloud_ground);
+
+We repeat the extraction now, flipping ``setNegative`` from false to true to extract the non-ground returns into a new ``PointCloud``.
+
+.. code-block:: cpp
+
+ Cloud::Ptr cloud_nonground(new Cloud);
+ extract.setNegative(true);
+ extract.filter(*cloud_nonground);
+
+To compute the normalized height, we wish to find the nearest ground point for each non-ground point. Here, we achieve this by using a nearest neighbor interpolation scheme. One may prefer to use a more sophisticated interpolation scheme, but that is beyond the scope of this tutorial. We begin by defining model coefficients that will allow us to project the ground and non-ground clouds into the XY plane.
+
+.. code-block:: cpp
+
+ pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients());
+ coefficients->values.resize(4);
+ coefficients->values[0] = coefficients->values[1] = 0;
+ coefficients->values[2] = 1.0;
+ coefficients->values[3] = 0;
+
+We can now project the ground points
+
+.. code-block:: cpp
+
+ pcl::ProjectInliers<pcl::PointXYZ> proj;
+ proj.setModelType(pcl::SACMODEL_PLANE);
+
+ Cloud::Ptr cloud_ground_projected(new Cloud);
+ proj.setInputCloud(cloud_ground);
+ proj.setModelCoefficients(coefficients);
+ proj.filter(*cloud_ground_projected);
+
+followed by the non-ground points
+
+.. code-block:: cpp
+
+ Cloud::Ptr cloud_nonground_projected(new Cloud);
+ proj.setInputCloud(cloud_nonground);
+ proj.setModelCoefficients(coefficients);
+ proj.filter(*cloud_nonground_projected);
+
+Next, we create a KdTree to accelerate our nearest neighbor search. The tree is composed of only ground returns, as our non-ground returns will serve as query points for the nearest neighbor search.
+
+.. code-block:: cpp
+
+ pcl::search::KdTree<pcl::PointXYZ>::Ptr ground_tree;
+ ground_tree.reset(new pcl::search::KdTree<pcl::PointXYZ> (false));
+ ground_tree->setInputCloud(cloud_ground_projected);
+
+We iterate over each of our projected non-ground points, searching for our nearest neighbor in the ground points. Using the indices of each the query (non-ground) and nearest neighbor (ground), we can retrieve the Z dimension from the input cloud, compute the height, and set this field in our original ``PointView``.
+
+.. code-block:: cpp
+
+ for (int i = 0; i < cloud_nonground_projected->size(); ++i)
+ {
+ pcl::PointXYZ nonground_query = cloud_nonground_projected->points[i];
+ std::vector<int> neighbors(1);
+ std::vector<float> sqr_distances(1);
+ ground_tree->nearestKSearch(nonground_query, 1, neighbors, sqr_distances);
+
+ double nonground_Z = view.getFieldAs<double>(Dimension::Id::Z, nonground[i]);
+ double ground_Z = view.getFieldAs<double>(Dimension::Id::Z, ground->indices[neighbors[0]]);
+ double height = nonground_Z - ground_Z;
+
+ view.setField(m_heightDim, nonground[i], height);
+ }
+
+The only thing left is to set the height field to 0.0 for each of the ground points.
+
+.. code-block:: cpp
+
+ for (auto const& ground_idx : ground->indices)
+ view.setField(m_heightDim, ground_idx, 0.0);
+
+Example #1
+-------------------------------------------------------------------------------
+
+Using the autzen dataset (here shown colored by elevation)
+
+.. image:: autzen-elevation.png
+ :height: 400px
+
+we run the following PDAL CLI command
+
+::
+
+ $ pdal translate autzen.laz autzen-height.bpf height \
+ --writers.bpf.output_dims="X,Y,Z,Height"
+
+The result, when colored by the normalized height instead of elevation is
+
+.. image:: autzen-height.png
+ :height: 400px
+
+Example #2
+-------------------------------------------------------------------------------
+
+If you'd like to overwrite your Z values, follow the height filter with :ref:`filters.ferry`.
+
+::
+
+ $ pdal translate input.laz output-height-as-Z.bpf height ferry \
+ --writers.bpf.output_dims="X,Y,Z" --filters.ferry.dimensions="Height=Z"
+
+Example #3
+-------------------------------------------------------------------------------
+
+If you don't yet have points classified as ground, start with :ref:`filters.ground`.
+
+::
+
+ $ pdal translate input.laz output-ground-height.bpf ground height \
+ --writers.bpf.output_dims="X,Y,Z,Height"
diff --git a/doc/tutorial/clipping-with-shapefile.rst b/doc/tutorial/clipping-with-shapefile.rst
new file mode 100644
index 0000000..cdf3f6a
--- /dev/null
+++ b/doc/tutorial/clipping-with-shapefile.rst
@@ -0,0 +1,208 @@
+.. _clipping:
+
+================================================================================
+Clipping with Geometries
+================================================================================
+
+:Author: Howard Butler
+:Contact: howard at hobu.co
+:Date: 11/09/2015
+
+
+Introduction
+-------------------------------------------------------------------------------
+
+This tutorial describes how to construct a pipeline that takes in geometries
+and clips out data with given geometry attributes. It is common to desire
+being able to cut or clip point cloud data with 2D geometries, often from
+auxillary data sources such as `OGR`_-readable `Shapefiles`_. This tutorial
+describes how to construct a pipeline that takes in geometries and clips out
+point cloud data inside geometries with matching attributes.
+
+.. contents::
+ :depth: 4
+ :backlinks: none
+
+
+.. _`OGR`: http://www.gdal.org
+.. _`Shapefiles`: https://en.wikipedia.org/wiki/Shapefile
+
+Example Data
+-------------------------------------------------------------------------------
+
+This tutorial utilizes the Autzen dataset. In addition to typical PDAL
+software (fetch it from :ref:`download`), you will need to download the
+following two files:
+
+* http://www.liblas.org/samples/autzen/autzen.laz
+* https://github.com/PDAL/PDAL/raw/master/test/data/autzen/attributes.json
+
+Stage Operations
+-------------------------------------------------------------------------------
+
+This operation depends on two :ref:`stages <stage_index>` PDAL provides.
+The first is the :ref:`filters.attribute` stage, which allows you to assign
+point values based on polygons read from `OGR`_. The second is the :ref:`filters.range`,
+which allows you to keep or reject points from the set that match given
+criteria.
+
+.. seealso::
+
+ :ref:`filters.predicate` allows you to construct sophisticated logic
+ for keeping or rejecting points in a more expressive environment (`Python`_).
+
+.. _`Python`: http://www.python.org
+
+Data Preparation
+-------------------------------------------------------------------------------
+
+.. figure:: autzen-shapes-point-cloud.png
+ :scale: 30%
+
+ Autzen Stadium, a 100 million+ point cloud file.
+
+The data are mixed in two different coordinate systems. The :ref:`LAZ
+<readers.las>` file is in `Oregon State Plane Ft.`_ and the `GeoJSON`_ defining
+the polygons is in `EPSG:4326`_. We have two options -- project the point cloud
+into the coordinate system of the attribute polygons, or project the attribute
+polygons into the coordinate system of the points. The latter is preferable in
+this case because it will be less math and therefore less computation. To make
+it convenient, we can utilize `OGR`_'s `VRT`_ capability to reproject the data
+for us on-the-fly:
+
+.. code-block:: xml
+
+ <OGRVRTDataSource>
+ <OGRVRTWarpedLayer>
+ <OGRVRTLayer name="OGRGeoJSON">
+ <SrcDataSource>attributes.json</SrcDataSource>
+ <LayerSRS>EPSG:4326</LayerSRS>
+ </OGRVRTLayer>
+ <TargetSRS>+proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=399999.9999999999 +y_0=0 +ellps=GRS80 +units=ft +no_defs</TargetSRS>
+ </OGRVRTWarpedLayer>
+ </OGRVRTDataSource>
+
+.. note::
+
+ The GeoJSON file does not have an externally-defined coordinate system,
+ so we are explictly setting one with the LayerSRS parameter. If your
+ data does have coordinate system information, you don't need to do that.
+
+Save this VRT definition to a file, called ``attributes.vrt`` in the same location where you
+stored the ``autzen.laz`` and ``attributes.json`` files.
+
+
+The attribute GeoJSON file has a couple of features with different attributes.
+For our scenario, we want to clip out the yellow-green polygon, marked number "5",
+in the upper right hand corner.
+
+
+
+.. figure:: autzen-shapes-to-clip.png
+ :scale: 30%
+
+ We want to clip out the polygon in the upper right hand corner. We can
+ view the `GeoJSON`_ geometry using something like `QGIS`_
+
+.. _`QGIS`: http://qgis.org
+
+Pipeline
+-------------------------------------------------------------------------------
+
+A PDAL :ref:`pipeline` is how you define a set of actions to happen to data
+as they are read, filtered, and written.
+
+.. code-block:: xml
+
+ <?xml version="2.0" encoding="utf-8"?>
+ <Pipeline version="1.0">
+ <Writer type="writers.las">
+ <Option name="filename">
+ output.las
+ </Option>
+ <Filter type="filters.range">
+ <Option name="limits">
+ Classification[5:5]
+ </Option>
+ <Filter type="filters.attribute">
+ <Option name="dimension">
+ Classification
+ </Option>
+ <Option name="datasource">
+ attributes.vrt
+ </Option>
+ <Option name="layer">
+ OGRGeoJSON
+ </Option>
+ <Option name="column">
+ CLS
+ </Option>
+ <Reader type="readers.las">
+ <Option name="filename">
+ autzen.laz
+ </Option>
+ </Reader>
+ </Filter>
+ </Filter>
+ </Writer>
+ </Pipeline>
+
+
+:ref:`Pipeline <pipeline>` files are read inside-out, so we will start with the
+:ref:`readers.las` and move up until we hit the :ref:`writers.las`.
+
+* :ref:`readers.las`: Define a reader that can read `ASPRS LAS`_ or `LASzip`_
+ data.
+* :ref:`filters.attribute`: Using the VRT we defined in `Data Preparation`_,
+ read attribute polygons out of the data source and assign the values from the
+ ``CLS`` column to the ``Classification`` field.
+* :ref:`filters.range`: Given that we have set the ``Classification`` values
+ for the points that have coincident polygons to 2, 5, and 6, only keep
+ ``Classification`` values in the range of ``5:5``. This functionally means
+ we're only keeping those points with a classification value of 5.
+* :ref:`writers.las`: write our content back out using an `ASPRS LAS`_ writer.
+
+.. note::
+
+ You don't have to use only ``Classification`` to set the attributes
+ with :ref:`filters.attribute`. Any valid dimension name could work, but
+ most LiDAR softwares will display categorical coloring for the
+ ``Classification`` field, and we can leverage that behavior in this
+ scenario.
+
+Processing
+-------------------------------------------------------------------------------
+
+1) Save the pipeline to a file called ``shape-clip.xml`` in the same directory as
+ your ``attributes.json`` and ``autzen.laz`` files.
+
+2) Call ``pdal pipeline`` on the :ref:`pipeline`.
+
+ ::
+
+ $ pdal pipeline shape-clip.xml
+
+3) Visualize ``output.las`` in an environment capable of viewing it. http://plas.io
+ or `CloudCompare`_ should do the trick.
+
+ .. image:: autzen-shapes-clipped.png
+ :scale: 30%
+
+Conclusion
+-------------------------------------------------------------------------------
+
+PDAL allows the composition of point cloud operations. This tutorial demonstrated
+how to use the :ref:`filters.attribute` and :ref:`filters.range` stages to clip
+points with shapefiles.
+
+.. _`CloudCompare`: http://www.danielgm.net/cc/
+
+.. _`ASPRS LAS`: http://www.asprs.org/Committee-General/LASer-LAS-File-Format-Exchange-Activities.html
+.. _`LASzip`: http://laszip.org
+
+.. _`VRT`: http://www.gdal.org/drv_vrt.html
+
+.. _`EPSG:4326`: http://epsg.io/4326
+.. _`GeoJSON`: http://geojson.org
+
+.. _`Oregon State Plane Ft.`: http://www.oregon.gov/DAS/CIO/GEO/pages/coordination/projections/projections.aspx
diff --git a/doc/tutorial/dart-throwing.rst b/doc/tutorial/dart-throwing.rst
new file mode 100644
index 0000000..5ada621
--- /dev/null
+++ b/doc/tutorial/dart-throwing.rst
@@ -0,0 +1,77 @@
+.. dart-throwing:
+
+===============================================================
+Performing Poisson Sampling of Point Clouds Using Dart Throwing
+===============================================================
+
+:Author: Bradley Chambers
+:Contact: brad.chambers at gmail.com
+:Date: 11/13/2015
+
+
+This tutorial will describe the creation of a new filter for sampling point cloud data, :ref:`filters.dartsample`.
+
+Introduction
+-------------------------------------------------------------------------------
+
+Sampling of point cloud data can be advantageous for a number of reasons. It can be used with care to create a lower resolution version of the point cloud for visualization, or to accelerate processing of derivative products at a coarser resolution. "Duplicate" points can be removed by subsampling. And the effects of overlapping and uneven scan patterns can be removed by sampling.
+
+Approach
+-------------------------------------------------------------------------------
+
+We have chosen to implement the dart throwing filter as a PCL filter. The reason for this is simple. While it is often the case that we want to create a filter that can be included as stage in a PDAL pipeline, there are other, more primitive filters, that we may wish to reuse within another filter. While we may not want to subsample our point cloud, thus discarding points from our output ``PointView``, we may be perfectly content to subsample the data as a transient representation of the [...]
+
+Our implementation is a no frills, brute force approach (there are more advanced methods that have been published over the years).
+
+We begin by creating a random permutation of the input ``PointView`` indices. The first point in this randomized set is appended to the output ``PointView`` and its associated octree. For the remaining points in the input cloud, we first test to see if there is a neighbor in the output cloud within the specified ``radius``. If so, we discard the point. If not, it too is added to the output ``PointView`` and octree.
+
+That's it! It's really that simple.
+
+Example #1
+-------------------------------------------------------------------------------
+
+We will again be working with the autzen dataset. The dart sampling filter is easily invoked via the PDAL ``translate`` command. Here, we enforce a minimum distance of three feet.
+
+::
+
+ $ pdal translate autzen.laz autzen-dart-sampled.laz dartsample \
+ --filters.dartsample.radius=3
+
+For comparison, we will process autzen using both :ref:`filters.decimation`, with a step size of 6, and :ref:`filters.voxelgrid`, with a leaf size of 4.5 feet in X, Y, and Z, to arrive at a subsampled point cloud of roughly 1.6 million points, which closely approximates the number of points returned in our dart sampling run.
+
+::
+
+ $ pdal translate autzen.laz autzen-randomly-sampled.laz decimation \
+ --filters.decimation.step=6
+
+::
+
+ $ pdal translate autzen.laz autzen-voxelgrid-sampled.laz voxelgrid \
+ --filters.voxelgrid.leaf_x=4.5 --filters.voxelgrid.leaf_y=4.5 --filters.voxelgrid.leaf_z=4.5
+
+First, we inspect a fixture located in the middle of an open field, displaying the original point cloud, Poisson (dart sampled), voxel grid, and randomly sampled results in clockwise order from top-left.
+
+.. image:: subsample-ex1.png
+ :height: 400px
+
+The Poisson and voxel gridded clouds both appear to do a good job retaining key elements of the structure, while significantly reducing the number of points allocated to the ground plane. The randomly sampled cloud however, exhibits the opposite behavior, noticeably degrading the structure, while heavily sampling the ground. This is not an unexpected result, as both the Poisson and voxel grid approaches take the data and its distribution into account during the subsampling process, while [...]
+
+The second example shows a very similar result, this time with a set of point pylons and power lines. The random sampling approach severely degrades the structures in the scene, while the Poisson and voxel grid techniques both preserve signal.
+
+.. image:: subsample-ex2.png
+ :height: 400px
+
+In the next example, we can see that there is an increased number of points in a scan overlap region. This is not uncommon, as data collectors strive to avoid gaps in coverage and overlap datasets to aid in registration of multiple passes. The appearance of these denser regions can be distracting to the eye, and the Poisson and voxel grid subsampling method can both be used to make the collected points appear more uniform by culling those points that are very near other other points. The [...]
+
+.. image:: subsample-ex3.png
+ :height: 400px
+
+In this top-down view of a football stadium, we again see that the random sampling technique preserves (and perhaps even accentuates) scan pattern and overlap artifacts. It also introduces a side effect to the voxel grid approach, an aliasing of the data, seen as staircasing in the sloping surfaces of the stadium.
+
+.. image:: subsample-ex4.png
+ :height: 400px
+
+Our last example once again demonstrates each of the issues we have identified. The random sampling result eliminates a majority of points from each of the towers and highlights a scan overlap region. The voxel grid method results in ringing in the sloped terrain. The Poisson approach preserves a good amount of detail in the original signal and does not introduce any visual artifacts.
+
+.. image:: subsample-ex5.png
+ :height: 400px
diff --git a/doc/tutorial/index.rst b/doc/tutorial/index.rst
index bcf7754..16b8986 100644
--- a/doc/tutorial/index.rst
+++ b/doc/tutorial/index.rst
@@ -26,6 +26,10 @@ Using PDAL
writing
pcl_block_tutorial
pcl_ground
+ clipping-with-shapefile
+ calculating-normalized-heights
+ dart-throwing
+
Developing
----------
diff --git a/doc/tutorial/liblas_to_pdal.rst b/doc/tutorial/liblas_to_pdal.rst
index 3192493..dd99ed8 100644
--- a/doc/tutorial/liblas_to_pdal.rst
+++ b/doc/tutorial/liblas_to_pdal.rst
@@ -3,6 +3,10 @@
libLAS C API to PDAL transition guide
=====================================
+:Author: Vaclav Petras
+:Contact: wenzeslaus at gmail.com
+:Date: 09/04/2015
+
This page shows how to port code using libLAS C API to PDAL API
(which is C++). The new code is not using full power of PDAL but
it uses just what is necessary to read content of a LAS file.
@@ -68,9 +72,9 @@ pointer was used with libLAS:
.. code-block:: cpp
-if (LAS_header == NULL) {
- /* fail */
-}
+ if (LAS_header == NULL) {
+ /* fail */
+ }
In general, PDAL will throw a ``pdal_error`` exception in case something
is wrong and it can't recover such in the case when the file can't be opened.
@@ -79,11 +83,11 @@ in ``try-catch`` block:
.. code-block:: cpp
-try {
- /* actual code */
-} catch {
- /* fail in your own way */
-}
+ try {
+ /* actual code */
+ } catch {
+ /* fail in your own way */
+ }
Dataset properties
diff --git a/doc/tutorial/overview.rst b/doc/tutorial/overview.rst
index 44b2633..86b412b 100644
--- a/doc/tutorial/overview.rst
+++ b/doc/tutorial/overview.rst
@@ -1,4 +1,4 @@
-.. _overview
+.. _overview:
******************************************************************************
PDAL Architecture Overview
@@ -15,6 +15,9 @@ manipulations and can calculate some statistical, boundary and density data.
PDAL provides an API that can be used by programmers for integration into their
own projects or to allow extension of existing capabilities.
+
+.. _the-pdal-model::
+
The PDAL model
--------------------------------------------------------------------------------
@@ -340,6 +343,8 @@ point_count_t read(PointViewPtr view, point_count_t count)
read.
+.. _implementing-a-filter::
+
Implementing a Filter
................................................................................
diff --git a/doc/tutorial/pcl_ground.rst b/doc/tutorial/pcl_ground.rst
index d8ab794..4f3bb4d 100644
--- a/doc/tutorial/pcl_ground.rst
+++ b/doc/tutorial/pcl_ground.rst
@@ -4,8 +4,13 @@
Identifying ground returns using ProgressiveMorphologicalFilter segmentation
===============================================================================
+:Author: Bradley Chambers
+:Contact: brad.chambers at gmail.com
+:Date: 10/28/2015
+
+
Implements the Progressive Morphological Filter for segmentation of ground
-points.
+points.
Background
------------------------------------------------------------------------------
diff --git a/doc/tutorial/pcl_spec.rst b/doc/tutorial/pcl_spec.rst
index 4c7ac35..f64560c 100644
--- a/doc/tutorial/pcl_spec.rst
+++ b/doc/tutorial/pcl_spec.rst
@@ -156,7 +156,10 @@ Any JSON keys not recognized by the spec are blissfully ignored.
ApproximateProgressiveMorphologicalFilter (APMF)
````````````````````````````````````````````````
-:pcl:`ApproximateProgressiveMorphologicalFilter <pcl::ApproximateProgressiveMorphologicalFilter>`
+.. seealso:
+
+ :ref:`filters.ground` utilizes ApproximateProgressiveMorphologicalFilter in
+ the context of a PDAL filter
This filter removes nonground points to produce a bare-earth point cloud. It is
similar to the ProgressiveMorphologicalFilter, but is potentially faster (and
@@ -225,7 +228,10 @@ setNegative: bool
ConditionalRemoval
``````````````````
-:pcl:`ConditionalRemoval <pcl::ConditionalRemoval>`
+.. seealso::
+
+ :ref:`filters.range` implements support for this PCL operation as a
+ PDAL filter
This filter removes normals outside of a given Z range.
@@ -263,8 +269,6 @@ normalZ: object `{"min": float, "max": float}`
GridMinimum
```````````
-:pcl:`GridMinimum <pcl::GridMinimum>`
-
This filter assembles a local 2D grid over a given PointCloud, then downsamples
the data.
@@ -297,7 +301,6 @@ setResolution: float
NormalEstimation
````````````````
-:pcl:`NormalEstimation <pcl::NormalEstimation>`
**Description**
@@ -337,8 +340,6 @@ setRadiusSearch: float
PassThrough
```````````
-:pcl:`PassThrough <pcl::PassThrough>`
-
**Description**
This filter allows the user to set min/max bounds on one dimension of the data.
@@ -376,9 +377,9 @@ setFilterFieldName: string (required)
Only the `X`, `Y`, `Z`, `R`, `G`, `B`, and `Intensity` dimensions are
supported.
-
+
.. note::
-
+
Although PDAL capitalizes the dimension names ("Z", "Intensity"), PCL
requires the names be given in lower case ("z", "intensity").
@@ -391,7 +392,11 @@ setFilterLimits: object `{"min": float, "max": float}`
ProgressiveMorphologicalFilter (PMF)
````````````````````````````````````
-:pcl:`ProgressiveMorphologicalFilter <pcl::ProgressiveMorphologialFilter>`
+
+.. seealso::
+
+ :ref:`filters.ground` implements support for this operation as a
+ PDAL filter
**Description**
@@ -422,7 +427,7 @@ Example:
]
}
}
-
+
**Parameters**
setMaxWindowSize: int
@@ -460,7 +465,11 @@ setNegative: bool
RadiusOutlierRemoval
````````````````````
-:pcl:`RadiusOutlierRemoval <pcl::RadiusOutlierRemoval>`
+.. seealso::
+
+ :ref:`filters.radiusoutlier` implements support for this operation
+ as a PDAL filter
+
**Description**
@@ -502,7 +511,10 @@ setRadiusSearch: float
StatisticalOutlierRemoval
`````````````````````````
-:pcl:`StatisticalOutlierRemoval <pcl::StatisticalOutlierRemoval>`
+.. seealso::
+
+ :ref:`filters.statisticaloutlier` implements support for this
+ operation as a PDAL filter
**Description**
@@ -543,7 +555,11 @@ setStddevMulThresh: float
VoxelGrid
`````````
-:pcl:`VoxelGrid <pcl::VoxelGrid>`
+.. seealso::
+
+ :ref:`filters.voxelgrid` implements support for this operation as a
+ PDAL filter
+
This filter assembles a local 3D grid over a given PointCloud, then downsamples
and filters the data.
diff --git a/doc/tutorial/reading.rst b/doc/tutorial/reading.rst
index 23dfad9..fbbf81e 100644
--- a/doc/tutorial/reading.rst
+++ b/doc/tutorial/reading.rst
@@ -4,6 +4,11 @@
Reading with PDAL
===============================================================================
+:Author: Bradley Chambers
+:Contact: brad.chambers at gmail.com
+:Date: 01/21/2015
+
+
.. contents:: Contents
:depth: 3
@@ -41,115 +46,44 @@ Our first example to demonstrate PDAL's utility will be to simply query an
The `interesting.las`_ file in these examples can be found on github.
-`reStructuredText`_ output
-................................................................................
-
-By default, PDAL outputs `reStructuredText`_. This makes it convenient for
-transforming the output into more pleasing formats like PDF (using `rst2pdf`_)
-or HTML (using `rst2html`_) as part of a processing pipeline.
-
-.. _`rst2pdf`: https://code.google.com/p/rst2pdf/
-.. _`rst2html`: http://docutils.sourceforge.net/docs/user/tools.html#rst2html-py
-
-.. _`reStructuredText`: http://docutils.sourceforge.net/rst.html
-
-::
-
- $ pdal info interesting.las -p 0
-
-::
-
- Point 0
- --------------------------------------------------------------------------------
-
- =================== ======================================= ===================
- Name Value Namespace
- =================== ======================================= ===================
- X 637012.23999999999 readers.las
- Y 849028.31000000006 readers.las
- Z 431.66000000000003 readers.las
- Intensity 143 readers.las
- ReturnNumber 1 readers.las
- NumberOfReturns 1 readers.las
- ScanDirectionFlag 1 readers.las
- EdgeOfFlightLine 0 readers.las
- Classification 1 readers.las
- ScanAngleRank -9 readers.las
- UserData 132 readers.las
- PointSourceId 7326 readers.las
- Time 245380.78254962614 readers.las
- Red 68 readers.las
- Green 77 readers.las
- Blue 88 readers.las
- =================== ======================================= ===================
-
-JavaScript output
-................................................................................
-
-JavaScript `JSON`_ can also be output.
+`pdal info` outputs JavaScript `JSON`_.
.. _`JSON`: http://www.json.org/
::
- $ pdal info interesting.las -p 0 --json
+ $ pdal info interesting.las -p 0
.. code-block:: javascript
{
- "X": "637012.23999999999",
- "Y": "849028.31000000006",
- "Z": "431.66000000000003",
- "Intensity": "143",
- "ReturnNumber": "1",
- "NumberOfReturns": "1",
- "ScanDirectionFlag": "1",
- "EdgeOfFlightLine": "0",
- "Classification": "1",
- "ScanAngleRank": "-9",
- "UserData": "132",
- "PointSourceId": "7326",
- "Time": "245380.78254962614",
- "Red": "68",
- "Green": "77",
- "Blue": "88"
+ "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
+ }
+ }
}
-
-
-XML output
-................................................................................
-
-XML output of this same point is as simple as adding the appropriate
-switch:
-
-::
-
- $ pdal info interesting.las -p 0 --xml
-
-.. code-block:: xml
-
- <?xml version="1.0" encoding="utf-8"?>
- <point>
- <X>637012.23999999999</X>
- <Y>849028.31000000006</Y>
- <Z>431.66000000000003</Z>
- <Intensity>143</Intensity>
- <ReturnNumber>1</ReturnNumber>
- <NumberOfReturns>1</NumberOfReturns>
- <ScanDirectionFlag>1</ScanDirectionFlag>
- <EdgeOfFlightLine>0</EdgeOfFlightLine>
- <Classification>1</Classification>
- <ScanAngleRank>-9</ScanAngleRank>
- <UserData>132</UserData>
- <PointSourceId>7326</PointSourceId>
- <Time>245380.78254962614</Time>
- <Red>68</Red>
- <Green>77</Green>
- <Blue>88</Blue>
- </point>
-
-
A conversion example
------------------------------------------------------------------------------
@@ -200,12 +134,12 @@ We can capture this metadata using the :ref:`info_command` utility.
::
- $ pdal info --metadata --xml interesting.las
+ $ pdal info --metadata interesting.las
-This produces metadata that looks like :ref:`this <metadataxml>`. You can use
-your favorite `XML`_ or `JSON`_ manipulation tools to extract this information
-and do what you need with it. For formats that do not have the ability to
-preserve this metadata internally, you can keep a ``.xml`` or ``.json`` file
+This produces metadata that looks like :ref:`this <metadatajson>`. 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.
.. seealso::
@@ -238,7 +172,7 @@ effects.
Simple conversion
..............................................................................
-The following XML document defines a :ref:`pipeline` that takes the ``file.las``
+The following `XML`_ document defines a :ref:`pipeline` that takes the ``file.las``
`ASPRS LAS`_ file and converts it to a new file called ``output.las``.
::
diff --git a/doc/tutorial/subsample-ex1.png b/doc/tutorial/subsample-ex1.png
new file mode 100644
index 0000000..28316a1
Binary files /dev/null and b/doc/tutorial/subsample-ex1.png differ
diff --git a/doc/tutorial/subsample-ex2.png b/doc/tutorial/subsample-ex2.png
new file mode 100644
index 0000000..60c82c8
Binary files /dev/null and b/doc/tutorial/subsample-ex2.png differ
diff --git a/doc/tutorial/subsample-ex3.png b/doc/tutorial/subsample-ex3.png
new file mode 100644
index 0000000..9485128
Binary files /dev/null and b/doc/tutorial/subsample-ex3.png differ
diff --git a/doc/tutorial/subsample-ex4.png b/doc/tutorial/subsample-ex4.png
new file mode 100644
index 0000000..13241ae
Binary files /dev/null and b/doc/tutorial/subsample-ex4.png differ
diff --git a/doc/tutorial/subsample-ex5.png b/doc/tutorial/subsample-ex5.png
new file mode 100644
index 0000000..88cd492
Binary files /dev/null and b/doc/tutorial/subsample-ex5.png differ
diff --git a/doc/tutorial/using.rst b/doc/tutorial/using.rst
index 86ad4bf..de6ece7 100644
--- a/doc/tutorial/using.rst
+++ b/doc/tutorial/using.rst
@@ -4,6 +4,10 @@
Using PDAL with CMake
===============================================================================
+:Author: Bradley Chambers
+:Contact: brad.chambers at gmail.com
+:Date: 01/21/2015
+
This tutorial will explain how to use PDAL in your own projects using CMake. A
more complete, working example can be found :ref:`here <writing>`.
diff --git a/doc/tutorial/writing-filter.rst b/doc/tutorial/writing-filter.rst
index a16d8c5..8167401 100644
--- a/doc/tutorial/writing-filter.rst
+++ b/doc/tutorial/writing-filter.rst
@@ -4,73 +4,109 @@
Writing a filter
===============================================================================
-PDAL's command-line application can be extended through the development of
-kernel functions. In this tutorial, we will give a brief example.
+:Author: Bradley Chambers
+:Contact: brad.chambers at gmail.com
+:Date: 11/11/2015
+
+
+PDAL can be extended through the development of filter functions.
+
+.. seealso::
+
+ For more on filters and their role in PDAL, please refer to :ref:`the-pdal-model` and :ref:`implementing-a-filter`.
+
+Every filter stage in PDAL is implemented as a plugin (sometimes referred to as a "driver"). Filters native to PDAL, such as :ref:`filters.ferry`, are implemented as _static_ filters and are statically linked into the PDAL library. Filters that require extra/optional dependencies, or are external to the core PDAL codebase altogether, such as :ref:`filters.ground`, are implemented as _shared_ filters, and are built as individual shared libraries, discoverable by PDAL at runtime.
+
+In this tutorial, we will give a brief example of a filter, with notes on how to make it static or shared.
+
The header
--------------------------------------------------------------------------------
+...............................................................................
First, we provide a full listing of the filter header.
.. literalinclude:: ../../examples/writing-filter/MyFilter.hpp
:language: cpp
-In your MyFilter class, you will use two macros defined in Filter.hpp to
-register some useful information about your filter. SET_STAGE_NAME sets the
-filter name and description. These are extracted by the PDAL application to
-inform the user of the filter's name and purpose. The name will be displayed
-when the user types `pdal --help`.
+This header should be relatively straightforward, but we will point out three methods that must be declared for the plugin interface to be satisfied.
.. literalinclude:: ../../examples/writing-filter/MyFilter.hpp
:language: cpp
- :lines: 25
+ :lines: 23-25
-SET_STAGE_LINK will provide a link to a webpage that documents the filter.
+In many instances, you should be able to copy this header template verbatim, changing only the filter class name, includes, and member functions/variables as required by your implementation.
-.. literalinclude:: ../../examples/writing-filter/MyFilter.hpp
+The source
+...............................................................................
+
+Again, we start with a full listing of the filter source.
+
+.. literalinclude:: ../../examples/writing-filter/MyFilter.cpp
:language: cpp
- :lines: 26
-Plugin filters should also SET_PLUGIN_VERSION to register the version number of
-the plugin.
+For your filter to be available to PDAL at runtime, it must adhere to the PDAL plugin interface. As a convenience, we provide the macros in ``pdal_macros.hpp`` to do just this.
-.. literalinclude:: ../../examples/writing-filter/MyFilter.hpp
+We begin by creating a ``PluginInfo`` struct containing three identifying elements - the filter name, description, and a link to documentation.
+
+.. literalinclude:: ../../examples/writing-filter/MyFilter.cpp
:language: cpp
- :lines: 27
+ :lines: 14-16
-The source
--------------------------------------------------------------------------------
+PDAL requires that filter names always begin with ``filters.``, and end with a string that uniquely identifies the filter. The description will be displayed to users of the PDAL CLI (``pdal --drivers``).
-Again, we start with a full listing of the filter source.
+Next, we pass the following to the ``CREATE_STATIC_PLUGIN`` macro, in order: PDAL plugin ABI major version, PDAL plugin ABI minor version, filter class name, stage type (``Filter``), and our ``PluginInfo`` struct.
.. literalinclude:: ../../examples/writing-filter/MyFilter.cpp
:language: cpp
+ :lines: 18
+
+To create a shared plugin, we simply change ``CREATE_STATIC_PLUGIN`` to ``CREATE_SHARED_PLUGIN``.
-In your filter implementation, you will use a third macro defined in
-pdal_macros. This macro registers the plugin with the Filter factory. It is
-only required by plugins.
+Finally, we implement a method to get the plugin name, which is primarily used by the PDAL CLI when using the ``--drivers`` or ``--options`` arguments.
.. literalinclude:: ../../examples/writing-filter/MyFilter.cpp
:language: cpp
- :lines: 11
+ :lines: 20-23
-Native filters will use a different set of macros added directly to the
-StageFactory.cpp file to register themselves.
+Now that the filter has implemented the proper plugin interface, we will begin to implement some methods that actually implement the filter. First, ``getDefaultOptions()`` is used to advertise those options that the filter provides. Within PDAL, this is primarily used as a means of displaying options via the PDAL CLI with the ``--options`` argument. It provides the user with the option names, descriptions, and default values.
-.. code-block:: cpp
+.. literalinclude:: ../../examples/writing-filter/MyFilter.cpp
+ :language: cpp
+ :lines: 25-30
- MAKE_FILTER_CREATOR(myfilter, pdal::MyFilter)
- REGISTER_FILTER(myfilter, pdal::MyFilter);
+The ``processOptions()`` method is used to parse any provided options. Here, we get the value of ``param``, if provided, else we populate ``m_value`` with the default value of ``1.0``.
.. literalinclude:: ../../examples/writing-filter/MyFilter.cpp
:language: cpp
- :lines: 13-16
+ :lines: 32-35
+
+In ``addDimensions()`` we make sure that the known ``Intensity`` dimension is registered. We can also add a custom dimension, ``MyDimension``, which will be populated within ``run()``.
.. literalinclude:: ../../examples/writing-filter/MyFilter.cpp
:language: cpp
- :lines: 18-21
+ :lines: 37-41
+
+Finally, we define ``run()``, which takes as input a ``PointViewPtr`` and returns a ``PointViewSet``. It is here that we can transform existing dimensions, add data to new dimensions, or selectively add/remove individual points.
.. literalinclude:: ../../examples/writing-filter/MyFilter.cpp
:language: cpp
- :lines: 23-28
+ :lines: 43-48
+
+We suggest you take a closer look at our existing filters to get an idea of the power of the ``Filter`` stage and inspiration for your own filters!
+
+StageFactory
+...............................................................................
+
+As of this writing, users must also make a couple of changes to ``StageFactory.cpp`` to properly register static plugins only (this is not required for shared plugins). It is our goal to eventually remove this requirement to further streamline development of add-on plugins.
+
+First, add the following line to the beginning of ``StageFactory.cpp`` (adjusting the path and filename as necessary).
+
+.. code-block:: cpp
+
+ #include <MyFilter.hpp>
+
+Next, add the following line of code to the ``StageFactory`` constructor.
+
+.. code-block:: cpp
+ PluginManager::initializePlugin(MyFilter_InitPlugin);
diff --git a/doc/tutorial/writing-kernel.rst b/doc/tutorial/writing-kernel.rst
index b128720..5a466ff 100644
--- a/doc/tutorial/writing-kernel.rst
+++ b/doc/tutorial/writing-kernel.rst
@@ -4,6 +4,11 @@
Writing a kernel
===============================================================================
+:Author: Bradley Chambers
+:Contact: brad.chambers at gmail.com
+:Date: 01/21/2015
+
+
PDAL's command-line application can be extended through the development of
kernel functions. In this tutorial, we will give a brief example.
@@ -15,21 +20,12 @@ First, we provide a full listing of the kernel header.
.. literalinclude:: ../../examples/writing-kernel/MyKernel.hpp
:language: cpp
-In your MyKernel class, you will use two macros defined in Kernel.hpp to
-register some useful information about your kernel. SET_KERNEL_NAME sets the
-kernel name and description. These are extracted by the PDAL application to
-inform the user of the kernel's name and purpose. The name will be displayed
-when the user types `pdal --help`.
+As with other plugins, the MyKernel class needs to have the following three methods declared for the plugin interface to be satisfied:
.. literalinclude:: ../../examples/writing-kernel/MyKernel.hpp
:language: cpp
- :lines: 12
-
-SET_KERNEL_LINK will provide a link to a webpage that documents the kernel.
+ :lines: 16-18
-.. literalinclude:: ../../examples/writing-kernel/MyKernel.hpp
- :language: cpp
- :lines: 13
The source
-------------------------------------------------------------------------------
@@ -39,31 +35,26 @@ Again, we start with a full listing of the kernel source.
.. literalinclude:: ../../examples/writing-kernel/MyKernel.cpp
:language: cpp
-In your kernel implementation, you will use a third macro defined in
-pdal_macros. This macro registers the plugin with the Kernel factory. It is
+In your kernel implementation, you will use a macro defined in pdal_macros.
+This macro registers the plugin with the Kernel factory. It is
only required by plugins.
.. literalinclude:: ../../examples/writing-kernel/MyKernel.cpp
:language: cpp
- :lines: 24
+ :lines: 23-29
-Native kernels will use a different set of macros added directly to the
-KernelFactory.cpp file to register themselves.
-
-.. code-block:: cpp
-
- MAKE_KERNEL_CREATOR(mykernel, pdal::MyKernel)
- REGISTER_KERNEL(mykernel, pdal::MyKernel);
+A static plugin macro can also be used to integrate the kernel with the main code.
+This will not be described here. Using this as a shared plugin will be described later.
To build up a processing pipeline in this
example, we need to create two objects: the
-PointContext and the StageFactory. The latter is
+PointTable and the StageFactory. The latter is
used to create the various stages that will be
used within the kernel.
.. literalinclude:: ../../examples/writing-kernel/MyKernel.cpp
:language: cpp
- :lines: 50-51
+ :lines: 60
The Reader is created from the StageFactory, and
is specified by the stage name, in this case an
@@ -73,7 +64,7 @@ read.
.. literalinclude:: ../../examples/writing-kernel/MyKernel.cpp
:language: cpp
- :lines: 53-56
+ :lines: 62-65
The Filter is also created from the StageFactory.
Here, we create a decimation filter that will
@@ -83,7 +74,7 @@ the reader.
.. literalinclude:: ../../examples/writing-kernel/MyKernel.cpp
:language: cpp
- :lines: 58-62
+ :lines: 67-71
Finally, the Writer is created from the
StageFactory. This text writer, takes as input
@@ -92,7 +83,7 @@ the output filename as its sole option.
.. literalinclude:: ../../examples/writing-kernel/MyKernel.cpp
:language: cpp
- :lines: 64-68
+ :lines: 73-77
The final two steps are to prepare and execute
the pipeline. This is achieved by calling prepare
@@ -100,4 +91,10 @@ and execute on the final stage.
.. literalinclude:: ../../examples/writing-kernel/MyKernel.cpp
:language: cpp
- :lines: 69-70
+ :lines: 78-79
+
+When compiled, a dynamic library file will be created; in this case, ``libpdal_plugin_kernel_mykernel.dylib``
+
+Put this file in whatever directory ``PDAL_DRIVER_PATH`` is pointing to. Then, if you run ``pdal --help``, you should see ``mykernel`` listed in the possible commands.
+
+To run this kernel, you would use ``pdal mykernel -i <input las file> -o <output text file>``.
diff --git a/doc/tutorial/writing-reader.rst b/doc/tutorial/writing-reader.rst
index b88f87a..b0448b6 100644
--- a/doc/tutorial/writing-reader.rst
+++ b/doc/tutorial/writing-reader.rst
@@ -4,6 +4,11 @@
Writing a reader
===============================================================================
+:Authors: Bradley Chambers, Scott Lewis
+:Contact: brad.chambers at gmail.com
+:Date: 11/13/2015
+
+
PDAL's command-line application can be extended through the development of
reader functions. In this tutorial, we will give a brief example.
@@ -15,21 +20,35 @@ First, we provide a full listing of the reader header.
.. literalinclude:: ../../examples/writing-reader/MyReader.hpp
:language: cpp
-In your MyReader class, you will use two macros defined in Reader.hpp to
-register some useful information about your reader. SET_STAGE_NAME sets the
-reader name and description. These are extracted by the PDAL application to
-inform the user of the reader's name and purpose. The name will be displayed
-when the user types `pdal --help`.
+In your MyReader class, you will declare the necessary methods and variables
+needed to make the reader work and meet the plugin specifications.
.. literalinclude:: ../../examples/writing-reader/MyReader.hpp
:language: cpp
- :lines: 12
+ :lines: 16-18
-SET_STAGE_LINK will provide a link to a webpage that documents the reader.
+These methods are required to fulfill the specs for defining a new plugin.
.. literalinclude:: ../../examples/writing-reader/MyReader.hpp
:language: cpp
- :lines: 13
+ :lines: 20-21
+
+These methods are used for setting various defaults for the Reader.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.hpp
+ :language: cpp
+ :lines: 24-26
+
+``m_stream`` is used to process the input, while ``m_index`` is used to track
+the index of the records. ``m_scale_z`` is specific to MyReader, and will
+be described later.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.hpp
+ :language: cpp
+ :lines: 28-32
+
+Various other override methods for the stage. There are a few others that
+could be overridden, which will not be discussed in this tutorial.
The source
-------------------------------------------------------------------------------
@@ -39,57 +58,155 @@ Again, we start with a full listing of the reader source.
.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
:language: cpp
-In your reader implementation, you will use a third macro defined in
-pdal_macros. This macro registers the plugin with the Reader factory. It is
-only required by plugins.
+In your reader implementation, you will use a macro defined in pdal_macros.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
+ :language: cpp
+ :lines: 7-12
+
+This macro registers the plugin with the PDAL code. In this case, we are
+declaring this as a SHARED plugin, meaning that it will be located external
+to the main PDAL instalation. The macro is supplied with a version number
+(major and minor), the class of the plugin, the parent class (in this case,
+to identify it as a reader), and an object with information. This information
+includes the name of the plugin, a description, and a link to documentation.
+
+Creating STATIC plugins requires a few more steps which will not be covered
+in this tutorial.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
+ :language: cpp
+ :lines: 16-22
+
+This method will process a set of default options for the reader. In this
+example, we are setting the z_scale value to a default of 1.0, indicating
+that the Z values we read should remain as-is. (In our reader, this could
+be changed if, for example, the Z values in the file represented mm values,
+and we want to represent them as m in the storage model).
+
+The options will then be processed elsewhere and will be supplied values from
+the pipeline configuration, etc.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
+ :language: cpp
+ :lines: 24-27
+
+This method takes an Options object and populates the reader's private
+variables with values found in the options object.
.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
:language: cpp
- :lines: 24
+ :lines: 29-35
-Native readers will use a different set of macros added directly to the
-ReaderFactory.cpp file to register themselves.
+This method registers the various dimensions the reader will use. In our case,
+we are using the X, Y, and Z built-in dimensions, as well as a custom
+dimension MyData.
-.. code-block:: cpp
+.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
+ :language: cpp
+ :lines: 48-52
- MAKE_READER_CREATOR(myreader, pdal::MyReader)
- REGISTER_READER(myreader, pdal::MyReader);
+This method is called when the Reader is ready for use. It will only be
+called once, regardless of the number of PointViews that are to be
+processed.
-To build up a processing pipeline in this example, we need to create two
-objects: the PointContext and the StageFactory. The latter is used to create
-the various stages that will be used within the reader.
+.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
+ :language: cpp
+ :lines: 55-68
+
+This is a helper function, which will convert a string value into the type
+specified when it's called. In our example, it will be used to convert
+strings to doubles when reading from the input stream.
.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
:language: cpp
- :lines: 50-51
+ :lines: 71-78
-The Reader is created from the StageFactory, and is specified by the stage
-name, in this case an LAS reader. For brevity, we provide the reader a single
-option, the filename of the file to be read.
+This method is the main processing method for the reader. It takes a
+pointer to a Point View which we will build as we read from the file. We
+initialize some variables as well, and then reset the input stream with
+the filename used for the reader. Note that in other readers, the contents
+of this method could be very different depending on the format of the file
+being read, but this should serve as a good start for how to build the
+PointView ojbect.
.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
:language: cpp
- :lines: 53-56
+ :lines: 80-82
-The Filter is also created from the StageFactory. Here, we create a decimation
-filter that will pass every tenth point to subsequent stages. We also specify
-the input to this stage, which is the reader.
+In prepration for reading the file, we prepare to skip some header lines. In
+our case, the header is only a single line.
.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
:language: cpp
- :lines: 58-62
+ :lines: 83-87
-Finally, the Writer is created from the StageFactory. This text writer, takes
-as input the previous stage (the decimation filter) and the output filename as
-its sole option.
+Here we begin our main loop. In our example file, the first line is a header,
+and each line thereafter is a single point. If the file had a different format
+the method of looping and reading would have to change as appropriate. We make
+sure we are skipping the header lines here before moving on.
.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
:language: cpp
- :lines: 64-68
+ :lines: 91-99
-The final two steps are to prepare and execute the pipeline. This is achieved
-by calling prepare and execute on the final stage.
+Here we take the line we read in the for block header, split it, and make sure
+that we have the proper number of fields.
.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
:language: cpp
- :lines: 69-70
+ :lines: 101-112
+
+Here we take the values we read and put them into the PointView object. The
+X and Y fields are simply converted from the file and put into the respective
+fields. MyData is done likewise with the custom dimension we defined. The Z
+value is read, and multiplied by the scale_z option (defaulted to 1.0), before
+the converted value is put into the field.
+
+When putting the value into the PointView object, we pass in the Dimension
+that we are assigning it to, the ID of the point (which is incremented in
+each iteration of the loop), and the dimension value.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
+ :language: cpp
+ :lines: 111-122
+
+Finally, we increment the nextId. After the loop is done, we set the index
+and number read, and return that value as the number of points read.
+This could differ in cases where we read multiple streams, but that won't
+be covered here.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
+ :language: cpp
+ :lines: 124-127
+
+When the read method is finished, the done method is called for any cleanup.
+In this case, we simply make sure the stream is reset.
+
+
+Compiling and Usage
+-------------------------------------------------------------------------------
+The MyReader.cpp code can be compiled. For this example, we'll use cmake.
+Here is the CMakeLists.txt file we will use:
+
+.. literalinclude:: ../../examples/writing-reader/CMakeLists.txt
+
+If this file is in the directory containing MyReader.hpp and MyReader.cpp,
+simply run ``cmake .``, followed by ``make``. This will generate a file called
+``libpdal_plugin_reader_myreader.dylib``.
+
+Put this dylib file into the directory pointed to by ``PDAL_DRIVER_PATH``, and
+then when you run ``pdal --drivers``, you should see an entry for
+readers.myreader.
+
+To test the reader, we will put it into a pipeline and output a text file.
+
+Please download the `pipeline-myreader.xml`_ and `test-reader-input.txt`_ files.
+
+In the directory with those two files, run
+``pdal pipeline pipeline-myreader.xml``. You should have an output file
+called ``output.txt``, which will have the same data as in the input file,
+except in a CSV style format, and with the Z values scaled by .001.
+
+.. _`pipeline-myreader.xml`: https://github.com/PDAL/PDAL/blob/master/examples/writing-reader/pipeline-myreader.xml?raw=true
+.. _`test-reader-input.txt`: https://github.com/PDAL/PDAL/blob/master/examples/writing-reader/test-reader-input.txt?raw=true
diff --git a/doc/tutorial/writing-writer.rst b/doc/tutorial/writing-writer.rst
index 41e6b7a..e93c4c2 100644
--- a/doc/tutorial/writing-writer.rst
+++ b/doc/tutorial/writing-writer.rst
@@ -4,6 +4,11 @@
Writing a writer
===============================================================================
+:Authors: Bradley Chambers, Scott Lewis
+:Contact: brad.chambers at gmail.com
+:Date: 11/18/2015
+
+
PDAL's command-line application can be extended through the development of
writer functions. In this tutorial, we will give a brief example.
@@ -15,89 +20,152 @@ First, we provide a full listing of the writer header.
.. literalinclude:: ../../examples/writing-writer/MyWriter.hpp
:language: cpp
-In your MyWriter class, you will use two macros defined in Writer.hpp to
-register some useful information about your writer. SET_STAGE_NAME sets the
-writer name and description. These are extracted by the PDAL application to
-inform the user of the writer's name and purpose. The name will be displayed
-when the user types `pdal --help`.
+In your MyWriter class, you will declare the necessary methods and variables
+needed to make the writer work and meet the plugin specifications.
+
+.. literalinclude:: ../../examples/writing-writer/MyWriter.hpp
+ :language: cpp
+ :lines: 11
+
+FileStreamPtr is defined to make the declaration of the stream easier to manage
+later on.
+
+.. literalinclude:: ../../examples/writing-writer/MyWriter.hpp
+ :language: cpp
+ :lines: 19-21
+
+These three methods are required to fulfill the specs for defining a new plugin.
+
+.. literalinclude:: ../../examples/writing-writer/MyWriter.hpp
+ :language: cpp
+ :lines: 23
+
+This method will be used to specify default options for the Writer.
.. literalinclude:: ../../examples/writing-writer/MyWriter.hpp
:language: cpp
- :lines: 12
+ :lines: 26-29
-SET_STAGE_LINK will provide a link to a webpage that documents the writer.
+These methods are used during various phases of the pipeline. There are also
+more methods, which will not be covered in this tutorial.
.. literalinclude:: ../../examples/writing-writer/MyWriter.hpp
:language: cpp
- :lines: 13
+ :lines: 31-37
+
+These are variables our Writer will use, such as the file to write to, the
+newline character to use, the name of the data field to use to write the MyData
+field, precision of the double outputs, the output stream, and the dimension
+that corresponds to the data field for easier lookup.
+
+As mentioned, there cen be additional configurations done as needed.
-The source
+
+The header
-------------------------------------------------------------------------------
-Again, we start with a full listing of the writer source.
+We will start with a full listing of the writer source.
.. literalinclude:: ../../examples/writing-writer/MyWriter.cpp
:language: cpp
-In your writer implementation, you will use a third macro defined in
-pdal_macros. This macro registers the plugin with the Writer factory. It is
-only required by plugins.
+In the writer implementation, we will use a macro defined in pdal_macros,
+which is included in the include chain we are using.
.. literalinclude:: ../../examples/writing-writer/MyWriter.cpp
:language: cpp
- :lines: 25
+ :lines: 11-16
-Native writers will use a different set of macros added directly to the
-WriterFactory.cpp file to register themselves.
+Here we define a struct with information regarding the writer, such as the
+name, a description, and a path to documentation. We then use the macro
+to create a SHARED plugin, which means it will be external to the main PDAL
+installation. When using the macro, we specify the version (major and minor),
+the class of the plugin, the class of the parent (Writer, in this case), and
+the struct we defined earlier.
-.. code-block:: cpp
+Creating STATIC plugins, which would be part of the main PDAL installation, is
+also possible, but requires some extra steps and will not be covered here.
- MAKE_WRITER_CREATOR(mywriter, pdal::MyWriter)
- REGISTER_WRITER(mywriter, pdal::MyWriter);
+.. literalinclude:: ../../examples/writing-writer/MyWriter.cpp
+ :language: cpp
+ :lines: 20-31
-To build up a processing pipeline in this
-example, we need to create two objects: the
-PointContext and the StageFactory. The latter is
-used to create the various stages that will be
-used within the writer.
+This struct is used for helping with the FileStreamPtr for cleanup.
.. literalinclude:: ../../examples/writing-writer/MyWriter.cpp
:language: cpp
- :lines: 50-51
+ :lines: 34-44
-The Reader is created from the StageFactory, and
-is specified by the stage name, in this case an
-LAS reader. For brevity, we provide the reader a
-single option, the filename of the file to be
-read.
+This method sets various default parameters. They can be overridden via the
+pipeline, if desired.
.. literalinclude:: ../../examples/writing-writer/MyWriter.cpp
:language: cpp
- :lines: 53-56
+ :lines: 47-63
-The Filter is also created from the StageFactory.
-Here, we create a decimation filter that will
-pass every tenth point to subsequent stages. We
-also specify the input to this stage, which is
-the reader.
+This method processes the options, including the default options given, and in
+this case also opens the output file stream for use.
.. literalinclude:: ../../examples/writing-writer/MyWriter.cpp
:language: cpp
- :lines: 58-62
+ :lines: 66-82
-Finally, the Writer is created from the
-StageFactory. This text writer, takes as input
-the previous stage (the decimation filter) and
-the output filename as its sole option.
+The ready method is used to prepare the writer for any number of PointViews that
+may be passed in. In this case, we are setting the precision for our double
+writes, looking up the dimension specified as the one to write into MyData,
+and writing the header of the output file.
.. literalinclude:: ../../examples/writing-writer/MyWriter.cpp
:language: cpp
- :lines: 64-68
-
-The final two steps are to prepare and execute
-the pipeline. This is achieved by calling prepare
-and execute on the final stage.
+ :lines: 85-101
+
+This method is the main method for writing. In our case, we are writing a very
+simple file, with data in the format of X:Y:Z:MyData. We loop through each
+index in the PointView, and for each one we take the X, Y, and Z values, as well
+as the value for the specified MyData dimension, and write this to the output
+file. In particular, note the reading of MyData; in our case, MyData is an
+integer, but the field we are reading might be a double. Converting from double
+to integer is done via truncation, not rounding, so by adding .5 before making
+the conversion will ensure rounding is done properly.
+
+Note that in this case, the output format is pretty simple. For more complex
+outputs, you may need to generate helper methods (and possibly helper classes)
+to help generate the proper output. The key is reading in the appropriate
+values from the PointView, and then writing those in whatever necessary format
+to the output stream.
.. literalinclude:: ../../examples/writing-writer/MyWriter.cpp
:language: cpp
- :lines: 69-70
+ :lines: 104-107
+
+This method is called when the writing is done. In this case, it simply cleans
+up the output stream by resetting it.
+
+
+Compiling and Usage
+-------------------------------------------------------------------------------
+To compile this reader, we will use cmake. Here is the CMakeLists.txt file we
+will use for this process:
+
+.. literalinclude:: ../../examples/writing-writer/CMakeLists.text
+
+If this file is in the directory with the MyWriter.hpp and MyWriter.cpp files,
+simply run ``cmake .`` followed by ``make``. This will generate a file called
+``libpdal_plugin_writer_mywriter.dylib``.
+
+Put this dylib file into the directory pointed to by ``PDAL_DRIVER_PATH``, and
+then when you run ``pdal --drivers``, you will see an entry for
+writers.mywriter.
+
+To test the writer, we will put it into a pipeline and read in a LAS file and
+covert it to our output format. For this example, use `interesting.las`_, and
+run it through `pipeline-mywriter.xml`_.
+
+If those files are in the same directory, you would just run the command
+``pdal pipeline pipeline-mywriter.xml``, and it will generate an output file
+called output.txt, which will be in the proper format. From there, if you
+wanted, you could run that output file through the MyReader that was created
+in the previous tutorial, as well.
+
+.. _`interesting.las`: https://github.com/PDAL/PDAL/blob/master/test/data/interesting.las?raw=true
+.. _`pipeline_mywriter.xml`: https://github.com/PDAL/PDAL/blob/master/examples/writing-writer/pipeline-mywriter.xml?raw=true
\ No newline at end of file
diff --git a/doc/tutorial/writing.rst b/doc/tutorial/writing.rst
index 9103d7e..5e38c2a 100644
--- a/doc/tutorial/writing.rst
+++ b/doc/tutorial/writing.rst
@@ -4,13 +4,18 @@
Writing with PDAL
=====================
+:Author: Bradley Chambers
+:Contact: brad.chambers at gmail.com
+:Date: 01/21/2015
+
+
This tutorial will describe a complete example of using PDAL C++ objects to write
a LAS file. The example will show fetching data from your own data source rather than
interacting with a :ref:`reader stage <stage_index>`.
.. note::
- If you implement your own :ref:`reader <stage_index>` that conforms to
+ If you implement your own :ref:`readers` that conforms to
PDAL's :cpp:class:`pdal::Stage`, you can implement a simple read-filter-write
pipeline using :ref:`pipeline` and not have to code anything explicit
yourself.
@@ -45,11 +50,14 @@ z dimensions.
.. literalinclude:: ../../examples/writing/tutorial.cpp
:language: cpp
- :lines: 32-41
+ :lines: 33-42
+
+Finally, the main code which creates the dummy data, puts it into a BufferReader
+and sends it to a writer.
.. literalinclude:: ../../examples/writing/tutorial.cpp
:language: cpp
- :lines: 43-70
+ :lines: 45-74
Compiling and running the program
-------------------------------------------------------------------------------
@@ -84,5 +92,3 @@ After the project is built, you can run it by typing:
.. code-block:: bash
$ ./tutorial
-
-
diff --git a/doc/vagrant.rst b/doc/vagrant.rst
index c9cf98b..f23e5af 100644
--- a/doc/vagrant.rst
+++ b/doc/vagrant.rst
@@ -1,29 +1,30 @@
.. _vagrant:
******************************************************************************
-Getting Started with PDAL using `Vagrant`_ and `VirtualBox`_
+Vagrant
******************************************************************************
-
:Author: Howard Butler
-:Contact: hobu.inc at gmail dot com
-:Date: 11/04/2013
+:Contact: howard at hobu.co
+:Date: 10/27/2015
+
+.. index:: Vagrant
Introduction
------------------------------------------------------------------------------
-Because of PDAL's relatively short lifespan, there are not so many
-distributions and packaging solutions that have it available. This means that
-prospective users of PDAL are pretty much on their own to build up PDAL
-and use it. Folks who've climbed this mountain with other well-entangled
-software like `GDAL`_, `MapServer`_, or `Mapnik`_ should be able to manage
-the compilation challenges listed in the full set of dependencies in :ref:`building_unix`.
-
-For everyone else, suffering all of the compilation challenges, including
-at least three different build systems is simply too much. "Give me a
-binary and be done with it," they might ask, and for them, there is an
-answer. Surrender the requirement of running PDAL in your own customized
-system for the buildout of PDAL on a known quantity -- a pre-configured
+Because of PDAL's relatively short lifespan, there are not so many
+distributions and packaging solutions that have it available. This means that
+prospective users of PDAL are pretty much on their own to build up PDAL and use
+it. Folks who've climbed this mountain with other well-entangled software like
+`GDAL`_, `MapServer`_, or `Mapnik`_ should be able to manage the compilation
+challenges listed in the full set of dependencies in :ref:`building_unix`.
+
+For everyone else, suffering all of the compilation challenges, including
+at least three different build systems is simply too much. "Give me a
+binary and be done with it," they might ask, and for them, there is an
+answer. Surrender the requirement of running PDAL in your own customized
+system for the buildout of PDAL on a known quantity -- a pre-configured
virtual machine.
Installation
@@ -31,34 +32,34 @@ Installation
.. note::
- This document assumes you are starting with a basic Macintosh system
- because this is the only system the author assumes people could
- ever want to run :). This document has not been tested on any other
- platforms, but it is expected that things should work if you're
+ This document assumes you are starting with a basic Macintosh system
+ because this is the only system the author assumes people could
+ ever want to run :). This document has not been tested on any other
+ platforms, but it is expected that things should work if you're
starting from Windows or some Linux.
-`Vagrant`_ is configuration management for virtual machines. Its focus is
-on reproducibility of configuration. The idea is to codify the configuration
-using simple text files, press a button, and out spits a fully configured
-virtual machine with the specified options. And for the most part, this is
+`Vagrant`_ is configuration management for virtual machines. Its focus is
+on reproducibility of configuration. The idea is to codify the configuration
+using simple text files, press a button, and out spits a fully configured
+virtual machine with the specified options. And for the most part, this is
what actually happens.
-`Vagrant`_ is simply the configuration management software, however. `VirtualBox`_
-is the virtual machine container. These two tools are used in concert,
+`Vagrant`_ is simply the configuration management software, however. `VirtualBox`_
+is the virtual machine container. These two tools are used in concert,
and both are required to complete this tutorial.
1) Download and install `VirtualBox <https://www.virtualbox.org/wiki/Downloads>`__.
2) Download and install `Vagrant <http://downloads.vagrantup.com/>`__.
3) Clone PDAL to your environment:
-
+
::
-
+
$ git clone https://github.com/PDAL/PDAL.git
4) Execute the vagrant configuration:
::
-
+
vagrant up
5) Wait ...
@@ -67,7 +68,7 @@ and both are required to complete this tutorial.
8) Look for the following when it's all done:
::
-
+
vagrant at pdal-development:~$ pdal info --input readpgpointcloud.xml -p 0
{
"X": "560974.95000000007",
@@ -89,14 +90,14 @@ and both are required to complete this tutorial.
"PointID": "772536",
"BlockID": "0"
}
-
+
9) Start playing around:
::
-
+
$ vagrant ssh
$ pdal
-
+
------------------------------------------------------------------------------------------
pdal (PDAL 0.9.9 (b632df) with GeoTIFF 1.4.0 GDAL 1.11dev LASzip 2.1.0 System )
------------------------------------------------------------------------------------------
@@ -105,26 +106,27 @@ and both are required to complete this tutorial.
- pipeline
- query
- translate
-
+
What you get
------------------------------------------------------------------------------
-The `Vagrant`_ configuration that PDAL provides contains nearly
-every possible feature except for `Oracle Point Cloud`_ support. Things it
+The `Vagrant`_ configuration that PDAL provides contains nearly
+every possible feature except for `Oracle Point Cloud`_ support. Things it
includes are:
* Full `pgpointcloud`_ support including example database
* :ref:`filters.hexbin`
-* :ref:`filters.reprojection`
-* :ref:`readers.nitf` and :ref:`writers.nitf`
+* :ref:`filters.reprojection`
+* :ref:`readers.nitf` and :ref:`writers.nitf`
* `LASzip`_ support in :ref:`readers.las` and :ref:`writers.las`
* Interpolation with `Points2Grid`_ using :ref:`writers.p2g`
* Python manipulation using :ref:`filters.predicate` and :ref:`filters.programmable`
* `PCL`_ support via :ref:`filters.pclblock`, :ref:`readers.pcd`,
:ref:`writers.pcd`, :ref:`ground_command`, and :ref:`pcl_command`
+* :ref:`writers.geowave`
-Head to :ref:`pipeline` for more information on using PDAL pipelines. Two pipelines
-are provided in ``/home/vagrant`` that are used to load the ``st-helens-small.las``
+Head to :ref:`pipeline` for more information on using PDAL pipelines. Two pipelines
+are provided in ``/home/vagrant`` that are used to load the ``st-helens-small.las``
file into `pgpointcloud`_.
.. _`Points2Grid`: https://github.com/CRREL/points2grid
diff --git a/examples/writing-filter/MyFilter.cpp b/examples/writing-filter/MyFilter.cpp
index f8ef958..0ec98d6 100644
--- a/examples/writing-filter/MyFilter.cpp
+++ b/examples/writing-filter/MyFilter.cpp
@@ -4,26 +4,47 @@
#include <pdal/Options.hpp>
#include <pdal/pdal_macros.hpp>
-#include <pdal/PointBuffer.hpp>
-#include <pdal/PointContext.hpp>
+#include <pdal/PointTable.hpp>
+#include <pdal/PointView.hpp>
#include <pdal/StageFactory.hpp>
-CREATE_FILTER_PLUGIN(myfilter, MyFilter)
+namespace pdal
+{
+
+static PluginInfo const s_info =
+ PluginInfo("filters.name", "My awesome filter",
+ "http://link/to/documentation");
+
+CREATE_STATIC_PLUGIN(1, 0, MyFilter, Filter, s_info)
+
+std::string MyFilter::getName() const
+{
+ return s_info.name;
+}
+
+Options MyFilter::getDefaultOptions()
+{
+ Options options;
+ options.add("param", 1.0, "My parameter");
+ return options;
+}
void MyFilter::processOptions(const pdal::Options& options)
{
- m_value = options.getValueOrDefault<double>("param", 1.0);
+ m_value = options.getValueOrDefault<double>("param", 1.0);
}
-void MyFilter::addDimensions(PointContextRef ctx)
+void MyFilter::addDimensions(PointLayoutPtr layout)
{
- ctx.registerDim(pdal::Dimension::Id::Intensity);
+ layout->registerDim(Dimension::Id::Intensity);
+ m_myDimension = layout->registerOrAssignDim("MyDimension", Dimension::Type::Unsigned8);
}
-PointBufferSet MyFilter::run(PointBufferPtr input)
+PointViewSet MyFilter::run(PointViewPtr input)
{
- PointBufferSet pbSet;
- pbSet.insert(input);
- return pbSet;
+ PointViewSet viewSet;
+ viewSet.insert(input);
+ return viewSet;
}
+} // namespace pdal
diff --git a/examples/writing-filter/MyFilter.hpp b/examples/writing-filter/MyFilter.hpp
index cc1fa9f..9ff3cae 100644
--- a/examples/writing-filter/MyFilter.hpp
+++ b/examples/writing-filter/MyFilter.hpp
@@ -6,34 +6,36 @@
#include <pdal/Stage.hpp>
#include <memory>
-#include <set>
namespace pdal
{
-class Options;
-class PointBuffer;
-class PointContext;
-}
-typedef std::shared_ptr<pdal::PointBuffer> PointBufferPtr;
-typedef std::set<PointBufferPtr> PointBufferSet;
-typedef PointContext PointContextRef;
+class Options;
+class PointLayout;
+class PointView;
-class MyFilter : public pdal::Filter
+class PDAL_DLL MyFilter : public Filter
{
public:
- SET_STAGE_NAME ("filters.name", "My Awesome Filter")
- SET_STAGE_LINK ("http://link/to/documentation")
- SET_PLUGIN_VERSION("1.0.0")
+ MyFilter() : Filter()
+ {}
- MyFilter() : Filter() {};
+ static void * create();
+ static int32_t destroy(void *);
+ std::string getName() const;
+
+ Options getDefaultOptions();
private:
- virtual void addDimensions(PointContextRef ctx);
- virtual void processOptions(const Options& options);
- virtual PointBufferSet run(PointBufferPtr buf);
+ double m_value;
+ Dimension::Id::Enum m_myDimension;
+
+ virtual void addDimensions(PointLayoutPtr layout);
+ virtual void processOptions(const Options& options);
+ virtual PointViewSet run(PointViewPtr view);
- MyFilter& operator=(const MyFilter&); // not implemented
- MyFilter(const MyFilter&); // not implemented
+ MyFilter& operator=(const MyFilter&); // not implemented
+ MyFilter(const MyFilter&); // not implemented
};
+} // namespace pdal
diff --git a/examples/writing-kernel/MyKernel.cpp b/examples/writing-kernel/MyKernel.cpp
index 693ba36..7a7430f 100644
--- a/examples/writing-kernel/MyKernel.cpp
+++ b/examples/writing-kernel/MyKernel.cpp
@@ -10,64 +10,75 @@
#include <pdal/KernelSupport.hpp>
#include <pdal/Options.hpp>
#include <pdal/pdal_macros.hpp>
-#include <pdal/PointBuffer.hpp>
-#include <pdal/PointContext.hpp>
-#include <pdal/Reader.hpp>
#include <pdal/StageFactory.hpp>
-#include <pdal/Writer.hpp>
+#include <pdal/PointTable.hpp>
#include <memory>
#include <string>
namespace po = boost::program_options;
-CREATE_KERNEL_PLUGIN(mykernel, MyKernel)
-
-void MyKernel::validateSwitches()
-{
- if (m_input_file == "")
- throw pdal::app_usage_error("--input/-i required");
- if (m_output_file == "")
- throw pdal::app_usage_error("--output/-o required");
-}
-
-void MyKernel::addSwitches()
-{
- po::options_description* options = new po::options_description("file options");
- options->add_options()
- ("input,i", po::value<std::string>(&m_input_file)->default_value(""), "input file name")
- ("output,o", po::value<std::string>(&m_output_file)->default_value(""), "output file name")
- ;
-
- addSwitchSet(options);
- addPositionalSwitch("input", 1);
- addPositionalSwitch("output", 1);
-}
-
-int MyKernel::execute()
-{
- pdal::PointContextRef ctx;
- pdal::StageFactory f;
-
- std::unique_ptr<pdal::Reader> reader(f.createReader("readers.las"));
- pdal::Options readerOptions;
- readerOptions.add("filename", m_input_file);
- reader->setOptions(readerOptions);
-
- std::unique_ptr<pdal::Filter> filter(f.createFilter("filters.decimation"));
- pdal::Options filterOptions;
- filterOptions.add("step", 10);
- filter->setOptions(filterOptions);
- filter->setInput(reader.get());
-
- std::unique_ptr<pdal::Writer> writer(f.createWriter("writers.text"));
- pdal::Options writerOptions;
- writerOptions.add("filename", m_output_file);
- writer->setOptions(writerOptions);
- writer->setInput(filter.get());
- writer->prepare(ctx);
- writer->execute(ctx);
-
- return 0;
-}
+namespace pdal {
+ static PluginInfo const s_info {
+ "kernels.mykernel",
+ "MyKernel",
+ "http://link/to/documentation"
+ };
+
+ CREATE_SHARED_PLUGIN(1, 0, MyKernel, Kernel, s_info);
+
+ std::string MyKernel::getName() const { return s_info.name; }
+
+ MyKernel::MyKernel() : Kernel()
+ {}
+
+ void MyKernel::validateSwitches()
+ {
+ if (m_input_file == "")
+ throw pdal::app_usage_error("--input/-i required");
+ if (m_output_file == "")
+ throw pdal::app_usage_error("--output/-o required");
+ }
+
+ void MyKernel::addSwitches()
+ {
+ po::options_description* options = new po::options_description("file options");
+ options->add_options()
+ ("input,i", po::value<std::string>(&m_input_file)->default_value(""), "input file name")
+ ("output,o", po::value<std::string>(&m_output_file)->default_value(""), "output file name")
+ ;
+
+ addSwitchSet(options);
+ addPositionalSwitch("input", 1);
+ addPositionalSwitch("output", 1);
+ }
+
+ int MyKernel::execute()
+ {
+ PointTable table;
+ StageFactory f;
+
+ Stage * reader = f.createStage("readers.las");
+ Options readerOptions;
+ readerOptions.add("filename", m_input_file);
+ reader->setOptions(readerOptions);
+
+ Stage * filter = f.createStage("filters.decimation");
+ Options filterOptions;
+ filterOptions.add("step", 10);
+ filter->setOptions(filterOptions);
+ filter->setInput(*reader);
+
+ Stage * writer = f.createStage("writers.text");
+ Options writerOptions;
+ writerOptions.add("filename", m_output_file);
+ writer->setOptions(writerOptions);
+ writer->setInput(*filter);
+ writer->prepare(table);
+ writer->execute(table);
+
+ return 0;
+ }
+
+} // namespace pdal
diff --git a/examples/writing-kernel/MyKernel.hpp b/examples/writing-kernel/MyKernel.hpp
index 4f6f22b..1ba5a7a 100644
--- a/examples/writing-kernel/MyKernel.hpp
+++ b/examples/writing-kernel/MyKernel.hpp
@@ -3,23 +3,28 @@
#pragma once
#include <pdal/Kernel.hpp>
+#include <pdal/plugin.hpp>
#include <string>
-class MyKernel : public pdal::Kernel
+namespace pdal
{
-public:
- SET_KERNEL_NAME ("MyKernel", "My Awesome Kernel")
- SET_KERNEL_LINK ("http://link/to/documentation")
- MyKernel() : Kernel() {};
- int execute();
+ class PDAL_DLL MyKernel : public Kernel
+ {
+ public:
+ static void * create();
+ static int32_t destroy(void *);
+ std::string getName() const;
+ int execute(); // override
-private:
- void validateSwitches();
- void addSwitches();
+ private:
+ MyKernel();
+ void validateSwitches();
+ void addSwitches();
- std::string m_input_file;
- std::string m_output_file;
-};
+ std::string m_input_file;
+ std::string m_output_file;
+ };
+} // namespace pdal
diff --git a/examples/writing-reader/MyReader.cpp b/examples/writing-reader/MyReader.cpp
index 3419593..91a486f 100644
--- a/examples/writing-reader/MyReader.cpp
+++ b/examples/writing-reader/MyReader.cpp
@@ -2,72 +2,128 @@
#include "MyReader.hpp"
-#include <boost/program_options.hpp>
+namespace pdal
+{
+ static PluginInfo const s_info = PluginInfo(
+ "readers.myreader",
+ "My Awesome Reader",
+ "http://link/to/documentation" );
-#include <pdal/Reader.hpp>
-#include <pdal/Kernel.hpp>
-#include <pdal/KernelFactory.hpp>
-#include <pdal/KernelSupport.hpp>
-#include <pdal/Options.hpp>
-#include <pdal/pdal_macros.hpp>
-#include <pdal/PointBuffer.hpp>
-#include <pdal/PointContext.hpp>
-#include <pdal/Reader.hpp>
-#include <pdal/StageFactory.hpp>
-#include <pdal/Writer.hpp>
+ CREATE_SHARED_PLUGIN(1, 0, MyReader, Reader, s_info)
-#include <memory>
-#include <string>
+ std::string MyReader::getName() const { return s_info.name; }
-namespace po = boost::program_options;
+ Options MyReader::getDefaultOptions()
+ {
+ Options options;
+ Option z_scale("z_scale", 1.0);
+ options.add(z_scale);
+ return options;
+ }
-CREATE_FILTER_PLUGIN(myfilter, MyReader)
+ void MyReader::processOptions(const Options& options)
+ {
+ m_scale_z = options.getValueOrDefault<double>("z_scale", 1.0);
+ }
-void MyReader::validateSwitches()
-{
- if (m_input_file == "")
- throw pdal::app_usage_error("--input/-i required");
- if (m_output_file == "")
- throw pdal::app_usage_error("--output/-o required");
-}
+ void MyReader::addDimensions(PointLayoutPtr layout)
+ {
+ layout->registerDim(Dimension::Id::X);
+ layout->registerDim(Dimension::Id::Y);
+ layout->registerDim(Dimension::Id::Z);
+ layout->registerOrAssignDim("MyData", Dimension::Type::Unsigned64);
+ }
-void MyReader::addSwitches()
-{
- po::options_description* options = new po::options_description("file options");
- options->add_options()
- ("input,i", po::value<std::string>(&m_input_file)->default_value(""), "input file name")
- ("output,o", po::value<std::string>(&m_output_file)->default_value(""), "output file name")
- ;
-
- addSwitchSet(options);
- addPositionalSwitch("input", 1);
- addPositionalSwitch("output", 1);
-}
-
-int MyReader::execute()
-{
- pdal::PointContextRef ctx;
- pdal::StageFactory f;
-
- std::unique_ptr<pdal::Reader> reader(f.createReader("readers.las"));
- pdal::Options readerOptions;
- readerOptions.add("filename", m_input_file);
- reader->setOptions(readerOptions);
-
- std::unique_ptr<pdal::Reader> filter(f.createReader("filters.decimation"));
- pdal::Options filterOptions;
- filterOptions.add("step", 10);
- filter->setOptions(filterOptions);
- filter->setInput(reader.get());
-
- std::unique_ptr<pdal::Writer> writer(f.createWriter("writers.text"));
- pdal::Options writerOptions;
- writerOptions.add("filename", m_output_file);
- writer->setOptions(writerOptions);
- writer->setInput(filter.get());
- writer->prepare(ctx);
- writer->execute(ctx);
-
- return 0;
-}
+ Dimension::IdList MyReader::getDefaultDimensions()
+ {
+ Dimension::IdList ids;
+
+ ids.push_back(Dimension::Id::X);
+ ids.push_back(Dimension::Id::Y);
+ ids.push_back(Dimension::Id::Z);
+
+ return ids;
+ }
+
+ void MyReader::ready(PointTableRef)
+ {
+ SpatialReference ref("EPSG:4385");
+ setSpatialReference(ref);
+ }
+
+
+ template <typename T>
+ T convert(const StringList& s, const std::string& name, size_t fieldno)
+ {
+ T output;
+ bool bConverted = Utils::fromString(s[fieldno], output);
+ if (!bConverted)
+ {
+ std::stringstream oss;
+ oss << "Unable to convert " << name << ", " << s[fieldno] << ", to double";
+ throw pdal_error(oss.str());
+ }
+
+ return output;
+ }
+
+
+ point_count_t MyReader::read(PointViewPtr view, point_count_t count)
+ {
+ PointLayoutPtr layout = view->layout();
+ PointId nextId = view->size();
+ PointId idx = m_index;
+ point_count_t numRead = 0;
+
+ m_stream.reset(new ILeStream(m_filename));
+
+ size_t HEADERSIZE(1);
+ size_t skip_lines(std::max(HEADERSIZE, (size_t)m_index));
+ size_t line_no(1);
+ for (std::string line; std::getline(*m_stream->stream(), line); line_no++)
+ {
+ if (line_no <= skip_lines)
+ {
+ continue;
+ }
+
+ // MyReader format: X::Y::Z::Data
+ StringList s = Utils::split2(line, ':');
+
+ unsigned long u64(0);
+ if (s.size() != 4)
+ {
+ std::stringstream oss;
+ oss << "Unable to split proper number of fields. Expected 4, got " << s.size();
+ throw pdal_error(oss.str());
+ }
+
+ std::string name("X");
+ view->setField(Dimension::Id::X, nextId, convert<double>(s, name, 0));
+
+ name = "Y";
+ view->setField(Dimension::Id::Y, nextId, convert<double>(s, name, 1));
+
+ name = "Z";
+ double z = convert<double>(s, name, 2) * m_scale_z;
+ view->setField(Dimension::Id::Z, nextId, z);
+
+ name = "MyData";
+ view->setField(layout->findProprietaryDim(name), nextId, convert<unsigned int>(s, name, 3));
+
+ nextId++;
+ if (m_cb)
+ m_cb(*view, nextId);
+ }
+ m_index = nextId;
+ numRead = nextId;
+
+ return numRead;
+ }
+
+ void MyReader::done(PointTableRef)
+ {
+ m_stream.reset();
+ }
+} //namespace pdal
diff --git a/examples/writing-reader/MyReader.hpp b/examples/writing-reader/MyReader.hpp
index 46ba8f0..8fd9f88 100644
--- a/examples/writing-reader/MyReader.hpp
+++ b/examples/writing-reader/MyReader.hpp
@@ -2,24 +2,33 @@
#pragma once
-#include "Reader.hpp"
+#include <pdal/PointView.hpp>
+#include <pdal/Reader.hpp>
+#include <pdal/util/IStream.hpp>
-#include <string>
-
-class MyReader : public pdal::Reader
+namespace pdal
{
-public:
- SET_STAGE_NAME ("MyReader", "My Awesome Reader")
- SET_STAGE_LINK ("http://link/to/documentation")
-
- MyReader() : Reader() {};
- int execute();
-
-private:
- void validateSwitches();
- void addSwitches();
-
- std::string m_input_file;
- std::string m_output_file;
-};
-
+ class MyReader : public Reader
+ {
+ public:
+ MyReader() : Reader() {};
+
+ static void * create();
+ static int32_t destroy(void *);
+ std::string getName() const;
+
+ Options getDefaultOptions();
+ static Dimension::IdList getDefaultDimensions();
+
+ private:
+ std::unique_ptr<ILeStream> m_stream;
+ point_count_t m_index;
+ double m_scale_z;
+
+ virtual void addDimensions(PointLayoutPtr layout);
+ virtual void processOptions(const Options& options);
+ virtual void ready(PointTableRef table);
+ virtual point_count_t read(PointViewPtr view, point_count_t count);
+ virtual void done(PointTableRef table);
+ };
+}
diff --git a/examples/writing-reader/pipeline-myreader.xml b/examples/writing-reader/pipeline-myreader.xml
new file mode 100644
index 0000000..5ac244b
--- /dev/null
+++ b/examples/writing-reader/pipeline-myreader.xml
@@ -0,0 +1,16 @@
+<?xml version="2.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+ <Writer type="writers.text">
+ <Option name="filename">
+ output.txt
+ </Option>
+ <Reader type="readers.myreader">
+ <Option name="filename">
+ test-reader-input.txt
+ </Option>
+ <Option name="z_scale">
+ .001
+ </Option>
+ </Reader>
+ </Writer>
+</Pipeline>
diff --git a/examples/writing-reader/test-reader-input.txt b/examples/writing-reader/test-reader-input.txt
new file mode 100644
index 0000000..0544525
--- /dev/null
+++ b/examples/writing-reader/test-reader-input.txt
@@ -0,0 +1,16 @@
+#X:Y:Z:MyData
+1:1:1000:99
+1:2:1000:98
+1:3:1100:99
+1:4:1050:50
+1:5:1055:98
+2:5:1000:99
+2:4:1111:99
+2:3:1500:50
+2:2:1200:55
+2:1:1210:95
+3:1:1500:25
+3:2:1100:99
+3:3:1100:98
+3:4:1000:97
+3:5:1000:93
diff --git a/examples/writing-writer/MyWriter.cpp b/examples/writing-writer/MyWriter.cpp
index 6d92281..a344991 100644
--- a/examples/writing-writer/MyWriter.cpp
+++ b/examples/writing-writer/MyWriter.cpp
@@ -4,70 +4,106 @@
#include <boost/program_options.hpp>
-#include <pdal/Writer.hpp>
-#include <pdal/Kernel.hpp>
-#include <pdal/KernelFactory.hpp>
-#include <pdal/KernelSupport.hpp>
-#include <pdal/Options.hpp>
-#include <pdal/pdal_macros.hpp>
-#include <pdal/PointBuffer.hpp>
-#include <pdal/PointContext.hpp>
-#include <pdal/Writer.hpp>
-#include <pdal/StageFactory.hpp>
-#include <pdal/Writer.hpp>
-
-#include <memory>
-#include <string>
-
namespace po = boost::program_options;
-CREATE_FILTER_PLUGIN(myfilter, MyWriter)
-
-void MyWriter::validateSwitches()
+namespace pdal
{
- if (m_input_file == "")
- throw pdal::app_usage_error("--input/-i required");
- if (m_output_file == "")
- throw pdal::app_usage_error("--output/-o required");
-}
+ static PluginInfo const s_info = PluginInfo(
+ "writers.mywriter",
+ "My Awesome Writer",
+ "http://path/to/documentation" );
-void MyWriter::addSwitches()
-{
- po::options_description* options = new po::options_description("file options");
- options->add_options()
- ("input,i", po::value<std::string>(&m_input_file)->default_value(""), "input file name")
- ("output,o", po::value<std::string>(&m_output_file)->default_value(""), "output file name")
- ;
-
- addSwitchSet(options);
- addPositionalSwitch("input", 1);
- addPositionalSwitch("output", 1);
-}
+ CREATE_SHARED_PLUGIN(1, 0, MyWriter, Writer, s_info);
-int MyWriter::execute()
-{
- pdal::PointContextRef ctx;
- pdal::StageFactory f;
-
- std::unique_ptr<pdal::Writer> reader(f.createWriter("readers.las"));
- pdal::Options readerOptions;
- readerOptions.add("filename", m_input_file);
- reader->setOptions(readerOptions);
-
- std::unique_ptr<pdal::Writer> filter(f.createWriter("filters.decimation"));
- pdal::Options filterOptions;
- filterOptions.add("step", 10);
- filter->setOptions(filterOptions);
- filter->setInput(reader.get());
-
- std::unique_ptr<pdal::Writer> writer(f.createWriter("writers.text"));
- pdal::Options writerOptions;
- writerOptions.add("filename", m_output_file);
- writer->setOptions(writerOptions);
- writer->setInput(filter.get());
- writer->prepare(ctx);
- writer->execute(ctx);
-
- return 0;
-}
+ std::string MyWriter::getName() const { return s_info.name; }
+
+ struct FileStreamDeleter
+ {
+ template <typename T>
+ void operator()(T* ptr)
+ {
+ if (ptr)
+ {
+ ptr->flush();
+ FileUtils::closeFile(ptr);
+ }
+ }
+ };
+
+
+ Options MyWriter::getDefaultOptions()
+ {
+ Options options;
+
+ options.add("newline", "\n", "Newline character to use for additional lines");
+ options.add("filename", "", "filename to write output to");
+ options.add("datafield", "", "field to use as the User Data field");
+ options.add("precision", 3, "Precision to use for data fields");
+
+ return options;
+ }
+
+
+ void MyWriter::processOptions(const Options& options)
+ {
+ m_filename = options.getValueOrThrow<std::string>("filename");
+ m_stream = FileStreamPtr(FileUtils::createFile(m_filename, true),
+ FileStreamDeleter());
+ if (!m_stream)
+ {
+ std::stringstream out;
+ out << "writers.mywriter couldn't open '" << m_filename <<
+ "' for output.";
+ throw pdal_error(out.str());
+ }
+ m_newline = options.getValueOrDefault<std::string>("newline", "\n");
+ m_datafield = options.getValueOrDefault<std::string>("datafield", "UserData");
+ m_precision = options.getValueOrDefault<int>("precision", 3);
+ }
+
+
+ void MyWriter::ready(PointTableRef table)
+ {
+ m_stream->precision(m_precision);
+ *m_stream << std::fixed;
+
+ Dimension::Id::Enum d = table.layout()->findDim(m_datafield);
+ if (d == Dimension::Id::Unknown)
+ {
+ std::ostringstream oss;
+ oss << "Dimension not found with name '" << m_datafield << "'";
+ throw pdal_error(oss.str());
+ }
+
+ m_dataDim = d;
+
+ *m_stream << "#X:Y:Z:MyData" << m_newline;
+ }
+
+
+ void MyWriter::write(PointViewPtr view)
+ {
+ for (PointId idx = 0; idx < view->size(); ++idx)
+ {
+ double x = view->getFieldAs<double>(Dimension::Id::X, idx);
+ double y = view->getFieldAs<double>(Dimension::Id::Y, idx);
+ double z = view->getFieldAs<double>(Dimension::Id::Z, idx);
+ unsigned int myData = 0;
+
+ if (!m_datafield.empty()) {
+ myData = (int)(view->getFieldAs<double>(m_dataDim, idx) + 0.5);
+ }
+
+ *m_stream << x << ":" << y << ":" << z << ":"
+ << myData << m_newline;
+ }
+ }
+
+
+ void MyWriter::done(PointTableRef)
+ {
+ m_stream.reset();
+ }
+
+}
diff --git a/examples/writing-writer/MyWriter.hpp b/examples/writing-writer/MyWriter.hpp
index 23f86ae..977894d 100644
--- a/examples/writing-writer/MyWriter.hpp
+++ b/examples/writing-writer/MyWriter.hpp
@@ -2,24 +2,39 @@
#pragma once
-#include "Writer.hpp"
+#include <pdal/Writer.hpp>
#include <string>
-class MyWriter : public pdal::Writer
-{
-public:
- SET_STAGE_NAME ("MyWriter", "My Awesome Writer")
- SET_STAGE_LINK ("http://link/to/documentation")
+namespace pdal{
- MyWriter() : Writer() {};
- int execute();
+ typedef std::shared_ptr<std::ostream> FileStreamPtr;
-private:
- void validateSwitches();
- void addSwitches();
+ class MyWriter : public Writer
+ {
+ public:
+ MyWriter()
+ {}
- std::string m_input_file;
- std::string m_output_file;
-};
+ static void * create();
+ static int32_t destroy(void *);
+ std::string getName() const;
+ Options getDefaultOptions();
+
+ private:
+ virtual void processOptions(const Options&);
+ virtual void ready(PointTableRef table);
+ virtual void write(const PointViewPtr view);
+ virtual void done(PointTableRef table);
+
+ std::string m_filename;
+ std::string m_newline;
+ std::string m_datafield;
+ int m_precision;
+
+ FileStreamPtr m_stream;
+ Dimension::Id::Enum m_dataDim;
+ };
+
+} // namespace pdal
diff --git a/examples/writing-writer/pipeline-mywriter.xml b/examples/writing-writer/pipeline-mywriter.xml
new file mode 100644
index 0000000..20d913b
--- /dev/null
+++ b/examples/writing-writer/pipeline-mywriter.xml
@@ -0,0 +1,19 @@
+<?xml version="2.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+ <Writer type="writers.mywriter">
+ <Option name="filename">
+ output.txt
+ </Option>
+ <Option name="datafield">
+ Intensity
+ </Option>
+ <Option name="precision">
+ 0
+ </Option>
+ <Reader type="readers.las">
+ <Option name="filename">
+ interesting.las
+ </Option>
+ </Reader>
+ </Writer>
+</Pipeline>
diff --git a/examples/writing/tutorial.cpp b/examples/writing/tutorial.cpp
index bf814c6..584b3fe 100644
--- a/examples/writing/tutorial.cpp
+++ b/examples/writing/tutorial.cpp
@@ -1,8 +1,9 @@
#include <pdal/PointView.hpp>
#include <pdal/BufferReader.hpp>
-#include <pdal/Pointtable->hpp>
+#include <pdal/PointTable.hpp>
#include <pdal/Dimension.hpp>
#include <pdal/Options.hpp>
+#include <pdal/StageFactory.hpp>
#include <vector>
@@ -49,9 +50,9 @@ int main(int argc, char* argv[])
options.add("filename", "myfile.las");
PointTable table;
- table.registerDim(Dimension::Id::X);
- table.registerDim(Dimension::Id::Y);
- table.registerDim(Dimension::Id::Z);
+ table.layout()->registerDim(Dimension::Id::X);
+ table.layout()->registerDim(Dimension::Id::Y);
+ table.layout()->registerDim(Dimension::Id::Z);
{
PointViewPtr view(new PointView(table));
@@ -59,14 +60,15 @@ int main(int argc, char* argv[])
std::vector<Point> data = getMyData();
fillView(view, data);
- BufferReader reader;
- reader.addView(view);
+ BufferReader *reader = new BufferReader();
+ reader->addView(view);
- LasWriter writer;
+ StageFactory factory;
+ Stage *writer = factory.createStage("writers.las");
- writer.setInput(&reader);
- writer.setOptions(options);
- writer.prepare(table);
- writer.execute(table);
+ writer->setInput(*reader);
+ writer->setOptions(options);
+ writer->prepare(table);
+ writer->execute(table);
}
}
diff --git a/filters/CMakeLists.txt b/filters/CMakeLists.txt
index 8dc67d4..5756f60 100644
--- a/filters/CMakeLists.txt
+++ b/filters/CMakeLists.txt
@@ -2,9 +2,11 @@ add_subdirectory(chipper)
add_subdirectory(colorization)
add_subdirectory(crop)
add_subdirectory(decimation)
+add_subdirectory(divider)
add_subdirectory(ferry)
add_subdirectory(merge)
add_subdirectory(mortonorder)
+add_subdirectory(randomize)
add_subdirectory(range)
add_subdirectory(reprojection)
add_subdirectory(sort)
diff --git a/filters/colorization/ColorizationFilter.cpp b/filters/colorization/ColorizationFilter.cpp
index 96767fb..57747f8 100644
--- a/filters/colorization/ColorizationFilter.cpp
+++ b/filters/colorization/ColorizationFilter.cpp
@@ -54,15 +54,6 @@ CREATE_STATIC_PLUGIN(1, 0, ColorizationFilter, Filter, s_info)
std::string ColorizationFilter::getName() const { return s_info.name; }
-struct GDALSourceDeleter
-{
- template <typename T>
- void operator()(T* ptr)
- {
- ::GDALClose(ptr);
- }
-};
-
void ColorizationFilter::initialize()
{
@@ -74,72 +65,104 @@ Options ColorizationFilter::getDefaultOptions()
{
Options options;
- pdal::Option red("dimension", "Red", "");
- pdal::Option b0("band",1, "");
- pdal::Option s0("scale", 1.0f, "scale factor for this dimension");
- pdal::Options redO;
- redO.add(b0);
- redO.add(s0);
- red.setOptions(redO);
-
- pdal::Option green("dimension", "Green", "");
- pdal::Option b1("band",2, "");
- pdal::Option s1("scale", 1.0f, "scale factor for this dimension");
- pdal::Options greenO;
- greenO.add(b1);
- greenO.add(s1);
- green.setOptions(greenO);
-
- pdal::Option blue("dimension", "Blue", "");
- pdal::Option b2("band",3, "");
- pdal::Option s2("scale", 1.0f, "scale factor for this dimension");
- pdal::Options blueO;
- blueO.add(b2);
- blueO.add(s2);
- blue.setOptions(blueO);
-
- pdal::Option reproject("reproject", false,
- "Reproject the input data into the same coordinate system as "
- "the raster?");
-
- options.add(red);
- options.add(green);
- options.add(blue);
- options.add(reproject);
+ options.add("dimensions", "Red:1:1.0, Green:2:1.0, Blue:3");
return options;
}
+namespace
+{
-void ColorizationFilter::processOptions(const Options& options)
+ColorizationFilter::BandInfo parseDim(const std::string& dim,
+ uint32_t defaultBand)
{
- m_rasterFilename = options.getValueOrThrow<std::string>("raster");
- std::vector<Option> dimensions = options.getOptions("dimension");
+ std::string::size_type pos, count;
+ const char *start;
+ char *end;
+ std::string name;
+ uint32_t band = defaultBand;
+ double scale = 1.0;
+
+ try
+ {
+ pos = 0;
+ // Skip leading whitespace.
+ count = Utils::extract(dim, pos, (int(*)(int))std::isspace);
+ pos += count;
+
+ count = Utils::extract(dim, pos, (int(*)(int))std::isalpha);
+ if (count == 0)
+ throw std::string("No dimension name.");
+ name = dim.substr(pos, count);
+ pos += count;
+
+ count = Utils::extract(dim, pos, (int(*)(int))std::isspace);
+ pos += count;
+
+ if (pos < dim.size() && dim[pos] == ':')
+ {
+ pos++;
+ start = dim.data() + pos;
+ band = std::strtoul(start, &end, 10);
+ if (start == end)
+ band = defaultBand;
+ pos += (end - start);
+
+ count = Utils::extract(dim, pos, (int(*)(int))std::isspace);
+ pos += count;
+
+ if (pos < dim.size() && dim[pos] == ':')
+ {
+ pos++;
+ start = dim.data() + pos;
+ scale = std::strtod(start, &end);
+ if (start == end)
+ scale = 1.0;
+ pos += (end - start);
+ }
+ }
+
+ count = Utils::extract(dim, pos, (int(*)(int))std::isspace);
+ pos += count;
- if (dimensions.size() == 0)
+ if (pos != dim.size())
+ throw std::string("Invalid characters following dimension "
+ "specification.");
+ }
+ catch (std::string s)
{
- m_bands.emplace_back("Red", Dimension::Id::Red, 1, 1.0);
- m_bands.emplace_back("Green", Dimension::Id::Green, 2, 1.0);
- m_bands.emplace_back("Blue", Dimension::Id::Blue, 3, 1.0);
- log()->get(LogLevel::Debug) << "No dimension mappings were given. "
- "Using default mappings." << std::endl;
+ std::ostringstream oss;
+ oss << "filters.colorization: invalid --dimensions option: '" << dim <<
+ "': " << s;
+ throw pdal_error(oss.str());
}
- for (auto i = dimensions.begin(); i != dimensions.end(); ++i)
+ return ColorizationFilter::BandInfo(name, band, scale);
+}
+
+} // unnamed namespace
+
+void ColorizationFilter::processOptions(const Options& options)
+{
+ m_rasterFilename = options.getValueOrThrow<std::string>("raster");
+
+ if (options.hasOption("dimension") && !options.hasOption("dimensions"))
+ throw pdal_error("Option 'dimension' no longer supported. Use "
+ "'dimensions' instead.");
+
+ StringList defaultDims;
+ defaultDims.push_back("Red");
+ defaultDims.push_back("Green");
+ defaultDims.push_back("Blue");
+
+ StringList dims =
+ options.getValueOrDefault<StringList>("dimensions", defaultDims);
+
+ uint32_t defaultBand = 1;
+ for (std::string& dim : dims)
{
- std::string name = i->getValue<std::string>();
- boost::optional<Options const&> dimensionOptions = i->getOptions();
- if (!dimensionOptions)
- {
- std::ostringstream oss;
- oss << "No band and scaling information given for dimension '" <<
- name << "'";
- throw pdal_error(oss.str());
- }
- uint32_t bandId =
- dimensionOptions->getValueOrThrow<uint32_t>("band");
- double scale =
- dimensionOptions->getValueOrDefault<double>("scale", 1.0);
- m_bands.emplace_back(name, Dimension::Id::Unknown, bandId, scale);
+ BandInfo bi = parseDim(dim, defaultBand);
+ defaultBand = bi.m_band + 1;
+ m_bands.push_back(bi);
}
}
@@ -154,101 +177,32 @@ void ColorizationFilter::addDimensions(PointLayoutPtr layout)
void ColorizationFilter::ready(PointTableRef table)
{
- m_forward_transform.assign(0.0);
- m_inverse_transform.assign(0.0);
-
- log()->get(LogLevel::Debug) << "Using " << m_rasterFilename <<
- " for raster" << std::endl;
- m_ds = GDALOpen(m_rasterFilename.c_str(), GA_ReadOnly);
- if (m_ds == NULL)
- throw pdal_error("Unable to open GDAL datasource!");
-
- if (GDALGetGeoTransform(m_ds, &(m_forward_transform.front())) != CE_None)
- throw pdal_error("unable to fetch forward geotransform for raster!");
-
- if (!GDALInvGeoTransform(&(m_forward_transform.front()),
- &(m_inverse_transform.front())))
- throw pdal_error("unable to fetch inverse geotransform for raster!");
-
- for (auto bi = m_bands.begin(); bi != m_bands.end(); ++bi)
- {
- if (bi->m_dim == Dimension::Id::Unknown)
- bi->m_dim = table.layout()->findDim(bi->m_name);
- if (bi->m_dim == Dimension::Id::Unknown)
- throw pdal_error((std::string)"Can't colorize - no dimension " +
- bi->m_name);
- }
+ m_raster =
+ std::unique_ptr<gdal::Raster>(new gdal::Raster(m_rasterFilename));
+ m_raster->open();
}
void ColorizationFilter::filter(PointView& view)
{
- int32_t pixel(0);
- int32_t line(0);
+ std::vector<double> data;
- std::array<double, 2> pix = { {0.0, 0.0} };
for (PointId idx = 0; idx < view.size(); ++idx)
{
double x = view.getFieldAs<double>(Dimension::Id::X, idx);
double y = view.getFieldAs<double>(Dimension::Id::Y, idx);
- if (!getPixelAndLinePosition(x, y, m_inverse_transform, pixel,
- line, m_ds))
+ if (!m_raster->read(x, y, data))
continue;
+ int i(0);
for (auto bi = m_bands.begin(); bi != m_bands.end(); ++bi)
{
BandInfo& b = *bi;
- GDALRasterBandH hBand = GDALGetRasterBand(m_ds, b.m_band);
- if (hBand == NULL)
- {
- std::ostringstream oss;
- oss << "Unable to get band " << b.m_band <<
- " from data source!";
- throw pdal_error(oss.str());
- }
- if (GDALRasterIO(hBand, GF_Read, pixel, line, 1, 1,
- &pix[0], 1, 1, GDT_CFloat64, 0, 0) == CE_None)
- view.setField(b.m_dim, idx, pix[0] * b.m_scale);
+ view.setField(b.m_dim, idx, data[i] * b.m_scale);
+ ++i;
}
}
}
-
-// Determines the pixel/line position given an x/y.
-// No reprojection is done at this time.
-bool ColorizationFilter::getPixelAndLinePosition(double x, double y,
- boost::array<double, 6> const& inverse, int32_t& pixel,
- int32_t& line, void *ds)
-{
- pixel = (int32_t)std::floor(inverse[0] + (inverse[1] * x) +
- (inverse[2] * y));
- line = (int32_t) std::floor(inverse[3] + (inverse[4] * x) +
- (inverse[5] * y));
-
- int xs = GDALGetRasterXSize(ds);
- int ys = GDALGetRasterYSize(ds);
-
- if (!xs || !ys)
- throw pdal_error("Unable to get X or Y size from raster!");
-
- if (pixel < 0 || line < 0 || pixel >= xs || line >= ys)
- {
- // The x, y is not coincident with this raster
- return false;
- }
-
- return true;
-}
-
-
-void ColorizationFilter::done(PointTableRef /*table*/)
-{
- if (m_ds != 0)
- {
- GDALClose(m_ds);
- m_ds = 0;
- }
-}
-
} // namespace pdal
diff --git a/filters/colorization/ColorizationFilter.hpp b/filters/colorization/ColorizationFilter.hpp
index 9095850..ea4e686 100644
--- a/filters/colorization/ColorizationFilter.hpp
+++ b/filters/colorization/ColorizationFilter.hpp
@@ -50,28 +50,29 @@ extern "C" PF_ExitFunc ColorizationFilter_InitPlugin();
namespace pdal
{
-namespace gdal
-{ class GlobalDebug; }
-
// Provides GDAL-based raster overlay that places output data in
// specified dimensions. It also supports scaling the data by a multiplier
// on a per-dimension basis.
class PDAL_DLL ColorizationFilter : public Filter
{
+public:
+ struct BandInfo
+ {
+ BandInfo(const std::string& name, uint32_t band, double scale) :
+ m_name(name), m_band(band), m_scale(scale),
+ m_dim(Dimension::Id::Unknown)
+ {}
-struct BandInfo
-{
- BandInfo(const std::string& name, Dimension::Id::Enum dim, uint32_t band,
- double scale) : m_name(name), m_dim(dim), m_band(band), m_scale(scale)
- {}
+ BandInfo() : m_band(0), m_scale(1.0), m_dim(Dimension::Id::Unknown)
+ {}
+
+ std::string m_name;
+ uint32_t m_band;
+ double m_scale;
+ Dimension::Id::Enum m_dim;
+ };
- std::string m_name;
- Dimension::Id::Enum m_dim;
- uint32_t m_band;
- double m_scale;
-};
-public:
ColorizationFilter()
{}
@@ -87,19 +88,11 @@ private:
virtual void addDimensions(PointLayoutPtr layout);
virtual void ready(PointTableRef table);
virtual void filter(PointView& view);
- virtual void done(PointTableRef table);
-
- bool getPixelAndLinePosition(double x, double y,
- boost::array<double, 6> const& inverse, int32_t& pixel,
- int32_t& line, void *ds);
std::string m_rasterFilename;
std::vector<BandInfo> m_bands;
- boost::array<double, 6> m_forward_transform;
- boost::array<double, 6> m_inverse_transform;
-
- GDALDatasetH m_ds;
+ std::unique_ptr<gdal::Raster> m_raster;
ColorizationFilter& operator=(const ColorizationFilter&); // not implemented
ColorizationFilter(const ColorizationFilter&); // not implemented
diff --git a/filters/crop/CropFilter.cpp b/filters/crop/CropFilter.cpp
index 683c39c..0e1d18f 100644
--- a/filters/crop/CropFilter.cpp
+++ b/filters/crop/CropFilter.cpp
@@ -34,6 +34,8 @@
#include "CropFilter.hpp"
+#include <iomanip>
+
#include <pdal/PointView.hpp>
#include <pdal/StageFactory.hpp>
#include <pdal/GDALUtils.hpp>
@@ -65,7 +67,6 @@ static void _GEOSErrorHandler(const char *fmt, ...)
char buf[1024];
vsnprintf(buf, sizeof(buf), fmt, args);
- std::cerr << "GEOS Error: " << buf << std::endl;
va_end(args);
}
@@ -96,7 +97,7 @@ CropFilter::CropFilter() : pdal::Filter()
void CropFilter::processOptions(const Options& options)
{
m_cropOutside = options.getValueOrDefault<bool>("outside", false);
- m_assignedSRS = options.getValueOrDefault<SpatialReference>("a_srs");
+ m_assignedSrs = options.getValueOrDefault<SpatialReference>("a_srs");
try
{
m_bounds = options.getValues<BOX2D>("bounds");
@@ -108,7 +109,6 @@ void CropFilter::processOptions(const Options& options)
std::vector<BOX3D> b3d = options.getValues<BOX3D>("bounds");
for (auto& i: b3d)
m_bounds.push_back(i.to2d());
-// m_bounds = b3d.to2d();
}
catch (boost::bad_lexical_cast)
{
@@ -123,8 +123,12 @@ void CropFilter::processOptions(const Options& options)
#ifdef PDAL_HAVE_GEOS
if (m_polys.size())
{
- m_geosEnvironment = initGEOS_r(pdal::geos::_GEOSWarningHandler,
- pdal::geos::_GEOSErrorHandler);
+ m_geoms.clear();
+ if (!m_geosEnvironment)
+ {
+ m_geosEnvironment = initGEOS_r(pdal::geos::_GEOSWarningHandler,
+ pdal::geos::_GEOSErrorHandler);
+ }
for (std::string poly : m_polys)
{
GeomPkg g;
@@ -147,15 +151,6 @@ void CropFilter::processOptions(const Options& options)
}
-void CropFilter::ready(PointTableRef table)
-{
-#ifdef PDAL_HAVE_GEOS
- for (auto& g : m_geoms)
- preparePolygon(g, table.spatialRef());
-#endif
-}
-
-
#ifdef PDAL_HAVE_GEOS
GEOSGeometry *CropFilter::validatePolygon(const std::string& poly)
{
@@ -194,19 +189,38 @@ void CropFilter::preparePolygon(GeomPkg& g, const SpatialReference& to)
{
char* out_wkt = GEOSGeomToWKT_r(m_geosEnvironment, g.m_geom);
std::string poly(out_wkt);
- poly = transformWkt(poly, m_assignedSRS, to);
+ poly = transformWkt(poly, m_assignedSrs, to);
log()->get(LogLevel::Debug2) << "Ingested WKT for filters.crop: " <<
- poly <<std::endl;
+ poly << std::endl;
GEOSFree_r(m_geosEnvironment, out_wkt);
// Store transformed geometry.
- GEOSGeom_destroy_r(m_geosEnvironment, g.m_geom);
- g.m_geom = GEOSGeomFromWKT_r(m_geosEnvironment, poly.c_str());
+ g.m_geomXform = GEOSGeomFromWKT_r(m_geosEnvironment, poly.c_str());
g.m_prepGeom = GEOSPrepare_r(m_geosEnvironment, g.m_geom);
if (!g.m_prepGeom)
throw pdal_error("unable to prepare geometry for index-accelerated "
"intersection");
}
+
+
+void CropFilter::freePolygon(GeomPkg& g, bool freeBase)
+{
+ if (g.m_geom && freeBase)
+ {
+ GEOSGeom_destroy_r(m_geosEnvironment, g.m_geom);
+ g.m_geom = NULL;
+ }
+ if (g.m_prepGeom)
+ {
+ GEOSPreparedGeom_destroy_r(m_geosEnvironment, g.m_prepGeom);
+ g.m_prepGeom = NULL;
+ }
+ if (g.m_geomXform)
+ {
+ GEOSGeom_destroy_r(m_geosEnvironment, g.m_geomXform);
+ g.m_geomXform = NULL;
+ }
+}
#endif
@@ -226,6 +240,7 @@ Options CropFilter::getDefaultOptions()
PointViewSet CropFilter::run(PointViewPtr view)
{
PointViewSet viewSet;
+ SpatialReference srs = view->spatialReference();
// Don't do anything if no bounds have been specified.
if (m_geoms.empty() && m_bounds.empty())
@@ -235,12 +250,21 @@ PointViewSet CropFilter::run(PointViewPtr view)
}
#ifdef PDAL_HAVE_GEOS
- for (const auto& geom : m_geoms)
+ for (auto& geom : m_geoms)
{
+ // If this is the first time through or the SRS has changed,
+ // prepare the crop polygon.
+ if (!geom.m_prepGeom || srs != m_lastSrs)
+ {
+ freePolygon(geom, false);
+ preparePolygon(geom, srs);
+ }
+
PointViewPtr outView = view->makeNew();
crop(geom, *view, *outView);
viewSet.insert(outView);
}
+ m_lastSrs = srs;
#endif
for (auto& box : m_bounds)
{
@@ -251,6 +275,7 @@ PointViewSet CropFilter::run(PointViewPtr view)
return viewSet;
}
+
void CropFilter::crop(const BOX2D& box, PointView& input, PointView& output)
{
for (PointId idx = 0; idx < input.size(); ++idx)
@@ -264,6 +289,7 @@ void CropFilter::crop(const BOX2D& box, PointView& input, PointView& output)
}
}
+
#ifdef PDAL_HAVE_GEOS
GEOSGeometry *CropFilter::createPoint(double x, double y, double z)
{
@@ -285,7 +311,6 @@ GEOSGeometry *CropFilter::createPoint(double x, double y, double z)
}
-
void CropFilter::crop(const GeomPkg& g, PointView& input, PointView& output)
{
bool logOutput = (log()->getLevel() > LogLevel::Debug4);
@@ -320,12 +345,11 @@ void CropFilter::done(PointTableRef /*table*/)
{
#ifdef PDAL_HAVE_GEOS
for (auto& g : m_geoms)
- {
- GEOSPreparedGeom_destroy_r(m_geosEnvironment, g.m_prepGeom);
- GEOSGeom_destroy_r(m_geosEnvironment, g.m_geom);
- }
+ freePolygon(g, true);
+ m_geoms.clear();
if (m_geosEnvironment)
finishGEOS_r(m_geosEnvironment);
+ m_geosEnvironment = 0;
#endif
}
diff --git a/filters/crop/CropFilter.hpp b/filters/crop/CropFilter.hpp
index 7e1d324..b6f6644 100644
--- a/filters/crop/CropFilter.hpp
+++ b/filters/crop/CropFilter.hpp
@@ -63,7 +63,8 @@ private:
std::vector<BOX2D> m_bounds;
bool m_cropOutside;
StringList m_polys;
- SpatialReference m_assignedSRS;
+ SpatialReference m_assignedSrs;
+ SpatialReference m_lastSrs;
#ifndef PDAL_HAVE_GEOS
typedef void *GEOSContextHandle_t;
@@ -74,14 +75,17 @@ private:
GEOSContextHandle_t m_geosEnvironment;
struct GeomPkg
{
+ GeomPkg() : m_geom(NULL), m_geomXform(NULL), m_prepGeom(NULL)
+ {}
+
GEOSGeometry *m_geom;
+ GEOSGeometry *m_geomXform;
const GEOSPreparedGeometry *m_prepGeom;
};
std::vector<GeomPkg> m_geoms;
virtual void processOptions(const Options& options);
- virtual void ready(PointTableRef table);
virtual PointViewSet run(PointViewPtr view);
virtual void done(PointTableRef table);
void crop(const BOX2D& box, PointView& input, PointView& output);
@@ -89,6 +93,7 @@ private:
#ifdef PDAL_HAVE_GEOS
GEOSGeometry *validatePolygon(const std::string& poly);
void preparePolygon(GeomPkg& g, const SpatialReference& to);
+ void freePolygon(GeomPkg& g, bool freeBase);
BOX2D computeBounds(GEOSGeometry const *geometry);
GEOSGeometry *createPoint(double x, double y, double z);
#endif
diff --git a/filters/divider/CMakeLists.txt b/filters/divider/CMakeLists.txt
new file mode 100644
index 0000000..6af45b7
--- /dev/null
+++ b/filters/divider/CMakeLists.txt
@@ -0,0 +1,14 @@
+#
+# Divider filter CMake configuration
+#
+
+set(srcs
+ DividerFilter.cpp
+)
+
+set(incs
+ DividerFilter.hpp
+)
+
+PDAL_ADD_DRIVER(filter divider "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/filters/divider/DividerFilter.cpp b/filters/divider/DividerFilter.cpp
new file mode 100644
index 0000000..56d6d1d
--- /dev/null
+++ b/filters/divider/DividerFilter.cpp
@@ -0,0 +1,137 @@
+/******************************************************************************
+ * Copyright (c) 2015, Hobu Inc. (info at hobu.co)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Hobu, Inc. nor the names of its contributors
+ * may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#include "DividerFilter.hpp"
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+ "filters.divider",
+ "Divide points into approximately equal sized groups based on a simple "
+ "scheme",
+ "http://pdal.io/stages/filters.divider.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, DividerFilter, Filter, s_info)
+
+std::string DividerFilter::getName() const { return s_info.name; }
+
+void DividerFilter::processOptions(const Options& options)
+{
+ std::string mode = options.getValueOrDefault<std::string>("mode");
+ mode = Utils::tolower(mode);
+ if (mode.empty() || mode == "partition")
+ m_mode = Mode::Partition;
+ else if (mode == "round_robin")
+ m_mode = Mode::RoundRobin;
+ else
+ {
+ std::ostringstream oss;
+ oss << getName() << ": Invalid 'mode' option '" << mode << "'. "
+ "Valid options are 'partition' and 'round_robin'";
+ throw pdal_error(oss.str());
+ }
+ if (options.hasOption("count") && options.hasOption("capacity"))
+ {
+ std::ostringstream oss;
+ oss << getName() << ": Can't specify both option 'count' and "
+ "option 'capacity.";
+ throw pdal_error(oss.str());
+ }
+ if (!options.hasOption("count") && !options.hasOption("capacity"))
+ {
+ std::ostringstream oss;
+ oss << getName() << ": Must specify either option 'count' or "
+ "option 'capacity.";
+ throw pdal_error(oss.str());
+ }
+ if (options.hasOption("count"))
+ {
+ m_size = options.getValueOrThrow<int>("count");
+ m_sizeMode = SizeMode::Count;
+ if (m_size < 2 || m_size > 1000)
+ {
+ std::ostringstream oss;
+ oss << getName() << ": Option 'count' must be in the range "
+ "[2, 1000].";
+ throw pdal_error(oss.str());
+ }
+ }
+ if (options.hasOption("capacity"))
+ {
+ m_size = options.getValueOrThrow<point_count_t>("capacity");
+ m_sizeMode = SizeMode::Capacity;
+ }
+}
+
+
+PointViewSet DividerFilter::run(PointViewPtr inView)
+{
+ if (m_sizeMode == SizeMode::Capacity)
+ m_size = ((inView->size() - 1) / m_size) + 1;
+
+ PointViewSet result;
+ std::vector<PointViewPtr> views;
+ for (point_count_t i = 0; i < m_size; ++i)
+ {
+ PointViewPtr v(inView->makeNew());
+ views.push_back(v);
+ result.insert(v);
+ }
+
+ if (m_mode == Mode::Partition)
+ {
+ point_count_t limit = ((inView->size() - 1) / m_size) + 1;
+ unsigned viewNum = 0;
+ for (PointId i = 0; i < inView->size();)
+ {
+ views[viewNum]->appendPoint(*inView, i++);
+ if (i % limit == 0)
+ viewNum++;
+ }
+ }
+ else // RoundRobin
+ {
+ unsigned viewNum = 0;
+ for (PointId i = 0; i < inView->size(); ++i)
+ {
+ views[viewNum]->appendPoint(*inView, i);
+ viewNum++;
+ if (viewNum == m_size)
+ viewNum = 0;
+ }
+ }
+ return result;
+}
+
+} // pdal
diff --git a/filters/range/RangeFilter.hpp b/filters/divider/DividerFilter.hpp
similarity index 65%
copy from filters/range/RangeFilter.hpp
copy to filters/divider/DividerFilter.hpp
index 48daafe..fad46b9 100644
--- a/filters/range/RangeFilter.hpp
+++ b/filters/divider/DividerFilter.hpp
@@ -1,5 +1,5 @@
/******************************************************************************
- * Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+ * Copyright (c) 2015, Hobu Inc. (info at hobu.co)
*
* All rights reserved.
*
@@ -13,10 +13,9 @@
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided
* with the distribution.
- * * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
- * names of its contributors may be used to endorse or promote
- * products derived from this software without specific prior
- * written permission.
+ * * Neither the name of Hobu, Inc. nor the names of its contributors
+ * may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
@@ -36,44 +35,47 @@
#include <pdal/Filter.hpp>
-#include <memory>
-#include <map>
-#include <string>
-
-extern "C" int32_t RangeFilter_ExitFunc();
-extern "C" PF_ExitFunc RangeFilter_InitPlugin();
+extern "C" int32_t DividerFilter_ExitFunc();
+extern "C" PF_ExitFunc DividefFilter_InitPlugin();
namespace pdal
{
-class Options;
-
-struct Range
+class PDAL_DLL DividerFilter : public pdal::Filter
{
- double min;
- double max;
-};
+public:
-class PDAL_DLL RangeFilter : public pdal::Filter
-{
public:
- RangeFilter() : Filter()
- {}
+ DividerFilter() : Filter()
+ {}
static void * create();
static int32_t destroy(void *);
std::string getName() const;
private:
- std::map<std::string, Range> m_name_map;
- std::map<Dimension::Id::Enum, Range> m_dimensions_map;
- virtual void processOptions(const Options&options);
- virtual void ready(PointTableRef table);
+ enum Mode
+ {
+ Partition,
+ RoundRobin
+ };
+
+ enum SizeMode
+ {
+ Count,
+ Capacity
+ };
+
+ Mode m_mode;
+ SizeMode m_sizeMode;
+ point_count_t m_size;
+
+ virtual void processOptions(const Options& options);
virtual PointViewSet run(PointViewPtr view);
- RangeFilter& operator=(const RangeFilter&); // not implemented
- RangeFilter(const RangeFilter&); // not implemented
+ DividerFilter& operator=(const DividerFilter&); // not implemented
+ DividerFilter(const DividerFilter&); // not implemented
};
} // namespace pdal
diff --git a/filters/ferry/FerryFilter.cpp b/filters/ferry/FerryFilter.cpp
index 197770f..8811ee3 100644
--- a/filters/ferry/FerryFilter.cpp
+++ b/filters/ferry/FerryFilter.cpp
@@ -52,15 +52,7 @@ Options FerryFilter::getDefaultOptions()
{
Options options;
- pdal::Option red("dimension", "Red", "");
- pdal::Option b0("to","Red2", "");
- pdal::Option def("def","Red2", "");
- pdal::Options redO;
- redO.add(b0);
- redO.add(def);
- red.setOptions(redO);
-
- options.add(red);
+ options.add("dimensions", "", "Dimensions to copy (<in>=<out>,...)");
return options;
}
@@ -68,30 +60,35 @@ Options FerryFilter::getDefaultOptions()
void FerryFilter::processOptions(const Options& options)
{
- std::vector<Option> dimensions = options.getOptions("dimension");
- for (auto i = dimensions.begin(); i != dimensions.end(); ++i)
+ if (options.hasOption("dimension"))
+ throw pdal_error("Option 'dimension' no longer supported. Use "
+ "'dimensions' instead.");
+
+ StringList dims = options.getValueOrThrow<StringList>("dimensions");
+ for (auto& dim : dims)
{
- std::string name = i->getValue<std::string>();
- boost::optional<Options const&> dimensionOptions = i->getOptions();
- if (!dimensionOptions)
+ StringList s = Utils::split2(dim, '=');
+ if (s.size() != 2)
{
std::ostringstream oss;
- oss << "No 'to' dimension given for dimension '" <<
- name << "'";
+ oss << "Invalid dimension specified '" << dim <<
+ "'. Need <from dimension>=<to dimension>. See "
+ "documentation for details.";
throw pdal_error(oss.str());
}
- std::string to_dim =
- dimensionOptions->getValueOrThrow<std::string>("to");
- if (boost::algorithm::iequals(name, to_dim))
+ Utils::trim(s[0]);
+ Utils::trim(s[1]);
+ if (s[0] == s[1])
{
std::ostringstream oss;
- oss << "The from and to dimension cannot be the same"
- << " name for dimension '" << name << "'";
+ oss << "Can't ferry dimension '" << s[0] << "' to itself.";
throw pdal_error(oss.str());
}
- m_name_map.insert(std::make_pair(name, to_dim));
+ m_name_map[s[0]] = s[1];
}
}
+
+
void FerryFilter::addDimensions(PointLayoutPtr layout)
{
for (const auto& dim_par : m_name_map)
@@ -100,6 +97,19 @@ void FerryFilter::addDimensions(PointLayoutPtr layout)
}
}
+
+void FerryFilter::prepared(PointTableRef table)
+{
+ for (const auto& dims : m_name_map)
+ if (table.layout()->findDim(dims.first) == Dimension::Id::Unknown)
+ {
+ std::ostringstream oss;
+ oss << "Can't ferry dimension '" << dims.first << "'. "
+ "Dimension doesn't exist.";
+ throw pdal_error(oss.str());
+ }
+}
+
void FerryFilter::ready(PointTableRef table)
{
const PointLayoutPtr layout(table.layout());
@@ -124,5 +134,5 @@ void FerryFilter::filter(PointView& view)
}
}
-
} // namespace pdal
+
diff --git a/filters/ferry/FerryFilter.hpp b/filters/ferry/FerryFilter.hpp
index 6305728..b733b91 100644
--- a/filters/ferry/FerryFilter.hpp
+++ b/filters/ferry/FerryFilter.hpp
@@ -60,6 +60,7 @@ public:
private:
virtual void processOptions(const Options&);
virtual void addDimensions(PointLayoutPtr layout);
+ virtual void prepared(PointTableRef table);
virtual void ready(PointTableRef table);
virtual void filter(PointView& view);
diff --git a/filters/merge/MergeFilter.cpp b/filters/merge/MergeFilter.cpp
index d0b409b..41251eb 100644
--- a/filters/merge/MergeFilter.cpp
+++ b/filters/merge/MergeFilter.cpp
@@ -46,5 +46,30 @@ CREATE_STATIC_PLUGIN(1, 0, MergeFilter, Filter, s_info)
std::string MergeFilter::getName() const { return s_info.name; }
+void MergeFilter::ready(PointTableRef table)
+{
+ SpatialReference srs = getSpatialReference();
+
+ if (srs.empty())
+ srs = table.anySpatialReference();
+ m_view.reset(new PointView(table, srs));
+}
+
+
+PointViewSet MergeFilter::run(PointViewPtr in)
+{
+ PointViewSet viewSet;
+
+ // If the SRS of all the point views aren't the same, print a warning
+ // unless we're explicitly overriding the SRS.
+ if (getSpatialReference().empty() &&
+ (in->spatialReference() != m_view->spatialReference()))
+ log()->get(LogLevel::Warning) << getName() << ": merging points "
+ "with inconsistent spatial references." << std::endl;
+ m_view->append(*in.get());
+ viewSet.insert(m_view);
+ return viewSet;
+}
+
} // namespace pdal
diff --git a/filters/merge/MergeFilter.hpp b/filters/merge/MergeFilter.hpp
index e71b77a..d1311be 100644
--- a/filters/merge/MergeFilter.hpp
+++ b/filters/merge/MergeFilter.hpp
@@ -55,17 +55,8 @@ public:
private:
PointViewPtr m_view;
- virtual void ready(PointTableRef table)
- { m_view.reset(new PointView(table)); }
-
- virtual PointViewSet run(PointViewPtr in)
- {
- PointViewSet viewSet;
-
- m_view->append(*in.get());
- viewSet.insert(m_view);
- return viewSet;
- }
+ virtual void ready(PointTableRef table);
+ virtual PointViewSet run(PointViewPtr in);
MergeFilter& operator=(const MergeFilter&); // not implemented
MergeFilter(const MergeFilter&); // not implemented
diff --git a/filters/randomize/CMakeLists.txt b/filters/randomize/CMakeLists.txt
new file mode 100644
index 0000000..81b44cc
--- /dev/null
+++ b/filters/randomize/CMakeLists.txt
@@ -0,0 +1,5 @@
+set(srcs RandomizeFilter.cpp)
+set(incs RandomizeFilter.hpp)
+
+PDAL_ADD_DRIVER(filter randomize "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/filters/merge/MergeFilter.cpp b/filters/randomize/RandomizeFilter.cpp
similarity index 81%
copy from filters/merge/MergeFilter.cpp
copy to filters/randomize/RandomizeFilter.cpp
index d0b409b..b310355 100644
--- a/filters/merge/MergeFilter.cpp
+++ b/filters/randomize/RandomizeFilter.cpp
@@ -1,6 +1,5 @@
/******************************************************************************
- * Copyright (c) 2014, Hobu Inc., hobu.inc at gmail.com
- * Copyright (c) 2015, Bradley J Chambers, brad.chambers at gmail.com
+ * Copyright (c) 2015, Hobu Inc. (hobu at hobu.co)
*
* All rights reserved.
*
@@ -32,19 +31,19 @@
* OF SUCH DAMAGE.
****************************************************************************/
-#include "MergeFilter.hpp"
+#include "RandomizeFilter.hpp"
namespace pdal
{
static PluginInfo const s_info = PluginInfo(
- "filters.merge",
- "Merge data from two different readers into a single stream.",
- "http://pdal.io/stages/filters.merge.html" );
+ "filters.randomize",
+ "Randomize points in a view.",
+ "http://pdal.io/stages/filters.randomize.html" );
-CREATE_STATIC_PLUGIN(1, 0, MergeFilter, Filter, s_info)
+CREATE_STATIC_PLUGIN(1, 0, RandomizeFilter, Filter, s_info)
-std::string MergeFilter::getName() const { return s_info.name; }
+std::string RandomizeFilter::getName() const { return s_info.name; }
} // namespace pdal
diff --git a/filters/merge/MergeFilter.hpp b/filters/randomize/RandomizeFilter.hpp
similarity index 75%
copy from filters/merge/MergeFilter.hpp
copy to filters/randomize/RandomizeFilter.hpp
index e71b77a..f632237 100644
--- a/filters/merge/MergeFilter.hpp
+++ b/filters/randomize/RandomizeFilter.hpp
@@ -1,5 +1,5 @@
/******************************************************************************
-* Copyright (c) 2014, Hobu Inc., hobu.inc at gmail.com
+* Copyright (c) 2015, Hobu Inc. (hobu at hobu.co)
*
* All rights reserved.
*
@@ -35,17 +35,18 @@
#pragma once
#include <pdal/Filter.hpp>
+#include <pdal/PointViewIter.hpp>
-extern "C" int32_t MergeFilter_ExitFunc();
-extern "C" PF_ExitFunc MergeFilter_InitPlugin();
+extern "C" int32_t RandomizeFilter_ExitFunc();
+extern "C" PF_ExitFunc RandomizeFilter_InitPlugin();
namespace pdal
{
-class PDAL_DLL MergeFilter : public MultiFilter
+class PDAL_DLL RandomizeFilter : public Filter
{
public:
- MergeFilter ()
+ RandomizeFilter()
{}
static void * create();
@@ -53,23 +54,11 @@ public:
std::string getName() const;
private:
- PointViewPtr m_view;
+ virtual void filter(PointView& view)
+ { std::random_shuffle(view.begin(), view.end()); }
- virtual void ready(PointTableRef table)
- { m_view.reset(new PointView(table)); }
-
- virtual PointViewSet run(PointViewPtr in)
- {
- PointViewSet viewSet;
-
- m_view->append(*in.get());
- viewSet.insert(m_view);
- return viewSet;
- }
-
- MergeFilter& operator=(const MergeFilter&); // not implemented
- MergeFilter(const MergeFilter&); // not implemented
+ RandomizeFilter& operator=(const RandomizeFilter&); // not implemented
+ RandomizeFilter(const RandomizeFilter&); // not implemented
};
} // namespace pdal
-
diff --git a/filters/range/RangeFilter.cpp b/filters/range/RangeFilter.cpp
index f4d6b64..74e10be 100644
--- a/filters/range/RangeFilter.cpp
+++ b/filters/range/RangeFilter.cpp
@@ -34,68 +34,195 @@
#include "RangeFilter.hpp"
-#include <cmath>
+#include <pdal/util/Utils.hpp>
+
+#include <cctype>
#include <limits>
#include <map>
#include <string>
-#include <utility>
#include <vector>
namespace pdal
{
-static PluginInfo const s_info = PluginInfo(
- "filters.range",
- "Pass only points given a dimension/range.",
- "http://pdal.io/stages/filters.range.html" );
+static PluginInfo const s_info =
+ PluginInfo("filters.range", "Pass only points given a dimension/range.",
+ "http://pdal.io/stages/filters.range.html");
CREATE_STATIC_PLUGIN(1, 0, RangeFilter, Filter, s_info)
-std::string RangeFilter::getName() const { return s_info.name; }
+std::string RangeFilter::getName() const
+{
+ return s_info.name;
+}
-void RangeFilter::processOptions(const Options& options)
+namespace
{
- std::vector<Option> dimensions = options.getOptions("dimension");
- if (dimensions.size() == 0)
- throw pdal_error("No dimensions given");
- for (auto const& d : dimensions)
+RangeFilter::Range parseRange(const std::string& r)
+{
+ std::string::size_type pos, count;
+ bool ilb = true;
+ bool iub = true;
+ bool negate = false;
+ const char *start;
+ char *end;
+ std::string name;
+ double ub, lb;
+
+ try
{
- std::string name = d.getValue<std::string>();
- boost::optional<Options const&> dimensionOptions = d.getOptions();
- if (!dimensionOptions)
- throw pdal_error("No dimension options");
-
- double val =dimensionOptions->getValueOrDefault<double>("equals",
- (std::numeric_limits<double>::max)());
- double min = dimensionOptions->getValueOrDefault<double>("min",
- -(std::numeric_limits<double>::max)());
- double max = dimensionOptions->getValueOrDefault<double>("max",
- (std::numeric_limits<double>::max)());
-
- if (val != (std::numeric_limits<double>::max)())
- min = max = val;
-
- Range range;
- range.min = min;
- range.max = max;
-
- m_name_map.insert(std::make_pair(name, range));
+ pos = 0;
+ // Skip leading whitespace.
+ count = Utils::extract(r, pos, (int(*)(int))std::isspace);
+ pos += count;
+
+ count = Utils::extract(r, pos, (int(*)(int))std::isalpha);
+ if (count == 0)
+ throw std::string("No dimension name.");
+ name = r.substr(pos, count);
+ pos += count;
+
+ if (r[pos] == '!')
+ {
+ negate = true;
+ pos++;
+ }
+
+ if (r[pos] == '(')
+ ilb = false;
+ else if (r[pos] != '[')
+ throw std::string("Missing '(' or '['.");
+ pos++;
+
+ // Extract lower bound.
+ start = r.data() + pos;
+ lb = std::strtod(start, &end);
+ if (start == end)
+ lb = std::numeric_limits<double>::min();
+ pos += (end - start);
+
+ count = Utils::extract(r, pos, (int(*)(int))std::isspace);
+ pos += count;
+
+ if (r[pos] != ':')
+ throw std::string("Missing ':' limit separator.");
+ pos++;
+
+ start = r.data() + pos;
+ ub = std::strtod(start, &end);
+ if (start == end)
+ ub = std::numeric_limits<double>::max();
+ pos += (end - start);
+
+ count = Utils::extract(r, pos, (int(*)(int))std::isspace);
+ pos += count;
+
+ if (r[pos] == ')')
+ iub = false;
+ else if (r[pos] != ']')
+ throw std::string("Missing ')' or ']'.");
+ pos++;
+
+ count = Utils::extract(r, pos, (int(*)(int))std::isspace);
+ pos += count;
+
+ if (pos != r.size())
+ throw std::string("Invalid characters following valid range.");
+ }
+ catch (std::string s)
+ {
+ std::ostringstream oss;
+ oss << "filters.range: invalid 'limits' option: '" << r << "': " << s;
+ throw pdal_error(oss.str());
}
+ return RangeFilter::Range(name, lb, ub, ilb, iub, negate);
+}
+
+} // unnamed namespace
+
+
+bool operator < (const RangeFilter::Range& r1, const RangeFilter::Range& r2)
+{
+ return (r1.m_name < r2.m_name ? true :
+ r1.m_name > r2.m_name ? false :
+ &r1 < &r2);
+}
+
+
+void RangeFilter::processOptions(const Options& options)
+{
+ StringList rangeString = options.getValueOrDefault<StringList>("limits");
+
+ if (rangeString.empty())
+ throw pdal_error("filters.range missing required 'limits' option.");
+
+ for (auto const& r : rangeString)
+ m_range_list.push_back(parseRange(r));
}
-void RangeFilter::ready(PointTableRef table)
+
+void RangeFilter::prepared(PointTableRef table)
{
const PointLayoutPtr layout(table.layout());
- for (auto const& d : m_name_map)
+
+ for (auto& r : m_range_list)
{
- m_dimensions_map.insert(
- std::make_pair(
- layout->findDim(d.first),
- d.second));
+ r.m_id = layout->findDim(r.m_name);
+ if (r.m_id == Dimension::Id::Unknown)
+ {
+ std::ostringstream oss;
+ oss << "Invalid dimension name in filters.range 'limits' "
+ "option: '" << r.m_name << "'.";
+ throw pdal_error(oss.str());
+ }
}
+ std::sort(m_range_list.begin(), m_range_list.end());
}
+// Determine if a point passes a single range.
+bool RangeFilter::dimensionPasses(double v, const Range& r) const
+{
+ bool fail = ((r.m_inclusive_lower_bound && v < r.m_lower_bound) ||
+ (!r.m_inclusive_lower_bound && v <= r.m_lower_bound) ||
+ (r.m_inclusive_upper_bound && v > r.m_upper_bound) ||
+ (!r.m_inclusive_upper_bound && v >= r.m_upper_bound));
+ if (r.m_negate)
+ fail = !fail;
+ return !fail;
+}
+
+// The range list is sorted by dimension, so the logic here should work
+// as ORs between ranges of the same dimension and ANDs between ranges
+// of different dimensions. This is simple logic, but is probably the most
+// common case.
+bool RangeFilter::pointPasses(PointView *view, PointId idx) const
+{
+ Dimension::Id::Enum lastId = m_range_list.front().m_id;
+ bool passes = false;
+ for (auto const& r : m_range_list)
+ {
+ // If we're at a new dimension, return false if we haven't passed
+ // the dimension, otherwise reset passes to false for the next
+ // dimension and keep checking.
+ if (r.m_id != lastId)
+ {
+ if (!passes)
+ return false;
+ lastId = r.m_id;
+ passes = false;
+ }
+ // If we've already passed this dimension, continue until we find
+ // a new dimension.
+ else if (passes)
+ continue;
+ double v = view->getFieldAs<double>(r.m_id, idx);
+ passes = dimensionPasses(v, r);
+ }
+ return passes;
+}
+
+
PointViewSet RangeFilter::run(PointViewPtr inView)
{
PointViewSet viewSet;
@@ -105,25 +232,11 @@ PointViewSet RangeFilter::run(PointViewPtr inView)
PointViewPtr outView = inView->makeNew();
for (PointId i = 0; i < inView->size(); ++i)
- {
- bool keep_point = true;
- for (auto const& d : m_dimensions_map)
- {
- double v = inView->getFieldAs<double>(d.first, i);
- if (v < d.second.min || v > d.second.max)
- {
- keep_point = false;
- break;
- }
- }
- if (keep_point)
+ if (pointPasses(inView.get(), i))
outView->appendPoint(*inView, i);
- }
viewSet.insert(outView);
-
return viewSet;
}
} // pdal
-
diff --git a/filters/range/RangeFilter.hpp b/filters/range/RangeFilter.hpp
index 48daafe..b0eec6a 100644
--- a/filters/range/RangeFilter.hpp
+++ b/filters/range/RangeFilter.hpp
@@ -48,15 +48,38 @@ namespace pdal
class Options;
-struct Range
-{
- double min;
- double max;
-};
-
class PDAL_DLL RangeFilter : public pdal::Filter
{
public:
+
+ struct Range
+ {
+ Range(const std::string name,
+ double lower_bound,
+ double upper_bound,
+ bool inclusive_lower_bound,
+ bool inclusive_upper_bound,
+ bool negate) :
+ m_name(name), m_id(Dimension::Id::Unknown),
+ m_lower_bound(lower_bound), m_upper_bound(upper_bound),
+ m_inclusive_lower_bound(inclusive_lower_bound),
+ m_inclusive_upper_bound(inclusive_upper_bound),
+ m_negate(negate)
+ {}
+
+ Range()
+ {}
+
+ std::string m_name;
+ Dimension::Id::Enum m_id;
+ double m_lower_bound;
+ double m_upper_bound;
+ bool m_inclusive_lower_bound;
+ bool m_inclusive_upper_bound;
+ bool m_negate;
+ };
+
+
RangeFilter() : Filter()
{}
@@ -65,12 +88,13 @@ public:
std::string getName() const;
private:
- std::map<std::string, Range> m_name_map;
- std::map<Dimension::Id::Enum, Range> m_dimensions_map;
+ std::vector<Range> m_range_list;
virtual void processOptions(const Options&options);
- virtual void ready(PointTableRef table);
+ virtual void prepared(PointTableRef table);
virtual PointViewSet run(PointViewPtr view);
+ bool dimensionPasses(double v, const Range& r) const;
+ bool pointPasses(PointView *view, PointId idx) const;
RangeFilter& operator=(const RangeFilter&); // not implemented
RangeFilter(const RangeFilter&); // not implemented
diff --git a/filters/reprojection/ReprojectionFilter.cpp b/filters/reprojection/ReprojectionFilter.cpp
index ad35927..ff8083f 100644
--- a/filters/reprojection/ReprojectionFilter.cpp
+++ b/filters/reprojection/ReprojectionFilter.cpp
@@ -94,6 +94,7 @@ void ReprojectionFilter::processOptions(const Options& options)
try
{
m_inSRS = options.getValueOrThrow<pdal::SpatialReference>("in_srs");
+ m_inferInputSRS = false;
}
catch (std::invalid_argument)
{
@@ -104,86 +105,135 @@ void ReprojectionFilter::processOptions(const Options& options)
"specification for 'in_srs' option: '" << srs << "'.";
throw pdal_error(oss.str());
}
- m_inferInputSRS = false;
}
}
+
void ReprojectionFilter::initialize()
{
GlobalEnvironment::get().initializeGDAL(log(), isDebug());
+
+ m_out_ref_ptr = OSRNewSpatialReference(0);
+
+ int result = OSRSetFromUserInput(m_out_ref_ptr,
+ m_outSRS.getWKT(pdal::SpatialReference::eCompoundOK).c_str());
+ if (result != OGRERR_NONE)
+ {
+ std::ostringstream oss;
+ oss << getName() << ": Invalid output spatial reference '" <<
+ m_outSRS.getWKT() << "'. This is usually caused by a bad value "
+ "for the 'out_srs' option.";
+ throw pdal_error(oss.str());
+ }
}
-void ReprojectionFilter::ready(PointTableRef table)
+
+void ReprojectionFilter::createTransform(PointView *view)
{
if (m_inferInputSRS)
{
- m_inSRS = table.spatialRef();
- if (m_inSRS.getWKT().empty())
- throw pdal_error("Source data has no spatial reference and none "
- "is specified with the 'in_srs' option.");
+ m_inSRS = view->spatialReference();
+ if (m_inSRS.empty())
+ {
+ std::ostringstream oss;
+ oss << getName() << ": source data has no spatial reference and "
+ "none is specified with the 'in_srs' option.";
+ throw pdal_error(oss.str());
+ }
}
+ if (m_in_ref_ptr)
+ OSRDestroySpatialReference(m_in_ref_ptr);
m_in_ref_ptr = OSRNewSpatialReference(0);
- m_out_ref_ptr = OSRNewSpatialReference(0);
int result =
OSRSetFromUserInput(m_in_ref_ptr,
m_inSRS.getWKT(pdal::SpatialReference::eCompoundOK).c_str());
if (result != OGRERR_NONE)
{
- std::ostringstream msg;
- msg << "Invalid input spatial reference '" << m_inSRS.getWKT() <<
- "'. This is usually caused by a bad value for the 'in_srs'"
- "option or an invalid spatial reference in the source file.";
- throw pdal_error(msg.str());
- }
-
-
- result = OSRSetFromUserInput(m_out_ref_ptr,
- m_outSRS.getWKT(pdal::SpatialReference::eCompoundOK).c_str());
- if (result != OGRERR_NONE)
- {
- std::ostringstream msg;
- msg << "Invalid output spatial reference '" << m_outSRS.getWKT() <<
- "'. This is usually caused by a bad value for the 'out_srs'"
- "option.";
- throw pdal_error(msg.str());
+ std::ostringstream oss;
+ oss << getName() << ": Invalid input spatial reference '" <<
+ m_inSRS.getWKT() << "'. This is usually caused by a bad " <<
+ "value for the 'in_srs' option or an invalid spatial reference " <<
+ "in the source file.";
+ throw pdal_error(oss.str());
}
-
- m_transform_ptr = OCTNewCoordinateTransformation(m_in_ref_ptr, m_out_ref_ptr);
+ if (m_transform_ptr)
+ OCTDestroyCoordinateTransformation(m_transform_ptr);
+ m_transform_ptr = OCTNewCoordinateTransformation(m_in_ref_ptr,
+ m_out_ref_ptr);
if (!m_transform_ptr)
{
- std::string msg = "Could not construct CoordinateTransformation in "
- "ReprojectionFilter:: ";
- throw std::runtime_error(msg);
+ std::ostringstream oss;
+ oss << getName() << ": Could not construct transformation.";
+ throw pdal_error(oss.str());
}
-
- setSpatialReference(m_outSRS);
}
-void ReprojectionFilter::transform(double& x, double& y, double& z)
+bool ReprojectionFilter::transform(double& x, double& y, double& z)
{
- int ret = OCTTransform(m_transform_ptr, 1, &x, &y, &z);
- if (ret == 0)
+ // OCTTransform will throw via GDAL error handler
+ // if there is an error. We don't expect the return value
+ // unless the GDAL handler gets shut off for whatever reason. In
+ // that case, we'll just throw.
+ if (OCTTransform(m_transform_ptr, 1, &x, &y, &z))
+ {
+ return true;
+ }
+ else
{
std::ostringstream msg;
msg << "Could not project point for ReprojectionTransform::" <<
- CPLGetLastErrorMsg() << ret;
+ CPLGetLastErrorMsg();
throw pdal_error(msg.str());
}
}
+PointViewSet ReprojectionFilter::run(PointViewPtr view)
+{
+ PointViewSet viewSet;
+ PointViewPtr outView = view->makeNew();
+
+ createTransform(view.get());
+
+ double x, y, z;
+
+ for (PointId id = 0; id < view->size(); ++id)
+ {
+ x = view->getFieldAs<double>(Dimension::Id::X, id);
+ y = view->getFieldAs<double>(Dimension::Id::Y, id);
+ z = view->getFieldAs<double>(Dimension::Id::Z, id);
+
+ if (transform(x, y, z))
+ {
+ view->setField(Dimension::Id::X, id, x);
+ view->setField(Dimension::Id::Y, id, y);
+ view->setField(Dimension::Id::Z, id, z);
+ outView->appendPoint(*view, id);
+ }
+ }
+
+ viewSet.insert(outView);
+ view->setSpatialReference(m_outSRS);
+ outView->setSpatialReference(m_outSRS);
+
+ return viewSet;
+}
+
+
void ReprojectionFilter::filter(PointView& view)
{
+ double x, y, z;
+
for (PointId id = 0; id < view.size(); ++id)
{
- double x = view.getFieldAs<double>(Dimension::Id::X, id);
- double y = view.getFieldAs<double>(Dimension::Id::Y, id);
- double z = view.getFieldAs<double>(Dimension::Id::Z, id);
+ x = view.getFieldAs<double>(Dimension::Id::X, id);
+ y = view.getFieldAs<double>(Dimension::Id::Y, id);
+ z = view.getFieldAs<double>(Dimension::Id::Z, id);
- transform(x, y, z);
+ OCTTransform(m_transform_ptr, 1, &x, &y, &z);
view.setField(Dimension::Id::X, id, x);
view.setField(Dimension::Id::Y, id, y);
@@ -191,4 +241,5 @@ void ReprojectionFilter::filter(PointView& view)
}
}
+
} // namespace pdal
diff --git a/filters/reprojection/ReprojectionFilter.hpp b/filters/reprojection/ReprojectionFilter.hpp
index e7898bf..a860646 100644
--- a/filters/reprojection/ReprojectionFilter.hpp
+++ b/filters/reprojection/ReprojectionFilter.hpp
@@ -61,12 +61,13 @@ public:
private:
virtual void processOptions(const Options& options);
- virtual void ready(PointTableRef table);
virtual void initialize();
+ virtual PointViewSet run(PointViewPtr view);
virtual void filter(PointView& view);
void updateBounds();
- void transform(double& x, double& y, double& z);
+ void createTransform(PointView *view);
+ bool transform(double& x, double& y, double& z);
SpatialReference m_inSRS;
SpatialReference m_outSRS;
@@ -78,6 +79,8 @@ private:
ReferencePtr m_out_ref_ptr;
TransformPtr m_transform_ptr;
+ bool m_cullBadPoints;
+
ReprojectionFilter& operator=(const ReprojectionFilter&); // not implemented
ReprojectionFilter(const ReprojectionFilter&); // not implemented
};
diff --git a/include/pdal/Compression.hpp b/include/pdal/Compression.hpp
index de0f802..03f17f0 100644
--- a/include/pdal/Compression.hpp
+++ b/include/pdal/Compression.hpp
@@ -44,10 +44,12 @@
#include <laz-perf/encoder.hpp>
#include <laz-perf/decoder.hpp>
#include <laz-perf/formats.hpp>
+#include <laz-perf/io.hpp>
#include <laz-perf/las.hpp>
#endif
#include <pdal/Dimension.hpp>
+#include <pdal/util/OStream.hpp>
#include <map>
#include <vector>
@@ -167,7 +169,7 @@ public:
~LazPerfCompressor()
{
if (!m_done)
- std::cerr << "LasPerfCompressor destroyed without a call "
+ std::cerr << "LazPerfCompressor destroyed without a call "
"to done()";
}
@@ -203,6 +205,117 @@ private:
bool m_done;
};
+class LazPerfVlrCompressor
+{
+ typedef laszip::io::__ofstream_wrapper<std::ostream> OutputStream;
+ typedef laszip::encoders::arithmetic<OutputStream> Encoder;
+ typedef laszip::formats::dynamic_compressor Compressor;
+ typedef laszip::factory::record_schema Schema;
+
+public:
+ LazPerfVlrCompressor(std::ostream& stream, const Schema& schema,
+ uint32_t chunksize) :
+ m_stream(stream), m_outputStream(stream), m_schema(schema),
+ m_chunksize(chunksize), m_chunkPointsWritten(0), m_chunkInfoPos(0),
+ m_chunkOffset(0)
+ {}
+
+ ~LazPerfVlrCompressor()
+ {
+ if (m_encoder)
+ std::cerr << "LazPerfVlrCompressor destroyed without a call "
+ "to done()";
+ }
+
+
+ void compress(const char *inbuf)
+ {
+ // First time through.
+ if (!m_encoder || !m_compressor)
+ {
+ // Get the position
+ m_chunkInfoPos = m_stream.tellp();
+ // Seek over the chunk info offset value
+ m_stream.seekp(sizeof(uint64_t), std::ios::cur);
+ m_chunkOffset = m_stream.tellp();
+ resetCompressor();
+ }
+ else if (m_chunkPointsWritten == m_chunksize)
+ {
+ resetCompressor();
+ newChunk();
+ }
+ m_compressor->compress(inbuf);
+ m_chunkPointsWritten++;
+ }
+
+ void done()
+ {
+ // Close and clear the point encoder.
+ m_encoder->done();
+ m_encoder.reset();
+
+ newChunk();
+
+ // Save our current position. Go to the location where we need
+ // to write the chunk table offset at the beginning of the point data.
+ std::streampos chunkTablePos = m_stream.tellp();
+ m_stream.seekp(m_chunkInfoPos);
+ OLeStream out(&m_stream);
+ out << (uint64_t)chunkTablePos;
+
+ // Move to the start of the chunk table.
+ m_stream.seekp(chunkTablePos);
+
+ // Write the chunk table header.
+ out << (uint32_t)0; // Version (?)
+ out << (uint32_t)m_chunkTable.size();
+
+ // Encode and write the chunk table.
+ OutputStream outputStream(m_stream);
+ Encoder encoder(outputStream);
+ laszip::compressors::integer compressor(32, 2);
+ compressor.init();
+
+ uint32_t predictor = 0;
+ for (uint32_t offset : m_chunkTable)
+ {
+ offset = htole32(offset);
+ compressor.compress(encoder, predictor, offset, 1);
+ predictor = offset;
+ }
+ encoder.done();
+ }
+
+private:
+ void resetCompressor()
+ {
+ if (m_encoder)
+ m_encoder->done();
+ m_encoder.reset(new Encoder(m_outputStream));
+ m_compressor = laszip::factory::build_compressor(*m_encoder, m_schema);
+ }
+
+ void newChunk()
+ {
+ std::streampos offset = m_stream.tellp();
+ m_chunkTable.push_back((uint32_t)(offset - m_chunkOffset));
+ m_chunkOffset = offset;
+ m_chunkPointsWritten = 0;
+ }
+
+ std::ostream& m_stream;
+ OutputStream m_outputStream;
+ std::unique_ptr<Encoder> m_encoder;
+ Compressor::ptr m_compressor;
+ Schema m_schema;
+ uint32_t m_chunksize;
+ uint32_t m_chunkPointsWritten;
+ std::streampos m_chunkInfoPos;
+ std::streampos m_chunkOffset;
+ std::vector<uint32_t> m_chunkTable;
+};
+
template<typename InputStream>
class LazPerfDecompressor
@@ -237,6 +350,62 @@ private:
Decompressor m_decompressor;
size_t m_pointSize;
};
+
+class LazPerfVlrDecompressor
+{
+public:
+ LazPerfVlrDecompressor(std::istream& stream, const char *vlrData,
+ std::streamoff pointOffset) :
+ m_stream(stream), m_inputStream(stream), m_chunksize(0),
+ m_chunkPointsRead(0)
+ {
+ laszip::io::laz_vlr zipvlr(vlrData);
+ m_chunksize = zipvlr.chunk_size;
+ m_schema = laszip::io::laz_vlr::to_schema(zipvlr);
+ m_stream.seekg(pointOffset + sizeof(int64_t));
+ }
+
+ size_t pointSize() const
+ { return (size_t)m_schema.size_in_bytes(); }
+
+ void decompress(char *outbuf)
+ {
+ if (m_chunkPointsRead == m_chunksize || !m_decoder || !m_decompressor)
+ {
+ resetDecompressor();
+ m_chunkPointsRead = 0;
+ }
+ m_decompressor->decompress(outbuf);
+ m_chunkPointsRead++;
+ }
+
+private:
+ void resetDecompressor()
+ {
+ m_decoder.reset(new Decoder(m_inputStream));
+ m_decompressor =
+ laszip::factory::build_decompressor(*m_decoder, m_schema);
+ }
+
+ typedef laszip::io::__ifstream_wrapper<std::istream> InputStream;
+ typedef laszip::decoders::arithmetic<InputStream> Decoder;
+ typedef laszip::formats::dynamic_decompressor Decompressor;
+ typedef laszip::factory::record_schema Schema;
+
+ std::istream& m_stream;
+ InputStream m_inputStream;
+ std::unique_ptr<Decoder> m_decoder;
+ Decompressor::ptr m_decompressor;
+ Schema m_schema;
+ uint32_t m_chunksize;
+ uint32_t m_chunkPointsRead;
+};
+
+#else
+
+typedef char LazPerfVlrCompressor;
+typedef char LazPerfVlrDecompressor;
+
#endif // PDAL_HAVE_LAZPERF
} // namespace pdal
diff --git a/include/pdal/FlexWriter.hpp b/include/pdal/FlexWriter.hpp
index 726dc32..8c287d9 100644
--- a/include/pdal/FlexWriter.hpp
+++ b/include/pdal/FlexWriter.hpp
@@ -33,6 +33,7 @@
#pragma once
+#include <pdal/PDALUtils.hpp>
#include <pdal/Writer.hpp>
namespace pdal
@@ -92,13 +93,22 @@ private:
{
readyTable(table);
if (m_hashPos == std::string::npos)
- readyFile(generateFilename());
+ {
+ if (!table.spatialReferenceUnique())
+ {
+ std::ostringstream oss;
+ oss << getName() << ": Attempting to write '" << m_filename <<
+ "' with multiple spatial references.";
+ Utils::printError(oss.str());
+ }
+ readyFile(generateFilename(), table.spatialReference());
+ }
}
virtual void write(const PointViewPtr view) final
{
if (m_hashPos != std::string::npos)
- readyFile(generateFilename());
+ readyFile(generateFilename(), view->spatialReference());
writeView(view);
if (m_hashPos != std::string::npos)
doneFile();
@@ -119,7 +129,8 @@ private:
virtual void doneTable(PointTableRef table)
{}
- virtual void readyFile(const std::string& filename) = 0;
+ virtual void readyFile(const std::string& filename,
+ const SpatialReference& srs) = 0;
virtual void writeView(const PointViewPtr view) = 0;
virtual void doneFile()
{}
diff --git a/include/pdal/GDALUtils.hpp b/include/pdal/GDALUtils.hpp
index 0459d21..eb5a128 100644
--- a/include/pdal/GDALUtils.hpp
+++ b/include/pdal/GDALUtils.hpp
@@ -35,17 +35,19 @@
#pragma once
#include <pdal/pdal_internal.hpp>
+#include <pdal/Dimension.hpp>
#include <pdal/Log.hpp>
#include <sstream>
#include <vector>
+#include <array>
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <cpl_port.h>
-#include "gdal.h"
+#include <gdal.h>
#include <cpl_vsi.h>
#include <cpl_conv.h>
#include <ogr_api.h>
@@ -73,18 +75,35 @@ public:
}
void setFromLayer(OGRLayerH layer)
- { newRef(OSRClone(OGR_L_GetSpatialRef(layer))); }
+ {
+ if (layer)
+ {
+ OGRSpatialReferenceH s = OGR_L_GetSpatialRef(layer);
+ if (s)
+ {
+ OGRSpatialReferenceH clone = OSRClone(s);
+ newRef(clone);
+ }
+
+ }
+ }
operator bool () const
{ return m_ref.get() != NULL; }
OGRSpatialReferenceH get() const
{ return m_ref.get(); }
- bool empty() const
+ std::string wkt() const
{
char *pszWKT = NULL;
OSRExportToWkt(m_ref.get(), &pszWKT);
bool valid = (bool)*pszWKT;
+ std::string output(pszWKT);
CPLFree(pszWKT);
- return (!valid);
+ return output;
+ }
+
+ bool empty() const
+ {
+ return wkt().empty();
}
private:
@@ -106,7 +125,14 @@ public:
OGRGeometryH geom;
char *p_wkt = const_cast<char *>(wkt.data());
- OGR_G_CreateFromWkt(&p_wkt, srs.get(), &geom);
+ OGRSpatialReferenceH ref = srs.get();
+ if (srs.empty())
+ {
+ ref = NULL;
+ }
+ OGRErr err = OGR_G_CreateFromWkt(&p_wkt, ref, &geom);
+ if (err != OGRERR_NONE)
+ throw pdal::pdal_error("unable to construct OGR geometry from wkt!");
newRef(geom);
}
@@ -127,6 +153,11 @@ public:
return std::string(p_wkt);
}
+ void setFromGeometry(OGRGeometryH geom)
+ {
+ if (geom)
+ newRef(OGR_G_Clone(geom));
+ }
private:
void newRef(void *v)
@@ -166,6 +197,54 @@ private:
pdal::LogPtr m_log;
};
+class PDAL_DLL Raster
+
+{
+
+public:
+ Raster(const std::string& filename);
+ ~Raster();
+ bool open();
+ void close();
+
+ bool read(double x, double y, std::vector<double>& data);
+ std::vector<pdal::Dimension::Type::Enum> getPDALDimensionTypes() const
+ {
+ return m_types;
+ }
+ bool readBand(std::vector<uint8_t>& band, int nBand);
+
+ void pixelToCoord(int column, int row, std::array<double, 2>& output) const;
+
+ SpatialReference getSpatialRef() const;
+
+ std::string m_filename;
+
+ std::array<double, 6> m_forward_transform;
+ std::array<double, 6> m_inverse_transform;
+
+ int m_raster_x_size;
+ int m_raster_y_size;
+
+ int m_block_x;
+ int m_block_y;
+
+ size_t m_size;
+ int m_band_count;
+ std::vector<pdal::Dimension::Type::Enum> m_types;
+ std::vector<std::array<double, 2>> m_block_sizes;
+
+ GDALDatasetH m_ds;
+
+private:
+ bool getPixelAndLinePosition(double x, double y,
+ std::array<double, 6> const& inverse,
+ int32_t& pixel, int32_t& line);
+ std::vector<pdal::Dimension::Type::Enum> computePDALDimensionTypes() const;
+ std::vector<std::array<int, 2>> fetchGDALBlockSizes() const;
+
+};
+
} // namespace gdal
diff --git a/include/pdal/Geometry.hpp b/include/pdal/Geometry.hpp
new file mode 100644
index 0000000..319bbbb
--- /dev/null
+++ b/include/pdal/Geometry.hpp
@@ -0,0 +1,146 @@
+/******************************************************************************
+* Copyright (c) 2015, Hobu Inc. (info at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in
+* the documentation and/or other materials provided
+* with the distribution.
+* * Neither the name of Hobu, Inc. nor the
+* names of its contributors may be used to endorse or promote
+* products derived from this software without specific prior
+* written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_types.hpp>
+
+#include <cstdarg>
+
+#ifdef PDAL_HAVE_GEOS
+#include <geos_c.h>
+#endif
+
+#pragma once
+
+namespace pdal
+{
+
+#ifdef PDAL_HAVE_GEOS
+namespace
+{
+
+static GEOSContextHandle_t s_environment(NULL);
+static int s_contextCnt(0);
+
+static void GEOSErrorHandler(const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ char buf[1024];
+
+ vsnprintf(buf, sizeof(buf), fmt, args);
+ std::cout << "GEOS error: " << buf << std::endl;
+
+ va_end(args);
+}
+
+static void GEOSWarningHandler(const char *fmt, ...)
+{
+ va_list args;
+
+ char buf[1024];
+ vsnprintf(buf, sizeof(buf), fmt, args);
+ std::cout << "GEOS warning: " << buf << std::endl;
+
+ va_end(args);
+}
+
+static GEOSContextHandle_t init()
+{
+ if (s_contextCnt == 0)
+ s_environment = initGEOS_r(GEOSWarningHandler, GEOSErrorHandler);
+ s_contextCnt++;
+ return s_environment;
+}
+
+static void finish()
+{
+ s_contextCnt--;
+ if (s_contextCnt == 0)
+ finishGEOS_r(s_environment);
+}
+
+} // Unnamed namespace
+
+namespace Geometry
+{
+
+static std::string smoothPolygon(const std::string& wkt, double tolerance)
+{
+ GEOSContextHandle_t env = init();
+
+ GEOSGeometry *geom = GEOSGeomFromWKT_r(env, wkt.c_str());
+ if (!geom)
+ return "";
+
+ GEOSGeometry *smoothed = GEOSTopologyPreserveSimplify_r(env, geom,
+ tolerance);
+ if (!smoothed)
+ return "";
+ char *smoothedWkt = GEOSGeomToWKT_r(env, smoothed);
+ std::string outWkt(smoothedWkt);
+ GEOSFree_r(env, smoothedWkt);
+ GEOSGeom_destroy_r(env, geom);
+ GEOSGeom_destroy_r(env, smoothed);
+ finish();
+ return outWkt;
+}
+
+static double computeArea(const std::string& wkt)
+{
+ GEOSContextHandle_t env = init();
+
+ GEOSGeometry *geom = GEOSGeomFromWKT_r(env, wkt.c_str());
+ if (!geom)
+ return 0.0;
+
+ double output(0.0);
+ int er = GEOSArea_r(env, geom, &output);
+ GEOSGeom_destroy_r(env, geom);
+ finish();
+ return output;
+}
+#else
+
+static std::string smoothPolygon(const std::string& wkt, double tolerance)
+{
+ throw pdal_error("Can't call smoothPolygon. PDAL not built with GEOS.");
+}
+
+#endif
+
+} // namespace Geometry
+
+} // namespace pdal
+
diff --git a/include/pdal/Kernel.hpp b/include/pdal/Kernel.hpp
index 9d418ae..8b03f7f 100644
--- a/include/pdal/Kernel.hpp
+++ b/include/pdal/Kernel.hpp
@@ -72,8 +72,7 @@ typedef std::shared_ptr<PointView> PointViewPtr;
class PDAL_DLL Kernel
{
public:
- virtual ~Kernel()
- {}
+ virtual ~Kernel();
// call this, to start the machine
int run(int argc, const char* argv[], const std::string& appName);
@@ -128,7 +127,12 @@ public:
void applyExtraStageOptionsRecursive(Stage *s)
{
- s->addOptions(extraStageOptions(s->getName()));
+ // if options provided via command-line, we assume they should overwrite
+ // existing options, remove first, and then add
+ Options ops = extraStageOptions(s->getName());
+
+ s->removeOptions(ops);
+ s->addOptions(ops);
auto stages = s->getInputs();
for (Stage *s : stages)
applyExtraStageOptionsRecursive(s);
@@ -192,4 +196,3 @@ private:
PDAL_DLL std::ostream& operator<<(std::ostream& ostr, const Kernel&);
} // namespace pdal
-
diff --git a/include/pdal/KernelSupport.hpp b/include/pdal/KernelSupport.hpp
index cbf1189..ece49c4 100644
--- a/include/pdal/KernelSupport.hpp
+++ b/include/pdal/KernelSupport.hpp
@@ -68,7 +68,7 @@ class PDAL_DLL KernelSupport
public:
// makes a writer, from just the filename and some other
// options (and the input stage)
- static PipelineManager* makePipeline(const std::string& filename);
+ static PipelineManagerPtr makePipeline(const std::string& filename);
private:
KernelSupport& operator=(const KernelSupport&); // not implemented
diff --git a/include/pdal/Metadata.hpp b/include/pdal/Metadata.hpp
index 6d2a052..18cab83 100644
--- a/include/pdal/Metadata.hpp
+++ b/include/pdal/Metadata.hpp
@@ -690,7 +690,7 @@ inline std::string Metadata::inferType(const std::string& val)
{
size_t pos;
- long l;
+ long l = 0;
try
{
pos = 0;
diff --git a/include/pdal/Options.hpp b/include/pdal/Options.hpp
index 8ca769a..4b0ecde 100644
--- a/include/pdal/Options.hpp
+++ b/include/pdal/Options.hpp
@@ -55,7 +55,6 @@ class Option;
namespace options
{
typedef std::multimap<std::string, Option> map_t;
-typedef std::shared_ptr<Options> OptionsPtr;
}
/*!
@@ -101,8 +100,7 @@ public:
/// @name Constructors
- /// Empty constructor
- Option() : m_options(0)
+ Option()
{}
/// Primary constructor
@@ -123,43 +121,48 @@ public:
/// Construct from an existing boost::property_tree
Option(const boost::property_tree::ptree& tree);
-/// @name Equality
- /// Equality
- bool equals(const Option& rhs) const
- {
- return (m_name == rhs.getName() &&
- m_value == rhs.getValue<std::string>() &&
- m_description == rhs.getDescription() &&
- m_options == rhs.m_options);
- }
-
/// Equality operator
bool operator==(const Option& rhs) const
{
- return equals(rhs);
+ return (m_name == rhs.getName() &&
+ m_value == rhs.getValue<std::string>() &&
+ m_description == rhs.getDescription());
}
/// Inequality operator
bool operator!=(const Option& rhs) const
{
- return (!equals(rhs));
+ return (! operator == (rhs));
}
/// @name Attribute access
- /// Overwrites the name given in the constructor
- /// @param name new value to use for the name of the Option
- inline void setName(const std::string& name)
+ /// @return the name for the Option instance
+ std::string const& getName() const
{
- m_name = name;
+ return m_name;
}
- /// @return the name for the Option instance
- inline std::string const& getName() const
+ static std::string::size_type
+ parse(const std::string& name, std::string::size_type p)
{
- return m_name;
+ std::string::size_type count = 0;
+
+ if (std::islower(name[p++]))
+ {
+ count++;
+
+ auto isname = [](char c)
+ { return (std::islower(c) || std::isdigit(c) || c == '_'); };
+ count += Utils::extract(name, p, isname);
+ }
+ return count;
}
+ // Make sure that the option name consists of lowercase characters or
+ // underscores.
+ static bool nameValid(const std::string& name, bool reportError);
+
/// Overwrites the description given in the constructor
/// @param description new value to use for the description of the Option
inline void setDescription(const std::string& description)
@@ -201,12 +204,6 @@ public:
\endverbatim
*/
- boost::optional<Options const&> getOptions() const;
-
- /// sets the Options set for this Option instance
- /// @param op Options set to use
- void setOptions(Options const& op);
-
bool empty() const;
#if defined(PDAL_COMPILER_MSVC)
@@ -231,7 +228,6 @@ private:
std::string m_name;
std::string m_value;
std::string m_description; // optional field
- options::OptionsPtr m_options; // Sub-options.
template <typename T>
void getValue(T& t) const
@@ -282,27 +278,6 @@ template<> void Option::setValue(const bool& value);
template<> void Option::setValue(const std::string& value);
#endif
-/*!
- \verbatim embed:rst
- An Options object is just a map of names to Option objects.
-
- Dumped as XML, an Options object with two Option objects looks like this:
-
- ::
-
- <?xml...>
- <Option>
- <Name>myname</name>
- <Value>17</value>
- <Description>my descr</description>
- </Option>
- <Option>
- <Name>myname2</name>
- <Value>13</value>
- <Description>my descr2</description>
- </Option>
- \endverbatim
-*/
class PDAL_DLL Options
{
public:
@@ -363,7 +338,7 @@ public:
void add(const Option& option);
// if option name not present, just returns
- void remove(const std::string& name);
+ void remove(const Option& option);
MetadataNode toMetadata() const
{
@@ -434,7 +409,7 @@ public:
// get value of an option, or use given default if option not present
template<typename T>
- T getValueOrDefault(std::string const& name, T defaultValue) const
+ T getValueOrDefault(std::string const& name, const T& defaultValue) const
{
T result;
@@ -481,84 +456,15 @@ public:
// returns true iff the option name is valid
bool hasOption(std::string const& name) const;
- // the empty options list
- // BUG: this should be a member variable, not a function, but doing so
- // causes vs2010 to fail to link
- static const Options& none();
-
void dump() const;
std::vector<Option> getOptions(std::string const& name="") const;
- template<typename T>
- boost::optional<T> getMetadataOption(std::string const& name) const
- {
- // <Reader type="writers.las">
- // <Option name="metadata">
- // <Options>
- // <Option name="dataformatid">
- // 3
- // </Option>
- // <Option name="filesourceid">
- // forward
- // </Option>
- // <Option name="year">
- // forward
- // </Option>
- // <Option name="day_of_year">
- // forward
- // </Option>
- // <Option name="vlr">
- // forward
- // <Options>
- // <Option name="user_id">
- // hobu
- // </Option>
- // <Option name="record">
- // 1234
- // </Option>
- // </Options>
- // </Option>
- // </Options>
- // </Option>
- // </Reader>
-
- Option const* doMetadata(0);
- try
- {
- doMetadata = &getOption("metadata");
- }
- catch (Option::not_found)
- {
- return boost::optional<T>();
- }
-
- boost::optional<Options const&> meta = doMetadata->getOptions();
- if (meta)
- {
- try
- {
- meta->getOption(name);
- }
- catch (Option::not_found)
- {
- return boost::optional<T>();
- }
-
- return boost::optional<T>(meta->getOption(name).getValue<T>());
- }
- return boost::optional<T>();
- }
-
private:
options::map_t m_options;
};
-
-
PDAL_DLL std::ostream& operator<<(std::ostream& ostr, const Options&);
-
} // namespace pdal
-
diff --git a/include/pdal/PDALUtils.hpp b/include/pdal/PDALUtils.hpp
index e493e11..bd92d1c 100644
--- a/include/pdal/PDALUtils.hpp
+++ b/include/pdal/PDALUtils.hpp
@@ -44,6 +44,10 @@
#include <pdal/PointView.hpp>
#include <pdal/Options.hpp>
+#ifndef _WIN32
+#include <sys/fcntl.h>
+#endif
+
namespace pdal
{
@@ -225,15 +229,8 @@ inline ptree toPTree(const Option& option)
t.put("Name", option.getName());
t.put("Value", option.getValue<std::string>());
if (option.getDescription() != "")
- {
t.put("Description", option.getDescription());
- }
- boost::optional<Options const&> options = option.getOptions();
- if (options != boost::none)
- {
- t.add_child("Options", toPTree(*options));
- }
return t;
}
diff --git a/include/pdal/PipelineManager.hpp b/include/pdal/PipelineManager.hpp
index 9d45e96..286fbf3 100644
--- a/include/pdal/PipelineManager.hpp
+++ b/include/pdal/PipelineManager.hpp
@@ -100,7 +100,7 @@ private:
PipelineManager& operator=(const PipelineManager&); // not implemented
PipelineManager(const PipelineManager&); // not implemented
};
-
+typedef std::unique_ptr<PipelineManager> PipelineManagerPtr;
} // namespace pdal
diff --git a/include/pdal/PointTable.hpp b/include/pdal/PointTable.hpp
index 41ad128..ca83771 100644
--- a/include/pdal/PointTable.hpp
+++ b/include/pdal/PointTable.hpp
@@ -34,8 +34,7 @@
#pragma once
-#include <map>
-#include <memory>
+#include <set>
#include <vector>
#include "pdal/Dimension.hpp"
@@ -62,8 +61,23 @@ public:
// Metadata operations.
MetadataNode metadata()
{ return m_metadata->getNode(); }
- SpatialReference spatialRef() const;
- void setSpatialRef(const SpatialReference& sref);
+ void clearSpatialReferences()
+ { m_spatialRefs.clear(); }
+ void addSpatialReference(const SpatialReference& srs)
+ { m_spatialRefs.insert(srs); }
+ bool spatialReferenceUnique() const
+ { return m_spatialRefs.size() == 1; }
+ SpatialReference spatialReference() const
+ {
+ return spatialReferenceUnique() ? anySpatialReference() :
+ SpatialReference();
+ }
+ SpatialReference anySpatialReference() const
+ {
+ return m_spatialRefs.size() ?
+ *m_spatialRefs.begin() : SpatialReference();
+ }
+
MetadataNode privateMetadata(const std::string& name);
private:
@@ -77,6 +91,7 @@ private:
protected:
MetadataPtr m_metadata;
+ std::set<SpatialReference> m_spatialRefs;
};
typedef BasePointTable& PointTableRef;
typedef BasePointTable const & ConstPointTableRef;
diff --git a/include/pdal/PointView.hpp b/include/pdal/PointView.hpp
index d4260e0..390a816 100644
--- a/include/pdal/PointView.hpp
+++ b/include/pdal/PointView.hpp
@@ -76,6 +76,13 @@ public:
m_id = ++lastId;
}
+ PointView(PointTableRef pointTable, const SpatialReference& srs) :
+ m_pointTable(pointTable), m_size(0), m_id(0), m_spatialReference(srs)
+ {
+ static int lastId = 0;
+ m_id = ++lastId;
+ }
+
virtual ~PointView()
{}
@@ -106,7 +113,9 @@ public:
/// Return a new point view with the same point table as this
/// point buffer.
PointViewPtr makeNew() const
- { return PointViewPtr(new PointView(m_pointTable)); }
+ {
+ return PointViewPtr( new PointView(m_pointTable, m_spatialReference));
+ }
template<class T>
T getFieldAs(Dimension::Id::Enum dim, PointId pointIndex) const;
@@ -204,8 +213,12 @@ public:
{ return m_pointTable.layout()->dimType(id);}
DimTypeList dimTypes() const
{ return m_pointTable.layout()->dimTypes(); }
-
- PointLayoutPtr layout() const { return m_pointTable.layout(); }
+ PointLayoutPtr layout() const
+ { return m_pointTable.layout(); }
+ void setSpatialReference(const SpatialReference& spatialRef)
+ { m_spatialReference = spatialRef; }
+ SpatialReference spatialReference() const
+ { return m_spatialReference; }
/// Fill a buffer with point data specified by the dimension list.
/// \param[in] dims List of dimensions/types to retrieve.
@@ -257,6 +270,7 @@ protected:
point_count_t m_size;
int m_id;
std::queue<PointId> m_temps;
+ SpatialReference m_spatialReference;
private:
template<typename T_IN, typename T_OUT>
@@ -271,9 +285,6 @@ private:
inline PointId getTemp(PointId id);
void freeTemp(PointId id)
{ m_temps.push(id); }
-
- // Awfulness to avoid exceptions in numeric cast.
- static bool m_ok;
};
struct PointViewLess
@@ -381,6 +392,7 @@ template <class T>
inline T PointView::getFieldAs(Dimension::Id::Enum dim,
PointId pointIndex) const
{
+ assert(pointIndex < m_size);
T retval;
const Dimension::Detail *dd = m_pointTable.layout()->dimDetail(dim);
double val;
diff --git a/include/pdal/SpatialReference.hpp b/include/pdal/SpatialReference.hpp
index a301a15..d890fbb 100644
--- a/include/pdal/SpatialReference.hpp
+++ b/include/pdal/SpatialReference.hpp
@@ -40,6 +40,19 @@ namespace pdal
{
class PDAL_DLL BOX3D;
+
+/// A SpatialReference defines a model of the earth that is used to describe
+/// the location of points.
+/// A SpatialReference is part of input data and is automatically loaded
+/// into PDAL by readers, or it's provided explicitly by a user through an
+/// option. All points in a point view share a common spatial reference. When
+/// a stage finishes processing point view, the point view takes on the
+/// spatial reference of that stage, if it had one.
+/// A point table tracks the spatial references of the views currently being
+/// processed by a stage. If a point table being processed by a stage has
+/// more than one spatial reference, PointTable::spatialReference() will
+/// return an empty spatial reference and PointTable::spatialReferenceUnique()
+/// will return false.
class PDAL_DLL SpatialReference
{
public:
@@ -59,11 +72,17 @@ public:
bool equals(const SpatialReference& other) const;
bool operator==(const SpatialReference& other) const;
bool operator!=(const SpatialReference& other) const;
+ bool operator<(const SpatialReference& other) const
+ { return m_wkt < other.m_wkt; }
// Returns true iff the object doesn't contain a valid srs.
// (this is a cleaner way of saying "getWKT() == "")
bool empty() const;
+
+ // Returns true of OSR can validate the SRS
+ bool valid() const;
+
/// Returns the OGC WKT describing Spatial Reference System.
/// If GDAL is linked, it uses GDAL's operations and methods to determine
/// the WKT. If GDAL is not linked, no WKT is returned.
diff --git a/include/pdal/Stage.hpp b/include/pdal/Stage.hpp
index 689486e..7d8282c 100644
--- a/include/pdal/Stage.hpp
+++ b/include/pdal/Stage.hpp
@@ -53,9 +53,6 @@ namespace pdal
{
class Iterator;
-class StageSequentialIterator;
-class StageRandomIterator;
-class StageBlockIterator;
class StageRunner;
class StageWrapper;
@@ -95,6 +92,11 @@ public:
for (const auto& o : opts.getOptions())
m_options.add(o);
}
+ void removeOptions(const Options& opts)
+ {
+ for (const auto& o : opts.getOptions())
+ m_options.remove(o);
+ }
virtual boost::property_tree::ptree serializePipeline() const = 0;
virtual LogPtr log() const
{ return m_log; }
@@ -116,15 +118,9 @@ public:
{ return Options(); }
static Dimension::IdList getDefaultDimensions()
{ return Dimension::IdList(); }
- static std::string s_getInfoLink()
- { return std::string(); }
static std::string s_getPluginVersion()
{ return std::string(); }
- virtual boost::property_tree::ptree toPTree(PointTableRef table) const
- { return boost::property_tree::ptree(); }
- virtual StageSequentialIterator* createSequentialIterator() const
- { return NULL; }
inline MetadataNode getMetadata() const
{ return m_metadata; }
@@ -158,9 +154,10 @@ private:
virtual void writerProcessOptions(const Options& /*options*/)
{}
void l_initialize(PointTableRef table);
- void l_done(PointTableRef table);
virtual QuickInfo inspect()
{ return QuickInfo(); }
+ virtual void initialize(PointTableRef /*table*/)
+ { initialize(); }
virtual void initialize()
{}
virtual void addDimensions(PointLayoutPtr /*layout*/)
@@ -181,4 +178,3 @@ private:
PDAL_DLL std::ostream& operator<<(std::ostream& ostr, const Stage&);
} // namespace pdal
-
diff --git a/include/pdal/StageWrapper.hpp b/include/pdal/StageWrapper.hpp
index 9af1b9f..62ec7ac 100644
--- a/include/pdal/StageWrapper.hpp
+++ b/include/pdal/StageWrapper.hpp
@@ -23,10 +23,7 @@ public:
static void ready(Stage& s, PointTableRef table)
{ s.ready(table); }
static void done(Stage& s, PointTableRef table)
- {
- s.l_done(table);
- s.done(table);
- }
+ { s.done(table); }
static PointViewSet run(Stage& s, PointViewPtr view)
{ return s.run(view); }
};
diff --git a/include/pdal/util/Algorithm.hpp b/include/pdal/util/Algorithm.hpp
index 9a8d336..0e92ff0 100644
--- a/include/pdal/util/Algorithm.hpp
+++ b/include/pdal/util/Algorithm.hpp
@@ -39,11 +39,36 @@
namespace pdal
{
+namespace Utils
+{
+
template<typename CONTAINER, typename VALUE>
bool contains(const CONTAINER& cont, const VALUE& val)
{
return std::find(cont.begin(), cont.end(), val) != cont.end();
}
+
+template<typename KEY, typename VALUE>
+bool contains(const std::map<KEY, VALUE>& c, const KEY& v)
+{
+ return c.find(v) != c.end();
+}
+
+
+template<typename TYPE, typename VALUE>
+void remove(std::vector<TYPE>& v, const VALUE& val)
+{
+ v.erase(std::remove(v.begin(), v.end(), val), v.end());
+}
+
+
+template<typename TYPE, typename PREDICATE>
+void remove_if(std::vector<TYPE>& v, PREDICATE p)
+{
+ v.erase(std::remove_if(v.begin(), v.end(), p), v.end());
+}
+
+} // namespace Utils
} // namespace pdal
diff --git a/include/pdal/util/Utils.hpp b/include/pdal/util/Utils.hpp
index 4fc220d..c8b7639 100644
--- a/include/pdal/util/Utils.hpp
+++ b/include/pdal/util/Utils.hpp
@@ -43,6 +43,7 @@
#include <stdexcept>
#include <cmath>
#include <fstream>
+#include <iomanip>
#include <istream>
#include <limits>
#include <cstring>
@@ -58,27 +59,6 @@ namespace pdal
namespace Utils
{
- template<typename T>
- char *as_buffer(T& data)
- { return static_cast<char*>(static_cast<void*>(&data)); }
-
- template<typename T>
- char *as_buffer(T* data)
- { return static_cast<char*>(static_cast<void*>(data)); }
-
- template <typename C, typename T>
- bool check_stream_state(std::basic_ios<C, T>& srtm)
- {
- // Test stream state bits
- if (srtm.eof())
- throw std::out_of_range("end of file encountered");
- else if (srtm.fail())
- throw std::runtime_error("non-fatal I/O error occured");
- else if (srtm.bad())
- throw std::runtime_error("fatal I/O error occured");
- return true;
- }
-
PDAL_DLL void random_seed(unsigned int seed);
PDAL_DLL double random(double minimum, double maximum);
PDAL_DLL double uniform(const double& minimum=0.0f,
@@ -232,6 +212,16 @@ namespace Utils
PDAL_DLL std::string escapeNonprinting(const std::string& s);
PDAL_DLL std::string hexDump(const char *buf, size_t count);
+ template<typename PREDICATE>
+ PDAL_DLL std::string::size_type
+ extract(const std::string& s, std::string::size_type p, PREDICATE pred)
+ {
+ std::string::size_type count = 0;
+ while (pred(s[p++]))
+ count++;
+ return count;
+ }
+
/// Split a string into substrings. Characters matching the predicate are
/// discarded.
/// \param[in] s String to split.
@@ -302,20 +292,31 @@ namespace Utils
std::string typeidName()
{ return Utils::demangle(typeid(T).name()); }
- template<typename KEY, typename VALUE>
- bool contains(const std::map<KEY, VALUE>& c, const KEY& v)
- { return c.find(v) != c.end(); }
-
- template<typename COLLECTION, typename VALUE>
- bool contains(const COLLECTION& c, const VALUE& v)
- { return (std::find(c.begin(), c.end(), v) != c.end()); }
-
struct RedirectStream
{
+ RedirectStream() : m_out(NULL), m_out2(NULL), m_buf(NULL)
+ {}
+
std::ofstream *m_out;
+ std::ostream *m_out2;
std::streambuf *m_buf;
};
+ /// Redirect a stream to some other stream.
+ /// \param[in] out Stream to redirect.
+ /// \param[in] dst Destination stream.
+ /// \return Context for stream restoration (see restore()).
+ inline RedirectStream redirect(std::ostream& out, std::ostream& dst)
+ {
+ RedirectStream redir;
+
+ redir.m_out2 = &dst;
+ redir.m_buf = out.rdbuf();
+ out.rdbuf(redir.m_out2->rdbuf());
+ return redir;
+ }
+
+
/// Redirect a stream to some file, by default /dev/null.
/// \param[in] out Stream to redirect.
/// \param[in] file Name of file where stream should be redirected.
@@ -338,7 +339,11 @@ namespace Utils
inline void restore(std::ostream& out, RedirectStream redir)
{
out.rdbuf(redir.m_buf);
- redir.m_out->close();
+ if (redir.m_out)
+ redir.m_out->close();
+ redir.m_out = NULL;
+ redir.m_out2 = NULL;
+ redir.m_buf = NULL;
}
//ABELL - This is certainly not as efficient as boost::numeric_cast, but
@@ -397,9 +402,19 @@ namespace Utils
return oss.str();
}
- // There is an overload of std::to_string() for float and double, but
- // its behavior is different from streaming and doesn't match what
- // we have been doing historically.
+ inline std::string toString(double from)
+ {
+ std::ostringstream oss;
+ oss << std::setprecision(10) << from;
+ return oss.str();
+ }
+
+ inline std::string toString(float from)
+ {
+ std::ostringstream oss;
+ oss << std::setprecision(8) << from;
+ return oss.str();
+ }
inline std::string toString(long long from)
{ return std::to_string(from); }
diff --git a/io/CMakeLists.txt b/io/CMakeLists.txt
index cbf5787..e198fd8 100644
--- a/io/CMakeLists.txt
+++ b/io/CMakeLists.txt
@@ -1,7 +1,9 @@
add_subdirectory(bpf)
add_subdirectory(derivative)
add_subdirectory(faux)
+add_subdirectory(ilvis2)
add_subdirectory(las)
+add_subdirectory(gdal)
add_subdirectory(null)
add_subdirectory(optech)
add_subdirectory(ply)
@@ -9,5 +11,6 @@ add_subdirectory(qfit)
add_subdirectory(sbet)
add_subdirectory(text)
add_subdirectory(terrasolid)
+add_subdirectory(tindex)
set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} PARENT_SCOPE)
diff --git a/io/bpf/BpfWriter.cpp b/io/bpf/BpfWriter.cpp
index 3873f80..b153939 100644
--- a/io/bpf/BpfWriter.cpp
+++ b/io/bpf/BpfWriter.cpp
@@ -131,16 +131,28 @@ void BpfWriter::processOptions(const Options& options)
}
m_bundledFiles.push_back(ulemFile);
}
+
+ // BPF coordinates are always in UTM meters, which can be quite large.
+ // Allowing the writer to proceed with the default offset of 0 can lead to
+ // unexpected quantization of the coordinates. Instead, we force use of
+ // auto offset to subtract the minimum value in XYZ, unless of course, the
+ // user chooses to override with their own offset.
+ if (!options.hasOption("offset_x"))
+ m_xXform.m_autoOffset = true;
+ if (!options.hasOption("offset_y"))
+ m_yXform.m_autoOffset = true;
+ if (!options.hasOption("offset_z"))
+ m_zXform.m_autoOffset = true;
}
-void BpfWriter::readyTable(PointTableRef table)
+void BpfWriter::prepared(PointTableRef table)
{
loadBpfDimensions(table.layout());
}
-void BpfWriter::readyFile(const std::string& filename)
+void BpfWriter::readyFile(const std::string& filename, const SpatialReference&)
{
m_stream.open(filename);
m_header.m_version = 3;
@@ -166,9 +178,28 @@ void BpfWriter::readyFile(const std::string& filename)
void BpfWriter::loadBpfDimensions(PointLayoutPtr layout)
{
+ Dimension::IdList dims;
+
+ if (m_outputDims.size())
+ {
+ for (std::string& s : m_outputDims)
+ {
+ Dimension::Id::Enum id = layout->findDim(s);
+ if (id == Dimension::Id::Unknown)
+ {
+ std::ostringstream oss;
+ oss << "Invalid dimension '" << s << "' specified for "
+ "'output_dims' option.";
+ throw pdal_error(oss.str());
+ }
+ dims.push_back(id);
+ }
+ }
+ else
+ dims = layout->dims();
+
// Verify that we have X, Y and Z and that they're the first three
// dimensions.
- Dimension::IdList dims = layout->dims();
std::sort(dims.begin(), dims.end());
if (dims.size() < 3 || dims[0] != Dimension::Id::X ||
dims[1] != Dimension::Id::Y || dims[2] != Dimension::Id::Z)
@@ -335,4 +366,3 @@ void BpfWriter::doneFile()
}
} //namespace pdal
-
diff --git a/io/bpf/BpfWriter.hpp b/io/bpf/BpfWriter.hpp
index 09d0995..70099de 100644
--- a/io/bpf/BpfWriter.hpp
+++ b/io/bpf/BpfWriter.hpp
@@ -68,8 +68,9 @@ private:
std::vector<BpfUlemFile> m_bundledFiles;
virtual void processOptions(const Options& options);
- virtual void readyTable(PointTableRef table);
- virtual void readyFile(const std::string& filename);
+ virtual void prepared(PointTableRef table);
+ virtual void readyFile(const std::string& filename,
+ const SpatialReference& srs);
virtual void writeView(const PointViewPtr data);
virtual void doneFile();
diff --git a/io/derivative/DerivativeWriter.cpp b/io/derivative/DerivativeWriter.cpp
index 03b7979..a70ae39 100644
--- a/io/derivative/DerivativeWriter.cpp
+++ b/io/derivative/DerivativeWriter.cpp
@@ -64,25 +64,21 @@ std::string DerivativeWriter::getName() const
const double c_pi = 3.14159265358979323846; /*!< PI value */
const float c_background = FLT_MIN;
-DerivativeWriter::DerivativeWriter()
- : Writer()
- , m_primitive_type(0)
-// , m_outputTypes(0)
+DerivativeWriter::DerivativeWriter() : m_primitive_type(0)
{
GDALAllRegister();
}
-void DerivativeWriter::ready(PointTableRef table)
+void DerivativeWriter::processOptions(const Options& ops)
{
- m_inSRS = table.spatialRef();
+ m_GRID_DIST_X = ops.getValueOrDefault<double>("grid_dist_x", 15.0);
+ m_GRID_DIST_Y = ops.getValueOrDefault<double>("grid_dist_y", 15.0);
}
+
void DerivativeWriter::initialize()
{
- m_GRID_DIST_X = getOptions().getValueOrDefault<double>("grid_dist_x", 15.0);
- m_GRID_DIST_Y = getOptions().getValueOrDefault<double>("grid_dist_y", 15.0);
- m_filename = getOptions().getValueOrThrow<std::string>("filename");
// maybe we eventually introduce an option to do more than slope
//std::vector<Option> types = options.getOptions("output_type");
@@ -661,7 +657,6 @@ int DerivativeWriter::determineCatchmentAreaD8(Eigen::MatrixXd* data,
//}
//(*area)(row, col) = determineCatchmentAreaD8(data, area, tNextY, tNextX, postSpacing);
}
- //ABELL - Returning something.
return 0;
}
@@ -999,7 +994,6 @@ GDALDataset* DerivativeWriter::createFloat32GTIFF(std::string filename,
return dataset;
}
}
- //ABELL
return NULL;
}
@@ -1471,6 +1465,7 @@ void DerivativeWriter::writeCurvature(Eigen::MatrixXd* tDemData,
void DerivativeWriter::write(const PointViewPtr data)
{
+ m_inSRS = data->spatialReference();
data->calculateBounds(m_bounds);
// calculate grid based off bounds and post spacing
@@ -1577,7 +1572,6 @@ void DerivativeWriter::write(const PointViewPtr data)
if (tInterpValue != c_background)
return tInterpValue;
- //ABELL - Returning something.
return 0.0f;
};
diff --git a/io/derivative/DerivativeWriter.hpp b/io/derivative/DerivativeWriter.hpp
index 198f7ed..e97acf3 100644
--- a/io/derivative/DerivativeWriter.hpp
+++ b/io/derivative/DerivativeWriter.hpp
@@ -108,8 +108,8 @@ public:
Options getDefaultOptions();
private:
+ virtual void processOptions(const Options& ops);
virtual void initialize();
- virtual void ready(PointTableRef table);
virtual void write(const PointViewPtr view);
void setBounds(const BOX2D& v)
@@ -163,7 +163,6 @@ private:
double m_GRID_DIST_Y;
unsigned int m_primitive_type;
BOX2D m_bounds;
- std::string m_filename;
SpatialReference m_inSRS;
DerivativeWriter& operator=(const DerivativeWriter&); // not implemented
diff --git a/io/faux/FauxReader.cpp b/io/faux/FauxReader.cpp
index fc5b85e..be4dc9c 100644
--- a/io/faux/FauxReader.cpp
+++ b/io/faux/FauxReader.cpp
@@ -55,12 +55,20 @@ std::string FauxReader::getName() const { return s_info.name; }
static Mode string2mode(const std::string& str)
{
- if (boost::iequals(str, "constant")) return Constant;
- if (boost::iequals(str, "random")) return Random;
- if (boost::iequals(str, "ramp")) return Ramp;
- if (boost::iequals(str, "uniform")) return Uniform;
- if (boost::iequals(str, "normal")) return Normal;
- throw pdal_error("invalid Mode option: " + str);
+ std::string lstr = Utils::tolower(str);
+ if (lstr == "constant")
+ return Constant;
+ if (lstr == "random")
+ return Random;
+ if (lstr == "ramp")
+ return Ramp;
+ if (lstr == "uniform")
+ return Uniform;
+ if (lstr == "normal")
+ return Normal;
+ std::ostringstream oss;
+ oss << s_info.name << ": Invalid 'mode' option: '" << str << "'.";
+ throw pdal_error(oss.str());
}
@@ -83,8 +91,8 @@ void FauxReader::processOptions(const Options& options)
std::string s = options.getValueOrDefault<std::string>("bounds");
std::ostringstream oss;
- oss << "Invalid 'bounds' specification for " << getName() <<
- ": '" << s << ". Format: '([xmin,xmax],[ymin,ymax],[zmin,zmax])'.";
+ oss << getName() << ": Invalid 'bounds' specification: '" << s <<
+ "'. Format: '([xmin,xmax],[ymin,ymax],[zmin,zmax])'.";
throw pdal_error(oss.str());
}
m_minX = bounds.minx;
@@ -97,6 +105,12 @@ void FauxReader::processOptions(const Options& options)
// For backward compatibility.
if (m_count == 0)
m_count = options.getValueOrThrow<point_count_t>("num_points");
+ if (m_count == 0)
+ {
+ std::ostringstream oss;
+ oss << getName() << ": Option 'count' must be non-zero.";
+ throw pdal_error(oss.str());
+ }
m_mean_x = options.getValueOrDefault<double>("mean_x",0.0);
m_mean_y = options.getValueOrDefault<double>("mean_y",0.0);
@@ -107,7 +121,12 @@ void FauxReader::processOptions(const Options& options)
m_mode = string2mode(options.getValueOrThrow<std::string>("mode"));
m_numReturns = options.getValueOrDefault("number_of_returns", 0);
if (m_numReturns > 10)
- throw pdal_error("faux: number_of_returns option must be 10 or less.");
+ {
+ std::ostringstream oss;
+ oss << getName() << ": Option 'number_of_returns' must be in the range "
+ "[0,10].";
+ throw pdal_error(oss.str());
+ }
}
Options FauxReader::getDefaultOptions()
@@ -145,9 +164,13 @@ Dimension::IdList FauxReader::getDefaultDimensions()
point_count_t FauxReader::read(PointViewPtr view, point_count_t count)
{
const double numDeltas = (double)count - 1.0;
- const double delX = (m_maxX - m_minX) / numDeltas;
- const double delY = (m_maxY - m_minY) / numDeltas;
- const double delZ = (m_maxZ - m_minZ) / numDeltas;
+ double delX(0), delY(0), delZ(0);
+ if (numDeltas)
+ {
+ delX = (m_maxX - m_minX) / numDeltas;
+ delY = (m_maxY - m_minY) / numDeltas;
+ delZ = (m_maxZ - m_minZ) / numDeltas;
+ }
log()->get(LogLevel::Debug5) << "Reading a point view of " <<
count << " points." << std::endl;
diff --git a/io/gdal/CMakeLists.txt b/io/gdal/CMakeLists.txt
new file mode 100644
index 0000000..546f0c0
--- /dev/null
+++ b/io/gdal/CMakeLists.txt
@@ -0,0 +1,10 @@
+set(src
+ GDALReader.cpp
+)
+
+set(inc
+ GDALReader.hpp
+)
+
+PDAL_ADD_DRIVER(reader gdal "${src}" "${inc}" objs)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objs} PARENT_SCOPE)
diff --git a/io/gdal/GDALReader.cpp b/io/gdal/GDALReader.cpp
new file mode 100644
index 0000000..2f3ff40
--- /dev/null
+++ b/io/gdal/GDALReader.cpp
@@ -0,0 +1,205 @@
+/******************************************************************************
+* Copyright (c) 2015, Howard Butler <howard at hobu.co>
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in
+* the documentation and/or other materials provided
+* with the distribution.
+* * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+* names of its contributors may be used to endorse or promote
+* products derived from this software without specific prior
+* written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "GDALReader.hpp"
+
+#include <sstream>
+#include <algorithm>
+
+
+#include <pdal/PointView.hpp>
+#include <pdal/GlobalEnvironment.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+ "readers.gdal",
+ "Read GDAL rasters as point clouds.",
+ "http://pdal.io/stages/reader.gdal.html");
+
+
+CREATE_STATIC_PLUGIN(1, 0, GDALReader, Reader, s_info);
+
+
+std::string GDALReader::getName() const
+{
+ return s_info.name;
+}
+
+
+GDALReader::GDALReader()
+ : m_index(0)
+{}
+
+
+void GDALReader::initialize()
+{
+ GlobalEnvironment::get().initializeGDAL(log());
+ if (!m_raster)
+ m_raster = std::unique_ptr<gdal::Raster>(new gdal::Raster(m_filename));
+
+ m_raster->open();
+ setSpatialReference(m_raster->getSpatialRef());
+ m_count = m_raster->m_raster_x_size * m_raster->m_raster_y_size;
+
+}
+
+void GDALReader::processOptions(const Options& options)
+{
+
+}
+
+QuickInfo GDALReader::inspect()
+{
+ QuickInfo qi;
+ std::unique_ptr<PointLayout> layout(new PointLayout());
+
+ addDimensions(layout.get());
+ initialize();
+
+ m_raster = std::unique_ptr<gdal::Raster>(new gdal::Raster(m_filename));
+ m_raster->open();
+
+ qi.m_pointCount = m_raster->m_raster_x_size * m_raster->m_raster_y_size;
+// qi.m_bounds = m_lasHeader.getBounds();
+ qi.m_srs = m_raster->getSpatialRef();
+ qi.m_valid = true;
+
+
+ return qi;
+}
+
+
+void GDALReader::addDimensions(PointLayoutPtr layout)
+{
+ int nBands = m_raster->m_band_count;
+
+ layout->registerDim(pdal::Dimension::Id::X);
+ layout->registerDim(pdal::Dimension::Id::Y);
+ for (int i=0; i < nBands; ++i)
+ {
+ std::ostringstream oss;
+ oss << "band-" << i+1;
+ layout->registerOrAssignDim(oss.str(), Dimension::Type::Double);
+ }
+}
+
+
+void GDALReader::ready(PointTableRef table)
+{
+ m_index = 0;
+
+
+}
+
+template<typename T>
+double convert(uint8_t*p)
+{
+ double output;
+
+ T t;
+ std::copy(p, p + sizeof(t), (uint8_t*)&t);
+ output = static_cast<double>(t);
+ return output;
+}
+
+point_count_t GDALReader::read(PointViewPtr view, point_count_t num)
+{
+ point_count_t count = std::min(num, m_count - m_index);
+ PointId nextId = view->size();
+
+ std::array<double, 2> coords;
+ for (int row = 0; row < m_raster->m_raster_y_size; ++row)
+ {
+ for(int col = 0; col < m_raster->m_raster_x_size; ++col)
+ {
+ m_raster->pixelToCoord(row, col, coords);
+ view->setField(Dimension::Id::X, nextId, coords[0]);
+ view->setField(Dimension::Id::Y, nextId, coords[1]);
+ nextId++;
+ }
+ }
+
+ std::vector<uint8_t> band;
+ std::vector<pdal::Dimension::Type::Enum> band_types = m_raster->getPDALDimensionTypes();
+ for (int b = 0; b < m_raster->m_band_count; ++b)
+ {
+ // Bands count from 1
+ // read up the band's bytes into an array,
+ // convert them from GDAL native types into
+ // doubles, and stuff them into the view
+ m_raster->readBand(band, b+1);
+ std::stringstream oss;
+ oss << "band-" << b+1;
+ log()->get(LogLevel::Info) << "Read band '" << oss.str() <<"'" << std::endl;
+ pdal::Dimension::Id::Enum d = view->layout()->findProprietaryDim(oss.str());
+ size_t dimSize = pdal::Dimension::size(band_types[b]); // count from 0
+
+ uint8_t* p = band.data();
+ for (point_count_t i = 0; i < count; ++i)
+ {
+
+ if (band_types[b] == pdal::Dimension::Type::Float ||
+ band_types[b] == pdal::Dimension::Type::Double )
+ {
+ if (dimSize == 4)
+ view->setField(d, i, convert<float>(p));
+ else
+ view->setField(d, i, convert<double>(p));
+ }
+ else
+ {
+ if (dimSize == 1)
+ {
+ view->setField(d, i, convert<uint8_t>(p));
+ }
+ else if (dimSize == 2)
+ {
+ view->setField(d, i, convert<uint16_t>(p));
+ }
+ else if (dimSize == 4)
+ {
+ view->setField(d, i, convert<uint32_t>(p));
+ }
+ }
+ p = p + dimSize;
+ }
+ }
+
+ return view->size();
+}
+
+
+}
diff --git a/filters/ferry/FerryFilter.hpp b/io/gdal/GDALReader.hpp
similarity index 74%
copy from filters/ferry/FerryFilter.hpp
copy to io/gdal/GDALReader.hpp
index 6305728..5221f85 100644
--- a/filters/ferry/FerryFilter.hpp
+++ b/io/gdal/GDALReader.hpp
@@ -1,5 +1,5 @@
/******************************************************************************
-* Copyright (c) 2014, Howard Butler <hobu.inc at gmail.com>
+* Copyright (c) 2015, Howard Butler <howard at hobu.co>
*
* All rights reserved.
*
@@ -34,40 +34,49 @@
#pragma once
-#include <pdal/Filter.hpp>
-
-#include <map>
#include <string>
-extern "C" int32_t FerryFilter_ExitFunc();
-extern "C" PF_ExitFunc FerryFilter_InitPlugin();
+
+#include <pdal/Dimension.hpp>
+#include <pdal/Reader.hpp>
+#include <pdal/StageFactory.hpp>
+
+#include <pdal/GDALUtils.hpp>
+
+extern "C" int32_t GDALReader_ExitFunc();
+extern "C" PF_ExitFunc GDALReader_InitPlugin();
+
namespace pdal
{
-class PDAL_DLL FerryFilter : public Filter
+
+typedef std::map<std::string, Dimension::Id::Enum> DimensionMap;
+
+
+
+class PDAL_DLL GDALReader : public Reader
{
public:
- FerryFilter()
- {}
-
- static void * create();
+ static void *create();
static int32_t destroy(void *);
std::string getName() const;
- Options getDefaultOptions();
+ GDALReader();
+
+ static Dimension::IdList getDefaultDimensions();
private:
- virtual void processOptions(const Options&);
+ virtual void initialize();
virtual void addDimensions(PointLayoutPtr layout);
+ virtual void processOptions(const Options&);
virtual void ready(PointTableRef table);
- virtual void filter(PointView& view);
+ virtual point_count_t read(PointViewPtr view, point_count_t num);
+ virtual QuickInfo inspect();
- FerryFilter& operator=(const FerryFilter&); // not implemented
- FerryFilter(const FerryFilter&); // not implemented
+ std::unique_ptr<gdal::Raster> m_raster;
+ point_count_t m_index;
- std::map<std::string, std::string> m_name_map;
- std::map< Dimension::Id::Enum , Dimension::Id::Enum > m_dimensions_map;
};
+}
-} // namespace pdal
diff --git a/io/ilvis2/CMakeLists.txt b/io/ilvis2/CMakeLists.txt
new file mode 100644
index 0000000..0fe903c
--- /dev/null
+++ b/io/ilvis2/CMakeLists.txt
@@ -0,0 +1,21 @@
+#
+# ILVIS2 driver CMake configuration
+#
+
+set(objs "")
+
+#
+# ILVIS2 Reader
+#
+set(srcs
+ Ilvis2Reader.cpp
+)
+
+set(incs
+ Ilvis2Reader.hpp
+)
+
+PDAL_ADD_DRIVER(reader ilvis2 "${srcs}" "${incs}" reader_objs)
+set(objs ${objs} ${reader_objs})
+
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objs} PARENT_SCOPE)
diff --git a/io/ilvis2/Ilvis2Reader.cpp b/io/ilvis2/Ilvis2Reader.cpp
new file mode 100644
index 0000000..c4f1b3f
--- /dev/null
+++ b/io/ilvis2/Ilvis2Reader.cpp
@@ -0,0 +1,225 @@
+/******************************************************************************
+* Copyright (c) 2015, Howard Butler (howard at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in
+* the documentation and/or other materials provided
+* with the distribution.
+* * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+* names of its contributors may be used to endorse or promote
+* products derived from this software without specific prior
+* written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "Ilvis2Reader.hpp"
+#include <algorithm>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+ "readers.ilvis2",
+ "ILVIS2 Reader",
+ "http://pdal.io/stages/readers.ilvis2.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, Ilvis2Reader, Reader, s_info)
+
+std::string Ilvis2Reader::getName() const { return s_info.name; }
+
+Options Ilvis2Reader::getDefaultOptions()
+{
+ Options options;
+ Option mapping("mapping", "LOW");
+ options.add(mapping);
+ return options;
+}
+
+void Ilvis2Reader::processOptions(const Options& options)
+{
+ m_convert = options.getValueOrDefault<std::string>("mapping", "CENTROID");
+}
+
+void Ilvis2Reader::addDimensions(PointLayoutPtr layout)
+{
+ using namespace pdal::Dimension::Type;
+ layout->registerOrAssignDim("LVIS_LFID", Unsigned64);
+ layout->registerOrAssignDim("SHOTNUMBER", Unsigned64);
+ layout->registerDim(pdal::Dimension::Id::GpsTime);
+ layout->registerOrAssignDim("LONGITUDE_CENTROID", Double);
+ layout->registerOrAssignDim("LATITUDE_CENTROID", Double);
+ layout->registerOrAssignDim("ELEVATION_CENTROID", Double);
+ layout->registerOrAssignDim("LONGITUDE_LOW", Double);
+ layout->registerOrAssignDim("LATITUDE_LOW", Double);
+ layout->registerOrAssignDim("ELEVATION_LOW", Double);
+ layout->registerOrAssignDim("LONGITUDE_HIGH", Double);
+ layout->registerOrAssignDim("LATITUDE_HIGH", Double);
+ layout->registerOrAssignDim("ELEVATION_HIGH", Double);
+ layout->registerDim(pdal::Dimension::Id::X);
+ layout->registerDim(pdal::Dimension::Id::Y);
+ layout->registerDim(pdal::Dimension::Id::Z);
+}
+
+pdal::Dimension::IdList Ilvis2Reader::getDefaultDimensions()
+{
+ using namespace pdal::Dimension;
+ Dimension::IdList ids;
+
+ ids.push_back(Id::GpsTime);
+ ids.push_back(Id::Y);
+ ids.push_back(Id::X);
+ ids.push_back(Id::Z);
+ return ids;
+}
+
+void Ilvis2Reader::ready(PointTableRef)
+{
+ m_stream.reset(new ILeStream(m_filename));
+
+ SpatialReference ref("EPSG:4385");
+ setSpatialReference(ref);
+}
+
+template <typename T>
+T convert(const StringList& s, const std::string& name, size_t fieldno)
+{
+ T output;
+ bool bConverted = Utils::fromString(s[fieldno], output);
+ if (!bConverted)
+ {
+ std::stringstream oss;
+ oss << "Unable to convert " << name << ", " << s[fieldno] << ", to double";
+ throw pdal_error(oss.str());
+ }
+
+ return output;
+}
+
+point_count_t Ilvis2Reader::read(PointViewPtr view, point_count_t count)
+{
+ PointLayoutPtr layout = view->layout();
+ PointId nextId = view->size();
+ PointId idx = m_index;
+ point_count_t numRead = 0;
+
+ // do any skipping to get to our m_index position;
+ m_stream.reset(new ILeStream(m_filename));
+
+ size_t HEADERSIZE(2);
+ size_t skip_lines(std::max(HEADERSIZE, (size_t)m_index));
+ size_t line_no(1);
+ for (std::string line; std::getline(*m_stream->stream(), line); line_no++)
+ {
+ if (line_no <= skip_lines)
+ {
+ continue;
+ }
+
+ StringList s = Utils::split2(line, ' ');
+// # LVIS_LFID SHOTNUMBER TIME LONGITUDE_CENTROID LATITUDE_CENTROID ELEVATION_CENTROID LONGITUDE_LOW LATITUDE_LOW ELEVATION_LOW LONGITUDE_HIGH LATITUDE_HIGH ELEVATION_HIGH
+ unsigned long u64(0);
+ if (s.size() != 12)
+ {
+ std::stringstream oss;
+ oss << "Unable to split proper number of fields. Expected 12, got " << s.size();
+ throw pdal_error(oss.str());
+ }
+
+ std::string name("LVIS_LFID");
+ view->setField(layout->findProprietaryDim(name), nextId, convert<unsigned int>(s, name, 0));
+
+ name = "SHOTNUMBER";
+ view->setField(layout->findProprietaryDim(name), nextId, convert<unsigned int>(s, name, 1));
+
+ view->setField(pdal::Dimension::Id::GpsTime, nextId, convert<double>(s, name, 2));
+
+ name = "LONGITUDE_CENTROID";
+ view->setField(layout->findProprietaryDim(name), nextId, convert<double>(s, name, 3) - 180.0);
+
+ name = "LATITUDE_CENTROID";
+ view->setField(layout->findProprietaryDim(name), nextId, convert<double>(s, name, 4));
+
+ name = "ELEVATION_CENTROID";
+ view->setField(layout->findProprietaryDim(name), nextId, convert<double>(s, name, 5));
+
+ name = "LONGITUDE_LOW";
+ view->setField(layout->findProprietaryDim(name), nextId, convert<double>(s, name, 6) - 180.0);
+
+ name = "LATITUDE_LOW";
+ view->setField(layout->findProprietaryDim(name), nextId, convert<double>(s, name, 7));
+
+ name = "ELEVATION_LOW";
+ view->setField(layout->findProprietaryDim(name), nextId, convert<double>(s, name, 8));
+
+ name = "LONGITUDE_HIGH";
+ view->setField(layout->findProprietaryDim(name), nextId, convert<double>(s, name, 9) - 180.0);
+
+ name = "LATITUDE_HIGH";
+ view->setField(layout->findProprietaryDim(name), nextId, convert<double>(s, name, 10));
+
+ name = "ELEVATION_HIGH";
+ view->setField(layout->findProprietaryDim(name), nextId, convert<double>(s, name, 11));
+
+ double x, y, z;
+ pdal::Dimension::Id::Enum xd, yd, zd;
+ if (Utils::iequals(m_convert, "HIGH"))
+ {
+ xd = layout->findProprietaryDim("LONGITUDE_HIGH");
+ yd = layout->findProprietaryDim("LATITUDE_HIGH");
+ zd = layout->findProprietaryDim("ELEVATION_HIGH");
+
+ } else if (Utils::iequals(m_convert, "LOW"))
+ {
+ xd = layout->findProprietaryDim("LONGITUDE_LOW");
+ yd = layout->findProprietaryDim("LATITUDE_LOW");
+ zd = layout->findProprietaryDim("ELEVATION_LOW");
+
+ } else
+ {
+ xd = layout->findProprietaryDim("LONGITUDE_CENTROID");
+ yd = layout->findProprietaryDim("LATITUDE_CENTROID");
+ zd = layout->findProprietaryDim("ELEVATION_CENTROID");
+
+ }
+
+ x = view->getFieldAs<double>(xd, nextId);
+ y = view->getFieldAs<double>(yd, nextId);
+ z = view->getFieldAs<double>(zd, nextId);
+
+ view->setField(pdal::Dimension::Id::X, nextId, x);
+ view->setField(pdal::Dimension::Id::Y, nextId, y);
+ view->setField(pdal::Dimension::Id::Z, nextId, z);
+ nextId++;
+ if (m_cb)
+ m_cb(*view, nextId);
+ }
+ m_index = nextId;
+ numRead = nextId;
+ return numRead;
+}
+
+
+
+
+
+} // namespace pdal
diff --git a/filters/ferry/FerryFilter.hpp b/io/ilvis2/Ilvis2Reader.hpp
similarity index 76%
copy from filters/ferry/FerryFilter.hpp
copy to io/ilvis2/Ilvis2Reader.hpp
index 6305728..fb1c274 100644
--- a/filters/ferry/FerryFilter.hpp
+++ b/io/ilvis2/Ilvis2Reader.hpp
@@ -1,5 +1,5 @@
/******************************************************************************
-* Copyright (c) 2014, Howard Butler <hobu.inc at gmail.com>
+* Copyright (c) 2015, Howard Butler (howard at hobu.co)
*
* All rights reserved.
*
@@ -34,40 +34,41 @@
#pragma once
-#include <pdal/Filter.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/Reader.hpp>
+#include <pdal/util/IStream.hpp>
-#include <map>
-#include <string>
-extern "C" int32_t FerryFilter_ExitFunc();
-extern "C" PF_ExitFunc FerryFilter_InitPlugin();
+extern "C" int32_t Ilvis2Reader_ExitFunc();
+extern "C" PF_ExitFunc Ilvis2Reader_InitPlugin();
namespace pdal
{
-
-class PDAL_DLL FerryFilter : public Filter
+class PDAL_DLL Ilvis2Reader : public pdal::Reader
{
public:
- FerryFilter()
- {}
+ Ilvis2Reader() : Reader(), m_index(0), m_convert("CENTROID")
+ {}
static void * create();
static int32_t destroy(void *);
std::string getName() const;
Options getDefaultOptions();
+ static Dimension::IdList getDefaultDimensions();
+
private:
- virtual void processOptions(const Options&);
+ std::unique_ptr<ILeStream> m_stream;
+ point_count_t m_index;
+ std::string m_convert;
+
virtual void addDimensions(PointLayoutPtr layout);
+ virtual void processOptions(const Options& options);
virtual void ready(PointTableRef table);
- virtual void filter(PointView& view);
+ virtual point_count_t read(PointViewPtr view, point_count_t count);
- FerryFilter& operator=(const FerryFilter&); // not implemented
- FerryFilter(const FerryFilter&); // not implemented
-
- std::map<std::string, std::string> m_name_map;
- std::map< Dimension::Id::Enum , Dimension::Id::Enum > m_dimensions_map;
};
+
} // namespace pdal
diff --git a/io/las/LasError.hpp b/io/las/LasError.hpp
index b7a6dbb..f45ba8c 100644
--- a/io/las/LasError.hpp
+++ b/io/las/LasError.hpp
@@ -35,7 +35,7 @@
#include <vector>
-#include <pdal/util/Utils.hpp>
+#include <pdal/util/Algorithm.hpp>
#include <pdal/Log.hpp>
namespace pdal
@@ -59,8 +59,9 @@ public:
if (!Utils::contains(warned, returnNum))
{
warned.push_back(returnNum);
- m_log->get(LogLevel::Warning) << m_filename << ": Found invalid value of '" <<
- returnNum << "' for point's return number.\n";
+ m_log->get(LogLevel::Warning) << m_filename <<
+ ": Found invalid value of '" << returnNum <<
+ "' for point's return number.\n";
}
}
diff --git a/io/las/LasHeader.cpp b/io/las/LasHeader.cpp
index 243c4e5..b136abe 100644
--- a/io/las/LasHeader.cpp
+++ b/io/las/LasHeader.cpp
@@ -90,7 +90,7 @@ void LasHeader::setSummary(const SummaryData& summary)
{
m_pointCount = summary.getTotalNumPoints();
for (size_t num = 0; num < RETURN_COUNT; ++num)
- m_pointCountByReturn[num] = summary.getReturnCount(num);
+ m_pointCountByReturn[num] = (int)summary.getReturnCount(num);
m_bounds = summary.getBounds();
}
@@ -197,6 +197,33 @@ void LasHeader::put(OLeStream& out, boost::uuids::uuid uuid)
}
+Dimension::IdList LasHeader::usedDims() const
+{
+ using namespace Dimension;
+
+ Dimension::Id::Enum dims[] = { Id::ReturnNumber, Id::NumberOfReturns,
+ Id::X, Id::Y, Id::Z, Id::Intensity, Id::ScanChannel,
+ Id::ScanDirectionFlag, Id::EdgeOfFlightLine, Id::Classification,
+ Id::UserData, Id::ScanAngleRank, Id::PointSourceId };
+
+ // This mess is because MSVC doesn't support initializer lists.
+ Dimension::IdList ids;
+ std::copy(std::begin(dims), std::end(dims), std::back_inserter(ids));
+
+ if (hasTime())
+ ids.push_back(Id::GpsTime);
+ if (hasColor())
+ {
+ ids.push_back(Id::Red);
+ ids.push_back(Id::Green);
+ ids.push_back(Id::Blue);
+ }
+ if (hasInfrared())
+ ids.push_back(Id::Infrared);
+
+ return ids;
+}
+
ILeStream& operator>>(ILeStream& in, LasHeader& h)
{
uint8_t versionMajor;
diff --git a/io/las/LasHeader.hpp b/io/las/LasHeader.hpp
index c8513fb..88f1def 100644
--- a/io/las/LasHeader.hpp
+++ b/io/las/LasHeader.hpp
@@ -41,6 +41,7 @@
#include <boost/uuid/uuid.hpp>
#include <boost/property_tree/ptree.hpp>
+#include <pdal/Dimension.hpp>
#include <pdal/util/Bounds.hpp>
#include <pdal/pdal_config.hpp>
#include <pdal/gitsha.h>
@@ -337,6 +338,12 @@ public:
return f > 5;
}
+ bool useWkt() const
+ { return (bool)((m_globalEncoding >> 4) & 1); }
+
+ bool incompatibleSrs() const
+ { return !useWkt() && has14Format(); }
+
/// Returns true iff the file is compressed (laszip),
/// as determined by the high bit in the point type
bool compressed() const
@@ -366,6 +373,7 @@ public:
void setSummary(const SummaryData& summary);
bool valid() const;
+ Dimension::IdList usedDims() const;
friend ILeStream& operator>>(ILeStream&, LasHeader& h);
friend OLeStream& operator<<(OLeStream&, const LasHeader& h);
diff --git a/io/las/LasReader.cpp b/io/las/LasReader.cpp
index 4967073..47ceaac 100644
--- a/io/las/LasReader.cpp
+++ b/io/las/LasReader.cpp
@@ -70,6 +70,26 @@ void LasReader::processOptions(const Options& options)
StringList extraDims = options.getValueOrDefault<StringList>("extra_dims");
m_extraDims = LasUtils::parse(extraDims);
+ m_compression = options.getValueOrDefault<std::string>("compression",
+ "LASZIP");
+ std::string compression = Utils::toupper(m_compression);
+#ifndef PDAL_HAVE_LAZPERF
+ if (compression == "LAZPERF")
+ throw pdal_error("Can't decompress with LAZperf. PDAL not built "
+ "with LAZperf.");
+#endif
+ if (compression != "LAZPERF" && compression != "LASZIP")
+ {
+ std::ostringstream oss;
+
+ oss << "Invalid value for option for compression: '" <<
+ m_compression << "'. Value values are 'lazperf' and 'laszip'.";
+ throw pdal_error(oss.str());
+ }
+
+ // Set case-corrected value.
+ m_compression = compression;
+
m_error.setFilename(m_filename);
}
@@ -89,8 +109,9 @@ QuickInfo LasReader::inspect()
QuickInfo qi;
std::unique_ptr<PointLayout> layout(new PointLayout());
+ PointTable table;
+ initialize(table);
addDimensions(layout.get());
- initialize();
Dimension::IdList dims = layout->dims();
for (auto di = dims.begin(); di != dims.end(); ++di)
@@ -98,17 +119,16 @@ QuickInfo LasReader::inspect()
if (!Utils::numericCast(m_lasHeader.pointCount(), qi.m_pointCount))
qi.m_pointCount = std::numeric_limits<point_count_t>::max();
qi.m_bounds = m_lasHeader.getBounds();
- qi.m_srs = getSrsFromVlrs();
+ qi.m_srs = getSpatialReference();
qi.m_valid = true;
- PointTable table;
done(table);
return qi;
}
-void LasReader::initialize()
+void LasReader::initializeLocal(PointTableRef table, MetadataNode& m)
{
if (m_initialized)
return;
@@ -148,45 +168,61 @@ void LasReader::initialize()
readExtraBytesVlr();
}
fixupVlrs();
+ setSrsFromVlrs(m);
+ MetadataNode forward = table.privateMetadata("lasforward");
+ extractHeaderMetadata(forward, m);
+ extractVlrMetadata(forward, m);
+
m_initialized = true;
}
-void LasReader::ready(PointTableRef table, MetadataNode& m)
+void LasReader::ready(PointTableRef table)
{
m_index = 0;
-
- setSrsFromVlrs(m);
- MetadataNode forward = table.privateMetadata("lasforward");
- extractHeaderMetadata(forward, m);
- extractVlrMetadata(forward, m);
-
if (m_lasHeader.compressed())
{
#ifdef PDAL_HAVE_LASZIP
- VariableLengthRecord *vlr = findVlr(LASZIP_USER_ID, LASZIP_RECORD_ID);
- m_zipPoint.reset(new ZipPoint(vlr));
-
- if (!m_unzipper)
+ if (m_compression == "LASZIP")
{
- m_unzipper.reset(new LASunzipper());
+ VariableLengthRecord *vlr = findVlr(LASZIP_USER_ID,
+ LASZIP_RECORD_ID);
+ m_zipPoint.reset(new ZipPoint(vlr));
- m_istream->seekg(m_lasHeader.pointOffset(), std::ios::beg);
-
- // Once we open the zipper, don't touch the stream until the
- // zipper is closed or bad things happen.
- if (!m_unzipper->open(*m_istream, m_zipPoint->GetZipper()))
+ if (!m_unzipper)
{
- std::ostringstream oss;
- const char* err = m_unzipper->get_error();
- if (err == NULL)
- err = "(unknown error)";
- oss << "Failed to open LASzip stream: " << std::string(err);
- throw pdal_error(oss.str());
+ m_unzipper.reset(new LASunzipper());
+
+ m_istream->seekg(m_lasHeader.pointOffset(), std::ios::beg);
+
+ // Once we open the zipper, don't touch the stream until the
+ // zipper is closed or bad things happen.
+ if (!m_unzipper->open(*m_istream, m_zipPoint->GetZipper()))
+ {
+ std::ostringstream oss;
+ const char* err = m_unzipper->get_error();
+ if (err == NULL)
+ err = "(unknown error)";
+ oss << "Failed to open LASzip stream: " << std::string(err);
+ throw pdal_error(oss.str());
+ }
}
}
-#else
- throw pdal_error("LASzip is not enabled. Can't read LAZ data.");
+#endif
+
+#ifdef PDAL_HAVE_LAZPERF
+ if (m_compression == "LAZPERF")
+ {
+ VariableLengthRecord *vlr = findVlr(LASZIP_USER_ID,
+ LASZIP_RECORD_ID);
+ m_decompressor.reset(new LazPerfVlrDecompressor(*m_istream,
+ vlr->data(), m_lasHeader.pointOffset()));
+ }
+#endif
+
+#if !defined(PDAL_HAVE_LAZPERF) && !defined(PDAL_HAVE_LASZIP)
+ throw pdal_error("Can't read compressed file without LASzip or "
+ "LAZperf decompression library.");
#endif
}
m_error.setLog(log());
@@ -399,16 +435,31 @@ void LasReader::setSrsFromVlrs(MetadataNode& m)
SpatialReference srs = getSpatialReference();
if (srs.getWKT(pdal::SpatialReference::eCompoundOK).empty())
- setSpatialReference(m, getSrsFromVlrs());
+ srs = getSrsFromVlrs();
+ setSpatialReference(m, srs);
}
SpatialReference LasReader::getSrsFromVlrs()
{
- SpatialReference srs = getSrsFromWktVlr();
- if (srs.empty())
- srs = getSrsFromGeotiffVlr();
- return srs;
+ bool useWkt = false;
+
+ if (m_lasHeader.incompatibleSrs())
+ {
+ log()->get(LogLevel::Error) << getName() <<
+ ": Invalid SRS specification. GeoTiff not "
+ "allowed with point formats 6 - 10." << std::endl;
+ }
+ else if (findVlr(TRANSFORM_USER_ID, WKT_RECORD_ID) &&
+ findVlr(TRANSFORM_USER_ID, GEOTIFF_DIRECTORY_RECORD_ID))
+ {
+ log()->get(LogLevel::Error) << getName() << ": File contains both "
+ "WKT and GeoTiff VLRs which is disallowed." << std::endl;
+ }
+ else
+ useWkt = (m_lasHeader.versionMinor() >= 4);
+
+ return useWkt ? getSrsFromWktVlr() : getSrsFromGeotiffVlr();
}
@@ -444,6 +495,7 @@ SpatialReference LasReader::getSrsFromWktVlr()
if (*c == 0)
len--;
std::string wkt(vlr->data(), len);
+
srs.setWKT(wkt);
return srs;
}
@@ -480,6 +532,12 @@ SpatialReference LasReader::getSrsFromGeotiffVlr()
if (wkt.size())
srs.setFromUserInput(geotiff.getWkt(false, false));
+ log()->get(LogLevel::Debug5) << "GeoTIFF keys: " << geotiff.getText() << std::endl;
+#else
+ if (findVlr(TRANSFORM_USER_ID, GEOTIFF_DIRECTORY_RECORD_ID))
+ log()->get(LogLevel::Error) << getName() <<
+ ": Can't decode LAS GeoTiff VLR to SRS - PDAL not built "
+ "with GeoTiff." << std::endl;
#endif
return srs;
}
@@ -565,26 +623,44 @@ point_count_t LasReader::read(PointViewPtr view, point_count_t count)
count = std::min(count, getNumPoints() - m_index);
PointId i = 0;
- if (m_zipPoint)
+ if (m_lasHeader.compressed())
{
#ifdef PDAL_HAVE_LASZIP
- for (i = 0; i < count; i++)
+ if (m_compression == "LASZIP")
{
- if (!m_unzipper->read(m_zipPoint->m_lz_point))
+ for (i = 0; i < count; i++)
{
- std::string error = "Error reading compressed point data: ";
- const char* err = m_unzipper->get_error();
- if (!err)
- err = "(unknown error)";
- error += err;
- throw pdal_error(error);
+ if (!m_unzipper->read(m_zipPoint->m_lz_point))
+ {
+ std::string error = "Error reading compressed point data: ";
+ const char* err = m_unzipper->get_error();
+ if (!err)
+ err = "(unknown error)";
+ error += err;
+ throw pdal_error(error);
+ }
+ loadPoint(*view.get(),
+ (char *)m_zipPoint->m_lz_point_data.data(), pointByteCount);
}
- loadPoint(*view.get(), (char *)m_zipPoint->m_lz_point_data.data(),
- pointByteCount);
}
-#else
- throw pdal_error("LASzip is not enabled for this "
- "LasReader::processBuffer");
+#endif
+
+#ifdef PDAL_HAVE_LAZPERF
+ if (m_compression == "LAZPERF")
+ {
+ assert(pointByteCount == m_decompressor->pointSize());
+
+ std::vector<char> ptBuf(m_decompressor->pointSize());
+ for (i = 0; i < count; i++)
+ {
+ m_decompressor->decompress(ptBuf.data());
+ loadPoint(*view.get(), ptBuf.data(), pointByteCount);
+ }
+ }
+#endif
+#if !defined(PDAL_HAVE_LAZPERF) && !defined(PDAL_HAVE_LASZIP)
+ throw pdal_error("Can't read compressed file without LASzip or "
+ "LAZperf decompression library.");
#endif
}
else
diff --git a/io/las/LasReader.hpp b/io/las/LasReader.hpp
index 2fd511b..857ba7d 100644
--- a/io/las/LasReader.hpp
+++ b/io/las/LasReader.hpp
@@ -35,6 +35,7 @@
#pragma once
#include <pdal/pdal_export.hpp>
+#include <pdal/Compression.hpp>
#include <pdal/Reader.hpp>
#include "LasError.hpp"
@@ -102,13 +103,17 @@ private:
LasHeader m_lasHeader;
std::unique_ptr<ZipPoint> m_zipPoint;
std::unique_ptr<LASunzipper> m_unzipper;
+ std::unique_ptr<LazPerfVlrDecompressor> m_decompressor;
point_count_t m_index;
std::istream* m_istream;
VlrList m_vlrs;
std::vector<ExtraDim> m_extraDims;
+ std::string m_compression;
virtual void processOptions(const Options& options);
- virtual void initialize();
+ virtual void initialize(PointTableRef table)
+ { initializeLocal(table, m_metadata); }
+ virtual void initializeLocal(PointTableRef table, MetadataNode& m);
virtual void addDimensions(PointLayoutPtr layout);
void fixupVlrs();
VariableLengthRecord *findVlr(const std::string& userId, uint16_t recordId);
@@ -120,9 +125,7 @@ private:
void extractHeaderMetadata(MetadataNode& forward, MetadataNode& m);
void extractVlrMetadata(MetadataNode& forward, MetadataNode& m);
virtual QuickInfo inspect();
- virtual void ready(PointTableRef table)
- { ready(table, m_metadata); }
- virtual void ready(PointTableRef table, MetadataNode& m);
+ virtual void ready(PointTableRef table);
virtual point_count_t read(PointViewPtr view, point_count_t count);
virtual void done(PointTableRef table);
virtual bool eof()
@@ -138,6 +141,7 @@ private:
LasReader& operator=(const LasReader&); // not implemented
LasReader(const LasReader&); // not implemented
bool m_initialized;
+ bool m_skipWktVLR;
};
} // namespace pdal
diff --git a/io/las/LasUtils.cpp b/io/las/LasUtils.cpp
index a84a1fc..5e5288c 100644
--- a/io/las/LasUtils.cpp
+++ b/io/las/LasUtils.cpp
@@ -185,9 +185,16 @@ namespace LasUtils
std::vector<ExtraDim> parse(const StringList& dimString)
{
std::vector<ExtraDim> extraDims;
+ bool all = false;
for (auto& dim : dimString)
{
+ if (dim == "all")
+ {
+ all = true;
+ continue;
+ }
+
StringList s = Utils::split2(dim, '=');
if (s.size() != 2)
{
@@ -211,6 +218,15 @@ std::vector<ExtraDim> parse(const StringList& dimString)
ExtraDim ed(s[0], type);
extraDims.push_back(ed);
}
+
+ if (all)
+ {
+ if (extraDims.size())
+ throw (pdal_error("Can't specify specific extra dimensions with "
+ "special 'all' keyword."));
+ extraDims.push_back(ExtraDim("all", Dimension::Type::None));
+ }
+
return extraDims;
}
diff --git a/io/las/LasUtils.hpp b/io/las/LasUtils.hpp
index d0712b3..b1f601a 100644
--- a/io/las/LasUtils.hpp
+++ b/io/las/LasUtils.hpp
@@ -40,6 +40,18 @@
namespace pdal
{
+namespace LasCompression
+{
+
+enum Enum
+{
+ LasZip,
+ LazPerf,
+ None
+};
+
+}
+
struct ExtraDim
{
ExtraDim(const std::string name, Dimension::Type::Enum type,
diff --git a/io/las/LasWriter.cpp b/io/las/LasWriter.cpp
index 2ff252c..c1bb645 100644
--- a/io/las/LasWriter.cpp
+++ b/io/las/LasWriter.cpp
@@ -38,8 +38,10 @@
#include <boost/uuid/uuid_generators.hpp>
#include <iostream>
+#include <pdal/Compression.hpp>
#include <pdal/PDALUtils.hpp>
#include <pdal/PointView.hpp>
+#include <pdal/util/Algorithm.hpp>
#include <pdal/util/Inserter.hpp>
#include <pdal/util/OStream.hpp>
#include <pdal/util/Utils.hpp>
@@ -61,7 +63,7 @@ CREATE_STATIC_PLUGIN(1, 0, LasWriter, Writer, s_info)
std::string LasWriter::getName() const { return s_info.name; }
-LasWriter::LasWriter() : m_ostream(NULL)
+LasWriter::LasWriter() : m_ostream(NULL), m_compression(LasCompression::None)
{
m_majorVersion.setDefault(1);
m_minorVersion.setDefault(2);
@@ -93,8 +95,9 @@ Options LasWriter::getDefaultOptions()
Options options;
LasHeader header;
- options.add("filename", "", "Name of the file for LAS/LAZ output.");
- options.add("compression", false, "Do we LASzip-compress the data?");
+ options.add("filename", "", "Output file specification.");
+ options.add("compression", "none", "Compression engine to use ('laszip' "
+ "or 'lazperf'.");
options.add("major_version", 1, "LAS Major version");
options.add("minor_version", 2, "LAS Minor version");
options.add("dataformat_id", 3, "Point format to write");
@@ -123,26 +126,54 @@ Options LasWriter::getDefaultOptions()
void LasWriter::processOptions(const Options& options)
{
if (options.hasOption("a_srs"))
- setSpatialReference(options.getValueOrDefault("a_srs", std::string()));
- m_lasHeader.setCompressed(options.getValueOrDefault("compression", false));
+ setSpatialReference(options.getValueOrDefault<std::string>("a_srs"));
+
+ std::string compression =
+ options.getValueOrDefault<std::string>("compression");
+ compression = Utils::toupper(compression);
+ if (compression == "LASZIP" || compression == "TRUE")
+ m_compression = LasCompression::LasZip;
+ else if (compression == "LAZPERF")
+ m_compression = LasCompression::LazPerf;
+ else
+ m_compression = LasCompression::None;
+ if (m_compression != LasCompression::None)
+ m_lasHeader.setCompressed(true);
+#if !defined(PDAL_HAVE_LASZIP) && !defined(PDAL_HAVE_LAZPERF)
+ if (m_compression != LasCompression::None)
+ throw pdal_error("Can't write LAZ output. "
+ "PDAL not built with LASzip or LAZperf.");
+#endif
+
m_discardHighReturnNumbers = options.getValueOrDefault(
"discard_high_return_numbers", false);
StringList extraDims = options.getValueOrDefault<StringList>("extra_dims");
m_extraDims = LasUtils::parse(extraDims);
-#ifndef PDAL_HAVE_LASZIP
- if (m_lasHeader.compressed())
- throw pdal_error("Can't write LAZ output. "
- "PDAL not built with LASzip.");
-#endif // PDAL_HAVE_LASZIP
fillForwardList(options);
getHeaderOptions(options);
- getVlrOptions(options);
}
void LasWriter::prepared(PointTableRef table)
{
+ PointLayoutPtr layout = table.layout();
+
+ // If we've asked for all dimensions, add to extraDims all dimensions
+ // in the layout that aren't already destined for LAS output.
+ if (m_extraDims.size() == 1 && m_extraDims[0].m_name == "all")
+ {
+ m_extraDims.clear();
+ Dimension::IdList ids = m_lasHeader.usedDims();
+ DimTypeList dimTypes = layout->dimTypes();
+ for (auto& dt : dimTypes)
+ {
+ if (!Utils::contains(ids, dt.m_id))
+ m_extraDims.push_back(
+ ExtraDim(layout->dimName(dt.m_id), dt.m_type));
+ }
+ }
+
m_extraByteLen = 0;
for (auto& dim : m_extraDims)
{
@@ -255,55 +286,17 @@ void LasWriter::getHeaderOptions(const Options &options)
setHeaderOption("offset_z", m_offsetZ, options);
}
-/// Get VLR-specific options and store for processing with metadata.
-/// \param opts Options to check for VLR info.
-void LasWriter::getVlrOptions(const Options& opts)
-{
- std::vector<pdal::Option> options = opts.getOptions("vlr");
- for (auto o = options.begin(); o != options.end(); ++o)
- {
- if (!boost::algorithm::istarts_with(o->getName(), "vlr"))
- continue;
-
- boost::optional<pdal::Options const&> vo = o->getOptions();
- if (!vo)
- continue;
-
- VlrOptionInfo info;
- info.m_name = o->getName().substr(strlen("vlr"));
- info.m_value = o->getValue<std::string>();
- try
- {
- info.m_recordId = vo->getOption("record_id").getValue<int16_t>();
- info.m_userId = vo->getOption("user_id").getValue<std::string>();
- }
- catch (Option::not_found)
- {
- continue;
- }
- info.m_description = vo->getValueOrDefault<std::string>
- ("description", "");
- m_optionInfos.push_back(info);
- }
-}
-
void LasWriter::readyTable(PointTableRef table)
{
- m_srs = getSpatialReference().empty() ?
- table.spatialRef() : getSpatialReference();
-
- setVlrsFromSpatialRef();
+ m_forwardMetadata = table.privateMetadata("lasforward");
setExtraBytesVlr();
- MetadataNode forward = table.privateMetadata("lasforward");
- fillHeader(forward);
- setVlrsFromMetadata(forward);
}
-void LasWriter::readyFile(const std::string& filename)
+void LasWriter::readyFile(const std::string& filename,
+ const SpatialReference& srs)
{
- m_error.setFilename(filename);
std::ostream *out = FileUtils::createFile(filename, true);
if (!out)
{
@@ -314,18 +307,35 @@ void LasWriter::readyFile(const std::string& filename)
throw pdal_error(out.str());
}
m_curFilename = filename;
+ m_error.setFilename(filename);
Utils::writeProgress(m_progressFd, "READYFILE", filename);
- prepOutput(out);
+ prepOutput(out, srs);
}
-void LasWriter::prepOutput(std::ostream *outStream)
+void LasWriter::prepOutput(std::ostream *outStream, const SpatialReference& srs)
{
+ // Use stage SRS if provided.
+ m_srs = getSpatialReference().empty() ? srs : getSpatialReference();
+
+ // Filling the header here gives the VLR functions below easy access to
+ // the version information and so on.
+ fillHeader();
+
+ // Spatial reference can potentially change for multiple output files.
+ setVlrsFromSpatialRef();
+ handleHeaderForwards(m_forwardMetadata);
+ setVlrsFromMetadata(m_forwardMetadata);
+
m_summaryData.reset(new SummaryData());
m_ostream = outStream;
if (m_lasHeader.compressed())
readyCompression();
+ // Compression should cause the last of the VLRs to get filled. We now
+ // have a valid count, so fill the header again.
+ fillHeader();
+
// Write the header.
OLeStream out(m_ostream);
out << m_lasHeader;
@@ -342,7 +352,7 @@ void LasWriter::prepOutput(std::ostream *outStream)
if (m_lasHeader.versionEquals(1, 0))
out << (uint16_t)0xCCDD;
m_lasHeader.setPointOffset((uint32_t)m_ostream->tellp());
- if (m_lasHeader.compressed())
+ if (m_compression == LasCompression::LasZip)
openCompression();
m_error.setLog(log());
@@ -380,8 +390,7 @@ MetadataNode LasWriter::findVlrMetadata(MetadataNode node,
}
-/// Set VLRs from metadata for forwarded info, or from option-provided data
-/// otherwise.
+/// Set VLRs from metadata for forwarded info.
void LasWriter::setVlrsFromMetadata(MetadataNode& forward)
{
std::vector<uint8_t> data;
@@ -411,8 +420,22 @@ void LasWriter::setVlrsFromMetadata(MetadataNode& forward)
/// \param srs - Active spatial reference.
void LasWriter::setVlrsFromSpatialRef()
{
- VlrList vlrs;
+ // Delete any existing spatial ref VLRs. This can be an issue if we're
+ // using the reader to write multiple output files via a filename template.
+ deleteVlr(TRANSFORM_USER_ID, GEOTIFF_DIRECTORY_RECORD_ID);
+ deleteVlr(TRANSFORM_USER_ID, GEOTIFF_DOUBLES_RECORD_ID);
+ deleteVlr(TRANSFORM_USER_ID, GEOTIFF_ASCII_RECORD_ID);
+ deleteVlr(TRANSFORM_USER_ID, WKT_RECORD_ID);
+ deleteVlr(LIBLAS_USER_ID, WKT_RECORD_ID);
+
+ if (m_lasHeader.versionAtLeast(1, 4))
+ addWktVlr();
+ else
+ addGeotiffVlrs();
+}
+void LasWriter::addGeotiffVlrs()
+{
#ifdef PDAL_HAVE_LIBGEOTIFF
GeotiffSupport geotiff;
geotiff.resetTags();
@@ -426,7 +449,9 @@ void LasWriter::setVlrsFromSpatialRef()
"GeoTiff GeoDoubleParamsTag");
addGeotiffVlr(geotiff, GEOTIFF_ASCII_RECORD_ID,
"GeoTiff GeoAsciiParamsTag");
- addWktVlr();
+#else
+ log()->get(LogLevel::Error) << getName() << ": PDAL not built with "
+ "libGeoTiff. Can't write valid LAS file." << std::endl;
#endif // PDAL_HAVE_LIBGEOTIFF
}
@@ -436,7 +461,7 @@ void LasWriter::setVlrsFromSpatialRef()
/// \param recordId - Record ID associated with the VLR/Geotiff ref.
/// \param description - Description to use with the VLR
/// \return Whether the VLR was added.
-bool LasWriter::addGeotiffVlr(GeotiffSupport& geotiff, uint16_t recordId,
+void LasWriter::addGeotiffVlr(GeotiffSupport& geotiff, uint16_t recordId,
const std::string& description)
{
#ifdef PDAL_HAVE_LIBGEOTIFF
@@ -445,14 +470,15 @@ bool LasWriter::addGeotiffVlr(GeotiffSupport& geotiff, uint16_t recordId,
size_t size = geotiff.getKey(recordId, &count, &data);
if (size == 0)
- return false;
+ {
+ log()->get(LogLevel::Warning) << getName() << ": Invalid spatial "
+ "reference for writing GeoTiff VLR." << std::endl;
+ return;
+ }
std::vector<uint8_t> buf(size);
memcpy(buf.data(), data, size);
addVlr(TRANSFORM_USER_ID, recordId, description, buf);
- return true;
-#else
- return false;
#endif // PDAL_HAVE_LIBGEOTIFF
}
@@ -517,8 +543,22 @@ void LasWriter::addVlr(const std::string& userId, uint16_t recordId,
}
}
+/// Delete a VLR from the vlr list.
+///
+void LasWriter::deleteVlr(const std::string& userId, uint16_t recordId)
+{
+ auto matches = [&userId, recordId](const VariableLengthRecord& vlr)
+ {
+ return vlr.matches(userId, recordId);
+ };
+
+ Utils::remove_if(m_vlrs, matches);
+ Utils::remove_if(m_eVlrs, matches);
+}
+
+
template <typename T>
-void LasWriter::handleForward(const std::string& s, T& headerVal,
+void LasWriter::handleHeaderForward(const std::string& s, T& headerVal,
const MetadataNode& base)
{
if (Utils::contains(m_forwards, s) && !headerVal.valSet())
@@ -530,25 +570,26 @@ void LasWriter::handleForward(const std::string& s, T& headerVal,
}
}
-void LasWriter::handleForwards(MetadataNode& forward)
-{
- handleForward("major_version", m_majorVersion, forward);
- handleForward("minor_version", m_minorVersion, forward);
- handleForward("dataformat_id", m_dataformatId, forward);
- handleForward("filesource_id", m_filesourceId, forward);
- handleForward("global_encoding", m_globalEncoding, forward);
- handleForward("project_id", m_projectId, forward);
- handleForward("system_id", m_systemId, forward);
- handleForward("software_id", m_softwareId, forward);
- handleForward("creation_doy", m_creationDoy, forward);
- handleForward("creation_year", m_creationYear, forward);
- handleForward("scale_x", m_scaleX, forward);
- handleForward("scale_y", m_scaleY, forward);
- handleForward("scale_z", m_scaleZ, forward);
- handleForward("offset_x", m_offsetX, forward);
- handleForward("offset_y", m_offsetY, forward);
- handleForward("offset_z", m_offsetZ, forward);
+void LasWriter::handleHeaderForwards(MetadataNode& forward)
+{
+ handleHeaderForward("major_version", m_majorVersion, forward);
+ handleHeaderForward("minor_version", m_minorVersion, forward);
+ handleHeaderForward("dataformat_id", m_dataformatId, forward);
+ handleHeaderForward("filesource_id", m_filesourceId, forward);
+ handleHeaderForward("global_encoding", m_globalEncoding, forward);
+ handleHeaderForward("project_id", m_projectId, forward);
+ handleHeaderForward("system_id", m_systemId, forward);
+ handleHeaderForward("software_id", m_softwareId, forward);
+ handleHeaderForward("creation_doy", m_creationDoy, forward);
+ handleHeaderForward("creation_year", m_creationYear, forward);
+
+ handleHeaderForward("scale_x", m_scaleX, forward);
+ handleHeaderForward("scale_y", m_scaleY, forward);
+ handleHeaderForward("scale_z", m_scaleZ, forward);
+ handleHeaderForward("offset_x", m_offsetX, forward);
+ handleHeaderForward("offset_y", m_offsetY, forward);
+ handleHeaderForward("offset_z", m_offsetZ, forward);
m_xXform.setScale(m_scaleX.val());
m_yXform.setScale(m_scaleY.val());
@@ -560,10 +601,8 @@ void LasWriter::handleForwards(MetadataNode& forward)
/// Fill the LAS header with values as provided in options or forwarded
/// metadata.
-void LasWriter::fillHeader(MetadataNode& forward)
+void LasWriter::fillHeader()
{
- handleForwards(forward);
-
const uint16_t WKT_MASK = (1 << 4);
m_lasHeader.setScale(m_xXform.m_scale, m_yXform.m_scale, m_zXform.m_scale);
@@ -581,8 +620,8 @@ void LasWriter::fillHeader(MetadataNode& forward)
m_lasHeader.setSystemId(m_systemId.val());
m_lasHeader.setProjectId(m_projectId.val());
m_lasHeader.setFileSourceId(m_filesourceId.val());
- // We always write a WKT VLR, but we need to be sure to set the WKT
- // bit when the version is at least 1.4.
+
+ // We always write a WKT VLR for version 1.4 and later.
uint16_t globalEncoding = m_globalEncoding.val();
if (m_lasHeader.versionAtLeast(1, 4))
globalEncoding |= WKT_MASK;
@@ -600,6 +639,15 @@ void LasWriter::fillHeader(MetadataNode& forward)
void LasWriter::readyCompression()
{
+ if (m_compression == LasCompression::LasZip)
+ readyLasZipCompression();
+ else if (m_compression == LasCompression::LazPerf)
+ readyLazPerfCompression();
+}
+
+
+void LasWriter::readyLasZipCompression()
+{
#ifdef PDAL_HAVE_LASZIP
m_zipPoint.reset(new ZipPoint(m_lasHeader.pointFormat(),
m_lasHeader.pointLen()));
@@ -612,6 +660,29 @@ void LasWriter::readyCompression()
}
+void LasWriter::readyLazPerfCompression()
+{
+#ifdef PDAL_HAVE_LAZPERF
+ if (m_lasHeader.versionAtLeast(1, 4))
+ throw pdal_error("Can't write version 1.4 output with LAZperf.");
+
+ laszip::factory::record_schema schema;
+ schema.push(laszip::factory::record_item::POINT10);
+ if (m_lasHeader.hasTime())
+ schema.push(laszip::factory::record_item::GPSTIME);
+ if (m_lasHeader.hasColor())
+ schema.push(laszip::factory::record_item::RGB12);
+ laszip::io::laz_vlr zipvlr = laszip::io::laz_vlr::from_schema(schema);
+ std::vector<uint8_t> data(zipvlr.size());
+ zipvlr.extract((char *)data.data());
+ addVlr(LASZIP_USER_ID, LASZIP_RECORD_ID, "http://laszip.org", data);
+
+ m_compressor.reset(new LazPerfVlrCompressor(*m_ostream, schema,
+ zipvlr.chunk_size));
+#endif
+}
+
+
/// Prepare the compressor to write points.
/// \param pointFormat - Formt of points we're writing.
void LasWriter::openCompression()
@@ -643,7 +714,6 @@ void LasWriter::writeView(const PointViewPtr view)
const PointView& viewRef(*view.get());
- //ABELL - Removed callback handling for now.
point_count_t remaining = view->size();
PointId idx = 0;
while (remaining)
@@ -652,36 +722,52 @@ void LasWriter::writeView(const PointViewPtr view)
idx += filled;
remaining -= filled;
-#ifdef PDAL_HAVE_LASZIP
- if (m_lasHeader.compressed())
- {
- char *pos = buf.data();
- for (point_count_t i = 0; i < filled; i++)
- {
- memcpy(m_zipPoint->m_lz_point_data.data(), pos, pointLen);
- if (!m_zipper->write(m_zipPoint->m_lz_point))
- {
- std::ostringstream oss;
- const char* err = m_zipper->get_error();
- if (err == NULL)
- err = "(unknown error)";
- oss << "Error writing point: " << std::string(err);
- throw pdal_error(oss.str());
- }
- pos += pointLen;
- }
- }
+ if (m_compression == LasCompression::LasZip)
+ writeLasZipBuf(buf.data(), pointLen, filled);
+ else if (m_compression == LasCompression::LazPerf)
+ writeLazPerfBuf(buf.data(), pointLen, filled);
else
m_ostream->write(buf.data(), filled * pointLen);
-#else
- m_ostream->write(buf.data(), filled * pointLen);
-#endif
}
Utils::writeProgress(m_progressFd, "DONEVIEW",
std::to_string(view->size()));
}
+void LasWriter::writeLasZipBuf(char *pos, size_t pointLen, point_count_t numPts)
+{
+#ifdef PDAL_HAVE_LASZIP
+ for (point_count_t i = 0; i < numPts; i++)
+ {
+ memcpy(m_zipPoint->m_lz_point_data.data(), pos, pointLen);
+ if (!m_zipper->write(m_zipPoint->m_lz_point))
+ {
+ std::ostringstream oss;
+ const char* err = m_zipper->get_error();
+ if (err == NULL)
+ err = "(unknown error)";
+ oss << "Error writing point: " << std::string(err);
+ throw pdal_error(oss.str());
+ }
+ pos += pointLen;
+ }
+#endif
+}
+
+
+void LasWriter::writeLazPerfBuf(char *pos, size_t pointLen,
+ point_count_t numPts)
+{
+#ifdef PDAL_HAVE_LAZPERF
+ for (point_count_t i = 0; i < numPts; i++)
+ {
+ m_compressor->compress(pos);
+ pos += pointLen;
+ }
+#endif
+}
+
+
point_count_t LasWriter::fillWriteBuf(const PointView& view,
PointId startId, std::vector<char>& buf)
{
@@ -705,8 +791,7 @@ point_count_t LasWriter::fillWriteBuf(const PointView& view,
uint8_t numberOfReturns(1);
if (view.hasDim(Id::ReturnNumber))
{
- returnNumber = view.getFieldAs<uint8_t>(Id::ReturnNumber,
- idx);
+ returnNumber = view.getFieldAs<uint8_t>(Id::ReturnNumber, idx);
if (returnNumber < 1 || returnNumber > maxReturnCount)
m_error.returnNumWarning(returnNumber);
}
@@ -791,10 +876,7 @@ point_count_t LasWriter::fillWriteBuf(const PointView& view,
uint8_t classification = 0;
if (view.hasDim(Id::Classification))
- {
- classification = view.getFieldAs<uint8_t>(Id::Classification,
- idx);
- }
+ classification = view.getFieldAs<uint8_t>(Id::Classification, idx);
ostream << classification;
uint8_t userData = 0;
@@ -819,8 +901,7 @@ point_count_t LasWriter::fillWriteBuf(const PointView& view,
uint16_t pointSourceId = 0;
if (view.hasDim(Id::PointSourceId))
- pointSourceId = view.getFieldAs<uint16_t>(Id::PointSourceId,
- idx);
+ pointSourceId = view.getFieldAs<uint16_t>(Id::PointSourceId, idx);
ostream << pointSourceId;
if (hasTime)
@@ -882,13 +963,10 @@ void LasWriter::doneFile()
void LasWriter::finishOutput()
{
- //ABELL - The zipper has to be closed right after all the points
- // are written or bad things happen since this call expects the
- // stream to be positioned at a particular position.
-#ifdef PDAL_HAVE_LASZIP
- if (m_lasHeader.compressed())
- m_zipper->close();
-#endif
+ if (m_compression == LasCompression::LasZip)
+ finishLasZipOutput();
+ else if (m_compression == LasCompression::LazPerf)
+ finishLazPerfOutput();
log()->get(LogLevel::Debug) << "Wrote " <<
m_summaryData->getTotalNumPoints() <<
@@ -910,21 +988,28 @@ void LasWriter::finishOutput()
// The summary is calculated as points are written.
m_lasHeader.setSummary(*m_summaryData);
- // VLR count may change as LAS records are written.
- m_lasHeader.setVlrCount(m_vlrs.size());
out.seek(0);
out << m_lasHeader;
out.seek(m_lasHeader.pointOffset());
+ m_ostream->flush();
+}
+
+
+void LasWriter::finishLasZipOutput()
+{
#ifdef PDAL_HAVE_LASZIP
- if (m_lasHeader.compressed())
- {
- m_zipper.reset();
- m_zipPoint.reset();
- }
+ m_zipper->close();
+#endif
+}
+
+
+void LasWriter::finishLazPerfOutput()
+{
+#ifdef PDAL_HAVE_LAZPERF
+ m_compressor->done();
#endif
- m_ostream->flush();
}
} // namespace pdal
diff --git a/io/las/LasWriter.hpp b/io/las/LasWriter.hpp
index a6b56c6..83981d5 100644
--- a/io/las/LasWriter.hpp
+++ b/io/las/LasWriter.hpp
@@ -34,6 +34,7 @@
#pragma once
+#include <pdal/Compression.hpp>
#include <pdal/FlexWriter.hpp>
#include "HeaderVal.hpp"
@@ -75,7 +76,7 @@ public:
Options getDefaultOptions();
protected:
- void prepOutput(std::ostream *out);
+ void prepOutput(std::ostream *out, const SpatialReference& srs);
void finishOutput();
private:
@@ -84,6 +85,7 @@ private:
std::unique_ptr<SummaryData> m_summaryData;
std::unique_ptr<LASzipper> m_zipper;
std::unique_ptr<ZipPoint> m_zipPoint;
+ std::unique_ptr<LazPerfVlrCompressor> m_compressor;
bool m_discardHighReturnNumbers;
std::map<std::string, std::string> m_headerVals;
std::vector<VlrOptionInfo> m_optionInfos;
@@ -96,6 +98,7 @@ private:
std::string m_curFilename;
std::set<std::string> m_forwards;
bool m_forwardVlrs;
+ LasCompression::Enum m_compression;
NumHeaderVal<uint8_t, 1, 1> m_majorVersion;
NumHeaderVal<uint8_t, 1, 4> m_minorVersion;
@@ -117,36 +120,45 @@ private:
StringHeaderVal<20> m_offsetX;
StringHeaderVal<20> m_offsetY;
StringHeaderVal<20> m_offsetZ;
+ MetadataNode m_forwardMetadata;
virtual void processOptions(const Options& options);
virtual void prepared(PointTableRef table);
virtual void readyTable(PointTableRef table);
- virtual void readyFile(const std::string& filename);
+ virtual void readyFile(const std::string& filename,
+ const SpatialReference& srs);
virtual void writeView(const PointViewPtr view);
virtual void doneFile();
void fillForwardList(const Options& options);
void getHeaderOptions(const Options& options);
- void getVlrOptions(const Options& opts);
template <typename T>
- void handleForward(const std::string& s, T& headerVal,
+ void handleHeaderForward(const std::string& s, T& headerVal,
const MetadataNode& base);
- void handleForwards(MetadataNode& forward);
- void fillHeader(MetadataNode& forward);
+ void handleHeaderForwards(MetadataNode& forward);
+ void fillHeader();
point_count_t fillWriteBuf(const PointView& view, PointId startId,
std::vector<char>& buf);
+ void writeLasZipBuf(char *data, size_t pointLen, point_count_t numPts);
+ void writeLazPerfBuf(char *data, size_t pointLen, point_count_t numPts);
void setVlrsFromMetadata(MetadataNode& forward);
MetadataNode findVlrMetadata(MetadataNode node, uint16_t recordId,
const std::string& userId);
void setExtraBytesVlr();
void setVlrsFromSpatialRef();
void readyCompression();
+ void readyLasZipCompression();
+ void readyLazPerfCompression();
void openCompression();
void addVlr(const std::string& userId, uint16_t recordId,
const std::string& description, std::vector<uint8_t>& data);
- bool addGeotiffVlr(GeotiffSupport& geotiff, uint16_t recordId,
+ void deleteVlr(const std::string& userId, uint16_t recordId);
+ void addGeotiffVlrs();
+ void addGeotiffVlr(GeotiffSupport& geotiff, uint16_t recordId,
const std::string& description);
bool addWktVlr();
+ void finishLasZipOutput();
+ void finishLazPerfOutput();
LasWriter& operator=(const LasWriter&); // not implemented
LasWriter(const LasWriter&); // not implemented
diff --git a/io/ply/CMakeLists.txt b/io/ply/CMakeLists.txt
index 10b7705..2c24995 100644
--- a/io/ply/CMakeLists.txt
+++ b/io/ply/CMakeLists.txt
@@ -1,13 +1,13 @@
set(src
PlyReader.cpp
PlyWriter.cpp
- ${PROJECT_SOURCE_DIR}/vendor/rply-1.1.3/rply.c
+ ${PROJECT_SOURCE_DIR}/vendor/rply-1.1.4/rply.c
)
set(inc
PlyReader.hpp
PlyWriter.hpp
- ${PROJECT_SOURCE_DIR}/vendor/rply-1.1.3/rply.h
+ ${PROJECT_SOURCE_DIR}/vendor/rply-1.1.4/rply.h
)
PDAL_ADD_DRIVER(reader ply "${src}" "${inc}" objs)
diff --git a/io/ply/PlyReader.cpp b/io/ply/PlyReader.cpp
index 36c18b6..4022c02 100644
--- a/io/ply/PlyReader.cpp
+++ b/io/ply/PlyReader.cpp
@@ -36,8 +36,6 @@
#include <sstream>
-#include <boost/algorithm/string.hpp>
-
#include <pdal/PointView.hpp>
namespace pdal
diff --git a/io/text/TextWriter.cpp b/io/text/TextWriter.cpp
index 18664a3..4e7fec6 100644
--- a/io/text/TextWriter.cpp
+++ b/io/text/TextWriter.cpp
@@ -42,8 +42,6 @@
#include <iostream>
#include <map>
-#include <boost/algorithm/string.hpp>
-#include <boost/algorithm/string/erase.hpp>
#include <boost/tokenizer.hpp>
namespace pdal
@@ -100,7 +98,7 @@ void TextWriter::processOptions(const Options& ops)
throw pdal_error(out.str());
}
m_outputType = ops.getValueOrDefault<std::string>("format", "csv");
- boost::to_upper(m_outputType);
+ m_outputType = Utils::toupper(m_outputType);
m_callback = ops.getValueOrDefault<std::string>("jscallback", "");
m_writeAllDims = ops.getValueOrDefault<bool>("keep_unspecified", true);
m_dimOrder = ops.getValueOrDefault<std::string>("order", "");
@@ -143,7 +141,7 @@ void TextWriter::ready(PointTableRef table)
{
Dimension::IdList all = table.layout()->dims();
for (auto di = all.begin(); di != all.end(); ++di)
- if (!contains(m_dims, *di))
+ if (!Utils::contains(m_dims, *di))
m_dims.push_back(*di);
}
diff --git a/io/tindex/CMakeLists.txt b/io/tindex/CMakeLists.txt
new file mode 100644
index 0000000..8957acf
--- /dev/null
+++ b/io/tindex/CMakeLists.txt
@@ -0,0 +1,10 @@
+set(src
+ TIndexReader.cpp
+)
+
+set(inc
+ TIndexReader.hpp
+)
+
+PDAL_ADD_DRIVER(reader tindex "${src}" "${inc}" objs)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objs} PARENT_SCOPE)
diff --git a/io/tindex/TIndexReader.cpp b/io/tindex/TIndexReader.cpp
new file mode 100644
index 0000000..b67d0a6
--- /dev/null
+++ b/io/tindex/TIndexReader.cpp
@@ -0,0 +1,343 @@
+/******************************************************************************
+* Copyright (c) 2015, Howard Butler (howard at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in
+* the documentation and/or other materials provided
+* with the distribution.
+* * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+* names of its contributors may be used to endorse or promote
+* products derived from this software without specific prior
+* written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "TIndexReader.hpp"
+#include <pdal/GDALUtils.hpp>
+
+
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+ "readers.tindex",
+ "TileIndex Reader",
+ "http://pdal.io/stages/readers.tindex.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, TIndexReader, Reader, s_info)
+
+std::string TIndexReader::getName() const { return s_info.name; }
+
+Options TIndexReader::getDefaultOptions()
+{
+ Options options;
+ Option sql("sql", "", "OGR-compatible SQL statement for querying tile index layer");
+ options.add(sql);
+ Option polygon("polygon", "", "WKT Polygon or MultiPolygon describing spatial extent to query");
+ options.add(polygon);
+ Option bounds("bounds", "", "PDAL-style bounds to limit query window (exclusive of --polygon)");
+ options.add(bounds);
+ Option lyr_name("lyr_name", "", "OGR layer name from which to read tile index layer");
+ options.add(lyr_name);
+ Option tindex_name("tindex_name", "", "OGR column name from which to read tile index location");
+ options.add(tindex_name);
+ Option a_srs("a_srs", "", "Override SRS of geometry in the tile index");
+ options.add(a_srs);
+ Option t_srs("t_srs", "", "Transform SRS of tile index geometry");
+ options.add(t_srs);
+ Option srs_column("srs_column", "", "Column to use for SRS");
+ options.add(srs_column);
+ return options;
+}
+
+TIndexReader::FieldIndexes TIndexReader::getFields()
+{
+ FieldIndexes indexes;
+
+ void *fDefn = OGR_L_GetLayerDefn(m_layer);
+
+ indexes.m_filename = OGR_FD_GetFieldIndex(fDefn,
+ m_tileIndexColumnName.c_str());
+ if (indexes.m_filename < 0)
+ {
+ std::ostringstream out;
+
+ out << "Unable to find field '" << m_tileIndexColumnName <<
+ "' in file '" << m_filename << "'.";
+ throw pdal_error(out.str());
+ }
+ indexes.m_srs = OGR_FD_GetFieldIndex(fDefn, m_srsColumnName.c_str());
+ if (indexes.m_srs < 0)
+ {
+ std::ostringstream out;
+
+ out << "Unable to find field '" << m_srsColumnName << "' in file '" <<
+ m_filename << "'.";
+ throw pdal_error(out.str());
+ }
+
+ indexes.m_ctime = OGR_FD_GetFieldIndex(fDefn, "created");
+ indexes.m_mtime = OGR_FD_GetFieldIndex(fDefn, "modified");
+
+ return indexes;
+}
+
+
+
+std::vector<TIndexReader::FileInfo> TIndexReader::getFiles()
+{
+ std::vector<TIndexReader::FileInfo> output;
+
+ OGR_L_ResetReading(m_layer);
+ FieldIndexes indexes = getFields();
+
+ while (true)
+ {
+ OGRFeatureH feature = OGR_L_GetNextFeature(m_layer);
+ if (!feature)
+ break;
+
+ FileInfo fileInfo;
+ fileInfo.m_filename =
+ OGR_F_GetFieldAsString(feature, indexes.m_filename);
+ fileInfo.m_srs =
+ OGR_F_GetFieldAsString(feature, indexes.m_srs);
+ output.push_back(fileInfo);
+
+ OGR_F_Destroy(feature);
+ }
+
+ return output;
+}
+void TIndexReader::initialize()
+{
+ GlobalEnvironment::get().initializeGDAL(log(), isDebug());
+}
+
+void TIndexReader::processOptions(const Options& options)
+{
+ m_layerName = options.getValueOrDefault<std::string>("lyr_name", "pdal");
+ m_srsColumnName = options.getValueOrDefault<std::string>("srs_column", "srs");
+ m_tileIndexColumnName = options.getValueOrDefault<std::string>("tindex_name", "location");
+ m_sql = options.getValueOrDefault<std::string>("sql", "");
+
+ m_wkt = options.getValueOrDefault<std::string>("wkt", "");
+ BOX2D boundary = options.getValueOrDefault<BOX2D>("boundary", BOX2D());
+ if (!boundary.empty())
+ {
+ m_wkt = boundary.toWKT();
+ }
+ m_tgtSrsString = options.getValueOrDefault<std::string>("t_srs", "EPSG:4326");
+ m_filterSRS = options.getValueOrDefault<std::string>("filter_srs", "");
+ m_attributeFilter = options.getValueOrDefault<std::string>("where", "");
+ m_dialect = options.getValueOrDefault<std::string>("dialect", "OGRSQL");
+
+ m_out_ref.reset(new gdal::SpatialRef());
+}
+
+void TIndexReader::addDimensions(PointLayoutPtr layout)
+{
+ using namespace pdal::Dimension::Type;
+ layout->registerDim(pdal::Dimension::Id::X);
+ layout->registerDim(pdal::Dimension::Id::Y);
+ layout->registerDim(pdal::Dimension::Id::Z);
+}
+
+pdal::Dimension::IdList TIndexReader::getDefaultDimensions()
+{
+ using namespace pdal::Dimension;
+ Dimension::IdList ids;
+
+ return ids;
+}
+
+void TIndexReader::ready(PointTableRef table)
+{
+ log()->get(LogLevel::Debug) << "Opening file "
+ << m_filename <<std::endl;
+
+ m_dataset = OGROpen(m_filename.c_str(), FALSE, NULL);
+ if (!m_dataset)
+ {
+ std::stringstream oss;
+ oss << "unable to datasource '" << m_filename << "'";
+ throw pdal::pdal_error(oss.str());
+ }
+
+ OGRGeometryH geometry(0);
+ if (m_sql.size())
+ {
+ m_layer = OGR_DS_ExecuteSQL(m_dataset,
+ m_sql.c_str(),
+ geometry,
+ m_dialect.c_str());
+ } else
+ {
+ m_layer = OGR_DS_GetLayerByName(m_dataset,
+ m_layerName.c_str());
+ }
+ if (!m_layer)
+ {
+ std::stringstream oss;
+ oss << "unable to open layer '"
+ << m_layerName << "' from OGR datasource '"
+ << m_filename << "'";
+ throw pdal::pdal_error(oss.str());
+ }
+
+ m_out_ref->setFromLayer(m_layer);
+
+ // Override the SRS if the user set one, otherwise, take it
+ // from the layer
+ if (m_tgtSrsString.size())
+ m_out_ref.reset(new gdal::SpatialRef(m_tgtSrsString));
+ else
+ m_out_ref.reset(new gdal::SpatialRef(m_out_ref->wkt()));
+
+ SpatialReference pdal_ref(m_out_ref->wkt());
+ setSpatialReference(pdal_ref);
+
+ std::unique_ptr<gdal::Geometry> wkt_g;
+
+ // If the user set either explicit 'polygon' or 'boundary' options
+ // we will filter by that geometry. The user can set a 'filter_srs'
+ // option to override the SRS of the input geometry and we will
+ // reproject to the output projection as needed.
+ if (m_wkt.size())
+ {
+ // Reproject the given wkt to the output SRS so
+ // filtering/cropping works
+ gdal::SpatialRef assign(m_filterSRS);
+ gdal::Geometry before(m_wkt, assign);
+ before.transform(*m_out_ref);
+
+ wkt_g.reset (new gdal::Geometry(before.wkt(), *m_out_ref));
+
+ geometry = wkt_g->get();
+ m_wkt = wkt_g->wkt();
+ OGR_L_SetSpatialFilter(m_layer, geometry);
+ }
+
+ if (m_attributeFilter.size())
+ {
+ OGRErr err = OGR_L_SetAttributeFilter(m_layer, m_attributeFilter.c_str());
+ if (err != OGRERR_NONE)
+ {
+ std::stringstream oss;
+ oss << "unable to set attribute filter '"
+ << m_attributeFilter << "' for OGR datasource '"
+ << m_filename << "'";
+ throw pdal::pdal_error(oss.str());
+ }
+ }
+
+ m_files = getFiles();
+
+ Options cropOptions;
+ if (m_wkt.size())
+ cropOptions.add("polygon", m_wkt);
+
+ for (auto f : m_files)
+ {
+ log()->get(LogLevel::Debug) << "Adding file "
+ << f.m_filename
+ << " to merge filter" <<std::endl;
+ Stage *premerge = NULL;
+ std::string driver = m_factory.inferReaderDriver(f.m_filename);
+ Stage *reader = m_factory.createStage(driver, true);
+ if (!reader)
+ {
+ std::stringstream out;
+ out << "Unable to create reader for file '"
+ << f.m_filename << "'.";
+ throw pdal_error(out.str());
+ }
+ Options readerOptions;
+ readerOptions.add("filename", f.m_filename);
+ reader->setOptions(readerOptions);
+ premerge = reader;
+
+ if (m_tgtSrsString != f.m_srs &&
+ (m_tgtSrsString.size() && f.m_srs.size()))
+ {
+ Stage *repro = m_factory.createStage("filters.reprojection", true);
+ repro->setInput(*reader);
+ Options reproOptions;
+ reproOptions.add("out_srs", m_tgtSrsString);
+ reproOptions.add("in_srs", f.m_srs);
+ log()->get(LogLevel::Debug2) << "Repro = "
+ << m_tgtSrsString << "/"
+ << f.m_srs << "!\n";
+ repro->setOptions(reproOptions);
+ premerge = repro;
+ }
+
+ // WKT is set, even if we're using a bounding box for filtering, so
+ // can be used as a test here.
+ if (!m_wkt.empty())
+ {
+ Stage *crop = m_factory.createStage("filters.crop", true);
+ crop->setOptions(cropOptions);
+ crop->setInput(*premerge);
+ log()->get(LogLevel::Debug3) << "Cropping data with wkt '"
+ << m_wkt << "'" << std::endl;
+ premerge = crop;
+ }
+
+ m_merge.setInput(*premerge);
+ }
+
+ m_table = table;
+
+}
+
+PointViewSet TIndexReader::run(PointViewPtr view)
+{
+ m_merge.prepare(m_table);
+ PointViewSet output = m_merge.execute(m_table);
+ return output;
+}
+
+TIndexReader::~TIndexReader()
+{
+ if (!m_dataset) return;
+ if (m_sql.size())
+ {
+ // We were created with OGR_DS_ExecuteSQL which needs to have
+ // its layer explicitly released
+ OGR_DS_ReleaseResultSet(m_dataset, m_layer);
+ }
+ else
+ {
+ OGR_DS_Destroy(m_dataset);
+ }
+
+ m_layer = 0;
+ m_dataset = 0;
+
+}
+
+
+
+} // namespace pdal
diff --git a/kernels/tindex/TIndexKernel.hpp b/io/tindex/TIndexReader.hpp
similarity index 65%
copy from kernels/tindex/TIndexKernel.hpp
copy to io/tindex/TIndexReader.hpp
index 705e67f..435fc20 100644
--- a/kernels/tindex/TIndexKernel.hpp
+++ b/io/tindex/TIndexReader.hpp
@@ -34,22 +34,19 @@
#pragma once
+#include <pdal/PointView.hpp>
+#include <pdal/Reader.hpp>
+#include <pdal/GlobalEnvironment.hpp>
+#include <merge/MergeFilter.hpp>
+#include <pdal/StageFactory.hpp>
#include <pdal/GDALUtils.hpp>
-#include <pdal/Kernel.hpp>
-#include <pdal/Stage.hpp>
-#include <pdal/util/FileUtils.hpp>
-#include <pdal/plugin.hpp>
-
-extern "C" int32_t TIndexKernel_ExitFunc();
-extern "C" PF_ExitFunc TIndexKernel_InitPlugin();
+extern "C" int32_t TIndexReader_ExitFunc();
+extern "C" PF_ExitFunc TIndexReader_InitPlugin();
namespace pdal
{
-
-class KernelFactory;
-
-class PDAL_DLL TIndexKernel : public Kernel
+class PDAL_DLL TIndexReader : public pdal::Reader
{
struct FileInfo
{
@@ -69,51 +66,57 @@ class PDAL_DLL TIndexKernel : public Kernel
};
public:
+ TIndexReader()
+ : Reader()
+ , m_dataset(0)
+ , m_layer(0)
+ , m_tablePtr(new PointTable())
+ , m_table(*m_tablePtr)
+ {}
+
+ ~TIndexReader();
static void * create();
static int32_t destroy(void *);
std::string getName() const;
- int execute(); // overrride
+
+ Options getDefaultOptions();
+ static Dimension::IdList getDefaultDimensions();
private:
- TIndexKernel();
- void addSwitches(); // overrride
- void validateSwitches(); // overrride
-
- StringList glob(std::string& path);
- void createFile();
- void mergeFile();
- bool openDataset(const std::string& filename);
- bool createDataset(const std::string& filename);
- bool openLayer(const std::string& layerName);
- bool createLayer(const std::string& layerName);
- FieldIndexes getFields();
- FileInfo getFileInfo(KernelFactory& factory, const std::string& filename);
- bool createFeature(const FieldIndexes& indexes, FileInfo& info);
- gdal::Geometry prepareGeometry(const FileInfo& fileInfo);
- gdal::Geometry prepareGeometry(const std::string& wkt,
- const gdal::SpatialRef& inSrs, const gdal::SpatialRef& outSrs);
- void createFields();
-
- bool isFileIndexed( const FieldIndexes& indexes, const FileInfo& fileInfo);
-
- std::string m_idxFilename;
- std::string m_filespec;
- StringList m_files;
+
+ virtual void addDimensions(PointLayoutPtr layout);
+ virtual void processOptions(const Options& options);
+ virtual void ready(PointTableRef table);
+ virtual PointViewSet run(PointViewPtr /*view*/);
+
+ virtual void initialize();
+
+ std::vector<FileInfo> m_files;
std::string m_layerName;
std::string m_driverName;
std::string m_tileIndexColumnName;
std::string m_srsColumnName;
std::string m_wkt;
- BOX2D m_bounds;
- bool m_merge;
- bool m_absPath;
+ std::string m_tgtSrsString;
+ std::string m_filterSRS;
+ std::string m_attributeFilter;
+ std::string m_dialect;
+ BOX2D m_boundary;
+ std::string m_sql;
+ std::unique_ptr<gdal::SpatialRef> m_out_ref;
void *m_dataset;
void *m_layer;
- std::string m_tgtSrsString;
- std::string m_assignSrsString;
- bool m_fastBoundary;
+
+ std::unique_ptr<PointTable> m_tablePtr;
+ PointTableRef m_table;
+ StageFactory m_factory;
+ MergeFilter m_merge;
+
+ std::vector<FileInfo> getFiles();
+ FieldIndexes getFields();
+
};
-} // namespace pdal
+} // namespace pdal
diff --git a/kernels/info/InfoKernel.cpp b/kernels/info/InfoKernel.cpp
index 78d6568..7a952a5 100644
--- a/kernels/info/InfoKernel.cpp
+++ b/kernels/info/InfoKernel.cpp
@@ -142,7 +142,7 @@ void InfoKernel::addSwitches()
processing_options->add_options()
("all",
po::value<bool>(&m_showAll)->zero_tokens()->implicit_value(true),
- "dump the schema")
+ "dump statistics, schema and metadata")
("point,p", po::value<std::string >(&m_pointIndexes), "point to dump")
("query", po::value< std::string>(&m_queryPoint),
"Return points in order of distance from the specified "
@@ -299,8 +299,7 @@ void InfoKernel::setup(const std::string& filename)
if (!m_needPoints)
readerOptions.add("count", 0);
- m_manager = std::unique_ptr<PipelineManager>(
- KernelSupport::makePipeline(filename));
+ m_manager = KernelSupport::makePipeline(filename);
m_reader = m_manager->getStage();
Stage *stage = m_reader;
diff --git a/kernels/info/InfoKernel.hpp b/kernels/info/InfoKernel.hpp
index b992520..38acf8d 100644
--- a/kernels/info/InfoKernel.hpp
+++ b/kernels/info/InfoKernel.hpp
@@ -104,7 +104,7 @@ private:
Stage *m_reader;
MetadataNode m_tree;
- std::unique_ptr<PipelineManager> m_manager;
+ PipelineManagerPtr m_manager;
};
} // namespace pdal
diff --git a/kernels/tindex/TIndexKernel.cpp b/kernels/tindex/TIndexKernel.cpp
index 716a740..ac71f0a 100644
--- a/kernels/tindex/TIndexKernel.cpp
+++ b/kernels/tindex/TIndexKernel.cpp
@@ -86,6 +86,7 @@ TIndexKernel::TIndexKernel()
, m_dataset(NULL)
, m_layer(NULL)
, m_fastBoundary(false)
+ , m_smoothBoundary(false)
{
m_log.setLeader("pdal tindex");
@@ -104,9 +105,12 @@ void TIndexKernel::addSwitches()
"OGR-readable/writeable tile index output")
("filespec", po::value<std::string>(&m_filespec),
"Build: Pattern of files to index. Merge: Output filename")
+ ("smooth_boundary", po::value<bool>(&m_smoothBoundary)->
+ zero_tokens()->implicit_value(false),
+ "use smoothed version of full boundary")
("fast_boundary", po::value<bool>(&m_fastBoundary)->
zero_tokens()->implicit_value(true),
- "use extend instead of exact boundary")
+ "use extent instead of exact boundary")
("lyr_name", po::value<std::string>(&m_layerName),
"OGR layer name to write into datasource")
("tindex_name", po::value<std::string>(&m_tileIndexColumnName)->
@@ -180,6 +184,9 @@ void TIndexKernel::validateSwitches()
throw pdal_error("--bounds option not supported when building "
"index.");
}
+ if (m_smoothBoundary && m_fastBoundary)
+ throw pdal_error("Can't request both smooth_boundary and "
+ "fast_boundary.");
}
@@ -415,7 +422,6 @@ void TIndexKernel::mergeFile()
Options reproOptions;
reproOptions.add("out_srs", m_tgtSrsString);
reproOptions.add("in_srs", f.m_srs);
- std::cerr << "Repro = " << m_tgtSrsString << "/" << f.m_srs << "!\n";
repro->setOptions(reproOptions);
premerge = repro;
}
@@ -478,7 +484,8 @@ bool TIndexKernel::createFeature(const FieldIndexes& indexes,
fileInfo.m_filename.c_str());
// Set the SRS into the feature.
- if (fileInfo.m_srs.empty())
+ // We override if m_assignSrsString is set
+ if (fileInfo.m_srs.empty() || m_assignSrsString.size())
fileInfo.m_srs = m_assignSrsString;
SpatialRef srcSrs(fileInfo.m_srs);
@@ -551,8 +558,9 @@ TIndexKernel::FileInfo TIndexKernel::getFileInfo(KernelFactory& factory,
Stage *s = f.createStage(driverName, true);
Options ops;
ops.add("filename", filename);
+ setCommonOptions(ops);
s->setOptions(ops);
-
+ applyExtraStageOptionsRecursive(s);
if (m_fastBoundary)
{
QuickInfo qi = s->preview();
@@ -587,12 +595,17 @@ TIndexKernel::FileInfo TIndexKernel::getFileInfo(KernelFactory& factory,
hexer->setInput(*s);
hexer->prepare(table);
- hexer->execute(table);
+ PointViewSet set = hexer->execute(table);
+
+ MetadataNode m = table.metadata();
+ m = m_smoothBoundary ?
+ m.findChild("filters.hexbin:smooth_boundary") :
+ m.findChild("filters.hexbin:boundary");
+ fileInfo.m_boundary = m.value();
- fileInfo.m_boundary =
- table.metadata().findChild("filters.hexbin:boundary").value();
- if (!table.spatialRef().empty())
- fileInfo.m_srs = table.spatialRef().getWKT();
+ PointViewPtr v = *set.begin();
+ if (!v->spatialReference().empty())
+ fileInfo.m_srs = v->spatialReference().getWKT();
}
FileUtils::fileTimes(filename, &fileInfo.m_ctime, &fileInfo.m_mtime);
@@ -739,15 +752,14 @@ gdal::Geometry TIndexKernel::prepareGeometry(const FileInfo& fileInfo)
throw pdal_error("Unable to import target SRS.");
Geometry g;
-
try
{
g = prepareGeometry(fileInfo.m_boundary, srcSrs, tgtSrs);
}
- catch (pdal_error)
+ catch (pdal_error& e)
{
oss << "Unable to transform geometry from source to target SRS for " <<
- fileInfo.m_filename << "'.";
+ fileInfo.m_filename << "'. Message is '" << e.what() << "'";
throw pdal_error(oss.str());
}
if (!g)
diff --git a/kernels/tindex/TIndexKernel.hpp b/kernels/tindex/TIndexKernel.hpp
index 705e67f..52a0ab2 100644
--- a/kernels/tindex/TIndexKernel.hpp
+++ b/kernels/tindex/TIndexKernel.hpp
@@ -113,6 +113,7 @@ private:
std::string m_tgtSrsString;
std::string m_assignSrsString;
bool m_fastBoundary;
+ bool m_smoothBoundary;
};
} // namespace pdal
diff --git a/kernels/translate/TranslateKernel.cpp b/kernels/translate/TranslateKernel.cpp
index 7627f91..7436441 100644
--- a/kernels/translate/TranslateKernel.cpp
+++ b/kernels/translate/TranslateKernel.cpp
@@ -164,7 +164,13 @@ int TranslateKernel::execute()
Stage* filter = &(m_manager->addFilter(filter_name));
if (filter == NULL)
+ {
+ std::ostringstream oss;
+ oss << "Unable to add filter " << filter_name << ". Filter "
+ "is invalid or plugin could not be loaded. Check "
+ "'pdal --drivers'.";
throw pdal_error("Error getting filter\n");
+ }
filter->setOptions(filterOptions);
filter->setInput(*stage);
diff --git a/pdal_defines.h.in b/pdal_defines.h.in
index 961efe1..71e0675 100644
--- a/pdal_defines.h.in
+++ b/pdal_defines.h.in
@@ -74,4 +74,6 @@
*/
#cmakedefine PDAL_APP_BUNDLE
+#define PDAL_PYTHON_LIBRARY "${PYTHON_LIBRARY}"
+
#endif
diff --git a/plugins/attribute/CMakeLists.txt b/plugins/attribute/CMakeLists.txt
index 7bce37b..90b499f 100644
--- a/plugins/attribute/CMakeLists.txt
+++ b/plugins/attribute/CMakeLists.txt
@@ -16,6 +16,11 @@ if (GEOS_FOUND AND GDAL_FOUND)
PDAL_ADD_PLUGIN(libname filter attribute
FILES "${srcs}" "${incs}"
LINK_WITH ${GEOS_LIBRARY} ${GDAL_LIBRARY})
+
+ if (WITH_TESTS)
+ PDAL_ADD_TEST(pdal_filters_attribute_test
+ FILES test/AttributeFilterTest.cpp)
+ endif()
else()
message(STATUS "BUILD_PLUGIN_ATTRIBUTE disabled because GEOS and/or GDAL was not found")
endif()
diff --git a/plugins/attribute/filters/AttributeFilter.cpp b/plugins/attribute/filters/AttributeFilter.cpp
index f98c06d..9970077 100644
--- a/plugins/attribute/filters/AttributeFilter.cpp
+++ b/plugins/attribute/filters/AttributeFilter.cpp
@@ -35,6 +35,7 @@
#include "AttributeFilter.hpp"
#include <memory>
+#include <vector>
#include <pdal/GlobalEnvironment.hpp>
#include <pdal/GDALUtils.hpp>
@@ -66,16 +67,33 @@ struct OGRDataSourceDeleter
}
};
-struct OGRGeometryDeleter
+namespace
{
- template <typename T>
- void operator()(T* ptr)
- {
- if (ptr)
- ::OGR_G_DestroyGeometry(ptr);
- }
-};
+static void _GEOSErrorHandler(const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ char buf[1024];
+
+ vsnprintf(buf, sizeof(buf), fmt, args);
+
+ va_end(args);
+}
+
+static void _GEOSWarningHandler(const char *fmt, ...)
+{
+ va_list args;
+
+ char buf[1024];
+ vsnprintf(buf, sizeof(buf), fmt, args);
+ std::cout << "GEOS warning: " << buf << std::endl;
+
+ va_end(args);
+}
+
+} // unnamed namespace
struct OGRFeatureDeleter
{
@@ -97,21 +115,8 @@ Options AttributeFilter::getDefaultOptions()
{
Options options;
- pdal::Option red("dimension", "Classification", "");
- pdal::Option b0("value","0", "");
- pdal::Option geometry("geometry","POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))", "");
- pdal::Option query("query","", "");
- pdal::Option layer("layer","", "");
- pdal::Option datasource("datasource","", "");
- pdal::Options redO;
- redO.add(b0);
- redO.add(geometry);
- redO.add(query);
- redO.add(layer);
- redO.add(datasource);
- red.setOptions(redO);
-
- options.add(red);
+ options.add("dimension", "Classification");
+ options.add("datasource", "source");
return options;
}
@@ -119,64 +124,77 @@ Options AttributeFilter::getDefaultOptions()
void AttributeFilter::processOptions(const Options& options)
{
- std::vector<Option> dimensions = options.getOptions("dimension");
- for (auto i = dimensions.begin(); i != dimensions.end(); ++i)
+ if (!options.hasOption("dimension"))
+ {
+ std::ostringstream oss;
+ oss << getName() << ": option 'dimension' must be specified.";
+ throw pdal_error(oss.str());
+ }
+ if (options.hasOption("value") && options.hasOption("datasource"))
+ {
+ std::ostringstream oss;
+ oss << getName() << ": options 'value' and 'datasource' mutually "
+ "exclusive.";
+ throw pdal_error(oss.str());
+ }
+ if (!options.hasOption("value") && !options.hasOption("datasource"))
{
- std::string name = i->getValue<std::string>();
- boost::optional<Options const&> dimensionOptions = i->getOptions();
- if (!dimensionOptions)
+ std::ostringstream oss;
+ oss << getName() << ": Either option 'value' or 'datasource' must "
+ "be specified.";
+ throw pdal_error(oss.str());
+ }
+
+ std::string ops[] = { "column", "query", "layer" };
+ for (auto& op : ops)
+ {
+ if (options.hasOption("value") && options.hasOption(op))
{
std::ostringstream oss;
- oss << "No options dimension given for dimension '" <<
- name << "'";
+ oss << getName() << ": option 'op' invalid with option 'value'.";
throw pdal_error(oss.str());
}
+ }
- AttributeInfo info;
- info.datasource = dimensionOptions->getValueOrDefault<std::string>("datasource", "");
-
-
- // If we have no datasource, then we're simply setting a value.
- // If we have no value, throw an exception.
- if (!info.datasource.size())
- {
- info.value = dimensionOptions->getValueOrThrow<std::string>("value");
- info.isogr = false;
- } else
- {
- info.column = dimensionOptions->getValueOrDefault<std::string>("column",""); // take first column
- info.query = dimensionOptions->getValueOrDefault<std::string>("query","");
- info.layer = dimensionOptions->getValueOrDefault<std::string>("layer",""); // take first layer
+ m_dimName = options.getValueOrDefault<std::string>("dimension");
+ m_value = options.getValueOrDefault<double>("value",
+ std::numeric_limits<double>::quiet_NaN());
+ m_datasource = options.getValueOrDefault<std::string>("datasource");
+ m_column = options.getValueOrDefault<std::string>("column");
+ m_query = options.getValueOrDefault<std::string>("query");
+ m_layer = options.getValueOrDefault<std::string>("layer");
+}
- }
- m_dimensions.insert(std::make_pair(name, info));
+void AttributeFilter::prepared(PointTableRef table)
+{
+ m_dim = table.layout()->findDim(m_dimName);
+ if (m_dim == Dimension::Id::Unknown)
+ {
+ std::ostringstream oss;
+ oss << getName() << ": Dimension '" << m_dimName << "' not found.";
+ throw pdal_error(oss.str());
}
}
+
void AttributeFilter::ready(PointTableRef table)
{
- for (auto& dim_par : m_dimensions)
+ if (m_value != m_value)
{
- Dimension::Id::Enum t = table.layout()->findDim(dim_par.first);
- dim_par.second.dim = t;
-
- if (dim_par.second.isogr)
+ m_ds = OGRDSPtr(OGROpen(m_datasource.c_str(), 0, 0),
+ OGRDataSourceDeleter());
+ if (!m_ds)
{
-
- OGRDSPtr ds = OGRDSPtr(OGROpen(dim_par.second.datasource.c_str(), 0, 0), OGRDataSourceDeleter());
- if (!ds)
- {
- std::ostringstream oss;
- oss << "Unable to open data source '" << dim_par.second.datasource <<"'";
- throw pdal_error(oss.str());
- }
- dim_par.second.ds = ds;
+ std::ostringstream oss;
+ oss << getName() << ": Unable to open data source '" <<
+ m_datasource << "'";
+ throw pdal_error(oss.str());
}
-
}
}
+
BOX3D computeBounds(GEOSContextHandle_t ctx, GEOSGeometry const *geometry)
{
uint32_t numInputDims;
@@ -208,13 +226,13 @@ BOX3D computeBounds(GEOSContextHandle_t ctx, GEOSGeometry const *geometry)
}
-GEOSGeometry* createGEOSPoint(GEOSContextHandle_t ctx, double x, double y, double z)
+GEOSGeometry* createGEOSPoint(GEOSContextHandle_t ctx,
+ double x, double y, double z)
{
int ret(0);
// precise filtering based on the geometry
- GEOSCoordSequence* coords =
- GEOSCoordSeq_create_r(ctx, 1, 3);
+ GEOSCoordSequence* coords = GEOSCoordSeq_create_r(ctx, 1, 3);
if (!coords)
throw pdal_error("unable to allocate coordinate sequence");
ret = GEOSCoordSeq_setX_r(ctx, coords, 0, x);
@@ -233,47 +251,46 @@ GEOSGeometry* createGEOSPoint(GEOSContextHandle_t ctx, double x, double y, doubl
return p;
}
-void AttributeFilter::UpdateGEOSBuffer(PointView& view, AttributeInfo& info)
+
+void AttributeFilter::UpdateGEOSBuffer(PointView& view)
{
QuadIndex idx(view);
- if (!info.lyr) // wake up the layer
+ if (m_layer.size())
+ m_lyr = OGR_DS_GetLayerByName(m_ds.get(), m_layer.c_str());
+ else if (m_query.size())
+ m_lyr = OGR_DS_ExecuteSQL(m_ds.get(), m_query.c_str(), 0, 0);
+ else
+ m_lyr = OGR_DS_GetLayer(m_ds.get(), 0);
+
+ if (!m_lyr)
{
- if (info.layer.size())
- info.lyr = OGR_DS_GetLayerByName(info.ds.get(), info.layer.c_str());
- else if (info.query.size())
- {
- info.lyr = OGR_DS_ExecuteSQL(info.ds.get(), info.query.c_str(), 0, 0);
- }
- else
- info.lyr = OGR_DS_GetLayer(info.ds.get(), 0);
- if (!info.lyr)
- {
- std::ostringstream oss;
- oss << "Unable to select layer '" << info.layer << "'";
- throw pdal_error(oss.str());
- }
+ std::ostringstream oss;
+ oss << getName() << ": Unable to select layer '" << m_layer << "'";
+ throw pdal_error(oss.str());
}
- OGRFeaturePtr feature = OGRFeaturePtr(OGR_L_GetNextFeature(info.lyr), OGRFeatureDeleter());
+ OGRFeaturePtr feature = OGRFeaturePtr(OGR_L_GetNextFeature(m_lyr),
+ OGRFeatureDeleter());
int field_index(1); // default to first column if nothing was set
- if (info.column.size())
+ if (m_column.size())
{
-
- field_index = OGR_F_GetFieldIndex(feature.get(), info.column.c_str());
+ field_index = OGR_F_GetFieldIndex(feature.get(), m_column.c_str());
if (field_index == -1)
{
std::ostringstream oss;
- oss << "No column name '" << info.column << "' was found.";
+ oss << getName() << ": No column name '" << m_column <<
+ "' was found.";
throw pdal_error(oss.str());
}
}
- while(feature)
+ while (feature)
{
OGRGeometryH geom = OGR_F_GetGeometryRef(feature.get());
OGRwkbGeometryType t = OGR_G_GetGeometryType(geom);
+ int32_t fieldVal = OGR_F_GetFieldAsInteger(feature.get(), field_index);
if (!(t == wkbPolygon ||
t == wkbMultiPolygon ||
@@ -281,28 +298,36 @@ void AttributeFilter::UpdateGEOSBuffer(PointView& view, AttributeInfo& info)
t == wkbMultiPolygon25D))
{
std::ostringstream oss;
- oss << "Geometry is not Polygon or MultiPolygon!";
+ oss << getName() << ": Geometry is not Polygon or MultiPolygon!";
throw pdal::pdal_error(oss.str());
}
- OGRGeometry* ogr_g = (OGRGeometry*) geom;
- GEOSGeometry* geos_g (0);
+ OGRGeometry *ogr_g = (OGRGeometry*)geom;
if (!m_geosEnvironment)
+ m_geosEnvironment = initGEOS_r(_GEOSWarningHandler,
+ _GEOSErrorHandler);
+
+ // Convert the the GDAL geom to WKB in order to avoid the version
+ // context issues with exporting directoly to GEOS.
+ OGRwkbByteOrder bo =
+ GEOS_getWKBByteOrder() == GEOS_WKB_XDR ? wkbXDR : wkbNDR;
+ int wkbSize = ogr_g->WkbSize();
+ std::vector<unsigned char> wkb(wkbSize);
+
+ ogr_g->exportToWkb(bo, wkb.data());
+ GEOSGeometry *geos_g = GEOSGeomFromWKB_buf_r(m_geosEnvironment,
+ wkb.data(), wkbSize);
+
+ GEOSPreparedGeometry const* geos_pg = GEOSPrepare_r(m_geosEnvironment,
+ geos_g);
+ if (!geos_pg)
{
-
-#if (GDAL_VERSION_MINOR < 11) && (GDAL_VERSION_MAJOR == 1)
- geos_g = ogr_g->exportToGEOS();
-#else
- m_geosEnvironment = ogr_g->createGEOSContext();
- geos_g = ogr_g->exportToGEOS(m_geosEnvironment);
-
-#endif
+ std::ostringstream oss;
+ oss << getName() << ": unable to prepare geometry for "
+ "index-accelerated intersection";
+ throw pdal_error(oss.str());
}
- GEOSPreparedGeometry const* geos_pg = GEOSPrepare_r(m_geosEnvironment, geos_g);
- if (!geos_pg)
- throw pdal_error("unable to prepare geometry for index-accelerated intersection");
-
// Compute a total bounds for the geometry. Query the QuadTree to
// find out the points that are inside the bbox. Then test each
// point in the bbox against the prepared geometry.
@@ -310,47 +335,40 @@ void AttributeFilter::UpdateGEOSBuffer(PointView& view, AttributeInfo& info)
std::vector<PointId> ids = idx.getPoints(box);
for (const auto& i : ids)
{
-
double x = view.getFieldAs<double>(Dimension::Id::X, i);
double y = view.getFieldAs<double>(Dimension::Id::Y, i);
double z = view.getFieldAs<double>(Dimension::Id::Z, i);
GEOSGeometry* p = createGEOSPoint(m_geosEnvironment, x, y ,z);
- if (static_cast<bool>(GEOSPreparedContains_r(m_geosEnvironment, geos_pg, p)))
+ if ((bool)(GEOSPreparedCovers_r(m_geosEnvironment, geos_pg, p)))
{
// We're in the poly, write the attribute value
- int32_t v = OGR_F_GetFieldAsInteger(feature.get(), field_index);
- view.setField(info.dim, i, v);
-// log()->get(LogLevel::Debug) << "Setting value: " << v << std::endl;
+ view.setField(m_dim, i, fieldVal);
}
-
GEOSGeom_destroy_r(m_geosEnvironment, p);
-
}
-
- feature = OGRFeaturePtr(OGR_L_GetNextFeature(info.lyr), OGRFeatureDeleter());
+ feature = OGRFeaturePtr(OGR_L_GetNextFeature(m_lyr),
+ OGRFeatureDeleter());
}
}
+
void AttributeFilter::filter(PointView& view)
{
+ if (m_value == m_value)
+ for (PointId i = 0; i < view.size(); ++i)
+ view.setField(m_dim, i, m_value);
+ else
+ UpdateGEOSBuffer(view);
+}
- for (auto& dim_par : m_dimensions)
- {
- if (dim_par.second.isogr)
- {
- UpdateGEOSBuffer(view, dim_par.second);
- } else
- {
- for (PointId i = 0; i < view.size(); ++i)
- {
- double v = boost::lexical_cast<double>(dim_par.second.value);
- view.setField(dim_par.second.dim, i, v);
- }
- }
- }
+void AttributeFilter::done(PointTableRef /*table*/)
+{
+ if (m_geosEnvironment)
+ finishGEOS_r(m_geosEnvironment);
+ m_geosEnvironment = 0;
}
} // namespace pdal
diff --git a/plugins/attribute/filters/AttributeFilter.hpp b/plugins/attribute/filters/AttributeFilter.hpp
index d9be09b..8feb0e8 100644
--- a/plugins/attribute/filters/AttributeFilter.hpp
+++ b/plugins/attribute/filters/AttributeFilter.hpp
@@ -53,65 +53,15 @@ namespace gdal
class ErrorHandler;
}
-
typedef std::shared_ptr<void> OGRDSPtr;
typedef std::shared_ptr<void> OGRFeaturePtr;
typedef std::shared_ptr<void> OGRGeometryPtr;
-class AttributeInfo
-{
-public:
- AttributeInfo() : ds(0), lyr(0), isogr(true) {};
-
- std::string connection;
- std::string column;
- std::string datasource;
- OGRDSPtr ds;
- OGRLayerH lyr;
- std::string query;
- std::string layer;
- std::string value;
- bool isogr;
- Dimension::Id::Enum dim;
- AttributeInfo(const AttributeInfo& other)
- : connection(other.connection)
- , column(other.column)
- , datasource(other.datasource)
- , ds(other.ds)
- , lyr(other.lyr)
- , query(other.query)
- , layer(other.layer)
- , value(other.value)
- , isogr(other.isogr)
- , dim(other.dim) {};
- AttributeInfo& operator=(const AttributeInfo& other)
- {
- if (&other != this)
- {
- connection = other.connection;
- column = other.column;
- datasource = other.datasource;
- ds = other.ds;
- lyr = other.lyr;
- query = other.query;
- value = other.value;
- layer = other.layer;
- isogr = other.isogr;
- dim = other.dim;
- }
- return *this;
- }
-
-};
-
-
-typedef std::map< std::string, AttributeInfo> AttributeInfoMap;
-
-
class PDAL_DLL AttributeFilter : public Filter
{
public:
- AttributeFilter() : Filter(), m_geosEnvironment(0) {};
+ AttributeFilter() : Filter(), m_ds(0), m_lyr(0), m_geosEnvironment(0)
+ {}
static void * create();
static int32_t destroy(void *);
@@ -122,18 +72,29 @@ public:
private:
virtual void initialize();
virtual void processOptions(const Options&);
+ virtual void prepared(PointTableRef table);
virtual void ready(PointTableRef table);
virtual void filter(PointView& view);
+ virtual void done(PointTableRef table);
AttributeFilter& operator=(const AttributeFilter&); // not implemented
AttributeFilter(const AttributeFilter&); // not implemented
typedef std::shared_ptr<void> OGRDSPtr;
- AttributeInfoMap m_dimensions;
+ OGRDSPtr m_ds;
+ OGRLayerH m_lyr;
+ std::string m_dimName;
+ double m_value;
+ std::string m_datasource;
+ std::string m_column;
+ std::string m_query;
+ std::string m_layer;
+ Dimension::Id::Enum m_dim;
+
GEOSContextHandle_t m_geosEnvironment;
std::unique_ptr<pdal::gdal::ErrorHandler> m_gdal_debug;
- void UpdateGEOSBuffer(PointView& view, AttributeInfo& info);
+ void UpdateGEOSBuffer(PointView& view);
};
diff --git a/plugins/attribute/test/AttributeFilterTest.cpp b/plugins/attribute/test/AttributeFilterTest.cpp
new file mode 100644
index 0000000..8d74b1b
--- /dev/null
+++ b/plugins/attribute/test/AttributeFilterTest.cpp
@@ -0,0 +1,186 @@
+/******************************************************************************
+* Copyright (c) 2015, Hobu Inc. (info at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in
+* the documentation and/or other materials provided
+* with the distribution.
+* * Neither the name of Hobu, Inc. nor the
+* names of its contributors may be used to endorse or promote
+* products derived from this software without specific prior
+* written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/StageFactory.hpp>
+#include <pdal/util/FileUtils.hpp>
+
+#include "Support.hpp"
+
+using namespace pdal;
+
+TEST(AttributeFilterTest, value)
+{
+ Options ro;
+ ro.add("filename", Support::datapath("autzen/autzen-dd.las"));
+
+ StageFactory factory;
+ Stage& r = *(factory.createStage("readers.las", true));
+ r.setOptions(ro);
+
+ Options fo;
+ fo.add("dimension", "X");
+ fo.add("value", 27.5);
+
+ Stage& f = *(factory.createStage("filters.attribute", true));
+ f.setInput(r);
+ f.setOptions(fo);
+
+ std::string tempfile(Support::temppath("out.las"));
+
+ Options wo;
+ wo.add("filename", tempfile);
+ Stage& w = *(factory.createStage("writers.las", true));
+ w.setInput(f);
+ w.setOptions(wo);
+
+ FileUtils::deleteFile(tempfile);
+ PointTable t1;
+ w.prepare(t1);
+ w.execute(t1);
+
+ Options testOptions;
+ testOptions.add("filename", tempfile);
+
+ Stage& test = *(factory.createStage("readers.las", true));
+ test.setOptions(testOptions);
+
+ PointTable t2;
+ test.prepare(t2);
+ PointViewSet s = test.execute(t2);
+ PointViewPtr v = *s.begin();
+ for (PointId i = 0; i < v->size(); ++i)
+ EXPECT_DOUBLE_EQ(v->getFieldAs<double>(Dimension::Id::X, i), 27.5);
+}
+
+TEST(AttributeFilterTest, datasource)
+{
+ Options ro;
+ ro.add("filename", Support::datapath("autzen/autzen-dd.las"));
+
+ StageFactory factory;
+ Stage& r = *(factory.createStage("readers.las", true));
+ r.setOptions(ro);
+
+ Options fo;
+ fo.add("dimension", "Classification");
+ fo.add("column", "cls");
+ fo.add("datasource", Support::datapath("autzen/attributes.shp"));
+
+ Stage& f = *(factory.createStage("filters.attribute", true));
+ f.setInput(r);
+ f.setOptions(fo);
+
+ std::string tempfile(Support::temppath("out.las"));
+
+ Options wo;
+ wo.add("filename", tempfile);
+ wo.add("forward", "all");
+ Stage& w = *(factory.createStage("writers.las", true));
+ w.setInput(f);
+ w.setOptions(wo);
+
+ FileUtils::deleteFile(tempfile);
+ PointTable t;
+ w.prepare(t);
+ w.execute(t);
+
+//
+//
+ Options testOptions;
+ testOptions.add("filename", tempfile);
+
+ Stage& test = *(factory.createStage("readers.las", true));
+ test.setOptions(testOptions);
+
+ Stage& c = *(factory.createStage("filters.crop", true));
+ c.setInput(test);
+
+ Options o1;
+ o1.add("polygon", "POLYGON ((-123.067019000727967 44.059524946819884,-123.066697831944637 44.059771500882199,-123.065494970755537 44.059838504937517,-123.064074882074451 44.059742872480356,-123.063707784110264 44.059184772926969,-123.06401206144227 44.05752667418929,-123.065925935478475 44.057786669839672,-123.065745673821624 44.058221493390228,-123.06633379431868 44.058264073197797,-123.066237450902648 44.058593303895073,-123.06633104847343 44.058966114097124,-123.06667192031054 44. [...]
+
+ c.setOptions(o1);
+
+ PointTable t1;
+ c.prepare(t1);
+ PointViewSet s = c.execute(t1);
+ PointViewPtr v = *s.begin();
+ for (PointId i = 0; i < v->size(); ++i)
+ EXPECT_EQ(v->getFieldAs<int>(Dimension::Id::Classification, i), 2);
+
+ Options o2;
+ o2.add("polygon", "POLYGON ((-123.064404672110015 44.062248205780641,-123.063001791092177 44.062295757390288,-123.062938948566199 44.061866413306625,-123.063711529699802 44.061825083575727,-123.062903757506561 44.060798284876931,-123.0634590922878 44.06084959530147,-123.063939134831102 44.061205726019097,-123.064707560079256 44.061834553141757,-123.064404672110015 44.062248205780641))");
+ c.setOptions(o2);
+
+ PointTable t2;
+ c.prepare(t2);
+ s = c.execute(t2);
+ v = *s.begin();
+ for (PointId i = 0; i < v->size(); ++i)
+ EXPECT_EQ(v->getFieldAs<int>(Dimension::Id::Classification, i), 5);
+
+ Options o3;
+ o3.add("polygon", "POLYGON ((-123.071105494548775 44.059121603563895,-123.070160265697027 44.059007342229378,-123.070431650409773 44.058379004056327,-123.071225617617372 44.058576450660659,-123.071105494548775 44.059121603563895))");
+ c.setOptions(o3);
+
+ PointTable t3;
+ c.prepare(t3);
+ s = c.execute(t3);
+ v = *s.begin();
+ for (PointId i = 0; i < v->size(); ++i)
+ EXPECT_EQ(v->getFieldAs<int>(Dimension::Id::Classification, i), 6);
+
+ Options o4;
+ o4.add("polygon", "POLYGON ((-123.06887558672102 44.059227793751305,-123.068425255931515 44.059301773132752,-123.067936238335534 44.059248990941661,-123.06749590912527 44.059043544671049,-123.06710185170931 44.058629650191868,-123.067099413306224 44.058063335596437,-123.067333190514816 44.057587417330502,-123.067852567837207 44.057320435256116,-123.068290450314009 44.057214830538491,-123.068899280712444 44.057225021409202,-123.069338909397359 44.057414523826182,-123.069655618140771 4 [...]
+ c.setOptions(o4);
+
+ PointTable t4;
+ c.prepare(t4);
+ s = c.execute(t4);
+ v = *s.begin();
+ for (PointId i = 0; i < v->size(); ++i)
+ EXPECT_EQ(v->getFieldAs<int>(Dimension::Id::Classification, i), 6);
+
+ Options o5;
+ o5.add("polygon", "POLYGON ((-123.071871740947586 44.058426242457685,-123.070376025800414 44.058117017731242,-123.07060216253906 44.057465769662898,-123.072144836409578 44.057837746292243,-123.071871740947586 44.058426242457685))");
+ c.setOptions(o5);
+
+ PointTable t5;
+ c.prepare(t5);
+ s = c.execute(t5);
+ v = *s.begin();
+ for (PointId i = 0; i < v->size(); ++i)
+ EXPECT_EQ(v->getFieldAs<int>(Dimension::Id::Classification, i), 6);
+}
diff --git a/plugins/geowave/CMakeLists.txt b/plugins/geowave/CMakeLists.txt
index 9dae78e..d76576d 100644
--- a/plugins/geowave/CMakeLists.txt
+++ b/plugins/geowave/CMakeLists.txt
@@ -8,9 +8,7 @@ include(${PDAL_CMAKE_DIR}/geowave.cmake)
set(GEOWAVE_LIBRARIES "")
set(GEOWAVE_LIBRARIES ${GEOWAVE_LIBRARIES} ${Boost_LIBRARIES})
-set(GEOWAVE_LIBRARIES ${GEOWAVE_LIBRARIES} ${JNI_LIBRARIES})
set(GEOWAVE_LIBRARIES ${GEOWAVE_LIBRARIES} ${JACE_LIBRARY})
-set(GEOWAVE_LIBRARIES ${GEOWAVE_LIBRARIES} ${JAVA_AWT_LIBRARY})
set(GEOWAVE_LIBRARIES ${GEOWAVE_LIBRARIES} ${JAVA_JVM_LIBRARY})
set(objs "")
diff --git a/plugins/geowave/io/GeoWaveReader.cpp b/plugins/geowave/io/GeoWaveReader.cpp
index b835895..c7c869b 100644
--- a/plugins/geowave/io/GeoWaveReader.cpp
+++ b/plugins/geowave/io/GeoWaveReader.cpp
@@ -57,11 +57,9 @@ using jace::StaticVmLoader;
#ifdef _WIN32
#include "jace/Win32VmLoader.h"
using jace::Win32VmLoader;
-const std::string os_pathsep(";");
#else
#include "jace/UnixVmLoader.h"
using ::jace::UnixVmLoader;
-const std::string os_pathsep(":");
#endif
#include "jace/JArray.h"
@@ -107,27 +105,27 @@ using jace::proxy::org::opengis::feature::simple::SimpleFeatureType;
#include "jace/proxy/org/opengis/feature/type/AttributeDescriptor.h"
using jace::proxy::org::opengis::feature::type::AttributeDescriptor;
-#include "jace/proxy/mil/nga/giat/geowave/index/ByteArrayId.h"
-using jace::proxy::mil::nga::giat::geowave::index::ByteArrayId;
-#include "jace/proxy/mil/nga/giat/geowave/vector/adapter/FeatureDataAdapter.h"
-using jace::proxy::mil::nga::giat::geowave::vector::adapter::FeatureDataAdapter;
-#include "jace/proxy/mil/nga/giat/geowave/vector/adapter/FeatureCollectionDataAdapter.h"
-using jace::proxy::mil::nga::giat::geowave::vector::adapter::FeatureCollectionDataAdapter;
-#include "jace/proxy/mil/nga/giat/geowave/store/index/Index.h"
-using jace::proxy::mil::nga::giat::geowave::store::index::Index;
-#include "jace/proxy/mil/nga/giat/geowave/store/index/IndexType_JaceIndexType.h"
-using jace::proxy::mil::nga::giat::geowave::store::index::IndexType_JaceIndexType;
-#include "jace/proxy/mil/nga/giat/geowave/store/query/Query.h"
-using jace::proxy::mil::nga::giat::geowave::store::query::Query;
-#include "jace/proxy/mil/nga/giat/geowave/store/query/SpatialQuery.h"
-using jace::proxy::mil::nga::giat::geowave::store::query::SpatialQuery;
-
-#include "jace/proxy/mil/nga/giat/geowave/accumulo/BasicAccumuloOperations.h"
-using jace::proxy::mil::nga::giat::geowave::accumulo::BasicAccumuloOperations;
-#include "jace/proxy/mil/nga/giat/geowave/accumulo/AccumuloDataStore.h"
-using jace::proxy::mil::nga::giat::geowave::accumulo::AccumuloDataStore;
-#include "jace/proxy/mil/nga/giat/geowave/accumulo/metadata/AccumuloAdapterStore.h"
-using jace::proxy::mil::nga::giat::geowave::accumulo::metadata::AccumuloAdapterStore;
+#include "jace/proxy/mil/nga/giat/geowave/core/index/ByteArrayId.h"
+using jace::proxy::mil::nga::giat::geowave::core::index::ByteArrayId;
+#include "jace/proxy/mil/nga/giat/geowave/adapter/vector/FeatureDataAdapter.h"
+using jace::proxy::mil::nga::giat::geowave::adapter::vector::FeatureDataAdapter;
+#include "jace/proxy/mil/nga/giat/geowave/adapter/vector/FeatureCollectionDataAdapter.h"
+using jace::proxy::mil::nga::giat::geowave::adapter::vector::FeatureCollectionDataAdapter;
+#include "jace/proxy/mil/nga/giat/geowave/core/store/index/Index.h"
+using jace::proxy::mil::nga::giat::geowave::core::store::index::Index;
+#include "jace/proxy/mil/nga/giat/geowave/core/geotime/IndexType_JaceIndexType.h"
+using jace::proxy::mil::nga::giat::geowave::core::geotime::IndexType_JaceIndexType;
+#include "jace/proxy/mil/nga/giat/geowave/core/store/query/Query.h"
+using jace::proxy::mil::nga::giat::geowave::core::store::query::Query;
+#include "jace/proxy/mil/nga/giat/geowave/core/geotime/store/query/SpatialQuery.h"
+using jace::proxy::mil::nga::giat::geowave::core::geotime::store::query::SpatialQuery;
+
+#include "jace/proxy/mil/nga/giat/geowave/datastore/accumulo/BasicAccumuloOperations.h"
+using jace::proxy::mil::nga::giat::geowave::datastore::accumulo::BasicAccumuloOperations;
+#include "jace/proxy/mil/nga/giat/geowave/datastore/accumulo/AccumuloDataStore.h"
+using jace::proxy::mil::nga::giat::geowave::datastore::accumulo::AccumuloDataStore;
+#include "jace/proxy/mil/nga/giat/geowave/datastore/accumulo/metadata/AccumuloAdapterStore.h"
+using jace::proxy::mil::nga::giat::geowave::datastore::accumulo::metadata::AccumuloAdapterStore;
static PluginInfo const s_info = PluginInfo(
"readers.geowave",
@@ -149,14 +147,14 @@ namespace pdal
{
Options options;
- Option zookeeperUrl("zookeeperUrl", "", "The comma-delimited URLs for all zookeeper servers, this will be directly used to instantiate a ZookeeperInstance");
- Option instanceName("instanceName", "", "The zookeeper instance name, this will be directly used to instantiate a ZookeeperInstance");
+ Option zookeeperUrl("zookeeper_url", "", "The comma-delimited URLs for all zookeeper servers, this will be directly used to instantiate a ZookeeperInstance");
+ Option instanceName("instance_name", "", "The zookeeper instance name, this will be directly used to instantiate a ZookeeperInstance");
Option username("username", "", "The username for the account to establish an Accumulo connector");
Option password("password", "", "The password for the account to establish an Accumulo connector");
- Option tableNamespace("tableNamespace", "", "The table name to be used when interacting with GeoWave");
- Option featureTypeName("featureTypeName", "", "The feature type name to be used when interacting with GeoWave");
- Option dataAdapter("dataAdapter", "FeatureDataAdapter", "FeatureCollectionDataAdapter stores multiple points per Accumulo entry. FeatureDataAdapter stores a single point per Accumulo entry.");
- Option pointsPerEntry("pointsPerEntry", 5000u, "Sets the maximum number of points per Accumulo entry when using FeatureCollectionDataAdapter.");
+ Option tableNamespace("table_namespace", "", "The table name to be used when interacting with GeoWave");
+ Option featureTypeName("feature_type_name", "", "The feature type name to be used when interacting with GeoWave");
+ Option dataAdapter("data_adapter", "FeatureDataAdapter", "FeatureCollectionDataAdapter stores multiple points per Accumulo entry. FeatureDataAdapter stores a single point per Accumulo entry.");
+ Option pointsPerEntry("points_per_entry", 5000u, "Sets the maximum number of points per Accumulo entry when using FeatureCollectionDataAdapter.");
Option bounds("bounds", "", "The extent of the bounding rectangle to use to query points, expressed as a string, eg: ([xmin, xmax], [ymin, ymax], [zmin, zmax])");
options.add(zookeeperUrl);
@@ -186,14 +184,14 @@ namespace pdal
void GeoWaveReader::processOptions(const Options& ops)
{
- m_zookeeperUrl = ops.getValueOrThrow<std::string>("zookeeperUrl");
- m_instanceName = ops.getValueOrThrow<std::string>("instanceName");
+ m_zookeeperUrl = ops.getValueOrThrow<std::string>("zookeeper_url");
+ m_instanceName = ops.getValueOrThrow<std::string>("instance_name");
m_username = ops.getValueOrThrow<std::string>("username");
m_password = ops.getValueOrThrow<std::string>("password");
- m_tableNamespace = ops.getValueOrThrow<std::string>("tableNamespace");
- m_featureTypeName = ops.getValueOrDefault<std::string>("featureTypeName", "PDAL_Point");
- m_useFeatCollDataAdapter = !(ops.getValueOrDefault<std::string>("dataAdapter", "FeatureCollectionDataAdapter").compare("FeatureDataAdapter") == 0);
- m_pointsPerEntry = ops.getValueOrDefault<uint32_t>("pointsPerEntry", 5000u);
+ m_tableNamespace = ops.getValueOrThrow<std::string>("table_namespace");
+ m_featureTypeName = ops.getValueOrDefault<std::string>("feature_type_name", "PDAL_Point");
+ m_useFeatCollDataAdapter = !(ops.getValueOrDefault<std::string>("data_adapter", "FeatureCollectionDataAdapter").compare("FeatureDataAdapter") == 0);
+ m_pointsPerEntry = ops.getValueOrDefault<uint32_t>("points_per_Entry", 5000u);
m_bounds = ops.getValueOrDefault<BOX3D>("bounds", BOX3D());
}
@@ -365,7 +363,6 @@ namespace pdal
{
StaticVmLoader loader(JNI_VERSION_1_2);
- std::string jaceClasspath = TOSTRING(JACE_RUNTIME_JAR);
std::string geowaveClasspath = TOSTRING(GEOWAVE_RUNTIME_JAR);
OptionList options;
@@ -374,7 +371,7 @@ namespace pdal
//options.push_back(CustomOption("-Xcheck:jni"));
//options.push_back(Verbose (Verbose::JNI));
//options.push_back(Verbose (Verbose::CLASS));
- options.push_back(ClassPath(jaceClasspath + os_pathsep + geowaveClasspath));
+ options.push_back(ClassPath(geowaveClasspath));
jace::createVm(loader, options);
}
diff --git a/plugins/geowave/io/GeoWaveReader.hpp b/plugins/geowave/io/GeoWaveReader.hpp
index e3fd571..6810300 100644
--- a/plugins/geowave/io/GeoWaveReader.hpp
+++ b/plugins/geowave/io/GeoWaveReader.hpp
@@ -42,8 +42,8 @@
#include <geos_c.h>
#endif
-#include "jace/proxy/mil/nga/giat/geowave/store/CloseableIterator.h"
-using jace::proxy::mil::nga::giat::geowave::store::CloseableIterator;
+#include "jace/proxy/mil/nga/giat/geowave/core/store/CloseableIterator.h"
+using jace::proxy::mil::nga::giat::geowave::core::store::CloseableIterator;
extern "C" int32_t GeoWaveReader_ExitFunc();
extern "C" PF_ExitFunc GeoWaveReader_InitPlugin();
diff --git a/plugins/geowave/io/GeoWaveWriter.cpp b/plugins/geowave/io/GeoWaveWriter.cpp
index d865a1e..494b77d 100644
--- a/plugins/geowave/io/GeoWaveWriter.cpp
+++ b/plugins/geowave/io/GeoWaveWriter.cpp
@@ -59,11 +59,9 @@ using jace::StaticVmLoader;
#ifdef _WIN32
#include "jace/Win32VmLoader.h"
using jace::Win32VmLoader;
-const std::string os_pathsep(";");
#else
#include "jace/UnixVmLoader.h"
using ::jace::UnixVmLoader;
-const std::string os_pathsep(":");
#endif
#include "jace/proxy/types/JDouble.h"
@@ -117,24 +115,24 @@ using jace::proxy::org::opengis::feature::simple::SimpleFeatureType;
#include "jace/proxy/org/opengis/feature/type/AttributeDescriptor.h"
using jace::proxy::org::opengis::feature::type::AttributeDescriptor;
-#include "jace/proxy/mil/nga/giat/geowave/index/ByteArrayId.h"
-using jace::proxy::mil::nga::giat::geowave::index::ByteArrayId;
-#include "jace/proxy/mil/nga/giat/geowave/vector/adapter/FeatureDataAdapter.h"
-using jace::proxy::mil::nga::giat::geowave::vector::adapter::FeatureDataAdapter;
-#include "jace/proxy/mil/nga/giat/geowave/vector/adapter/FeatureCollectionDataAdapter.h"
-using jace::proxy::mil::nga::giat::geowave::vector::adapter::FeatureCollectionDataAdapter;
-#include "jace/proxy/mil/nga/giat/geowave/store/adapter/WritableDataAdapter.h"
-using jace::proxy::mil::nga::giat::geowave::store::adapter::WritableDataAdapter;
-#include "jace/proxy/mil/nga/giat/geowave/store/index/Index.h"
-using jace::proxy::mil::nga::giat::geowave::store::index::Index;
-#include "jace/proxy/mil/nga/giat/geowave/store/index/IndexType_JaceIndexType.h"
-using jace::proxy::mil::nga::giat::geowave::store::index::IndexType_JaceIndexType;
-#include "jace/proxy/mil/nga/giat/geowave/accumulo/BasicAccumuloOperations.h"
-using jace::proxy::mil::nga::giat::geowave::accumulo::BasicAccumuloOperations;
-#include "jace/proxy/mil/nga/giat/geowave/accumulo/AccumuloDataStore.h"
-using jace::proxy::mil::nga::giat::geowave::accumulo::AccumuloDataStore;
-#include "jace/proxy/mil/nga/giat/geowave/accumulo/AccumuloIndexWriter.h"
-using jace::proxy::mil::nga::giat::geowave::accumulo::AccumuloIndexWriter;
+#include "jace/proxy/mil/nga/giat/geowave/core/index/ByteArrayId.h"
+using jace::proxy::mil::nga::giat::geowave::core::index::ByteArrayId;
+#include "jace/proxy/mil/nga/giat/geowave/adapter/vector/FeatureDataAdapter.h"
+using jace::proxy::mil::nga::giat::geowave::adapter::vector::FeatureDataAdapter;
+#include "jace/proxy/mil/nga/giat/geowave/adapter/vector/FeatureCollectionDataAdapter.h"
+using jace::proxy::mil::nga::giat::geowave::adapter::vector::FeatureCollectionDataAdapter;
+#include "jace/proxy/mil/nga/giat/geowave/core/store/adapter/WritableDataAdapter.h"
+using jace::proxy::mil::nga::giat::geowave::core::store::adapter::WritableDataAdapter;
+#include "jace/proxy/mil/nga/giat/geowave/core/store/index/Index.h"
+using jace::proxy::mil::nga::giat::geowave::core::store::index::Index;
+#include "jace/proxy/mil/nga/giat/geowave/core/geotime/IndexType_JaceIndexType.h"
+using jace::proxy::mil::nga::giat::geowave::core::geotime::IndexType_JaceIndexType;
+#include "jace/proxy/mil/nga/giat/geowave/datastore/accumulo/BasicAccumuloOperations.h"
+using jace::proxy::mil::nga::giat::geowave::datastore::accumulo::BasicAccumuloOperations;
+#include "jace/proxy/mil/nga/giat/geowave/datastore/accumulo/AccumuloDataStore.h"
+using jace::proxy::mil::nga::giat::geowave::datastore::accumulo::AccumuloDataStore;
+#include "jace/proxy/mil/nga/giat/geowave/datastore/accumulo/AccumuloIndexWriter.h"
+using jace::proxy::mil::nga::giat::geowave::datastore::accumulo::AccumuloIndexWriter;
static PluginInfo const s_info = PluginInfo(
"writers.geowave",
@@ -156,14 +154,14 @@ namespace pdal
{
Options options;
- Option zookeeperUrl("zookeeperUrl", "", "The comma-delimited URLs for all zookeeper servers, this will be directly used to instantiate a ZookeeperInstance.");
- Option instanceName("instanceName", "", "The zookeeper instance name, this will be directly used to instantiate a ZookeeperInstance.");
+ Option zookeeperUrl("zookeeper_url", "", "The comma-delimited URLs for all zookeeper servers, this will be directly used to instantiate a ZookeeperInstance.");
+ Option instanceName("instance_name", "", "The zookeeper instance name, this will be directly used to instantiate a ZookeeperInstance.");
Option username("username", "", "The username for the account to establish an Accumulo connector.");
Option password("password", "", "The password for the account to establish an Accumulo connector.");
- Option tableNamespace("tableNamespace", "", "The table name to be used when interacting with GeoWave.");
- Option featureTypeName("featureTypeName", "PDAL_Point", "The feature type name to be used when interacting with GeoWave.");
- Option dataAdapter("dataAdapter", "FeatureDataAdapter", "FeatureCollectionDataAdapter stores multiple points per Accumulo entry. FeatureDataAdapter stores a single point per Accumulo entry.");
- Option pointsPerEntry("pointsPerEntry", 5000u, "Sets the maximum number of points per Accumulo entry when using FeatureCollectionDataAdapter.");
+ Option tableNamespace("table_namespace", "", "The table name to be used when interacting with GeoWave.");
+ Option featureTypeName("feature_type_name", "PDAL_Point", "The feature type name to be used when interacting with GeoWave.");
+ Option dataAdapter("data_adapter", "FeatureDataAdapter", "FeatureCollectionDataAdapter stores multiple points per Accumulo entry. FeatureDataAdapter stores a single point per Accumulo entry.");
+ Option pointsPerEntry("points_per_entry", 5000u, "Sets the maximum number of points per Accumulo entry when using FeatureCollectionDataAdapter.");
options.add(zookeeperUrl);
options.add(instanceName);
@@ -179,14 +177,14 @@ namespace pdal
void GeoWaveWriter::processOptions(const Options& ops)
{
- m_zookeeperUrl = ops.getValueOrThrow<std::string>("zookeeperUrl");
- m_instanceName = ops.getValueOrThrow<std::string>("instanceName");
+ m_zookeeperUrl = ops.getValueOrThrow<std::string>("zookeeper_url");
+ m_instanceName = ops.getValueOrThrow<std::string>("instance_name");
m_username = ops.getValueOrThrow<std::string>("username");
m_password = ops.getValueOrThrow<std::string>("password");
- m_tableNamespace = ops.getValueOrThrow<std::string>("tableNamespace");
- m_featureTypeName = ops.getValueOrDefault<std::string>("featureTypeName", "PDAL_Point");
- m_useFeatCollDataAdapter = !(ops.getValueOrDefault<std::string>("dataAdapter", "FeatureCollectionDataAdapter").compare("FeatureDataAdapter") == 0);
- m_pointsPerEntry = ops.getValueOrDefault<uint32_t>("pointsPerEntry", 5000u);
+ m_tableNamespace = ops.getValueOrThrow<std::string>("table_namespace");
+ m_featureTypeName = ops.getValueOrDefault<std::string>("feature_type_name", "PDAL_Point");
+ m_useFeatCollDataAdapter = !(ops.getValueOrDefault<std::string>("data_adapter", "FeatureCollectionDataAdapter").compare("FeatureDataAdapter") == 0);
+ m_pointsPerEntry = ops.getValueOrDefault<uint32_t>("points_per_entry", 5000u);
}
void GeoWaveWriter::initialize()
@@ -315,7 +313,6 @@ namespace pdal
{
StaticVmLoader loader(JNI_VERSION_1_2);
- std::string jaceClasspath = TOSTRING(JACE_RUNTIME_JAR);
std::string geowaveClasspath = TOSTRING(GEOWAVE_RUNTIME_JAR);
OptionList options;
@@ -324,7 +321,7 @@ namespace pdal
//options.push_back(CustomOption("-Xcheck:jni"));
//options.push_back(Verbose (Verbose::JNI));
//options.push_back(Verbose (Verbose::CLASS));
- options.push_back(ClassPath(jaceClasspath + os_pathsep + geowaveClasspath));
+ options.push_back(ClassPath(geowaveClasspath));
jace::createVm(loader, options);
}
diff --git a/plugins/greyhound/io/GreyhoundReader.cpp b/plugins/greyhound/io/GreyhoundReader.cpp
index ff8c102..24ebde8 100644
--- a/plugins/greyhound/io/GreyhoundReader.cpp
+++ b/plugins/greyhound/io/GreyhoundReader.cpp
@@ -76,7 +76,7 @@ void GreyhoundReader::initialize()
void GreyhoundReader::processOptions(const Options& options)
{
m_url = options.getValueOrThrow<std::string>("url");
- m_pipelineId = options.getValueOrThrow<std::string>("pipelineId");
+ m_pipelineId = options.getValueOrThrow<std::string>("pipeline_id");
m_wsClient.initialize(m_url);
}
diff --git a/plugins/hexbin/filters/HexBin.cpp b/plugins/hexbin/filters/HexBin.cpp
index 95266bb..239d4a7 100644
--- a/plugins/hexbin/filters/HexBin.cpp
+++ b/plugins/hexbin/filters/HexBin.cpp
@@ -35,6 +35,7 @@
#include "HexBin.hpp"
#include <hexer/HexIter.hpp>
+#include <pdal/Geometry.hpp>
#include <pdal/StageFactory.hpp>
using namespace hexer;
@@ -82,6 +83,7 @@ void HexBin::filter(PointView& view)
double x = view.getFieldAs<double>(pdal::Dimension::Id::X, idx);
double y = view.getFieldAs<double>(pdal::Dimension::Id::Y, idx);
m_grid->addPoint(x, y);
+ m_count++;
}
}
@@ -141,6 +143,36 @@ void HexBin::done(PointTableRef table)
m_grid->toWKT(polygon);
m_metadata.add("boundary", polygon.str(),
"Boundary MULTIPOLYGON of domain");
+
+ /***
+ We want to make these bumps on edges go away, which means that
+ we want to elimnate both B and C. If we take a line from A -> C,
+ we need the tolerance to eliminate B. After that we're left with
+ the triangle ACD and we want to eliminate C. The perpendicular
+ distance from AD to C is the hexagon height / 2, so we set the
+ tolerance a little larger than that. This is larger than the
+ perpendicular distance needed to eliminate B in ABC, so should
+ serve for both cases.
+
+ B ______ C
+ / \
+ A / \ D
+
+ ***/
+ double tolerance = 1.1 * m_grid->height() / 2;
+ m_metadata.add("smoothed_boundary",
+ Geometry::smoothPolygon(polygon.str(), tolerance),
+ "Smoothed boundary MULTIPOLYGON of domain");
+ double area = Geometry::computeArea(polygon.str());
+
+ double density = (double) m_count / area ;
+ m_metadata.add("density",
+ density,
+ "Number of points per square unit");
+ m_metadata.add("area",
+ area,
+ "Area in square units of tessellated polygon");
+
}
} // namespace pdal
diff --git a/plugins/hexbin/filters/HexBin.hpp b/plugins/hexbin/filters/HexBin.hpp
index 2a73bcc..50bf09d 100644
--- a/plugins/hexbin/filters/HexBin.hpp
+++ b/plugins/hexbin/filters/HexBin.hpp
@@ -62,6 +62,7 @@ private:
int32_t m_density;
double m_edgeLength;
bool m_outputTesselation;
+ point_count_t m_count;
virtual void processOptions(const Options& options);
virtual void ready(PointTableRef table);
diff --git a/plugins/nitf/io/NitfReader.cpp b/plugins/nitf/io/NitfReader.cpp
index f3c6941..b3a93c8 100644
--- a/plugins/nitf/io/NitfReader.cpp
+++ b/plugins/nitf/io/NitfReader.cpp
@@ -97,7 +97,7 @@ std::string NitfReader::getName() const { return s_info.name; }
//
-void NitfReader::initialize()
+void NitfReader::initialize(PointTableRef table)
{
NitfFile nitf(m_filename);
nitf.open();
@@ -107,15 +107,11 @@ void NitfReader::initialize()
m_metadata.add("DESDATA_LENGTH", m_length);
nitf.close();
- LasReader::initialize();
-}
-
-void NitfReader::ready(PointTableRef table)
-{
// Initialize the LAS stuff with its own metadata node.
MetadataNode lasNode = m_metadata.add(LasReader::getName());
- LasReader::ready(table, lasNode);
+ initializeLocal(table, lasNode);
}
} // namespace pdal
+
diff --git a/plugins/nitf/io/NitfReader.hpp b/plugins/nitf/io/NitfReader.hpp
index 6a4cdfb..1231186 100644
--- a/plugins/nitf/io/NitfReader.hpp
+++ b/plugins/nitf/io/NitfReader.hpp
@@ -84,8 +84,7 @@ private:
std::unique_ptr<RDevice> m_rdevice;
std::unique_ptr<RStream> m_rstream;
- virtual void initialize();
- virtual void ready(PointTableRef table);
+ virtual void initialize(PointTableRef table);
NitfReader& operator=(const NitfReader&); // not implemented
NitfReader(const NitfReader&); // not implemented
};
diff --git a/plugins/nitf/io/NitfWriter.cpp b/plugins/nitf/io/NitfWriter.cpp
index 80e546f..6dc5961 100644
--- a/plugins/nitf/io/NitfWriter.cpp
+++ b/plugins/nitf/io/NitfWriter.cpp
@@ -143,50 +143,41 @@ NitfWriter::NitfWriter()
void NitfWriter::processOptions(const Options& options)
{
LasWriter::processOptions(options);
- m_cLevel = options.getValueOrDefault<std::string>("CLEVEL","03");
- m_sType = options.getValueOrDefault<std::string>("STYPE","BF01");
- m_oStationId = options.getValueOrDefault<std::string>("OSTAID","PDAL");
- m_fileTitle = options.getValueOrDefault<std::string>("FTITLE", "");
- m_fileClass = options.getValueOrDefault<std::string>("FSCLAS","U");
- m_origName = options.getValueOrDefault<std::string>("ONAME","");
- m_origPhone = options.getValueOrDefault<std::string>("OPHONE","");
- m_securityClass = options.getValueOrDefault<std::string>("FSCLAS","U");
+ m_cLevel = options.getValueOrDefault<std::string>("clevel","03");
+ m_sType = options.getValueOrDefault<std::string>("stype","BF01");
+ m_oStationId = options.getValueOrDefault<std::string>("ostaid", "PDAL");
+ m_fileTitle = options.getValueOrDefault<std::string>("ftitle");
+ m_fileClass = options.getValueOrDefault<std::string>("fsclas","U");
+ m_origName = options.getValueOrDefault<std::string>("oname");
+ m_origPhone = options.getValueOrDefault<std::string>("ophone");
+ m_securityClass = options.getValueOrDefault<std::string>("fsclas","U");
m_securityControlAndHandling =
- options.getValueOrDefault<std::string>("FSCTLH","");
+ options.getValueOrDefault<std::string>("fsctlh");
m_securityClassificationSystem =
- options.getValueOrDefault<std::string>("FSCLSY","");
- m_imgSecurityClass = options.getValueOrDefault<std::string>("FSCLAS","U");
- m_imgDate = getOptions().getValueOrDefault<std::string>("IDATIM", "");
- m_imgIdentifier2 = getOptions().getValueOrDefault<std::string>("IID2", "");
- m_sic = getOptions().getValueOrDefault<std::string>("FSCLTX", "");
- try
- {
- m_aimidb = getOptions().getOption("AIMIDB");
- }
- catch (Option::not_found)
- {}
- try
- {
- m_acftb = getOptions().getOption("ACFTB");
- }
- catch (Option::not_found)
- {}
+ options.getValueOrDefault<std::string>("fsclsy");
+ m_imgSecurityClass = options.getValueOrDefault<std::string>("fsclas","U");
+ m_imgDate = options.getValueOrDefault<std::string>("idatim");
+ m_imgIdentifier2 = options.getValueOrDefault<std::string>("iid2");
+ m_sic = options.getValueOrDefault<std::string>("fscltx");
+ m_aimidb = options.getValueOrDefault<StringList>("aimidb");
+ m_acftb = options.getValueOrDefault<StringList>("acftb");
}
void NitfWriter::writeView(const PointViewPtr view)
{
view->calculateBounds(m_bounds);
-
LasWriter::writeView(view);
}
-void NitfWriter::readyFile(const std::string& filename)
+void NitfWriter::readyFile(const std::string& filename,
+ const SpatialReference& srs)
{
m_error.setFilename(filename);
m_nitfFilename = filename;
- prepOutput(&m_oss);
+ Utils::writeProgress(m_progressFd, "READYFILE", filename);
+ prepOutput(&m_oss, srs);
}
@@ -319,35 +310,39 @@ void NitfWriter::doneFile()
iSource.addBand(*band);
//AIMIDB
- if (!m_aimidb.empty())
+ ::nitf::TRE aimidbTre("AIMIDB");
+ for (auto& s : m_aimidb)
{
- boost::optional<const Options&> options = m_aimidb.getOptions();
- if (options)
+ StringList v = Utils::split2(s, ':');
+ if (v.size() != 2)
{
- ::nitf::TRE tre("AIMIDB");
- std::vector<Option> opts = options->getOptions();
- for (auto i = opts.begin(); i != opts.end(); ++i)
- {
- tre.setField(i->getName(), i->getValue<std::string>());
- }
- subheader.getExtendedSection().appendTRE(tre);
+ std::ostringstream oss;
+ oss << "Invalid name/value for AIMDB '" << s <<
+ "'. Format: <name>:<value>.";
+ throw oss.str();
}
+ Utils::trim(v[0]);
+ Utils::trim(v[1]);
+ aimidbTre.setField(v[0], v[1]);
+ subheader.getExtendedSection().appendTRE(aimidbTre);
}
//ACFTB
- if (!m_acftb.empty())
+ ::nitf::TRE acftbTre("ACFTB");
+ for (auto& s : m_acftb)
{
- boost::optional<const Options&> options = m_acftb.getOptions();
- if (options)
+ StringList v = Utils::split2(s, ':');
+ if (v.size() != 2)
{
- ::nitf::TRE tre("ACFTB");
- std::vector<Option> opts = options->getOptions();
- for (auto i = opts.begin(); i != opts.end(); ++i)
- {
- tre.setField(i->getName(), i->getValue<std::string>());
- }
- subheader.getExtendedSection().appendTRE(tre);
+ std::ostringstream oss;
+ oss << "Invalid name/value for ACFTB '" << s <<
+ "'. Format: <name>:<value>.";
+ throw oss.str();
}
+ Utils::trim(v[0]);
+ Utils::trim(v[1]);
+ acftbTre.setField(v[0], v[1]);
+ subheader.getExtendedSection().appendTRE(acftbTre);
}
::nitf::Writer writer;
diff --git a/plugins/nitf/io/NitfWriter.hpp b/plugins/nitf/io/NitfWriter.hpp
index e446f7f..f5330ea 100644
--- a/plugins/nitf/io/NitfWriter.hpp
+++ b/plugins/nitf/io/NitfWriter.hpp
@@ -52,7 +52,8 @@ public:
private:
virtual void processOptions(const Options& options);
- virtual void readyFile(const std::string& filename);
+ virtual void readyFile(const std::string& filename,
+ const SpatialReference& srs);
virtual void doneFile();
virtual void writeView(const PointViewPtr view);
@@ -70,8 +71,8 @@ private:
std::string m_securityClassificationSystem;
std::string m_imgSecurityClass;
std::string m_imgDate;
- pdal::Option m_aimidb;
- pdal::Option m_acftb;
+ StringList m_aimidb;
+ StringList m_acftb;
std::string m_imgIdentifier2;
std::string m_sic;
std::stringstream m_oss;
diff --git a/plugins/nitf/test/NitfReaderTest.cpp b/plugins/nitf/test/NitfReaderTest.cpp
index 11e809c..388bd1b 100644
--- a/plugins/nitf/test/NitfReaderTest.cpp
+++ b/plugins/nitf/test/NitfReaderTest.cpp
@@ -171,5 +171,5 @@ TEST(NitfReaderTest, optionSrs)
EXPECT_EQ(sr, nitfReader->getSpatialReference().getWKT());
EXPECT_EQ("", writer.getSpatialReference().getWKT());
- EXPECT_EQ(sr, table.spatialRef().getWKT());
+ EXPECT_EQ(sr, table.spatialReference().getWKT());
}
diff --git a/plugins/nitf/test/NitfWriterTest.cpp b/plugins/nitf/test/NitfWriterTest.cpp
index 0d0f881..b09ea13 100644
--- a/plugins/nitf/test/NitfWriterTest.cpp
+++ b/plugins/nitf/test/NitfWriterTest.cpp
@@ -121,19 +121,19 @@ TEST(NitfWriterTest, test1)
Option debug("debug", true);
Option verbose("verbose", 8);
- Option datetime("IDATIM", "20110516183337");
+ Option datetime("idatim", "20110516183337");
writer_opts.add(datetime);
- Option cls("FSCLAS", "S");
+ Option cls("fsclas", "S");
writer_opts.add(cls);
- Option phone("OPHONE", "5159664628");
+ Option phone("ophone", "5159664628");
writer_opts.add(phone);
- Option name("ONAME", "Howard Butler");
+ Option name("oname", "Howard Butler");
writer_opts.add(name);
- Option ftitle("FTITLE", "LiDAR from somewhere");
+ Option ftitle("ftitle", "LiDAR from somewhere");
writer_opts.add(ftitle);
// writer_opts.add(debug);
diff --git a/plugins/oci/io/OciReader.cpp b/plugins/oci/io/OciReader.cpp
index 3a8125b..903cf6d 100644
--- a/plugins/oci/io/OciReader.cpp
+++ b/plugins/oci/io/OciReader.cpp
@@ -53,14 +53,13 @@ std::string OciReader::getName() const { return s_info.name; }
void OciReader::processOptions(const Options& options)
{
- m_schemaFile = options.getValueOrDefault<std::string>(
- "xml_schema_dump", std::string());
+ m_schemaFile = options.getValueOrDefault<std::string>("xml_schema_dump");
if (options.hasOption("spatialreference"))
m_spatialRef = boost::optional<SpatialReference>(
options.getValueOrThrow<pdal::SpatialReference>(
"spatialreference"));
m_query = options.getValueOrThrow<std::string>("query");
- m_connSpec = options.getValueOrDefault<std::string>("connection", "");
+ m_connSpec = options.getValueOrDefault<std::string>("connection");
m_updatePointSourceId = options.getValueOrDefault<bool>(
"populate_pointsourceid", false);
diff --git a/plugins/oci/io/OciWriter.cpp b/plugins/oci/io/OciWriter.cpp
index 379ad34..33555df 100644
--- a/plugins/oci/io/OciWriter.cpp
+++ b/plugins/oci/io/OciWriter.cpp
@@ -87,8 +87,8 @@ Options OciWriter::getDefaultOptions()
Options options;
Option is3d("is3d", false,
- "Should we use 3D objects for SDO_PC PC_EXTENT, BLK_EXTENT, "
- "and indexing");
+ "Should we use 3D objects (include the z dimension) for SDO_PC "
+ "PC_EXTENT, BLK_EXTENT, and indexing");
Option solid("solid", false,
"Define the point cloud's PC_EXTENT geometry gtype as (1,1007,3) "
"instead of the normal (1,1003,3), and use gtype 3008/2008 vs "
@@ -433,7 +433,7 @@ std::string OciWriter::loadSQLData(std::string const& filename)
void OciWriter::runFileSQL(std::string const& filename)
{
std::ostringstream oss;
- std::string sql = getOptions().getValueOrDefault<std::string>(filename, "");
+ std::string sql = getOptions().getValueOrDefault<std::string>(filename);
if (!sql.size())
return;
@@ -670,6 +670,7 @@ bool OciWriter::isValidWKT(std::string const& input)
void OciWriter::processOptions(const Options& options)
{
+ m_3d = getDefaultedOption<bool>(options, "is3d");
m_precision = getDefaultedOption<uint32_t>(options,
"stream_output_precision");
m_createIndex = options.getValueOrDefault<bool>("create_index", true);
@@ -680,7 +681,6 @@ void OciWriter::processOptions(const Options& options)
options.getValueOrDefault<bool>("disable_cloud_trigger", false);
m_trace = options.getValueOrDefault<bool>("do_trace", false);
m_solid = getDefaultedOption<bool>(options, "solid");
- m_3d = getDefaultedOption<bool>(options, "is3d");
m_srid = options.getValueOrThrow<uint32_t>("srid");
m_baseTableBounds =
getDefaultedOption<BOX3D>(options, "base_table_bounds");
diff --git a/plugins/p2g/io/P2gWriter.cpp b/plugins/p2g/io/P2gWriter.cpp
index b6b5d8d..770fdfe 100644
--- a/plugins/p2g/io/P2gWriter.cpp
+++ b/plugins/p2g/io/P2gWriter.cpp
@@ -107,16 +107,24 @@ void P2gWriter::processOptions(const Options& options)
}
-/*
void P2gWriter::ready(PointTableRef table)
{
+/*
double min_x = (std::numeric_limits<double>::max)();
double max_x = (std::numeric_limits<double>::min)();
double min_y = (std::numeric_limits<double>::max)();
double max_y = (std::numeric_limits<double>::min)();
setBounds(pdal::Bounds<double>(min_x, min_y, max_x, max_y));
-}
*/
+ if (!table.spatialReferenceUnique())
+ {
+ std::ostringstream oss;
+
+ oss << getName() << ": Can't write output with multiple spatial "
+ "references.";
+ throw pdal_error(oss.str());
+ }
+}
Options P2gWriter::getDefaultOptions()
@@ -142,8 +150,7 @@ Options P2gWriter::getDefaultOptions()
void P2gWriter::write(const PointViewPtr view)
{
- std::string z_name = getOptions().getValueOrDefault<std::string>("Z", "Z");
-
+ std::string z_name = getOptions().getValueOrDefault<std::string>("z", "Z");
for (point_count_t idx = 0; idx < view->size(); idx++)
{
@@ -215,17 +222,17 @@ void P2gWriter::done(PointTableRef table)
adfGeoTransform[4] = 0.0;
adfGeoTransform[5] = -1 * m_GRID_DIST_Y;
- SpatialReference const& srs = table.spatialRef();
+ SpatialReference const& srs = table.spatialReference();
- log()->get(LogLevel::Debug) << "Output SRS :'" << srs.getWKT() << "'" << std::endl;
- if ((rc = m_interpolator->finish(const_cast<char*>(m_filename.c_str()), m_outputFormat, m_outputTypes, adfGeoTransform, srs.getWKT().c_str())) < 0)
+ log()->get(LogLevel::Debug) << "Output SRS :'" << srs.getWKT() << "'" <<
+ std::endl;
+ if ((rc = m_interpolator->finish(const_cast<char*>(m_filename.c_str()),
+ m_outputFormat, m_outputTypes, adfGeoTransform,
+ srs.getWKT().c_str())) < 0)
{
throw p2g_error("interp->finish() error");
}
-
- return;
}
-
-
} // namespaces
+
diff --git a/plugins/p2g/io/P2gWriter.hpp b/plugins/p2g/io/P2gWriter.hpp
index 2ef645b..63d8953 100644
--- a/plugins/p2g/io/P2gWriter.hpp
+++ b/plugins/p2g/io/P2gWriter.hpp
@@ -78,6 +78,7 @@ private:
P2gWriter& operator=(const P2gWriter&); // not implemented
virtual void processOptions(const Options& options);
+ virtual void ready(PointTableRef table);
virtual void write(const PointViewPtr view);
virtual void done(PointTableRef table);
diff --git a/plugins/pcl/CMakeLists.txt b/plugins/pcl/CMakeLists.txt
index 54d8e61..86d0cc0 100644
--- a/plugins/pcl/CMakeLists.txt
+++ b/plugins/pcl/CMakeLists.txt
@@ -31,6 +31,7 @@ include_directories(${PCL_INCLUDE_DIRS})
include_directories(${CMAKE_CURRENT_LIST_DIR})
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/filters)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/pipeline)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/dartsample)
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
if (NOT WIN32)
@@ -131,6 +132,44 @@ PDAL_ADD_PLUGIN(ground_filter_libname filter ground
FILES filters/GroundFilter.hpp filters/GroundFilter.cpp
LINK_WITH ${PCL_LIBRARIES})
+PDAL_ADD_PLUGIN(statistical_outlier_filter_libname filter statisticaloutlier
+ FILES filters/StatisticalOutlierFilter.hpp filters/StatisticalOutlierFilter.cpp
+ LINK_WITH ${PCL_LIBRARIES})
+
+PDAL_ADD_PLUGIN(radius_outlier_filter_libname filter radiusoutlier
+ FILES filters/RadiusOutlierFilter.hpp filters/RadiusOutlierFilter.cpp
+ LINK_WITH ${PCL_LIBRARIES})
+
+PDAL_ADD_PLUGIN(voxelgrid_filter_libname filter voxelgrid
+ FILES filters/VoxelGridFilter.hpp filters/VoxelGridFilter.cpp
+ LINK_WITH ${PCL_LIBRARIES})
+
+PDAL_ADD_PLUGIN(movingleastsquares_filter_libname filter movingleastsquares
+ FILES filters/MovingLeastSquaresFilter.hpp filters/MovingLeastSquaresFilter.cpp
+ LINK_WITH ${PCL_LIBRARIES})
+
+PDAL_ADD_PLUGIN(gridprojection_filter_libname filter gridprojection
+ FILES filters/GridProjectionFilter.hpp filters/GridProjectionFilter.cpp
+ LINK_WITH ${PCL_LIBRARIES})
+
+PDAL_ADD_PLUGIN(poisson_filter_libname filter poisson
+ FILES filters/PoissonFilter.hpp filters/PoissonFilter.cpp
+ LINK_WITH ${PCL_LIBRARIES})
+
+PDAL_ADD_PLUGIN(greedyprojection_filter_libname filter greedyprojection
+ FILES filters/GreedyProjectionFilter.hpp filters/GreedyProjectionFilter.cpp
+ LINK_WITH ${PCL_LIBRARIES})
+
+PDAL_ADD_PLUGIN(height_filter_libname filter height
+ FILES filters/HeightFilter.cpp
+ LINK_WITH ${PCL_LIBRARIES})
+
+PDAL_ADD_PLUGIN(dartsample_filter_libname filter dartsample
+ FILES
+ filters/DartSampleFilter.cpp
+ dartsample/dart_sample.cpp
+ LINK_WITH ${PCL_LIBRARIES})
+
#
# PCL Kernel
#
diff --git a/plugins/python/plang/Plang.hpp b/plugins/pcl/dartsample/dart_sample.cpp
similarity index 68%
rename from plugins/python/plang/Plang.hpp
rename to plugins/pcl/dartsample/dart_sample.cpp
index f132790..c8bde0f 100644
--- a/plugins/python/plang/Plang.hpp
+++ b/plugins/pcl/dartsample/dart_sample.cpp
@@ -1,5 +1,5 @@
/******************************************************************************
-* Copyright (c) 2015, Hobu Inc. (info at hobu.co)
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
*
* All rights reserved.
*
@@ -13,9 +13,10 @@
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided
* with the distribution.
-* * Neither the name of Hobu, Inc. nor the names of its contributors
-* may be used to endorse or promote products derived from this
-* software without specific prior written permission.
+* * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+* names of its contributors may be used to endorse or promote
+* products derived from this software without specific prior
+* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
@@ -31,25 +32,18 @@
* OF SUCH DAMAGE.
****************************************************************************/
-#pragma once
+#include "dart_sample.hpp"
-#include <pdal/Metadata.hpp>
+#ifndef PCL_NO_PRECOMPILE
+#include <pcl/impl/instantiate.hpp>
+#include <pcl/point_types.h>
-// forward declare PyObject so we don't need the python headers everywhere
-// see: http://mail.python.org/pipermail/python-dev/2003-August/037601.html
-#ifndef PyObject_HEAD
-struct _object;
-typedef _object PyObject;
+// Instantiations of specific point types
+#ifdef PCL_ONLY_CORE_POINT_TYPES
+PCL_INSTANTIATE(DartSample,
+ (pcl::PointXYZ)(pcl::PointXYZI)(pcl::PointXYZRGBA)(pcl::PointXYZRGB))
+#else
+PCL_INSTANTIATE(DartSample, PCL_XYZ_POINT_TYPES)
#endif
-namespace pdal
-{
-namespace plang
-{
-
-PyObject *fromMetadata(MetadataNode m);
-void addMetadata(PyObject *list, MetadataNode m);
-
-} // namespace plang
-} // namespace pdal
-
+#endif // PCL_NO_PRECOMPILE
diff --git a/plugins/pcl/dartsample/dart_sample.h b/plugins/pcl/dartsample/dart_sample.h
new file mode 100644
index 0000000..709f4b1
--- /dev/null
+++ b/plugins/pcl/dartsample/dart_sample.h
@@ -0,0 +1,112 @@
+/******************************************************************************
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in
+* the documentation and/or other materials provided
+* with the distribution.
+* * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+* names of its contributors may be used to endorse or promote
+* products derived from this software without specific prior
+* written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pcl/filters/filter_indices.h>
+
+namespace pcl
+{
+ /** \brief @b DartSample performs dart throwing for a given radius.
+ * \author Bradley J Chambers
+ * \ingroup filters
+ */
+ template<typename PointT>
+ class DartSample : public FilterIndices<PointT>
+ {
+ using FilterIndices<PointT>::filter_name_;
+ using FilterIndices<PointT>::getClassName;
+ using FilterIndices<PointT>::indices_;
+ using FilterIndices<PointT>::input_;
+ using FilterIndices<PointT>::negative_;
+ using FilterIndices<PointT>::user_filter_value_;
+ using FilterIndices<PointT>::extract_removed_indices_;
+ using FilterIndices<PointT>::removed_indices_;
+
+ typedef typename FilterIndices<PointT>::PointCloud PointCloud;
+ typedef typename PointCloud::Ptr PointCloudPtr;
+ typedef typename PointCloud::ConstPtr PointCloudConstPtr;
+
+ public:
+
+ typedef boost::shared_ptr< DartSample<PointT> > Ptr;
+ typedef boost::shared_ptr< const DartSample<PointT> > ConstPtr;
+
+ /** \brief Empty constructor. */
+ DartSample (bool extract_removed_indices = false) :
+ FilterIndices<PointT> (extract_removed_indices),
+ radius_ (1.0)
+ {
+ filter_name_ = "DartSample";
+ }
+
+ /** \brief Set minimum distance radius for adding points..
+ * \param radius
+ */
+ inline void
+ setRadius (double radius)
+ {
+ radius_ = radius;
+ }
+
+ /** \brief Get the value of the internal \a radius parameter.
+ */
+ inline double
+ getRadius ()
+ {
+ return (radius_);
+ }
+
+ protected:
+
+ /** \brief Minimum distance radius for adding points. */
+ double radius_;
+
+ /** \brief Sample of point indices into a separate PointCloud
+ * \param output the resultant point cloud
+ */
+ void
+ applyFilter (PointCloud &output);
+
+ /** \brief Sample of point indices
+ * \param indices the resultant point cloud indices
+ */
+ void
+ applyFilter (std::vector<int> &indices);
+ };
+}
+
+#ifdef PCL_NO_PRECOMPILE
+#include "dart_sample.hpp"
+#endif
diff --git a/plugins/pcl/dartsample/dart_sample.hpp b/plugins/pcl/dartsample/dart_sample.hpp
new file mode 100644
index 0000000..a022b3e
--- /dev/null
+++ b/plugins/pcl/dartsample/dart_sample.hpp
@@ -0,0 +1,116 @@
+/******************************************************************************
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in
+* the documentation and/or other materials provided
+* with the distribution.
+* * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+* names of its contributors may be used to endorse or promote
+* products derived from this software without specific prior
+* written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include "dart_sample.h"
+
+#include <algorithm>
+#include <cmath>
+#include <cstdlib>
+#include <ctime>
+#include <vector>
+
+#include <pcl/common/io.h>
+#include <pcl/console/print.h>
+#include <pcl/io/pcd_io.h>
+#include <pcl/octree/octree.h>
+#include <pcl/point_traits.h>
+#include <pcl/point_types.h>
+
+///////////////////////////////////////////////////////////////////////////////
+template<typename PointT> void
+pcl::DartSample<PointT>::applyFilter (PointCloud &output)
+{
+ std::vector<int> indices;
+ output.is_dense = true;
+ applyFilter (indices);
+ copyPointCloud (*input_, indices, output);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+template<typename PointT>
+void
+pcl::DartSample<PointT>::applyFilter (std::vector<int> &indices)
+{
+ unsigned N = static_cast<unsigned> (input_->size ());
+
+ std::srand ( std::time (NULL));
+ std::vector<int> shuffled_indices = (*indices_);
+ std::random_shuffle (shuffled_indices.begin (), shuffled_indices.end ());
+
+ // Reserve N indices/removed_indices_
+ indices.resize (static_cast<size_t> (N));
+ if (extract_removed_indices_)
+ removed_indices_->resize (static_cast<size_t> (N));
+
+ unsigned i = 0;
+ unsigned ri = 0;
+
+ // Create octree, seeded with the first index
+ pcl::octree::OctreePointCloudSearch<PointT> tree (radius_ / std::sqrt (3));
+ typename pcl::PointCloud<PointT>::Ptr cloud_t (new pcl::PointCloud<PointT>);
+ tree.setInputCloud (cloud_t);
+ tree.addPointToCloud (input_->points[shuffled_indices[0]], cloud_t);
+
+ // Keep the first index
+ indices[i++] = shuffled_indices[0];
+
+ // Iterate over remaining points, keeping only those meeting the minimum
+ // distance criteria.
+ for (auto const& j : shuffled_indices)
+ {
+ std::vector<int> neighbors;
+ std::vector<float> sqr_distances;
+ PointT temp_pt = input_->points[j];
+
+ int num = tree.radiusSearch (temp_pt, radius_, neighbors, sqr_distances, 1);
+
+ if (num == 0)
+ {
+ indices[i++] = j;
+ tree.addPointToCloud (temp_pt, cloud_t);
+ }
+ else if (extract_removed_indices_)
+ {
+ (*removed_indices_)[ri++] = j;
+ }
+ }
+
+ indices.resize (static_cast<size_t> (i));
+ removed_indices_->resize (static_cast<size_t> (ri));
+}
+
+#define PCL_INSTANTIATE_DartSample(T) \
+ template class PCL_EXPORTS pcl::DartSample<T>;
diff --git a/plugins/pcl/filters/PCLBlock.cpp b/plugins/pcl/filters/DartSampleFilter.cpp
similarity index 52%
copy from plugins/pcl/filters/PCLBlock.cpp
copy to plugins/pcl/filters/DartSampleFilter.cpp
index a5b5cb6..5f8edad 100644
--- a/plugins/pcl/filters/PCLBlock.cpp
+++ b/plugins/pcl/filters/DartSampleFilter.cpp
@@ -1,5 +1,5 @@
/******************************************************************************
-* Copyright (c) 2013-2014, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
*
* All rights reserved.
*
@@ -32,8 +32,9 @@
* OF SUCH DAMAGE.
****************************************************************************/
-#include "PCLBlock.hpp"
+#include "DartSampleFilter.hpp"
+#include "dart_sample.h"
#include "PCLConversions.hpp"
#include "PCLPipeline.h"
@@ -44,50 +45,46 @@
namespace pdal
{
-static PluginInfo const s_info = PluginInfo(
- "filters.pclblock",
- "PCL Block implementation",
- "http://pdal.io/stages/filters.pclblock.html" );
+static PluginInfo const s_info =
+ PluginInfo("filters.dartsample", "Dart sample filter",
+ "http://pdal.io/stages/filters.dartsample.html");
-CREATE_SHARED_PLUGIN(1, 0, PCLBlock, Filter, s_info)
+CREATE_SHARED_PLUGIN(1, 0, DartSampleFilter, Filter, s_info)
-std::string PCLBlock::getName() const { return s_info.name; }
+std::string DartSampleFilter::getName() const
+{
+ return s_info.name;
+}
-/** \brief This method processes the PointView through the given pipeline. */
+Options DartSampleFilter::getDefaultOptions()
+{
+ Options options;
+ options.add("radius", 1.0, "Minimum distance criterion");
+ return options;
+}
-void PCLBlock::processOptions(const Options& options)
+void DartSampleFilter::processOptions(const Options& options)
{
- m_filename = options.getValueOrDefault<std::string>("filename", "");
- m_json = options.getValueOrDefault<std::string>("json", "");
+ m_radius = options.getValueOrDefault<double>("radius", 1.0);
}
-PointViewSet PCLBlock::run(PointViewPtr input)
+PointViewSet DartSampleFilter::run(PointViewPtr input)
{
PointViewPtr output = input->makeNew();
PointViewSet viewSet;
viewSet.insert(output);
- bool logOutput = log()->getLevel() > LogLevel::Debug1;
- if (logOutput)
- log()->floatPrecision(8);
-
- log()->get(LogLevel::Debug2) <<
- input->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
- input->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
- input->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
- log()->get(LogLevel::Debug2) << "Process PCLBlock..." << std::endl;
+ log()->floatPrecision(2);
+ log()->get(LogLevel::Info) << "DartSampleFilter (radius="
+ << m_radius << ")\n";
BOX3D buffer_bounds;
input->calculateBounds(buffer_bounds);
- // convert PointView to PointNormal
typedef pcl::PointCloud<pcl::PointXYZ> Cloud;
Cloud::Ptr cloud(new Cloud);
pclsupport::PDALtoPCD(input, *cloud, buffer_bounds);
- log()->get(LogLevel::Debug2) << cloud->points[0].x << ", " <<
- cloud->points[0].y << ", " << cloud->points[0].z << std::endl;
-
int level = log()->getLevel();
switch (level)
{
@@ -111,39 +108,29 @@ PointViewSet PCLBlock::run(PointViewPtr input)
break;
}
- pcl::Pipeline<pcl::PointXYZ> pipeline;
- pipeline.setInputCloud(cloud);
- if (!m_filename.empty())
- pipeline.setFilename(m_filename);
- else if (!m_json.empty())
- pipeline.setJSON(m_json);
- else
- throw pdal_error("No PCL pipeline specified!");
- // PDALtoPCD subtracts min values in each XYZ dimension to prevent rounding
- // errors in conversion to float. These offsets need to be conveyed to the
- // pipeline to offset any bounds entered as part of a PassThrough filter.
- pipeline.setOffsets(buffer_bounds.minx, buffer_bounds.miny, buffer_bounds.minz);
-
- // create PointCloud for results
- Cloud::Ptr cloud_f(new Cloud);
- pipeline.filter(*cloud_f);
-
- if (cloud_f->points.empty())
+ pcl::DartSample<pcl::PointXYZ> ds;
+ ds.setInputCloud(cloud);
+ ds.setRadius(m_radius);
+
+ std::vector<int> samples;
+ ds.filter(samples);
+
+ if (samples.empty())
{
- log()->get(LogLevel::Debug2) << "Filtered cloud has no points!" << std::endl;
+ log()->get(LogLevel::Warning) << "Filtered cloud has no points!\n";
return viewSet;
}
- pclsupport::PCDtoPDAL(*cloud_f, output, buffer_bounds);
+ for (const auto& i : samples)
+ output->appendPoint(*input, i);
+
+ double frac = (double)samples.size() / (double)cloud->size();
+ log()->get(LogLevel::Info) << "Retaining " << samples.size() << " of "
+ << cloud->size() << " points ("
+ << 100*frac
+ << "%)\n";
- log()->get(LogLevel::Debug2) << cloud->points.size() << " before, " <<
- cloud_f->points.size() << " after" << std::endl;
- log()->get(LogLevel::Debug2) << output->size() << std::endl;
- log()->get(LogLevel::Debug2) << output->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
- output->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
- output->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
return viewSet;
}
} // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.hpp b/plugins/pcl/filters/DartSampleFilter.hpp
similarity index 76%
copy from plugins/pcl/filters/GroundFilter.hpp
copy to plugins/pcl/filters/DartSampleFilter.hpp
index 448c9f3..63e6725 100644
--- a/plugins/pcl/filters/GroundFilter.hpp
+++ b/plugins/pcl/filters/DartSampleFilter.hpp
@@ -1,5 +1,5 @@
/******************************************************************************
-* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2013, Bradley J Chambers (brad.chambers at gmail.com)
*
* All rights reserved.
*
@@ -35,45 +35,31 @@
#pragma once
#include <pdal/Filter.hpp>
-#include <pdal/Stage.hpp>
-
-#include <memory>
+#include <pdal/StageFactory.hpp>
namespace pdal
{
-class Options;
-class PointLayout;
-class PointTable;
-class PointView;
-
-class PDAL_DLL GroundFilter : public Filter
+class PDAL_DLL DartSampleFilter : public Filter
{
public:
- GroundFilter() : Filter()
+ DartSampleFilter() : Filter()
{}
static void * create();
static int32_t destroy(void *);
std::string getName() const;
+ Options getDefaultOptions();
+
private:
- double m_maxWindowSize;
- double m_slope;
- double m_maxDistance;
- double m_initialDistance;
- double m_cellSize;
- bool m_classify;
- bool m_extract;
- bool m_approximate;
+ double m_radius;
- virtual void addDimensions(PointLayoutPtr layout);
virtual void processOptions(const Options& options);
virtual PointViewSet run(PointViewPtr view);
- GroundFilter& operator=(const GroundFilter&); // not implemented
- GroundFilter(const GroundFilter&); // not implemented
+ DartSampleFilter& operator=(const DartSampleFilter&); // not implemented
+ DartSampleFilter(const DartSampleFilter&); // not implemented
};
} // namespace pdal
-
diff --git a/plugins/pcl/filters/PCLBlock.cpp b/plugins/pcl/filters/GreedyProjectionFilter.cpp
similarity index 58%
copy from plugins/pcl/filters/PCLBlock.cpp
copy to plugins/pcl/filters/GreedyProjectionFilter.cpp
index a5b5cb6..1bd2800 100644
--- a/plugins/pcl/filters/PCLBlock.cpp
+++ b/plugins/pcl/filters/GreedyProjectionFilter.cpp
@@ -1,5 +1,5 @@
/******************************************************************************
-* Copyright (c) 2013-2014, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
*
* All rights reserved.
*
@@ -32,36 +32,50 @@
* OF SUCH DAMAGE.
****************************************************************************/
-#include "PCLBlock.hpp"
+#include "GreedyProjectionFilter.hpp"
#include "PCLConversions.hpp"
#include "PCLPipeline.h"
#include <pcl/console/print.h>
#include <pcl/point_types.h>
+#include <pcl/features/normal_3d.h>
#include <pcl/io/pcd_io.h>
+#include <pcl/surface/gp3.h>
namespace pdal
{
-static PluginInfo const s_info = PluginInfo(
- "filters.pclblock",
- "PCL Block implementation",
- "http://pdal.io/stages/filters.pclblock.html" );
+static PluginInfo const s_info =
+ PluginInfo("filters.greedyprojection", "Grid Projection filter",
+ "http://pdal.io/stages/filters.greedyprojection.html");
-CREATE_SHARED_PLUGIN(1, 0, PCLBlock, Filter, s_info)
+CREATE_SHARED_PLUGIN(1, 0, GreedyProjectionFilter, Filter, s_info)
-std::string PCLBlock::getName() const { return s_info.name; }
+std::string GreedyProjectionFilter::getName() const
+{
+ return s_info.name;
+}
+
+Options GreedyProjectionFilter::getDefaultOptions()
+{
+ Options options;
+ // options.add("leaf_x", 1.0, "Leaf size in X dimension");
+ // options.add("leaf_y", 1.0, "Leaf size in Y dimension");
+ // options.add("leaf_z", 1.0, "Leaf size in Z dimension");
+ return options;
+}
/** \brief This method processes the PointView through the given pipeline. */
-void PCLBlock::processOptions(const Options& options)
+void GreedyProjectionFilter::processOptions(const Options& options)
{
- m_filename = options.getValueOrDefault<std::string>("filename", "");
- m_json = options.getValueOrDefault<std::string>("json", "");
+ // m_leaf_x = options.getValueOrDefault<double>("leaf_x", 1.0);
+ // m_leaf_y = options.getValueOrDefault<double>("leaf_y", 1.0);
+ // m_leaf_z = options.getValueOrDefault<double>("leaf_z", 1.0);
}
-PointViewSet PCLBlock::run(PointViewPtr input)
+PointViewSet GreedyProjectionFilter::run(PointViewPtr input)
{
PointViewPtr output = input->makeNew();
PointViewSet viewSet;
@@ -71,11 +85,7 @@ PointViewSet PCLBlock::run(PointViewPtr input)
if (logOutput)
log()->floatPrecision(8);
- log()->get(LogLevel::Debug2) <<
- input->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
- input->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
- input->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
- log()->get(LogLevel::Debug2) << "Process PCLBlock..." << std::endl;
+ log()->get(LogLevel::Debug2) << "Process GreedyProjectionFilter..." << std::endl;
BOX3D buffer_bounds;
input->calculateBounds(buffer_bounds);
@@ -85,9 +95,6 @@ PointViewSet PCLBlock::run(PointViewPtr input)
Cloud::Ptr cloud(new Cloud);
pclsupport::PDALtoPCD(input, *cloud, buffer_bounds);
- log()->get(LogLevel::Debug2) << cloud->points[0].x << ", " <<
- cloud->points[0].y << ", " << cloud->points[0].z << std::endl;
-
int level = log()->getLevel();
switch (level)
{
@@ -111,22 +118,48 @@ PointViewSet PCLBlock::run(PointViewPtr input)
break;
}
- pcl::Pipeline<pcl::PointXYZ> pipeline;
- pipeline.setInputCloud(cloud);
- if (!m_filename.empty())
- pipeline.setFilename(m_filename);
- else if (!m_json.empty())
- pipeline.setJSON(m_json);
- else
- throw pdal_error("No PCL pipeline specified!");
- // PDALtoPCD subtracts min values in each XYZ dimension to prevent rounding
- // errors in conversion to float. These offsets need to be conveyed to the
- // pipeline to offset any bounds entered as part of a PassThrough filter.
- pipeline.setOffsets(buffer_bounds.minx, buffer_bounds.miny, buffer_bounds.minz);
+ // pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
+ pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>);
+ pcl::search::KdTree<pcl::PointXYZ>::Ptr tree;
+ pcl::search::KdTree<pcl::PointNormal>::Ptr tree2;
+
+ // Create search tree
+ tree.reset(new pcl::search::KdTree<pcl::PointXYZ> (false));
+ tree->setInputCloud(cloud);
+
+ // Normal estimation
+ pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n;
+ pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal> ());
+ n.setInputCloud(cloud);
+ n.setSearchMethod(tree);
+ n.setKSearch(20);
+ n.compute(*normals);
+
+ // Concatenate XYZ and normal information
+ pcl::concatenateFields(*cloud, *normals, *cloud_with_normals);
+
+ // Create search tree
+ tree2.reset(new pcl::search::KdTree<pcl::PointNormal>);
+ tree2->setInputCloud(cloud_with_normals);
+
+ // initial setup
+ pcl::GreedyProjectionTriangulation<pcl::PointNormal> gp3;
+ gp3.setInputCloud(cloud_with_normals);
+ gp3.setSearchMethod(tree2);
+ gp3.setSearchRadius(0.025);
+ gp3.setMu(2.5);
+ gp3.setMaximumNearestNeighbors(100);
+ gp3.setMaximumSurfaceAngle(M_PI/4); // 45 degrees
+ gp3.setMinimumAngle(M_PI/18); // 10 degrees
+ gp3.setMaximumAngle(2*M_PI/3); // 120 degrees
+ gp3.setNormalConsistency(false);
// create PointCloud for results
+ pcl::PolygonMesh grid;
+ gp3.reconstruct(grid);
+
Cloud::Ptr cloud_f(new Cloud);
- pipeline.filter(*cloud_f);
+ pcl::fromPCLPointCloud2(grid.cloud, *cloud_f);
if (cloud_f->points.empty())
{
@@ -139,11 +172,8 @@ PointViewSet PCLBlock::run(PointViewPtr input)
log()->get(LogLevel::Debug2) << cloud->points.size() << " before, " <<
cloud_f->points.size() << " after" << std::endl;
log()->get(LogLevel::Debug2) << output->size() << std::endl;
- log()->get(LogLevel::Debug2) << output->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
- output->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
- output->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
+
return viewSet;
}
} // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.hpp b/plugins/pcl/filters/GreedyProjectionFilter.hpp
similarity index 76%
copy from plugins/pcl/filters/GroundFilter.hpp
copy to plugins/pcl/filters/GreedyProjectionFilter.hpp
index 448c9f3..3e6646f 100644
--- a/plugins/pcl/filters/GroundFilter.hpp
+++ b/plugins/pcl/filters/GreedyProjectionFilter.hpp
@@ -1,5 +1,5 @@
/******************************************************************************
-* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2013, Bradley J Chambers (brad.chambers at gmail.com)
*
* All rights reserved.
*
@@ -35,45 +35,31 @@
#pragma once
#include <pdal/Filter.hpp>
-#include <pdal/Stage.hpp>
-
-#include <memory>
+#include <pdal/StageFactory.hpp>
namespace pdal
{
-class Options;
-class PointLayout;
-class PointTable;
-class PointView;
-
-class PDAL_DLL GroundFilter : public Filter
+class PDAL_DLL GreedyProjectionFilter : public Filter
{
public:
- GroundFilter() : Filter()
+ GreedyProjectionFilter() : Filter()
{}
static void * create();
static int32_t destroy(void *);
std::string getName() const;
+ Options getDefaultOptions();
+
private:
- double m_maxWindowSize;
- double m_slope;
- double m_maxDistance;
- double m_initialDistance;
- double m_cellSize;
- bool m_classify;
- bool m_extract;
- bool m_approximate;
+ // double m_leaf_x, m_leaf_y, m_leaf_z;
- virtual void addDimensions(PointLayoutPtr layout);
virtual void processOptions(const Options& options);
virtual PointViewSet run(PointViewPtr view);
- GroundFilter& operator=(const GroundFilter&); // not implemented
- GroundFilter(const GroundFilter&); // not implemented
+ GreedyProjectionFilter& operator=(const GreedyProjectionFilter&); // not implemented
+ GreedyProjectionFilter(const GreedyProjectionFilter&); // not implemented
};
} // namespace pdal
-
diff --git a/plugins/pcl/filters/PCLBlock.cpp b/plugins/pcl/filters/GridProjectionFilter.cpp
similarity index 60%
copy from plugins/pcl/filters/PCLBlock.cpp
copy to plugins/pcl/filters/GridProjectionFilter.cpp
index a5b5cb6..d71a61a 100644
--- a/plugins/pcl/filters/PCLBlock.cpp
+++ b/plugins/pcl/filters/GridProjectionFilter.cpp
@@ -1,5 +1,5 @@
/******************************************************************************
-* Copyright (c) 2013-2014, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
*
* All rights reserved.
*
@@ -32,36 +32,50 @@
* OF SUCH DAMAGE.
****************************************************************************/
-#include "PCLBlock.hpp"
+#include "GridProjectionFilter.hpp"
#include "PCLConversions.hpp"
#include "PCLPipeline.h"
#include <pcl/console/print.h>
#include <pcl/point_types.h>
+#include <pcl/features/normal_3d.h>
#include <pcl/io/pcd_io.h>
+#include <pcl/surface/grid_projection.h>
namespace pdal
{
-static PluginInfo const s_info = PluginInfo(
- "filters.pclblock",
- "PCL Block implementation",
- "http://pdal.io/stages/filters.pclblock.html" );
+static PluginInfo const s_info =
+ PluginInfo("filters.gridprojection", "Grid Projection filter",
+ "http://pdal.io/stages/filters.gridprojection.html");
-CREATE_SHARED_PLUGIN(1, 0, PCLBlock, Filter, s_info)
+CREATE_SHARED_PLUGIN(1, 0, GridProjectionFilter, Filter, s_info)
-std::string PCLBlock::getName() const { return s_info.name; }
+std::string GridProjectionFilter::getName() const
+{
+ return s_info.name;
+}
+
+Options GridProjectionFilter::getDefaultOptions()
+{
+ Options options;
+ // options.add("leaf_x", 1.0, "Leaf size in X dimension");
+ // options.add("leaf_y", 1.0, "Leaf size in Y dimension");
+ // options.add("leaf_z", 1.0, "Leaf size in Z dimension");
+ return options;
+}
/** \brief This method processes the PointView through the given pipeline. */
-void PCLBlock::processOptions(const Options& options)
+void GridProjectionFilter::processOptions(const Options& options)
{
- m_filename = options.getValueOrDefault<std::string>("filename", "");
- m_json = options.getValueOrDefault<std::string>("json", "");
+ // m_leaf_x = options.getValueOrDefault<double>("leaf_x", 1.0);
+ // m_leaf_y = options.getValueOrDefault<double>("leaf_y", 1.0);
+ // m_leaf_z = options.getValueOrDefault<double>("leaf_z", 1.0);
}
-PointViewSet PCLBlock::run(PointViewPtr input)
+PointViewSet GridProjectionFilter::run(PointViewPtr input)
{
PointViewPtr output = input->makeNew();
PointViewSet viewSet;
@@ -71,11 +85,7 @@ PointViewSet PCLBlock::run(PointViewPtr input)
if (logOutput)
log()->floatPrecision(8);
- log()->get(LogLevel::Debug2) <<
- input->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
- input->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
- input->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
- log()->get(LogLevel::Debug2) << "Process PCLBlock..." << std::endl;
+ log()->get(LogLevel::Debug2) << "Process GridProjectionFilter..." << std::endl;
BOX3D buffer_bounds;
input->calculateBounds(buffer_bounds);
@@ -85,9 +95,6 @@ PointViewSet PCLBlock::run(PointViewPtr input)
Cloud::Ptr cloud(new Cloud);
pclsupport::PDALtoPCD(input, *cloud, buffer_bounds);
- log()->get(LogLevel::Debug2) << cloud->points[0].x << ", " <<
- cloud->points[0].y << ", " << cloud->points[0].z << std::endl;
-
int level = log()->getLevel();
switch (level)
{
@@ -111,22 +118,43 @@ PointViewSet PCLBlock::run(PointViewPtr input)
break;
}
- pcl::Pipeline<pcl::PointXYZ> pipeline;
- pipeline.setInputCloud(cloud);
- if (!m_filename.empty())
- pipeline.setFilename(m_filename);
- else if (!m_json.empty())
- pipeline.setJSON(m_json);
- else
- throw pdal_error("No PCL pipeline specified!");
- // PDALtoPCD subtracts min values in each XYZ dimension to prevent rounding
- // errors in conversion to float. These offsets need to be conveyed to the
- // pipeline to offset any bounds entered as part of a PassThrough filter.
- pipeline.setOffsets(buffer_bounds.minx, buffer_bounds.miny, buffer_bounds.minz);
+ // pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
+ pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>);
+ pcl::search::KdTree<pcl::PointXYZ>::Ptr tree;
+ pcl::search::KdTree<pcl::PointNormal>::Ptr tree2;
+
+ // Create search tree
+ tree.reset(new pcl::search::KdTree<pcl::PointXYZ> (false));
+ tree->setInputCloud(cloud);
+
+ // Normal estimation
+ pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n;
+ pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal> ());
+ n.setInputCloud(cloud);
+ n.setSearchMethod(tree);
+ n.setKSearch(20);
+ n.compute(*normals);
+
+ // Concatenate XYZ and normal information
+ pcl::concatenateFields(*cloud, *normals, *cloud_with_normals);
+
+ // Create search tree
+ tree2.reset(new pcl::search::KdTree<pcl::PointNormal>);
+ tree2->setInputCloud(cloud_with_normals);
+
+ // initial setup
+ pcl::GridProjection<pcl::PointNormal> gp;
+ gp.setInputCloud(cloud_with_normals);
+ gp.setSearchMethod(tree2);
+ gp.setResolution(0.5);
+ gp.setPaddingSize(3);
// create PointCloud for results
+ pcl::PolygonMesh grid;
+ gp.reconstruct(grid);
+
Cloud::Ptr cloud_f(new Cloud);
- pipeline.filter(*cloud_f);
+ pcl::fromPCLPointCloud2(grid.cloud, *cloud_f);
if (cloud_f->points.empty())
{
@@ -139,11 +167,8 @@ PointViewSet PCLBlock::run(PointViewPtr input)
log()->get(LogLevel::Debug2) << cloud->points.size() << " before, " <<
cloud_f->points.size() << " after" << std::endl;
log()->get(LogLevel::Debug2) << output->size() << std::endl;
- log()->get(LogLevel::Debug2) << output->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
- output->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
- output->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
+
return viewSet;
}
} // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.hpp b/plugins/pcl/filters/GridProjectionFilter.hpp
similarity index 76%
copy from plugins/pcl/filters/GroundFilter.hpp
copy to plugins/pcl/filters/GridProjectionFilter.hpp
index 448c9f3..bb0037e 100644
--- a/plugins/pcl/filters/GroundFilter.hpp
+++ b/plugins/pcl/filters/GridProjectionFilter.hpp
@@ -1,5 +1,5 @@
/******************************************************************************
-* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2013, Bradley J Chambers (brad.chambers at gmail.com)
*
* All rights reserved.
*
@@ -35,45 +35,31 @@
#pragma once
#include <pdal/Filter.hpp>
-#include <pdal/Stage.hpp>
-
-#include <memory>
+#include <pdal/StageFactory.hpp>
namespace pdal
{
-class Options;
-class PointLayout;
-class PointTable;
-class PointView;
-
-class PDAL_DLL GroundFilter : public Filter
+class PDAL_DLL GridProjectionFilter : public Filter
{
public:
- GroundFilter() : Filter()
+ GridProjectionFilter() : Filter()
{}
static void * create();
static int32_t destroy(void *);
std::string getName() const;
+ Options getDefaultOptions();
+
private:
- double m_maxWindowSize;
- double m_slope;
- double m_maxDistance;
- double m_initialDistance;
- double m_cellSize;
- bool m_classify;
- bool m_extract;
- bool m_approximate;
+ // double m_leaf_x, m_leaf_y, m_leaf_z;
- virtual void addDimensions(PointLayoutPtr layout);
virtual void processOptions(const Options& options);
virtual PointViewSet run(PointViewPtr view);
- GroundFilter& operator=(const GroundFilter&); // not implemented
- GroundFilter(const GroundFilter&); // not implemented
+ GridProjectionFilter& operator=(const GridProjectionFilter&); // not implemented
+ GridProjectionFilter(const GridProjectionFilter&); // not implemented
};
} // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.cpp b/plugins/pcl/filters/GroundFilter.cpp
index 7072d4f..2fb8d68 100644
--- a/plugins/pcl/filters/GroundFilter.cpp
+++ b/plugins/pcl/filters/GroundFilter.cpp
@@ -51,22 +51,38 @@
namespace pdal
{
-static PluginInfo const s_info = PluginInfo(
- "filters.ground",
- "Progressive morphological filter",
- "http://pdal.io/stages/filters.ground.html" );
+static PluginInfo const s_info =
+ PluginInfo("filters.ground", "Progressive morphological filter",
+ "http://pdal.io/stages/filters.ground.html");
CREATE_SHARED_PLUGIN(1, 0, GroundFilter, Filter, s_info)
-std::string GroundFilter::getName() const { return s_info.name; }
+std::string GroundFilter::getName() const
+{
+ return s_info.name;
+}
+
+Options GroundFilter::getDefaultOptions()
+{
+ Options options;
+ options.add("max_window_size", 33, "Maximum window size");
+ options.add("slope", 1, "Slope");
+ options.add("max_distance", 2.5, "Maximum distance");
+ options.add("initial_distance", 0.15, "Initial distance");
+ options.add("cell_size", 1, "Cell Size");
+ options.add("classify", true, "Apply classification labels?");
+ options.add("extract", false, "Extract ground returns?");
+ options.add("approximate", false, "Use approximate algorithm?");
+ return options;
+}
void GroundFilter::processOptions(const Options& options)
{
- m_maxWindowSize = options.getValueOrDefault<double>("maxWindowSize", 33);
+ m_maxWindowSize = options.getValueOrDefault<double>("max_window_size", 33);
m_slope = options.getValueOrDefault<double>("slope", 1);
- m_maxDistance = options.getValueOrDefault<double>("maxDistance", 2.5);
- m_initialDistance = options.getValueOrDefault<double>("initialDistance", 0.15);
- m_cellSize = options.getValueOrDefault<double>("cellSize", 1);
+ m_maxDistance = options.getValueOrDefault<double>("max_distance", 2.5);
+ m_initialDistance = options.getValueOrDefault<double>("initial_distance", 0.15);
+ m_cellSize = options.getValueOrDefault<double>("cell_size", 1);
m_classify = options.getValueOrDefault<bool>("classify", true);
m_extract = options.getValueOrDefault<bool>("extract", false);
m_approximate = options.getValueOrDefault<bool>("approximate", false);
@@ -130,7 +146,8 @@ PointViewSet GroundFilter::run(PointViewPtr input)
// run the PMF filter, grabbing indices of ground returns
pmf.extract(idx->indices);
- } else
+ }
+ else
{
pcl::ApproximateProgressiveMorphologicalFilter<pcl::PointXYZ> pmf;
pmf.setInputCloud(cloud);
@@ -156,7 +173,9 @@ PointViewSet GroundFilter::run(PointViewPtr input)
// set the classification label of ground returns as 2
// (corresponding to ASPRS LAS specification)
for (const auto& i : idx->indices)
- { input->setField(Dimension::Id::Classification, i, 2); }
+ {
+ input->setField(Dimension::Id::Classification, i, 2);
+ }
viewSet.insert(input);
}
@@ -192,4 +211,3 @@ PointViewSet GroundFilter::run(PointViewPtr input)
}
} // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.hpp b/plugins/pcl/filters/GroundFilter.hpp
index 448c9f3..49b7753 100644
--- a/plugins/pcl/filters/GroundFilter.hpp
+++ b/plugins/pcl/filters/GroundFilter.hpp
@@ -57,6 +57,8 @@ public:
static int32_t destroy(void *);
std::string getName() const;
+ Options getDefaultOptions();
+
private:
double m_maxWindowSize;
double m_slope;
@@ -76,4 +78,3 @@ private:
};
} // namespace pdal
-
diff --git a/plugins/pcl/filters/HeightFilter.cpp b/plugins/pcl/filters/HeightFilter.cpp
new file mode 100644
index 0000000..6503418
--- /dev/null
+++ b/plugins/pcl/filters/HeightFilter.cpp
@@ -0,0 +1,180 @@
+/******************************************************************************
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in
+* the documentation and/or other materials provided
+* with the distribution.
+* * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+* names of its contributors may be used to endorse or promote
+* products derived from this software without specific prior
+* written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "HeightFilter.hpp"
+
+// c++
+#include <memory>
+#include <string>
+#include <vector>
+
+// project
+#include "PCLConversions.hpp"
+#include <pdal/Dimension.hpp>
+#include <pdal/Options.hpp>
+#include <pdal/pdal_macros.hpp>
+#include <pdal/PointTable.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/StageFactory.hpp>
+
+// other
+#include <pcl/console/print.h>
+#include <pcl/filters/extract_indices.h>
+#include <pcl/filters/project_inliers.h>
+#include <pcl/io/pcd_io.h>
+#include <pcl/ModelCoefficients.h>
+#include <pcl/point_types.h>
+#include <pcl/search/kdtree.h>
+
+#define DBG log()->get(LogLevel::Debug)
+
+namespace pdal
+{
+
+typedef pcl::PointCloud<pcl::PointXYZ> Cloud;
+
+static PluginInfo const s_info =
+ PluginInfo("filters.height", "Height Filter", "");
+
+CREATE_SHARED_PLUGIN(1, 0, HeightFilter, Filter, s_info)
+
+std::string HeightFilter::getName() const
+{
+ return s_info.name;
+}
+
+void HeightFilter::addDimensions(PointLayoutPtr layout)
+{
+ m_heightDim = layout->registerOrAssignDim("Height", Dimension::Type::Double);
+}
+
+void HeightFilter::prepared(PointTableRef table)
+{
+ const PointLayoutPtr layout(table.layout());
+ if (!layout->hasDim(Dimension::Id::Classification))
+ throw pdal_error("HeightFilter: missing Classification dimension in input PointView");
+}
+
+void HeightFilter::filter(PointView& view)
+{
+ bool logOutput = log()->getLevel() > LogLevel::Debug1;
+ if (logOutput)
+ log()->floatPrecision(8);
+
+ DBG << "Computing normalized heights...\n";
+
+ BOX3D bounds;
+ view.calculateBounds(bounds);
+
+ Cloud::Ptr cloud_in(new Cloud);
+ pclsupport::PDALtoPCD(std::make_shared<PointView>(view), *cloud_in, bounds);
+
+ pcl::PointIndices::Ptr ground(new pcl::PointIndices());
+ ground->indices.reserve(view.size());
+
+ std::vector<PointId> nonground;
+ nonground.reserve(view.size());
+
+ for (PointId id = 0; id < view.size(); ++id)
+ {
+ double c = view.getFieldAs<double>(Dimension::Id::Classification, id);
+
+ if (c == 2)
+ ground->indices.push_back(id);
+ else
+ nonground.push_back(id);
+ }
+
+ if (ground->indices.size()==0)
+ throw pdal_error("HeightFilter: the input PointView does not appear to have any points classified as ground");
+
+ pcl::ExtractIndices<pcl::PointXYZ> extract;
+ extract.setInputCloud(cloud_in);
+ extract.setIndices(ground);
+
+ Cloud::Ptr cloud_ground(new Cloud);
+ extract.setNegative(false);
+ extract.filter(*cloud_ground);
+
+ Cloud::Ptr cloud_nonground(new Cloud);
+ extract.setNegative(true);
+ extract.filter(*cloud_nonground);
+
+ // project both ground and non-ground into XY plane
+
+ // Create a set of planar coefficients with X=Y=0,Z=1
+ pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients());
+ coefficients->values.resize(4);
+ coefficients->values[0] = coefficients->values[1] = 0;
+ coefficients->values[2] = 1.0;
+ coefficients->values[3] = 0;
+
+ // Create the filtering object
+ pcl::ProjectInliers<pcl::PointXYZ> proj;
+ proj.setModelType(pcl::SACMODEL_PLANE);
+
+ Cloud::Ptr cloud_ground_projected(new Cloud);
+ proj.setInputCloud(cloud_ground);
+ proj.setModelCoefficients(coefficients);
+ proj.filter(*cloud_ground_projected);
+
+ Cloud::Ptr cloud_nonground_projected(new Cloud);
+ proj.setInputCloud(cloud_nonground);
+ proj.setModelCoefficients(coefficients);
+ proj.filter(*cloud_nonground_projected);
+
+ pcl::search::KdTree<pcl::PointXYZ>::Ptr ground_tree;
+ ground_tree.reset(new pcl::search::KdTree<pcl::PointXYZ> (false));
+ ground_tree->setInputCloud(cloud_ground_projected);
+
+ for (size_t i = 0; i < cloud_nonground_projected->size(); ++i)
+ {
+ pcl::PointXYZ nonground_query = cloud_nonground_projected->points[i];
+ std::vector<int> neighbors(1);
+ std::vector<float> sqr_distances(1);
+ ground_tree->nearestKSearch(nonground_query, 1, neighbors, sqr_distances);
+
+ double nonground_Z = view.getFieldAs<double>(Dimension::Id::Z, nonground[i]);
+ double ground_Z = view.getFieldAs<double>(Dimension::Id::Z, ground->indices[neighbors[0]]);
+ double height = nonground_Z - ground_Z;
+
+ view.setField(m_heightDim, nonground[i], height);
+ }
+
+ for (auto const& ground_idx : ground->indices)
+ view.setField(m_heightDim, ground_idx, 0.0);
+}
+
+
+} // namespace pdal
diff --git a/plugins/pcl/filters/GroundFilter.hpp b/plugins/pcl/filters/HeightFilter.hpp
similarity index 80%
copy from plugins/pcl/filters/GroundFilter.hpp
copy to plugins/pcl/filters/HeightFilter.hpp
index 448c9f3..69a2704 100644
--- a/plugins/pcl/filters/GroundFilter.hpp
+++ b/plugins/pcl/filters/HeightFilter.hpp
@@ -34,23 +34,26 @@
#pragma once
+#include <cstdint>
+#include <memory>
+#include <string>
+
+#include <pdal/pdal_export.hpp>
+#include <pdal/Dimension.hpp>
#include <pdal/Filter.hpp>
#include <pdal/Stage.hpp>
-#include <memory>
-
namespace pdal
{
class Options;
class PointLayout;
-class PointTable;
class PointView;
-class PDAL_DLL GroundFilter : public Filter
+class PDAL_DLL HeightFilter : public Filter
{
public:
- GroundFilter() : Filter()
+ HeightFilter() : Filter()
{}
static void * create();
@@ -58,22 +61,14 @@ public:
std::string getName() const;
private:
- double m_maxWindowSize;
- double m_slope;
- double m_maxDistance;
- double m_initialDistance;
- double m_cellSize;
- bool m_classify;
- bool m_extract;
- bool m_approximate;
+ Dimension::Id::Enum m_heightDim;
virtual void addDimensions(PointLayoutPtr layout);
- virtual void processOptions(const Options& options);
- virtual PointViewSet run(PointViewPtr view);
+ virtual void prepared(PointTableRef table);
+ virtual void filter(PointView& view);
- GroundFilter& operator=(const GroundFilter&); // not implemented
- GroundFilter(const GroundFilter&); // not implemented
+ HeightFilter& operator=(const HeightFilter&); // not implemented
+ HeightFilter(const HeightFilter&); // not implemented
};
} // namespace pdal
-
diff --git a/plugins/pcl/filters/PCLBlock.cpp b/plugins/pcl/filters/MovingLeastSquaresFilter.cpp
similarity index 65%
copy from plugins/pcl/filters/PCLBlock.cpp
copy to plugins/pcl/filters/MovingLeastSquaresFilter.cpp
index a5b5cb6..06af7fb 100644
--- a/plugins/pcl/filters/PCLBlock.cpp
+++ b/plugins/pcl/filters/MovingLeastSquaresFilter.cpp
@@ -1,5 +1,5 @@
/******************************************************************************
-* Copyright (c) 2013-2014, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
*
* All rights reserved.
*
@@ -32,7 +32,7 @@
* OF SUCH DAMAGE.
****************************************************************************/
-#include "PCLBlock.hpp"
+#include "MovingLeastSquaresFilter.hpp"
#include "PCLConversions.hpp"
#include "PCLPipeline.h"
@@ -40,28 +40,41 @@
#include <pcl/console/print.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
+#include <pcl/surface/mls.h>
namespace pdal
{
-static PluginInfo const s_info = PluginInfo(
- "filters.pclblock",
- "PCL Block implementation",
- "http://pdal.io/stages/filters.pclblock.html" );
+static PluginInfo const s_info =
+ PluginInfo("filters.movingleastsquares", "Moving Least Squares filter",
+ "http://pdal.io/stages/filters.movingleastsquares.html");
-CREATE_SHARED_PLUGIN(1, 0, PCLBlock, Filter, s_info)
+CREATE_SHARED_PLUGIN(1, 0, MovingLeastSquaresFilter, Filter, s_info)
-std::string PCLBlock::getName() const { return s_info.name; }
+std::string MovingLeastSquaresFilter::getName() const
+{
+ return s_info.name;
+}
+
+Options MovingLeastSquaresFilter::getDefaultOptions()
+{
+ Options options;
+ // options.add("leaf_x", 1.0, "Leaf size in X dimension");
+ // options.add("leaf_y", 1.0, "Leaf size in Y dimension");
+ // options.add("leaf_z", 1.0, "Leaf size in Z dimension");
+ return options;
+}
/** \brief This method processes the PointView through the given pipeline. */
-void PCLBlock::processOptions(const Options& options)
+void MovingLeastSquaresFilter::processOptions(const Options& options)
{
- m_filename = options.getValueOrDefault<std::string>("filename", "");
- m_json = options.getValueOrDefault<std::string>("json", "");
+ // m_leaf_x = options.getValueOrDefault<double>("leaf_x", 1.0);
+ // m_leaf_y = options.getValueOrDefault<double>("leaf_y", 1.0);
+ // m_leaf_z = options.getValueOrDefault<double>("leaf_z", 1.0);
}
-PointViewSet PCLBlock::run(PointViewPtr input)
+PointViewSet MovingLeastSquaresFilter::run(PointViewPtr input)
{
PointViewPtr output = input->makeNew();
PointViewSet viewSet;
@@ -71,11 +84,7 @@ PointViewSet PCLBlock::run(PointViewPtr input)
if (logOutput)
log()->floatPrecision(8);
- log()->get(LogLevel::Debug2) <<
- input->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
- input->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
- input->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
- log()->get(LogLevel::Debug2) << "Process PCLBlock..." << std::endl;
+ log()->get(LogLevel::Debug2) << "Process MovingLeastSquaresFilter..." << std::endl;
BOX3D buffer_bounds;
input->calculateBounds(buffer_bounds);
@@ -85,9 +94,6 @@ PointViewSet PCLBlock::run(PointViewPtr input)
Cloud::Ptr cloud(new Cloud);
pclsupport::PDALtoPCD(input, *cloud, buffer_bounds);
- log()->get(LogLevel::Debug2) << cloud->points[0].x << ", " <<
- cloud->points[0].y << ", " << cloud->points[0].z << std::endl;
-
int level = log()->getLevel();
switch (level)
{
@@ -111,22 +117,17 @@ PointViewSet PCLBlock::run(PointViewPtr input)
break;
}
- pcl::Pipeline<pcl::PointXYZ> pipeline;
- pipeline.setInputCloud(cloud);
- if (!m_filename.empty())
- pipeline.setFilename(m_filename);
- else if (!m_json.empty())
- pipeline.setJSON(m_json);
- else
- throw pdal_error("No PCL pipeline specified!");
- // PDALtoPCD subtracts min values in each XYZ dimension to prevent rounding
- // errors in conversion to float. These offsets need to be conveyed to the
- // pipeline to offset any bounds entered as part of a PassThrough filter.
- pipeline.setOffsets(buffer_bounds.minx, buffer_bounds.miny, buffer_bounds.minz);
+ // initial setup
+ pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointXYZ> mls;
+ mls.setInputCloud(cloud);
+ mls.setSearchRadius(1);
+ mls.setPolynomialFit(true);
+ mls.setPolynomialOrder(2);
+ mls.setUpsamplingMethod(pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointXYZ>::NONE);
// create PointCloud for results
Cloud::Ptr cloud_f(new Cloud);
- pipeline.filter(*cloud_f);
+ mls.process(*cloud_f);
if (cloud_f->points.empty())
{
@@ -139,11 +140,8 @@ PointViewSet PCLBlock::run(PointViewPtr input)
log()->get(LogLevel::Debug2) << cloud->points.size() << " before, " <<
cloud_f->points.size() << " after" << std::endl;
log()->get(LogLevel::Debug2) << output->size() << std::endl;
- log()->get(LogLevel::Debug2) << output->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
- output->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
- output->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
+
return viewSet;
}
} // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.hpp b/plugins/pcl/filters/MovingLeastSquaresFilter.hpp
similarity index 76%
copy from plugins/pcl/filters/GroundFilter.hpp
copy to plugins/pcl/filters/MovingLeastSquaresFilter.hpp
index 448c9f3..b5c58c2 100644
--- a/plugins/pcl/filters/GroundFilter.hpp
+++ b/plugins/pcl/filters/MovingLeastSquaresFilter.hpp
@@ -1,5 +1,5 @@
/******************************************************************************
-* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2013, Bradley J Chambers (brad.chambers at gmail.com)
*
* All rights reserved.
*
@@ -35,45 +35,31 @@
#pragma once
#include <pdal/Filter.hpp>
-#include <pdal/Stage.hpp>
-
-#include <memory>
+#include <pdal/StageFactory.hpp>
namespace pdal
{
-class Options;
-class PointLayout;
-class PointTable;
-class PointView;
-
-class PDAL_DLL GroundFilter : public Filter
+class PDAL_DLL MovingLeastSquaresFilter : public Filter
{
public:
- GroundFilter() : Filter()
+ MovingLeastSquaresFilter() : Filter()
{}
static void * create();
static int32_t destroy(void *);
std::string getName() const;
+ Options getDefaultOptions();
+
private:
- double m_maxWindowSize;
- double m_slope;
- double m_maxDistance;
- double m_initialDistance;
- double m_cellSize;
- bool m_classify;
- bool m_extract;
- bool m_approximate;
+ // double m_leaf_x, m_leaf_y, m_leaf_z;
- virtual void addDimensions(PointLayoutPtr layout);
virtual void processOptions(const Options& options);
virtual PointViewSet run(PointViewPtr view);
- GroundFilter& operator=(const GroundFilter&); // not implemented
- GroundFilter(const GroundFilter&); // not implemented
+ MovingLeastSquaresFilter& operator=(const MovingLeastSquaresFilter&); // not implemented
+ MovingLeastSquaresFilter(const MovingLeastSquaresFilter&); // not implemented
};
} // namespace pdal
-
diff --git a/plugins/pcl/filters/PCLBlock.cpp b/plugins/pcl/filters/PCLBlock.cpp
index a5b5cb6..f89d908 100644
--- a/plugins/pcl/filters/PCLBlock.cpp
+++ b/plugins/pcl/filters/PCLBlock.cpp
@@ -44,14 +44,16 @@
namespace pdal
{
-static PluginInfo const s_info = PluginInfo(
- "filters.pclblock",
- "PCL Block implementation",
- "http://pdal.io/stages/filters.pclblock.html" );
+static PluginInfo const s_info =
+ PluginInfo("filters.pclblock", "PCL Block implementation",
+ "http://pdal.io/stages/filters.pclblock.html");
CREATE_SHARED_PLUGIN(1, 0, PCLBlock, Filter, s_info)
-std::string PCLBlock::getName() const { return s_info.name; }
+std::string PCLBlock::getName() const
+{
+ return s_info.name;
+}
/** \brief This method processes the PointView through the given pipeline. */
@@ -72,9 +74,9 @@ PointViewSet PCLBlock::run(PointViewPtr input)
log()->floatPrecision(8);
log()->get(LogLevel::Debug2) <<
- input->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
- input->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
- input->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
+ input->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
+ input->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
+ input->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
log()->get(LogLevel::Debug2) << "Process PCLBlock..." << std::endl;
BOX3D buffer_bounds;
@@ -86,7 +88,7 @@ PointViewSet PCLBlock::run(PointViewPtr input)
pclsupport::PDALtoPCD(input, *cloud, buffer_bounds);
log()->get(LogLevel::Debug2) << cloud->points[0].x << ", " <<
- cloud->points[0].y << ", " << cloud->points[0].z << std::endl;
+ cloud->points[0].y << ", " << cloud->points[0].z << std::endl;
int level = log()->getLevel();
switch (level)
@@ -146,4 +148,3 @@ PointViewSet PCLBlock::run(PointViewPtr input)
}
} // namespace pdal
-
diff --git a/plugins/pcl/filters/PCLBlock.cpp b/plugins/pcl/filters/PoissonFilter.cpp
similarity index 61%
copy from plugins/pcl/filters/PCLBlock.cpp
copy to plugins/pcl/filters/PoissonFilter.cpp
index a5b5cb6..8bf97eb 100644
--- a/plugins/pcl/filters/PCLBlock.cpp
+++ b/plugins/pcl/filters/PoissonFilter.cpp
@@ -1,5 +1,5 @@
/******************************************************************************
-* Copyright (c) 2013-2014, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
*
* All rights reserved.
*
@@ -32,36 +32,50 @@
* OF SUCH DAMAGE.
****************************************************************************/
-#include "PCLBlock.hpp"
+#include "PoissonFilter.hpp"
#include "PCLConversions.hpp"
#include "PCLPipeline.h"
#include <pcl/console/print.h>
#include <pcl/point_types.h>
+#include <pcl/features/normal_3d.h>
#include <pcl/io/pcd_io.h>
+#include <pcl/surface/poisson.h>
namespace pdal
{
-static PluginInfo const s_info = PluginInfo(
- "filters.pclblock",
- "PCL Block implementation",
- "http://pdal.io/stages/filters.pclblock.html" );
+static PluginInfo const s_info =
+ PluginInfo("filters.poisson", "Poisson filter",
+ "http://pdal.io/stages/filters.poisson.html");
-CREATE_SHARED_PLUGIN(1, 0, PCLBlock, Filter, s_info)
+CREATE_SHARED_PLUGIN(1, 0, PoissonFilter, Filter, s_info)
-std::string PCLBlock::getName() const { return s_info.name; }
+std::string PoissonFilter::getName() const
+{
+ return s_info.name;
+}
+
+Options PoissonFilter::getDefaultOptions()
+{
+ Options options;
+ options.add("depth", 8, "Maximum depth of the tree used for reconstruction");
+ options.add("point_weight", 4.0,
+ "Importance of interpolation of point samples in the screened "\
+ "Poisson equation");
+ return options;
+}
/** \brief This method processes the PointView through the given pipeline. */
-void PCLBlock::processOptions(const Options& options)
+void PoissonFilter::processOptions(const Options& options)
{
- m_filename = options.getValueOrDefault<std::string>("filename", "");
- m_json = options.getValueOrDefault<std::string>("json", "");
+ m_depth = options.getValueOrDefault<int>("depth", 8);
+ m_point_weight = options.getValueOrDefault<float>("point_weight", 4.0);
}
-PointViewSet PCLBlock::run(PointViewPtr input)
+PointViewSet PoissonFilter::run(PointViewPtr input)
{
PointViewPtr output = input->makeNew();
PointViewSet viewSet;
@@ -71,11 +85,7 @@ PointViewSet PCLBlock::run(PointViewPtr input)
if (logOutput)
log()->floatPrecision(8);
- log()->get(LogLevel::Debug2) <<
- input->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
- input->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
- input->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
- log()->get(LogLevel::Debug2) << "Process PCLBlock..." << std::endl;
+ log()->get(LogLevel::Debug2) << "Process PoissonFilter..." << std::endl;
BOX3D buffer_bounds;
input->calculateBounds(buffer_bounds);
@@ -85,9 +95,6 @@ PointViewSet PCLBlock::run(PointViewPtr input)
Cloud::Ptr cloud(new Cloud);
pclsupport::PDALtoPCD(input, *cloud, buffer_bounds);
- log()->get(LogLevel::Debug2) << cloud->points[0].x << ", " <<
- cloud->points[0].y << ", " << cloud->points[0].z << std::endl;
-
int level = log()->getLevel();
switch (level)
{
@@ -111,22 +118,43 @@ PointViewSet PCLBlock::run(PointViewPtr input)
break;
}
- pcl::Pipeline<pcl::PointXYZ> pipeline;
- pipeline.setInputCloud(cloud);
- if (!m_filename.empty())
- pipeline.setFilename(m_filename);
- else if (!m_json.empty())
- pipeline.setJSON(m_json);
- else
- throw pdal_error("No PCL pipeline specified!");
- // PDALtoPCD subtracts min values in each XYZ dimension to prevent rounding
- // errors in conversion to float. These offsets need to be conveyed to the
- // pipeline to offset any bounds entered as part of a PassThrough filter.
- pipeline.setOffsets(buffer_bounds.minx, buffer_bounds.miny, buffer_bounds.minz);
+ // pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
+ pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>);
+ pcl::search::KdTree<pcl::PointXYZ>::Ptr tree;
+ pcl::search::KdTree<pcl::PointNormal>::Ptr tree2;
+
+ // Create search tree
+ tree.reset(new pcl::search::KdTree<pcl::PointXYZ> (false));
+ tree->setInputCloud(cloud);
+
+ // Normal estimation
+ pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n;
+ pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal> ());
+ n.setInputCloud(cloud);
+ n.setSearchMethod(tree);
+ n.setKSearch(20);
+ n.compute(*normals);
+
+ // Concatenate XYZ and normal information
+ pcl::concatenateFields(*cloud, *normals, *cloud_with_normals);
+
+ // Create search tree
+ tree2.reset(new pcl::search::KdTree<pcl::PointNormal>);
+ tree2->setInputCloud(cloud_with_normals);
+
+ // initial setup
+ pcl::Poisson<pcl::PointNormal> p;
+ p.setInputCloud(cloud_with_normals);
+ p.setSearchMethod(tree2);
+ p.setDepth(m_depth);
+ p.setPointWeight(m_point_weight);
// create PointCloud for results
+ pcl::PolygonMesh grid;
+ p.reconstruct(grid);
+
Cloud::Ptr cloud_f(new Cloud);
- pipeline.filter(*cloud_f);
+ pcl::fromPCLPointCloud2(grid.cloud, *cloud_f);
if (cloud_f->points.empty())
{
@@ -139,11 +167,8 @@ PointViewSet PCLBlock::run(PointViewPtr input)
log()->get(LogLevel::Debug2) << cloud->points.size() << " before, " <<
cloud_f->points.size() << " after" << std::endl;
log()->get(LogLevel::Debug2) << output->size() << std::endl;
- log()->get(LogLevel::Debug2) << output->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
- output->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
- output->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
+
return viewSet;
}
} // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.hpp b/plugins/pcl/filters/PoissonFilter.hpp
similarity index 76%
copy from plugins/pcl/filters/GroundFilter.hpp
copy to plugins/pcl/filters/PoissonFilter.hpp
index 448c9f3..7b502bc 100644
--- a/plugins/pcl/filters/GroundFilter.hpp
+++ b/plugins/pcl/filters/PoissonFilter.hpp
@@ -1,5 +1,5 @@
/******************************************************************************
-* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2013, Bradley J Chambers (brad.chambers at gmail.com)
*
* All rights reserved.
*
@@ -35,45 +35,32 @@
#pragma once
#include <pdal/Filter.hpp>
-#include <pdal/Stage.hpp>
-
-#include <memory>
+#include <pdal/StageFactory.hpp>
namespace pdal
{
-class Options;
-class PointLayout;
-class PointTable;
-class PointView;
-
-class PDAL_DLL GroundFilter : public Filter
+class PDAL_DLL PoissonFilter : public Filter
{
public:
- GroundFilter() : Filter()
+ PoissonFilter() : Filter()
{}
static void * create();
static int32_t destroy(void *);
std::string getName() const;
+ Options getDefaultOptions();
+
private:
- double m_maxWindowSize;
- double m_slope;
- double m_maxDistance;
- double m_initialDistance;
- double m_cellSize;
- bool m_classify;
- bool m_extract;
- bool m_approximate;
+ int m_depth;
+ float m_point_weight;
- virtual void addDimensions(PointLayoutPtr layout);
virtual void processOptions(const Options& options);
virtual PointViewSet run(PointViewPtr view);
- GroundFilter& operator=(const GroundFilter&); // not implemented
- GroundFilter(const GroundFilter&); // not implemented
+ PoissonFilter& operator=(const PoissonFilter&); // not implemented
+ PoissonFilter(const PoissonFilter&); // not implemented
};
} // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.cpp b/plugins/pcl/filters/RadiusOutlierFilter.cpp
similarity index 60%
copy from plugins/pcl/filters/GroundFilter.cpp
copy to plugins/pcl/filters/RadiusOutlierFilter.cpp
index 7072d4f..7526a12 100644
--- a/plugins/pcl/filters/GroundFilter.cpp
+++ b/plugins/pcl/filters/RadiusOutlierFilter.cpp
@@ -32,7 +32,7 @@
* OF SUCH DAMAGE.
****************************************************************************/
-#include "GroundFilter.hpp"
+#include "RadiusOutlierFilter.hpp"
#include "PCLConversions.hpp"
@@ -45,44 +45,51 @@
#include <pcl/console/print.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/io/pcd_io.h>
-#include <pcl/segmentation/progressive_morphological_filter.h>
-#include <pcl/segmentation/approximate_progressive_morphological_filter.h>
+#include <pcl/filters/radius_outlier_removal.h>
namespace pdal
{
-static PluginInfo const s_info = PluginInfo(
- "filters.ground",
- "Progressive morphological filter",
- "http://pdal.io/stages/filters.ground.html" );
+static PluginInfo const s_info =
+ PluginInfo("filters.radiusoutlier", "Radius outlier removal",
+ "http://pdal.io/stages/filters.radiusoutlier.html");
-CREATE_SHARED_PLUGIN(1, 0, GroundFilter, Filter, s_info)
+CREATE_SHARED_PLUGIN(1, 0, RadiusOutlierFilter, Filter, s_info)
-std::string GroundFilter::getName() const { return s_info.name; }
+std::string RadiusOutlierFilter::getName() const
+{
+ return s_info.name;
+}
-void GroundFilter::processOptions(const Options& options)
+Options RadiusOutlierFilter::getDefaultOptions()
{
- m_maxWindowSize = options.getValueOrDefault<double>("maxWindowSize", 33);
- m_slope = options.getValueOrDefault<double>("slope", 1);
- m_maxDistance = options.getValueOrDefault<double>("maxDistance", 2.5);
- m_initialDistance = options.getValueOrDefault<double>("initialDistance", 0.15);
- m_cellSize = options.getValueOrDefault<double>("cellSize", 1);
+ Options options;
+ options.add("min_neighbors", 2, "Minimum number of neighbors in radius");
+ options.add("radius", 1, "Radius");
+ options.add("classify", true, "Apply classification labels?");
+ options.add("extract", false, "Extract ground returns?");
+ return options;
+}
+
+void RadiusOutlierFilter::processOptions(const Options& options)
+{
+ m_min_neighbors = options.getValueOrDefault<int>("min_neighbors", 2);
+ m_radius = options.getValueOrDefault<double>("radius", 1);
m_classify = options.getValueOrDefault<bool>("classify", true);
m_extract = options.getValueOrDefault<bool>("extract", false);
- m_approximate = options.getValueOrDefault<bool>("approximate", false);
}
-void GroundFilter::addDimensions(PointLayoutPtr layout)
+void RadiusOutlierFilter::addDimensions(PointLayoutPtr layout)
{
layout->registerDim(Dimension::Id::Classification);
}
-PointViewSet GroundFilter::run(PointViewPtr input)
+PointViewSet RadiusOutlierFilter::run(PointViewPtr input)
{
bool logOutput = log()->getLevel() > LogLevel::Debug1;
if (logOutput)
log()->floatPrecision(8);
- log()->get(LogLevel::Debug2) << "Process GroundFilter...\n";
+ log()->get(LogLevel::Debug2) << "Process RadiusOutlierFilter...\n";
// convert PointView to PointXYZ
typedef pcl::PointCloud<pcl::PointXYZ> Cloud;
@@ -115,59 +122,57 @@ PointViewSet GroundFilter::run(PointViewPtr input)
break;
}
- // setup the PMF filter
- pcl::PointIndicesPtr idx(new pcl::PointIndices);
- if (!m_approximate)
- {
+ // setup the outlier filter
+ pcl::RadiusOutlierRemoval<pcl::PointXYZ> ror(true);
+ ror.setInputCloud(cloud);
+ ror.setMinNeighborsInRadius(m_min_neighbors);
+ ror.setRadiusSearch(m_radius);
- pcl::ProgressiveMorphologicalFilter<pcl::PointXYZ> pmf;
- pmf.setInputCloud(cloud);
- pmf.setMaxWindowSize(m_maxWindowSize);
- pmf.setSlope(m_slope);
- pmf.setMaxDistance(m_maxDistance);
- pmf.setInitialDistance(m_initialDistance);
- pmf.setCellSize(m_cellSize);
-
- // run the PMF filter, grabbing indices of ground returns
- pmf.extract(idx->indices);
- } else
- {
- pcl::ApproximateProgressiveMorphologicalFilter<pcl::PointXYZ> pmf;
- pmf.setInputCloud(cloud);
- pmf.setMaxWindowSize(m_maxWindowSize);
- pmf.setSlope(m_slope);
- pmf.setMaxDistance(m_maxDistance);
- pmf.setInitialDistance(m_initialDistance);
- pmf.setCellSize(m_cellSize);
+ pcl::PointCloud<pcl::PointXYZ> output;
+ ror.setNegative(true);
+ ror.filter(output);
- // run the PMF filter, grabbing indices of ground returns
- pmf.extract(idx->indices);
+ // filtered to return inliers
+ pcl::PointIndicesPtr inliers(new pcl::PointIndices);
+ ror.getRemovedIndices(*inliers);
+ // inverse are the outliers
+ std::vector<int> outliers(input->size()-inliers->indices.size());
+ for (PointId i = 0, j = 0, k = 0; i < input->size(); ++i)
+ {
+ if (i == (PointId)inliers->indices[j])
+ {
+ j++;
+ continue;
+ }
+ outliers[k++] = i;
}
PointViewSet viewSet;
- if (!idx->indices.empty() && (m_classify || m_extract))
+ if (!outliers.empty() && (m_classify || m_extract))
{
if (m_classify)
{
- log()->get(LogLevel::Debug2) << "Labeled " << idx->indices.size() << " ground returns!\n";
+ log()->get(LogLevel::Debug2) << "Labeled " << outliers.size() << " outliers as noise!\n";
- // set the classification label of ground returns as 2
- // (corresponding to ASPRS LAS specification)
- for (const auto& i : idx->indices)
- { input->setField(Dimension::Id::Classification, i, 2); }
+ // set the classification label of outlier returns as 18
+ // (corresponding to ASPRS LAS specification for high noise)
+ for (const auto& i : outliers)
+ {
+ input->setField(Dimension::Id::Classification, i, 18);
+ }
viewSet.insert(input);
}
if (m_extract)
{
- log()->get(LogLevel::Debug2) << "Extracted " << idx->indices.size() << " ground returns!\n";
+ log()->get(LogLevel::Debug2) << "Extracted " << inliers->indices.size() << " inliers!\n";
- // create new PointView containing only ground returns
+ // create new PointView containing only outliers
PointViewPtr output = input->makeNew();
- for (const auto& i : idx->indices)
+ for (const auto& i : inliers->indices)
{
output->appendPoint(*input, i);
}
@@ -178,8 +183,8 @@ PointViewSet GroundFilter::run(PointViewPtr input)
}
else
{
- if (idx->indices.empty())
- log()->get(LogLevel::Debug2) << "Filtered cloud has no ground returns!\n";
+ if (outliers.empty())
+ log()->get(LogLevel::Debug2) << "Filtered cloud has no outliers!\n";
if (!(m_classify || m_extract))
log()->get(LogLevel::Debug2) << "Must choose --classify or --extract\n";
@@ -192,4 +197,3 @@ PointViewSet GroundFilter::run(PointViewPtr input)
}
} // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.hpp b/plugins/pcl/filters/RadiusOutlierFilter.hpp
similarity index 86%
copy from plugins/pcl/filters/GroundFilter.hpp
copy to plugins/pcl/filters/RadiusOutlierFilter.hpp
index 448c9f3..e7d1190 100644
--- a/plugins/pcl/filters/GroundFilter.hpp
+++ b/plugins/pcl/filters/RadiusOutlierFilter.hpp
@@ -47,33 +47,30 @@ class PointLayout;
class PointTable;
class PointView;
-class PDAL_DLL GroundFilter : public Filter
+class PDAL_DLL RadiusOutlierFilter : public Filter
{
public:
- GroundFilter() : Filter()
+ RadiusOutlierFilter() : Filter()
{}
static void * create();
static int32_t destroy(void *);
std::string getName() const;
+ Options getDefaultOptions();
+
private:
- double m_maxWindowSize;
- double m_slope;
- double m_maxDistance;
- double m_initialDistance;
- double m_cellSize;
+ int m_min_neighbors;
+ double m_radius;
bool m_classify;
bool m_extract;
- bool m_approximate;
virtual void addDimensions(PointLayoutPtr layout);
virtual void processOptions(const Options& options);
virtual PointViewSet run(PointViewPtr view);
- GroundFilter& operator=(const GroundFilter&); // not implemented
- GroundFilter(const GroundFilter&); // not implemented
+ RadiusOutlierFilter& operator=(const RadiusOutlierFilter&); // not implemented
+ RadiusOutlierFilter(const RadiusOutlierFilter&); // not implemented
};
} // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.cpp b/plugins/pcl/filters/StatisticalOutlierFilter.cpp
similarity index 60%
copy from plugins/pcl/filters/GroundFilter.cpp
copy to plugins/pcl/filters/StatisticalOutlierFilter.cpp
index 7072d4f..91a2f53 100644
--- a/plugins/pcl/filters/GroundFilter.cpp
+++ b/plugins/pcl/filters/StatisticalOutlierFilter.cpp
@@ -32,7 +32,7 @@
* OF SUCH DAMAGE.
****************************************************************************/
-#include "GroundFilter.hpp"
+#include "StatisticalOutlierFilter.hpp"
#include "PCLConversions.hpp"
@@ -45,44 +45,51 @@
#include <pcl/console/print.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/io/pcd_io.h>
-#include <pcl/segmentation/progressive_morphological_filter.h>
-#include <pcl/segmentation/approximate_progressive_morphological_filter.h>
+#include <pcl/filters/statistical_outlier_removal.h>
namespace pdal
{
-static PluginInfo const s_info = PluginInfo(
- "filters.ground",
- "Progressive morphological filter",
- "http://pdal.io/stages/filters.ground.html" );
+static PluginInfo const s_info =
+ PluginInfo("filters.statisticaloutlier", "Statistical outlier removal",
+ "http://pdal.io/stages/filters.statisticaloutlier.html");
-CREATE_SHARED_PLUGIN(1, 0, GroundFilter, Filter, s_info)
+CREATE_SHARED_PLUGIN(1, 0, StatisticalOutlierFilter, Filter, s_info)
-std::string GroundFilter::getName() const { return s_info.name; }
+std::string StatisticalOutlierFilter::getName() const
+{
+ return s_info.name;
+}
-void GroundFilter::processOptions(const Options& options)
+Options StatisticalOutlierFilter::getDefaultOptions()
{
- m_maxWindowSize = options.getValueOrDefault<double>("maxWindowSize", 33);
- m_slope = options.getValueOrDefault<double>("slope", 1);
- m_maxDistance = options.getValueOrDefault<double>("maxDistance", 2.5);
- m_initialDistance = options.getValueOrDefault<double>("initialDistance", 0.15);
- m_cellSize = options.getValueOrDefault<double>("cellSize", 1);
+ Options options;
+ options.add("mean_k", 8, "Mean number of neighbors");
+ options.add("multiplier", 2, "Standard deviation threshold");
+ options.add("classify", true, "Apply classification labels?");
+ options.add("extract", false, "Extract ground returns?");
+ return options;
+}
+
+void StatisticalOutlierFilter::processOptions(const Options& options)
+{
+ m_meanK = options.getValueOrDefault<int>("mean_k", 8);
+ m_multiplier = options.getValueOrDefault<double>("multiplier", 2);
m_classify = options.getValueOrDefault<bool>("classify", true);
m_extract = options.getValueOrDefault<bool>("extract", false);
- m_approximate = options.getValueOrDefault<bool>("approximate", false);
}
-void GroundFilter::addDimensions(PointLayoutPtr layout)
+void StatisticalOutlierFilter::addDimensions(PointLayoutPtr layout)
{
layout->registerDim(Dimension::Id::Classification);
}
-PointViewSet GroundFilter::run(PointViewPtr input)
+PointViewSet StatisticalOutlierFilter::run(PointViewPtr input)
{
bool logOutput = log()->getLevel() > LogLevel::Debug1;
if (logOutput)
log()->floatPrecision(8);
- log()->get(LogLevel::Debug2) << "Process GroundFilter...\n";
+ log()->get(LogLevel::Debug2) << "Process StatisticalOutlierFilter...\n";
// convert PointView to PointXYZ
typedef pcl::PointCloud<pcl::PointXYZ> Cloud;
@@ -115,59 +122,57 @@ PointViewSet GroundFilter::run(PointViewPtr input)
break;
}
- // setup the PMF filter
- pcl::PointIndicesPtr idx(new pcl::PointIndices);
- if (!m_approximate)
- {
+ // setup the outlier filter
+ pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor(true);
+ sor.setInputCloud(cloud);
+ sor.setMeanK(m_meanK);
+ sor.setStddevMulThresh(m_multiplier);
- pcl::ProgressiveMorphologicalFilter<pcl::PointXYZ> pmf;
- pmf.setInputCloud(cloud);
- pmf.setMaxWindowSize(m_maxWindowSize);
- pmf.setSlope(m_slope);
- pmf.setMaxDistance(m_maxDistance);
- pmf.setInitialDistance(m_initialDistance);
- pmf.setCellSize(m_cellSize);
-
- // run the PMF filter, grabbing indices of ground returns
- pmf.extract(idx->indices);
- } else
- {
- pcl::ApproximateProgressiveMorphologicalFilter<pcl::PointXYZ> pmf;
- pmf.setInputCloud(cloud);
- pmf.setMaxWindowSize(m_maxWindowSize);
- pmf.setSlope(m_slope);
- pmf.setMaxDistance(m_maxDistance);
- pmf.setInitialDistance(m_initialDistance);
- pmf.setCellSize(m_cellSize);
+ pcl::PointCloud<pcl::PointXYZ> output;
+ sor.setNegative(true);
+ sor.filter(output);
- // run the PMF filter, grabbing indices of ground returns
- pmf.extract(idx->indices);
+ // filtered to return inliers
+ pcl::PointIndicesPtr inliers(new pcl::PointIndices);
+ sor.getRemovedIndices(*inliers);
+ // inverse are the outliers
+ std::vector<int> outliers(input->size()-inliers->indices.size());
+ for (PointId i = 0, j = 0, k = 0; i < input->size(); ++i)
+ {
+ if (i == (PointId)inliers->indices[j])
+ {
+ j++;
+ continue;
+ }
+ outliers[k++] = i;
}
PointViewSet viewSet;
- if (!idx->indices.empty() && (m_classify || m_extract))
+ if (!outliers.empty() && (m_classify || m_extract))
{
if (m_classify)
{
- log()->get(LogLevel::Debug2) << "Labeled " << idx->indices.size() << " ground returns!\n";
+ log()->get(LogLevel::Debug2) << "Labeled " << outliers.size() << " outliers as noise!\n";
- // set the classification label of ground returns as 2
- // (corresponding to ASPRS LAS specification)
- for (const auto& i : idx->indices)
- { input->setField(Dimension::Id::Classification, i, 2); }
+ // set the classification label of outlier returns as 18
+ // (corresponding to ASPRS LAS specification for high noise)
+ for (const auto& i : outliers)
+ {
+ input->setField(Dimension::Id::Classification, i, 18);
+ }
viewSet.insert(input);
}
if (m_extract)
{
- log()->get(LogLevel::Debug2) << "Extracted " << idx->indices.size() << " ground returns!\n";
+ log()->get(LogLevel::Debug2) << "Extracted " << inliers->indices.size() << " inliers!\n";
- // create new PointView containing only ground returns
+ // create new PointView containing only outliers
PointViewPtr output = input->makeNew();
- for (const auto& i : idx->indices)
+ for (const auto& i : inliers->indices)
{
output->appendPoint(*input, i);
}
@@ -178,8 +183,8 @@ PointViewSet GroundFilter::run(PointViewPtr input)
}
else
{
- if (idx->indices.empty())
- log()->get(LogLevel::Debug2) << "Filtered cloud has no ground returns!\n";
+ if (outliers.empty())
+ log()->get(LogLevel::Debug2) << "Filtered cloud has no outliers!\n";
if (!(m_classify || m_extract))
log()->get(LogLevel::Debug2) << "Must choose --classify or --extract\n";
@@ -192,4 +197,3 @@ PointViewSet GroundFilter::run(PointViewPtr input)
}
} // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.hpp b/plugins/pcl/filters/StatisticalOutlierFilter.hpp
similarity index 86%
copy from plugins/pcl/filters/GroundFilter.hpp
copy to plugins/pcl/filters/StatisticalOutlierFilter.hpp
index 448c9f3..d2b9146 100644
--- a/plugins/pcl/filters/GroundFilter.hpp
+++ b/plugins/pcl/filters/StatisticalOutlierFilter.hpp
@@ -47,33 +47,30 @@ class PointLayout;
class PointTable;
class PointView;
-class PDAL_DLL GroundFilter : public Filter
+class PDAL_DLL StatisticalOutlierFilter : public Filter
{
public:
- GroundFilter() : Filter()
+ StatisticalOutlierFilter() : Filter()
{}
static void * create();
static int32_t destroy(void *);
std::string getName() const;
+ Options getDefaultOptions();
+
private:
- double m_maxWindowSize;
- double m_slope;
- double m_maxDistance;
- double m_initialDistance;
- double m_cellSize;
+ int m_meanK;
+ double m_multiplier;
bool m_classify;
bool m_extract;
- bool m_approximate;
virtual void addDimensions(PointLayoutPtr layout);
virtual void processOptions(const Options& options);
virtual PointViewSet run(PointViewPtr view);
- GroundFilter& operator=(const GroundFilter&); // not implemented
- GroundFilter(const GroundFilter&); // not implemented
+ StatisticalOutlierFilter& operator=(const StatisticalOutlierFilter&); // not implemented
+ StatisticalOutlierFilter(const StatisticalOutlierFilter&); // not implemented
};
} // namespace pdal
-
diff --git a/plugins/pcl/filters/PCLBlock.cpp b/plugins/pcl/filters/VoxelGridFilter.cpp
similarity index 65%
copy from plugins/pcl/filters/PCLBlock.cpp
copy to plugins/pcl/filters/VoxelGridFilter.cpp
index a5b5cb6..6d17700 100644
--- a/plugins/pcl/filters/PCLBlock.cpp
+++ b/plugins/pcl/filters/VoxelGridFilter.cpp
@@ -1,5 +1,5 @@
/******************************************************************************
-* Copyright (c) 2013-2014, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
*
* All rights reserved.
*
@@ -32,7 +32,7 @@
* OF SUCH DAMAGE.
****************************************************************************/
-#include "PCLBlock.hpp"
+#include "VoxelGridFilter.hpp"
#include "PCLConversions.hpp"
#include "PCLPipeline.h"
@@ -40,28 +40,41 @@
#include <pcl/console/print.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
+#include <pcl/filters/voxel_grid.h>
namespace pdal
{
-static PluginInfo const s_info = PluginInfo(
- "filters.pclblock",
- "PCL Block implementation",
- "http://pdal.io/stages/filters.pclblock.html" );
+static PluginInfo const s_info =
+ PluginInfo("filters.voxelgrid", "Voxel grid filter",
+ "http://pdal.io/stages/filters.voxelgrid.html");
-CREATE_SHARED_PLUGIN(1, 0, PCLBlock, Filter, s_info)
+CREATE_SHARED_PLUGIN(1, 0, VoxelGridFilter, Filter, s_info)
-std::string PCLBlock::getName() const { return s_info.name; }
+std::string VoxelGridFilter::getName() const
+{
+ return s_info.name;
+}
+
+Options VoxelGridFilter::getDefaultOptions()
+{
+ Options options;
+ options.add("leaf_x", 1.0, "Leaf size in X dimension");
+ options.add("leaf_y", 1.0, "Leaf size in Y dimension");
+ options.add("leaf_z", 1.0, "Leaf size in Z dimension");
+ return options;
+}
/** \brief This method processes the PointView through the given pipeline. */
-void PCLBlock::processOptions(const Options& options)
+void VoxelGridFilter::processOptions(const Options& options)
{
- m_filename = options.getValueOrDefault<std::string>("filename", "");
- m_json = options.getValueOrDefault<std::string>("json", "");
+ m_leaf_x = options.getValueOrDefault<double>("leaf_x", 1.0);
+ m_leaf_y = options.getValueOrDefault<double>("leaf_y", 1.0);
+ m_leaf_z = options.getValueOrDefault<double>("leaf_z", 1.0);
}
-PointViewSet PCLBlock::run(PointViewPtr input)
+PointViewSet VoxelGridFilter::run(PointViewPtr input)
{
PointViewPtr output = input->makeNew();
PointViewSet viewSet;
@@ -71,11 +84,7 @@ PointViewSet PCLBlock::run(PointViewPtr input)
if (logOutput)
log()->floatPrecision(8);
- log()->get(LogLevel::Debug2) <<
- input->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
- input->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
- input->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
- log()->get(LogLevel::Debug2) << "Process PCLBlock..." << std::endl;
+ log()->get(LogLevel::Debug2) << "Process VoxelGridFilter..." << std::endl;
BOX3D buffer_bounds;
input->calculateBounds(buffer_bounds);
@@ -85,9 +94,6 @@ PointViewSet PCLBlock::run(PointViewPtr input)
Cloud::Ptr cloud(new Cloud);
pclsupport::PDALtoPCD(input, *cloud, buffer_bounds);
- log()->get(LogLevel::Debug2) << cloud->points[0].x << ", " <<
- cloud->points[0].y << ", " << cloud->points[0].z << std::endl;
-
int level = log()->getLevel();
switch (level)
{
@@ -111,22 +117,14 @@ PointViewSet PCLBlock::run(PointViewPtr input)
break;
}
- pcl::Pipeline<pcl::PointXYZ> pipeline;
- pipeline.setInputCloud(cloud);
- if (!m_filename.empty())
- pipeline.setFilename(m_filename);
- else if (!m_json.empty())
- pipeline.setJSON(m_json);
- else
- throw pdal_error("No PCL pipeline specified!");
- // PDALtoPCD subtracts min values in each XYZ dimension to prevent rounding
- // errors in conversion to float. These offsets need to be conveyed to the
- // pipeline to offset any bounds entered as part of a PassThrough filter.
- pipeline.setOffsets(buffer_bounds.minx, buffer_bounds.miny, buffer_bounds.minz);
+ // initial setup
+ pcl::VoxelGrid<pcl::PointXYZ> vg;
+ vg.setInputCloud(cloud);
+ vg.setLeafSize(m_leaf_x, m_leaf_y, m_leaf_z);
// create PointCloud for results
Cloud::Ptr cloud_f(new Cloud);
- pipeline.filter(*cloud_f);
+ vg.filter(*cloud_f);
if (cloud_f->points.empty())
{
@@ -139,11 +137,8 @@ PointViewSet PCLBlock::run(PointViewPtr input)
log()->get(LogLevel::Debug2) << cloud->points.size() << " before, " <<
cloud_f->points.size() << " after" << std::endl;
log()->get(LogLevel::Debug2) << output->size() << std::endl;
- log()->get(LogLevel::Debug2) << output->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
- output->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
- output->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
+
return viewSet;
}
} // namespace pdal
-
diff --git a/plugins/pcl/filters/GroundFilter.hpp b/plugins/pcl/filters/VoxelGridFilter.hpp
similarity index 76%
copy from plugins/pcl/filters/GroundFilter.hpp
copy to plugins/pcl/filters/VoxelGridFilter.hpp
index 448c9f3..915bc40 100644
--- a/plugins/pcl/filters/GroundFilter.hpp
+++ b/plugins/pcl/filters/VoxelGridFilter.hpp
@@ -1,5 +1,5 @@
/******************************************************************************
-* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+* Copyright (c) 2013, Bradley J Chambers (brad.chambers at gmail.com)
*
* All rights reserved.
*
@@ -35,45 +35,31 @@
#pragma once
#include <pdal/Filter.hpp>
-#include <pdal/Stage.hpp>
-
-#include <memory>
+#include <pdal/StageFactory.hpp>
namespace pdal
{
-class Options;
-class PointLayout;
-class PointTable;
-class PointView;
-
-class PDAL_DLL GroundFilter : public Filter
+class PDAL_DLL VoxelGridFilter : public Filter
{
public:
- GroundFilter() : Filter()
+ VoxelGridFilter() : Filter()
{}
static void * create();
static int32_t destroy(void *);
std::string getName() const;
+ Options getDefaultOptions();
+
private:
- double m_maxWindowSize;
- double m_slope;
- double m_maxDistance;
- double m_initialDistance;
- double m_cellSize;
- bool m_classify;
- bool m_extract;
- bool m_approximate;
+ double m_leaf_x, m_leaf_y, m_leaf_z;
- virtual void addDimensions(PointLayoutPtr layout);
virtual void processOptions(const Options& options);
virtual PointViewSet run(PointViewPtr view);
- GroundFilter& operator=(const GroundFilter&); // not implemented
- GroundFilter(const GroundFilter&); // not implemented
+ VoxelGridFilter& operator=(const VoxelGridFilter&); // not implemented
+ VoxelGridFilter(const VoxelGridFilter&); // not implemented
};
} // namespace pdal
-
diff --git a/plugins/pcl/kernel/GroundKernel.cpp b/plugins/pcl/kernel/GroundKernel.cpp
index f1b9c34..824573b 100644
--- a/plugins/pcl/kernel/GroundKernel.cpp
+++ b/plugins/pcl/kernel/GroundKernel.cpp
@@ -94,11 +94,11 @@ void GroundKernel::addSwitches()
file_options->add_options()
("input,i", po::value<std::string>(&m_inputFile)->default_value(""), "input file name")
("output,o", po::value<std::string>(&m_outputFile)->default_value(""), "output file name")
- ("maxWindowSize", po::value<double>(&m_maxWindowSize)->default_value(33), "max window size")
+ ("max_window_size", po::value<double>(&m_maxWindowSize)->default_value(33), "max window size")
("slope", po::value<double>(&m_slope)->default_value(1), "slope")
- ("maxDistance", po::value<double>(&m_maxDistance)->default_value(2.5), "max distance")
- ("initialDistance", po::value<double>(&m_initialDistance)->default_value(0.15, "0.15"), "initial distance")
- ("cellSize", po::value<double>(&m_cellSize)->default_value(1), "cell size")
+ ("max_distance", po::value<double>(&m_maxDistance)->default_value(2.5), "max distance")
+ ("initial_distance", po::value<double>(&m_initialDistance)->default_value(0.15, "0.15"), "initial distance")
+ ("cell_size", po::value<double>(&m_cellSize)->default_value(1), "cell size")
("classify", po::bool_switch(&m_classify), "apply classification labels?")
("extract", po::bool_switch(&m_extract), "extract ground returns?")
("approximate,a", po::bool_switch(&m_approximate), "use approximate algorithm? (much faster)")
@@ -122,11 +122,11 @@ int GroundKernel::execute()
readerStage.setOptions(readerOptions);
Options groundOptions;
- groundOptions.add<double>("maxWindowSize", m_maxWindowSize);
+ groundOptions.add<double>("max_window_size", m_maxWindowSize);
groundOptions.add<double>("slope", m_slope);
- groundOptions.add<double>("maxDistance", m_maxDistance);
- groundOptions.add<double>("initialDistance", m_initialDistance);
- groundOptions.add<double>("cellSize", m_cellSize);
+ groundOptions.add<double>("max_distance", m_maxDistance);
+ groundOptions.add<double>("initial_distance", m_initialDistance);
+ groundOptions.add<double>("cell_size", m_cellSize);
groundOptions.add<bool>("classify", m_classify);
groundOptions.add<bool>("extract", m_extract);
groundOptions.add<bool>("approximate", m_approximate);
diff --git a/plugins/pcl/pipeline/PCLPipeline.hpp b/plugins/pcl/pipeline/PCLPipeline.hpp
index b6dd968..caf067a 100644
--- a/plugins/pcl/pipeline/PCLPipeline.hpp
+++ b/plugins/pcl/pipeline/PCLPipeline.hpp
@@ -564,14 +564,14 @@ pcl::Pipeline<PointT>::applyMovingLeastSquares(PointCloudConstPtr cloud, PointCl
mls.setSearchRadius(1);
mls.setPolynomialFit(true);
mls.setPolynomialOrder(2);
- mls.setUpsamplingMethod(pcl::MovingLeastSquares<PointT, PointT>::SAMPLE_LOCAL_PLANE);
+ mls.setUpsamplingMethod(pcl::MovingLeastSquares<PointT, PointT>::NONE);
//mls.setDilationIterations(1);
//mls.setDilationVoxelSize(0.5);
//mls.setPointDensity(20);
- mls.setUpsamplingRadius(2);
- mls.setUpsamplingStepSize(1);
- PCL_DEBUG("%f radius \n", mls.getUpsamplingRadius());
- PCL_DEBUG("%f step\n", mls.getUpsamplingStepSize());
+ //mls.setUpsamplingRadius(2);
+ //mls.setUpsamplingStepSize(1);
+ //PCL_DEBUG("%f radius \n", mls.getUpsamplingRadius());
+ //PCL_DEBUG("%f step\n", mls.getUpsamplingStepSize());
mls.process(output);
PCL_DEBUG("%d filtered to %d in moving least squares\n", cloud->points.size(), output.points.size());
diff --git a/plugins/pgpointcloud/io/PgReader.cpp b/plugins/pgpointcloud/io/PgReader.cpp
index 2b55ae4..b50a245 100644
--- a/plugins/pgpointcloud/io/PgReader.cpp
+++ b/plugins/pgpointcloud/io/PgReader.cpp
@@ -174,6 +174,7 @@ uint32_t PgReader::fetchPcid() const
}
oss << " WHERE c.relname = " << pg_quote_literal(m_table_name);
oss << " AND a.attname = " << pg_quote_literal(m_column_name);
+ oss << " AND a.attrelid = c.oid " ;
if (!m_schema_name.empty())
{
oss << " AND c.relnamespace = n.oid AND n.nspname = " <<
diff --git a/plugins/pgpointcloud/test/PgpointcloudWriterTest.cpp b/plugins/pgpointcloud/test/PgpointcloudWriterTest.cpp
index 333c1b8..0332aa6 100644
--- a/plugins/pgpointcloud/test/PgpointcloudWriterTest.cpp
+++ b/plugins/pgpointcloud/test/PgpointcloudWriterTest.cpp
@@ -36,6 +36,7 @@
#include <pdal/Writer.hpp>
#include <pdal/StageFactory.hpp>
+#include <pdal/util/Algorithm.hpp>
#include "Support.hpp"
#include "Pgtest-Support.hpp"
@@ -92,7 +93,8 @@ Options getDbOptions()
class PgpointcloudWriterTest : public testing::Test
{
public:
- PgpointcloudWriterTest() : m_masterConnection(0), m_testConnection(0) {};
+ PgpointcloudWriterTest() : m_masterConnection(0), m_testConnection(0),
+ m_bSkipTests(false) {};
protected:
virtual void SetUp()
{
@@ -108,11 +110,27 @@ protected:
std::stringstream createDbSql;
createDbSql << "CREATE DATABASE " <<
testDbTempname << " TEMPLATE template0";
- executeOnMasterDb(createDbSql.str());
+ try
+ {
+ executeOnMasterDb(createDbSql.str());
+ }
+ catch( const pdal_error& error )
+ {
+ m_bSkipTests = true;
+ return;
+ }
m_testConnection = pg_connect( getTestDBTempConn() );
- executeOnTestDb("CREATE EXTENSION pointcloud");
+ try
+ {
+ executeOnTestDb("CREATE EXTENSION pointcloud");
+ }
+ catch( const pdal_error& error )
+ {
+ m_bSkipTests = true;
+ return;
+ }
}
void executeOnTestDb(const std::string& sql)
@@ -134,6 +152,8 @@ protected:
}
}
+ bool shouldSkipTests() const { return m_bSkipTests; }
+
private:
void executeOnMasterDb(const std::string& sql)
@@ -155,6 +175,7 @@ private:
PGconn* m_masterConnection;
PGconn* m_testConnection;
+ bool m_bSkipTests;
};
namespace
@@ -194,11 +215,21 @@ void optionsWrite(const Options& writerOps)
TEST_F(PgpointcloudWriterTest, write)
{
+ if (shouldSkipTests())
+ {
+ return;
+ }
+
optionsWrite(getDbOptions());
}
TEST_F(PgpointcloudWriterTest, writeScaled)
{
+ if (shouldSkipTests())
+ {
+ return;
+ }
+
Options ops = getDbOptions();
ops.add("scale_x", .01);
ops.add("scale_y", .01);
@@ -209,6 +240,11 @@ TEST_F(PgpointcloudWriterTest, writeScaled)
TEST_F(PgpointcloudWriterTest, writeXYZ)
{
+ if (shouldSkipTests())
+ {
+ return;
+ }
+
Options ops = getDbOptions();
ops.add("output_dims", "X,Y,Z");
@@ -229,6 +265,11 @@ TEST_F(PgpointcloudWriterTest, writeXYZ)
TEST_F(PgpointcloudWriterTest, writetNoPointcloudExtension)
{
+ if (shouldSkipTests())
+ {
+ return;
+ }
+
StageFactory f;
std::unique_ptr<Stage> writer(f.createStage("writers.pgpointcloud"));
EXPECT_TRUE(writer.get());
diff --git a/plugins/python/filters/ProgrammableFilter.cpp b/plugins/python/filters/ProgrammableFilter.cpp
index 236e9ad..c198c6c 100644
--- a/plugins/python/filters/ProgrammableFilter.cpp
+++ b/plugins/python/filters/ProgrammableFilter.cpp
@@ -35,7 +35,6 @@
#include <pdal/pdal_internal.hpp>
#include "ProgrammableFilter.hpp"
-#include "../plang/Plang.hpp"
#include <pdal/PointView.hpp>
#include <pdal/StageFactory.hpp>
diff --git a/plugins/python/plang/CMakeLists.txt b/plugins/python/plang/CMakeLists.txt
deleted file mode 100644
index ec53803..0000000
--- a/plugins/python/plang/CMakeLists.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-
-set(plang_srcs
- BufferedInvocation.cpp
- Invocation.cpp
- Environment.cpp
- Plang.cpp
- Redirector.cpp
- Script.cpp
-)
-
-set(plang_headers
- BufferedInvocation.hpp
- Invocation.hpp
- Environment.hpp
- Plang.hpp
- Redirector.hpp
- Script.hpp
-)
-
-set(PYTHON_LIBRARY ${PDAL_NO_AS_NEEDED_START}
- ${PYTHON_LIBRARY}
- ${PDAL_NO_AS_NEEDED_END})
-PDAL_ADD_LIBRARY(${PLANG_LIB_NAME} ${plang_srcs} ${plang_headers})
-target_link_libraries(${PLANG_LIB_NAME} ${PDAL_BASE_LIB_NAME} ${PYTHON_LIBRARY})
-install(TARGETS ${PLANG_LIB_NAME}
- RUNTIME DESTINATION ${PDAL_BIN_INSTALL_DIR}
- LIBRARY DESTINATION ${PDAL_LIB_INSTALL_DIR}
- ARCHIVE DESTINATION ${PDAL_LIB_INSTALL_DIR})
-
-if (WITH_TESTS)
- PDAL_ADD_TEST(plangtest FILES ../test/PLangTest.cpp
- LINK_WITH ${PLANG_LIB_NAME})
-
-endif()
diff --git a/plugins/python/plang/Plang.cpp b/plugins/python/plang/Plang.cpp
deleted file mode 100644
index 11d0dc7..0000000
--- a/plugins/python/plang/Plang.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-#include <Python.h>
-
-#include <boost/uuid/string_generator.hpp>
-
-//#include <pdal/plang/Plang.hpp>
-#include <pdal/Metadata.hpp>
-
-namespace pdal
-{
-namespace plang
-{
-
-PyObject *fromMetadata(MetadataNode m)
-{
- std::string name = m.name();
- std::string value = m.value();
- std::string type = m.type();
- std::string description = m.description();
-
- MetadataNodeList children = m.children();
- PyObject *submeta = NULL;
- if (children.size())
- {
- submeta = PyList_New(0);
- for (MetadataNode& child : children)
- PyList_Append(submeta, fromMetadata(child));
- }
- PyObject *data = PyTuple_New(5);
- PyTuple_SetItem(data, 0, PyString_FromString(name.data()));
- PyTuple_SetItem(data, 1, PyString_FromString(value.data()));
- PyTuple_SetItem(data, 2, PyString_FromString(type.data()));
- PyTuple_SetItem(data, 3, PyString_FromString(description.data()));
- PyTuple_SetItem(data, 4, submeta);
-
- return data;
-}
-
-void addMetadata(PyObject *list, MetadataNode m)
-{
- if (!PyList_Check(list))
- return;
- for (Py_ssize_t i = 0; i < PyList_Size(list); ++i)
- {
- PyObject *tuple = PyList_GetItem(list, i);
- if (!PyTuple_Check(tuple) || PyTuple_Size(tuple) != 5)
- continue;
- PyObject *o;
- o = PyTuple_GetItem(tuple, 0);
- if (!o || !PyString_Check(o))
- continue;
- std::string name = PyString_AsString(o);
-
- o = PyTuple_GetItem(tuple, 1);
- if (!o || !PyString_Check(o))
- continue;
- std::string value = PyString_AsString(o);
-
- o = PyTuple_GetItem(tuple, 2);
- if (!o || !PyString_Check(o))
- continue;
- std::string type = PyString_AsString(o);
- if (type.empty())
- type = Metadata::inferType(value);
-
- o = PyTuple_GetItem(tuple, 3);
- if (!o || !PyString_Check(o))
- continue;
- std::string description = PyString_AsString(o);
-
- PyObject *submeta = PyTuple_GetItem(tuple, 4);
- MetadataNode child = m.add(name, value, type, description);
- if (submeta)
- addMetadata(submeta, child);
- }
-}
-
-} // namespace plang
-} // namespace pdal
diff --git a/plugins/rxp/io/RxpReader.hpp b/plugins/rxp/io/RxpReader.hpp
index 041059e..a99a649 100644
--- a/plugins/rxp/io/RxpReader.hpp
+++ b/plugins/rxp/io/RxpReader.hpp
@@ -67,6 +67,7 @@ public:
: pdal::Reader()
, m_uri("")
, m_syncToPps(DEFAULT_SYNC_TO_PPS)
+ , m_minimal(false)
, m_pointcloud()
{}
diff --git a/scripts/ci/before_install.sh b/scripts/ci/before_install.sh
index 86f0809..73e9af3 100755
--- a/scripts/ci/before_install.sh
+++ b/scripts/ci/before_install.sh
@@ -68,5 +68,20 @@ then
points2grid
fi
+#
+# LasZIP
+#
+
+mkdir laszip
+cd laszip
+wget https://github.com/LASzip/LASzip/releases/download/v2.2.0/laszip-src-2.2.0.tar.gz &&
+ tar xzf laszip-src-2.2.0.tar.gz &&
+ cd laszip-src-2.2.0 &&
+ ./configure &&
+ make &&
+ sudo make install &&
+ sudo ldconfig &&
+ (cd /usr/local/include && sudo mkdir laszip && cd laszip && sudo ln -s ../las*.hpp .)
+
gcc --version
clang --version
diff --git a/scripts/ci/script.sh b/scripts/ci/script.sh
index 75f0ffa..a07cad6 100755
--- a/scripts/ci/script.sh
+++ b/scripts/ci/script.sh
@@ -42,6 +42,8 @@ cmake \
-DWITH_LAZPERF=$OPTIONAL_COMPONENT_SWITCH \
-DWITH_GEOTIFF=$OPTIONAL_COMPONENT_SWITCH \
-DWITH_LASZIP=$OPTIONAL_COMPONENT_SWITCH \
+ -DLASZIP_INCLUDE_DIR:PATH=/usr/local/include \
+ -DLASZIP_LIBRARY:FILEPATH=/usr/local/lib/liblaszip.so \
-DWITH_TESTS=ON \
-G "$PDAL_CMAKE_GENERATOR" \
..
diff --git a/scripts/linux-install-scripts/geowave b/scripts/linux-install-scripts/geowave
index 28f3de8..bf3e1e6 100755
--- a/scripts/linux-install-scripts/geowave
+++ b/scripts/linux-install-scripts/geowave
@@ -1,7 +1,7 @@
#!/bin/sh
SERVICE_NAME=geowave
-PATH_TO_JAR=/home/vagrant/geowave/geowave-deploy/target/geowave-deploy-0.8.5-jace.jar
-CLASS_TO_RUN=mil.nga.giat.geowave.demo.app.GeoWaveDemoApp
+PATH_TO_JAR=/home/vagrant/geowave/geowave-jace.jar
+CLASS_TO_RUN=mil.nga.giat.geowave.datastore.accumulo.app.GeoWaveDemoApp
PID_PATH_NAME=/tmp/geowave-pid
case $1 in
start)
diff --git a/scripts/linux-install-scripts/geowave.sh b/scripts/linux-install-scripts/geowave.sh
index e2973d7..da50590 100755
--- a/scripts/linux-install-scripts/geowave.sh
+++ b/scripts/linux-install-scripts/geowave.sh
@@ -1,14 +1,29 @@
#!/bin/bash -e
+NUMTHREADS=2
+if [[ -f /sys/devices/system/cpu/online ]]; then
+ # Calculates 1.5 times physical threads
+ NUMTHREADS=$(( ( $(cut -f 2 -d '-' /sys/devices/system/cpu/online) + 1 ) * 15 / 10 ))
+fi
+#NUMTHREADS=1 # disable MP
+export NUMTHREADS
+
# Installs GeoWave library
-git clone https://github.com/ngageoint/geowave.git geowave
+mkdir geowave
cd geowave
-git checkout tags/v0.8.5
-mvn clean package -pl geowave-deploy -am -P generate-jace-proxies,linux-amd64-gcc -DskipITs=true -DskipTests=true
+wget http://s3.amazonaws.com/geowave-rpms/release/TARBALL/geowave-0.8.8.1-24f1a85-jace-source.tar.gz
+tar -xzf geowave-*-jace-source.tar.gz
+mkdir build
+cd build
+cmake -G "Unix Makefiles" \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DBUILD_SHARED_LIBS=ON \
+ ..
+
+make -j $NUMTHREADS
# Configure library paths
-chmod 777 /home/vagrant/geowave/geowave-deploy/target/dependency/jace/libjace.so
-sudo ln -s /home/vagrant/geowave/geowave-deploy/target/dependency/jace/libjace.so /usr/lib/libjace.so
-echo "/usr/lib/jvm/java-7-oracle/jre/lib/amd64" | sudo tee --append /etc/ld.so.conf.d/awt.conf
+chmod 777 /home/vagrant/geowave/build/libjace.so
+sudo ln -s /home/vagrant/geowave/build/libjace.so /usr/lib/libjace.so
echo "/usr/lib/jvm/java-7-oracle/jre/lib/amd64/server" | sudo tee --append /etc/ld.so.conf.d/jvm.conf
sudo ldconfig
diff --git a/scripts/linux-install-scripts/packages.sh b/scripts/linux-install-scripts/packages.sh
index a9196b3..215e22b 100755
--- a/scripts/linux-install-scripts/packages.sh
+++ b/scripts/linux-install-scripts/packages.sh
@@ -39,8 +39,7 @@ sudo apt-get install -y -q git \
g++-multilib \
libglew-dev \
oracle-java7-installer \
- maven \
- libc6-i386
+ maven
diff --git a/scripts/linux-install-scripts/pdal.sh b/scripts/linux-install-scripts/pdal.sh
index c20aea2..6e3105e 100644
--- a/scripts/linux-install-scripts/pdal.sh
+++ b/scripts/linux-install-scripts/pdal.sh
@@ -5,6 +5,7 @@ if [[ -f /sys/devices/system/cpu/online ]]; then
fi
#NUMTHREADS=1 # disable MP
export NUMTHREADS
+export JAVA_HOME=/usr/lib/jvm/java-7-oracle
git clone https://github.com/PDAL/PDAL.git pdal
cd pdal
@@ -31,15 +32,9 @@ cmake -G "Unix Makefiles" \
-DLAZPERF_INCLUDE_DIR=/home/vagrant/laz-perf \
-DJSONCPP_ROOT_DIR=/usr/include/jsoncpp \
-DBUILD_PLUGIN_GEOWAVE=ON \
- -DGEOWAVE_RUNTIME_JAR=/home/vagrant/geowave/geowave-deploy/target/geowave-deploy-0.8.5-jace.jar \
- -DJACE_INCLUDE_DIR=/home/vagrant/geowave/geowave-deploy/target/dependency/jace/include \
- -DJACE_LIBRARY=/home/vagrant/geowave/geowave-deploy/target/dependency/jace/libjace.so \
- -DJACE_RUNTIME_JAR=/home/vagrant/geowave/geowave-deploy/target/dependency/jace-core-runtime-1.2.22.jar \
- -DJAVA_AWT_INCLUDE_PATH=/usr/lib/jvm/java-7-oracle/include \
- -DJAVA_AWT_LIBRARY=/usr/lib/jvm/java-7-oracle/jre/lib/amd64/libjawt.so \
- -DJAVA_INCLUDE_PATH=/usr/lib/jvm/java-7-oracle/include \
- -DJAVA_INCLUDE_PATH2=/usr/lib/jvm/java-7-oracle/include/linux \
- -DJAVA_JVM_LIBRARY=/usr/lib/jvm/java-7-oracle/jre/lib/amd64/server/libjvm.so \
+ -DGEOWAVE_RUNTIME_JAR=/home/vagrant/geowave/geowave-jace.jar \
+ -DJACE_INCLUDE_DIR=/home/vagrant/geowave/include \
+ -DJACE_LIBRARY=/home/vagrant/geowave/build/libjace.so \
..
make -j $NUMTHREADS
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 4dc48e7..0b849a2 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -43,6 +43,7 @@ set(PDAL_BASE_HPP
"${PDAL_HEADERS_DIR}/Filter.hpp"
"${PDAL_HEADERS_DIR}/FlexWriter.hpp"
"${PDAL_HEADERS_DIR}/GDALUtils.hpp"
+ "${PDAL_HEADERS_DIR}/Geometry.hpp"
"${PDAL_HEADERS_DIR}/GlobalEnvironment.hpp"
"${PDAL_HEADERS_DIR}/gitsha.h"
"${PDAL_HEADERS_DIR}/KDIndex.hpp"
@@ -177,7 +178,6 @@ else()
set(UTIL_LIB ${PDAL_UTIL_LIB_NAME})
endif()
-
target_link_libraries(${PDAL_BASE_LIB_NAME}
${CMAKE_THREAD_LIBS_INIT}
${GDAL_LIBRARY}
diff --git a/src/GDALUtils.cpp b/src/GDALUtils.cpp
index 523f524..59c6637 100644
--- a/src/GDALUtils.cpp
+++ b/src/GDALUtils.cpp
@@ -100,6 +100,282 @@ ErrorHandler::~ErrorHandler()
CPLPopErrorHandler();
}
+Raster::Raster(const std::string& filename)
+ : m_filename(filename)
+ , m_raster_x_size(0)
+ , m_raster_y_size(0)
+ , m_block_x(0)
+ , m_block_y(0)
+ , m_size(0)
+ , m_band_count(0)
+ , m_ds(0)
+
+{
+ m_forward_transform.fill(0.0);
+ m_inverse_transform.fill(0.0);
+}
+
+bool Raster::open()
+{
+ if (m_ds)
+ return true; // already open
+
+ m_ds = GDALOpen(m_filename.c_str(), GA_ReadOnly);
+ if (m_ds == NULL)
+ throw pdal_error("Unable to open GDAL datasource!");
+
+ if (GDALGetGeoTransform(m_ds, &(m_forward_transform.front())) != CE_None)
+ throw pdal_error("unable to fetch forward geotransform for raster!");
+
+ if (!GDALInvGeoTransform(&(m_forward_transform.front()),
+ &(m_inverse_transform.front())))
+ throw pdal_error("unable to fetch inverse geotransform for raster!");
+
+ m_raster_x_size = GDALGetRasterXSize(m_ds);
+ m_raster_y_size = GDALGetRasterYSize(m_ds);
+ m_band_count = GDALGetRasterCount(m_ds);
+
+ m_types = computePDALDimensionTypes();
+ m_size = 0;
+ for(auto t: m_types)
+ {
+ m_size += pdal::Dimension::size(t);
+ }
+ return true;
+}
+
+void Raster::pixelToCoord(int col, int row, std::array<double, 2>& output) const
+{
+ // from http://gis.stackexchange.com/questions/53617/how-to-find-lat-lon-values-for-every-pixel-in-a-geotiff-file
+ double c = m_forward_transform[0];
+ double a = m_forward_transform[1];
+ double b = m_forward_transform[2];
+ double f = m_forward_transform[3];
+ double d = m_forward_transform[4];
+ double e = m_forward_transform[5];
+
+ output[0] = a*col + b*row + a*0.5 + b*0.5 + c;
+ output[1] = d*col + e*row + d*0.5 + e*0.5 + f;
+}
+
+// Determines the pixel/line position given an x/y.
+// No reprojection is done at this time.
+bool Raster::getPixelAndLinePosition(double x, double y,
+ std::array<double, 6> const& inverse,
+ int32_t& pixel, int32_t& line)
+{
+ pixel = (int32_t)std::floor(inverse[0] + (inverse[1] * x) +
+ (inverse[2] * y));
+ line = (int32_t) std::floor(inverse[3] + (inverse[4] * x) +
+ (inverse[5] * y));
+
+ int xs = m_raster_x_size;
+ int ys = m_raster_y_size;
+
+ if (!xs || !ys)
+ throw pdal_error("Unable to get X or Y size from raster!");
+
+ if (pixel < 0 || line < 0 || pixel >= xs || line >= ys)
+ {
+ // The x, y is not coincident with this raster
+ return false;
+ }
+
+ return true;
+}
+
+pdal::Dimension::Type::Enum convertGDALtoPDAL(GDALDataType t)
+{
+
+ using namespace pdal::Dimension::Type;
+ switch (t)
+ {
+ case GDT_Byte:
+ return Unsigned8;
+ case GDT_UInt16:
+ return Unsigned16;
+ case GDT_Int16:
+ return Signed16;
+ case GDT_UInt32:
+ return Unsigned32;
+ case GDT_Int32:
+ return Signed32;
+ case GDT_CFloat32:
+ return Float;
+ case GDT_CFloat64:
+ return Double;
+ default:
+ return None;
+ }
+
+ return None;
+}
+
+bool Raster::readBand(std::vector<uint8_t>& data, int nBand)
+{
+ data.resize(m_raster_x_size * m_raster_y_size);
+
+ GDALRasterBandH band = GDALGetRasterBand(m_ds, nBand);
+ if (!band)
+ {
+ std::ostringstream oss;
+ oss << "Unable to get band " << nBand <<
+ " from data source!";
+ throw pdal_error(oss.str());
+ }
+
+ int nXBlockSize(0);
+ int nYBlockSize(0);
+
+ GDALGetBlockSize(band, &nXBlockSize, &nYBlockSize);
+
+ int nXBlocks = (GDALGetRasterBandXSize(band) + nXBlockSize - 1) / nXBlockSize;
+ int nYBlocks = (GDALGetRasterBandYSize(band) + nYBlockSize - 1) / nYBlockSize;
+
+ for (int iYBlock = 0; iYBlock < nYBlocks; iYBlock++)
+ {
+ int nXValid(0); int nYValid(0);
+ for (int iXBlock = 0; iXBlock < nXBlocks; iXBlock++)
+ {
+
+ if ((iXBlock+1) * nXBlockSize > GDALGetRasterBandXSize(band))
+ nXValid = GDALGetRasterBandXSize(band) - iXBlock * nXBlockSize;
+ else
+ nXValid = nXBlockSize;
+ if ((iYBlock+1) * nYBlockSize > GDALGetRasterBandYSize(band))
+ nYValid = GDALGetRasterBandYSize(band) - iYBlock * nYBlockSize;
+ else
+ nYValid = nYBlockSize;
+
+ int offset = iXBlock * (nXValid * nYValid) + iYBlock * (nXValid * nYValid);
+
+ CPLErr err = GDALReadBlock(band, iXBlock, iYBlock, data.data() + offset);
+ if (err != CPLE_None)
+ {
+ std::ostringstream oss;
+ oss << "unable to read block for ("<<iXBlock <<","<< iYBlock <<")";
+ throw pdal::pdal_error(oss.str());
+ }
+
+ }
+
+ }
+ return true;
+}
+
+std::vector<std::array<int, 2>> Raster::fetchGDALBlockSizes() const
+{
+ std::vector<std::array<int, 2>> output;
+ for (int i=1; i < m_band_count; ++i)
+ {
+ GDALRasterBandH band = GDALGetRasterBand(m_ds, i);
+ if (!band)
+ {
+ std::ostringstream oss;
+ oss << "Unable to get band " << i <<
+ " from data source!";
+ throw pdal_error(oss.str());
+ }
+ int x(0), y(0);
+ GDALGetBlockSize(band, &x, &y);
+ std::array<int, 2> a;
+ a[0] = x;
+ a[1] = y;
+ output.push_back(a);
+ }
+
+
+ return output;
+}
+
+std::vector<pdal::Dimension::Type::Enum> Raster::computePDALDimensionTypes() const
+{
+
+ if (!m_ds) throw pdal::pdal_error("raster is not open!");
+
+ std::vector<pdal::Dimension::Type::Enum> output;
+ for (int i=0; i < m_band_count; ++i)
+ {
+ GDALRasterBandH band = GDALGetRasterBand(m_ds, i+1);
+ if (!band)
+ {
+ std::ostringstream oss;
+ oss << "Unable to get band " << i+1 <<
+ " from data source!";
+ throw pdal_error(oss.str());
+ }
+
+ GDALDataType t = GDALGetRasterDataType(band);
+ int x(0), y(0);
+ GDALGetBlockSize(band, &x, &y);
+ pdal::Dimension::Type::Enum ptype = convertGDALtoPDAL(t);
+
+ output.push_back(ptype);
+ }
+ return output;
+}
+
+
+bool Raster::read(double x, double y, std::vector<double>& data)
+{
+
+ if (!m_ds)
+ throw pdal::pdal_error("Unable to read() because raster data source is not open");
+
+ int32_t pixel(0);
+ int32_t line(0);
+ data.resize(m_band_count);
+
+ std::array<double, 2> pix = { {0.0, 0.0} };
+
+ // No data at this x,y if we can't compute a pixel/line location
+ // for it.
+ if (!getPixelAndLinePosition(x, y, m_inverse_transform, pixel, line))
+ return false;
+
+ for (int i=0; i < m_band_count; ++i)
+ {
+ GDALRasterBandH b = GDALGetRasterBand(m_ds, i+1);
+ if (GDALRasterIO(b, GF_Read, pixel, line, 1, 1,
+ &pix[0], 1, 1, GDT_CFloat64, 0, 0) == CE_None)
+ {
+ // we read a pixel put its values in our vector
+ data[i] = pix[0];
+ }
+
+ }
+
+ return true;
+}
+
+SpatialReference Raster::getSpatialRef() const
+{
+ if (!m_ds)
+ throw pdal::pdal_error("Unable to getSpatialRef() because raster data source is not open");
+
+ const char* wkt = GDALGetProjectionRef(m_ds);
+
+ SpatialReference r(wkt);
+ return r;
+
+}
+
+Raster::~Raster()
+{
+ close();
+}
+
+void Raster::close()
+{
+ if (m_ds != 0)
+ {
+ GDALClose(m_ds);
+ m_ds = 0;
+ }
+ m_size = 0;
+ m_types.clear();
+}
+
} // namespace gdal
std::string transformWkt(std::string wkt, const SpatialReference& from,
diff --git a/src/Kernel.cpp b/src/Kernel.cpp
index 7c516a2..724d755 100644
--- a/src/Kernel.cpp
+++ b/src/Kernel.cpp
@@ -35,11 +35,14 @@
#include <pdal/GlobalEnvironment.hpp>
#include <pdal/Kernel.hpp>
#include <pdal/PDALUtils.hpp>
+
+#include <cctype>
#include <iostream>
#include <boost/algorithm/string.hpp>
#include <pdal/pdal_config.hpp>
+#include <pdal/Options.hpp>
#include <pdal/StageFactory.hpp>
#include <pdal/pdal_config.hpp>
@@ -71,6 +74,18 @@ Kernel::Kernel()
{}
+Kernel::~Kernel()
+{
+ for (auto & iter : m_public_options)
+ {
+ delete iter;
+ }
+ for (auto & iter : m_hidden_options)
+ {
+ delete iter;
+ }
+}
+
std::ostream& operator<<(std::ostream& ostr, const Kernel& kernel)
{
ostr << " Name: " << kernel.getName() << std::endl;
@@ -219,61 +234,72 @@ int Kernel::run(int argc, const char* argv[], const std::string& appName)
}
+namespace
+{
+
+bool parseOption(std::string o, std::string& stage, std::string& option,
+ std::string& value)
+{
+ if (o.size() < 2)
+ return false;
+ if (o[0] != '-' || o[1] != '-')
+ return false;
+
+ o = o.substr(2);
+
+ // Options are stage_type.stage_name.option_name
+ // stage_type and stage_name are always lowercase. Option name starts
+ // with lowercase and then contains lowercase, numbers or underscore.
+
+ // This awfulness is to work around the multiply-defined islower. Seems
+ // a bit better than the cast solution.
+ auto islc = [](char c)
+ { return std::islower(c); };
+
+ std::string::size_type pos = 0;
+ std::string::size_type count = 0;
+ // Get stage_type.
+ count = Utils::extract(o, pos, islc);
+ pos += count;
+ if (o[pos++] != '.')
+ return false;
+
+ // Get stage_name.
+ count = Utils::extract(o, pos, islc);
+ pos += count;
+ stage = o.substr(0, pos);
+ if (o[pos++] != '.')
+ return false;
+
+ // Get option name.
+ std::string::size_type optionStart = pos;
+ count = Option::parse(o, pos);
+ pos += count;
+ option = o.substr(optionStart, count);
+
+ if (o[pos++] != '=')
+ return false;
+
+ // The command-line parser takes care of quotes around an argument
+ // value and such. May want to do something to handle escaped characters?
+ value = o.substr(pos);
+ return true;
+}
+
+} // unnamed namespace
+
+
void Kernel::collectExtraOptions()
{
for (const auto& o : m_extra_options)
{
- typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
-
- // if we don't have --, we're not an option we
- // even care about
- if (!boost::algorithm::find_first(o, "--"))
- continue;
-
- // Find the dimensions listed and put them on the id list.
- boost::char_separator<char> equal("=");
- boost::char_separator<char> dot(".");
- tokenizer option_tokens(o, equal);
- std::vector<std::string> option_split;
- for (auto const& ti : option_tokens)
- option_split.push_back(boost::lexical_cast<std::string>(ti));
- if (!(option_split.size() == 2))
- {
-// std::ostringstream oss;
-// oss << "option '" << o << "' did not split correctly. Is it "
-// "in the form --readers.las.option=foo?";
-// throw app_usage_error(oss.str());
- continue;
- }
-
- std::string option_value(option_split[1]);
- std::string stage_value(option_split[0]);
- boost::algorithm::erase_all(stage_value, "--");
-
- tokenizer name_tokens(stage_value, dot);
- std::vector<std::string> stage_values;
- for (auto const& ti : name_tokens)
- stage_values.push_back(ti);
+ std::string stageName, opName, value;
- std::string option_name = *stage_values.rbegin();
- std::ostringstream stage_name_ostr;
- bool bFirst(true);
- for (auto s = stage_values.begin(); s != stage_values.end() - 1; ++s)
+ if (parseOption(o, stageName, opName, value))
{
- auto s2 = boost::algorithm::erase_all_copy(*s, " ");
-
- if (bFirst)
- {
- bFirst = false;
- }
- else
- stage_name_ostr <<".";
- stage_name_ostr << s2;
+ Option op(opName, value);
+ m_extraStageOptions[stageName].add(op);
}
- std::string stageName(stage_name_ostr.str());
-
- Option op(option_name, option_value);
- m_extraStageOptions[stageName].add(op);
}
}
diff --git a/src/KernelSupport.cpp b/src/KernelSupport.cpp
index cef6e09..a834012 100644
--- a/src/KernelSupport.cpp
+++ b/src/KernelSupport.cpp
@@ -44,12 +44,12 @@
namespace pdal
{
-PipelineManager* KernelSupport::makePipeline(const std::string& inputFile)
+PipelineManagerPtr KernelSupport::makePipeline(const std::string& inputFile)
{
if (!pdal::FileUtils::fileExists(inputFile))
throw app_runtime_error("file not found: " + inputFile);
- PipelineManager* output = new PipelineManager;
+ PipelineManagerPtr output(new PipelineManager);
if (inputFile == "STDIN")
{
diff --git a/src/Options.cpp b/src/Options.cpp
index 43c2834..87ff3a7 100644
--- a/src/Options.cpp
+++ b/src/Options.cpp
@@ -1,4 +1,5 @@
/******************************************************************************
+* Copyright (c) 2015, Hobu Inc. (hobu at hobu.co)
*
* All rights reserved.
*
@@ -34,17 +35,10 @@
#include <pdal/Options.hpp>
#include <pdal/PDALUtils.hpp>
-#include <boost/property_tree/ptree.hpp>
-#include <boost/property_tree/json_parser.hpp>
-#include <boost/optional.hpp>
-#include <boost/foreach.hpp>
-#include <boost/algorithm/string.hpp>
-
#include <iostream>
#include <sstream>
#include <iostream>
-
namespace pdal
{
@@ -56,25 +50,6 @@ Option::Option(const boost::property_tree::ptree& tree)
m_value = tree.get<std::string>("Value");
m_description =
tree.count("Description") ? tree.get<std::string>("Description") : "";
-
- boost::property_tree::ptree opts;
- ptree const& options = tree.get_child("Options", opts);
- if (options.size())
- m_options = options::OptionsPtr(new Options(options));
-}
-
-
-boost::optional<Options const&> Option::getOptions() const
-{
- if (m_options.get())
- return boost::optional<Options const&>(*m_options.get());
- else
- return boost::optional<Options const&>();
-}
-
-void Option::setOptions(Options const& options)
-{
- m_options = options::OptionsPtr(new Options(options));
}
#if !defined(PDAL_COMPILER_MSVC)
@@ -95,23 +70,12 @@ template<> void Option::setValue(const std::string& value)
}
#endif
-bool Option::empty() const
-{
- if (m_options)
- return m_options->empty();
- else
- return false;
-}
void Option::toMetadata(MetadataNode& parent) const
{
MetadataNode child = parent.add(getName());
child.add("value", getValue<std::string>());
child.add("description", getDescription());
-
- auto opts = getOptions();
- if (opts)
- opts->toMetadata(child);
}
//---------------------------------------------------------------------------
@@ -128,6 +92,20 @@ Options::Options(const Option& opt)
}
+bool Option::nameValid(const std::string& name, bool reportError)
+{
+ bool valid = (parse(name, 0) == name.size());
+ if (!valid && reportError)
+ {
+ std::ostringstream oss;
+ oss << "Invalid option name '" << name << "'. Options must "
+ "consist of only lowercase letters, numbers and '_'.";
+ Utils::printError(oss.str());
+ }
+ return valid;
+}
+
+
Options::Options(const boost::property_tree::ptree& tree)
{
for (auto iter = tree.begin(); iter != tree.end(); ++iter)
@@ -141,10 +119,17 @@ Options::Options(const boost::property_tree::ptree& tree)
void Options::add(const Option& option)
{
+ assert(Option::nameValid(option.getName(), true));
m_options.insert(std::pair<std::string, Option>(option.getName(), option));
}
+void Options::remove(const Option& option)
+{
+ m_options.erase(option.getName());
+}
+
+
Option& Options::getOptionByRef(const std::string& name)
{
auto iter = m_options.find(name);
@@ -161,6 +146,7 @@ Option& Options::getOptionByRef(const std::string& name)
const Option& Options::getOption(const std::string& name) const
{
+ assert(Option::nameValid(name, true));
auto iter = m_options.find(name);
if (iter == m_options.end())
{
@@ -177,7 +163,7 @@ std::vector<Option> Options::getOptions(std::string const& name) const
std::vector<Option> output;
// If we have an empty name, return them all
- if (boost::iequals(name, ""))
+ if (name.empty())
{
for (auto it = m_options.begin(); it != m_options.end(); ++it)
{
@@ -195,13 +181,6 @@ std::vector<Option> Options::getOptions(std::string const& name) const
return output;
}
-// the empty options set
-static const Options s_none;
-const Options& Options::none()
-{
- return s_none;
-}
-
bool Options::hasOption(std::string const& name) const
{
diff --git a/src/PDALUtils.cpp b/src/PDALUtils.cpp
index a5c9ae6..cebc870 100644
--- a/src/PDALUtils.cpp
+++ b/src/PDALUtils.cpp
@@ -152,9 +152,6 @@ void toJSON(const Option& opt, std::ostream& o, int level)
o << indent2 << "\"value\" : " << value << "," << endl;
o << indent2 << "\"description\" : " << description << endl;
- boost::optional<Options const&> opts = opt.getOptions();
- if (opts)
- toJSON(*opts, o, level + 1);
o << indent << "}";
}
diff --git a/src/PipelineReader.cpp b/src/PipelineReader.cpp
index 93f7bdd..1a6c301 100644
--- a/src/PipelineReader.cpp
+++ b/src/PipelineReader.cpp
@@ -164,26 +164,6 @@ Option PipelineReader::parseElement_Option(const ptree& tree)
boost::algorithm::trim(value);
Option option(name, value);
- boost::optional<ptree const&> moreOptions =
- tree.get_child_optional("Options");
-
- if (moreOptions)
- {
- ptree::const_iterator iter = moreOptions->begin();
-
- Options options;
- while (iter != moreOptions->end())
- {
- if (iter->first == "Option")
- {
- Option o2 = parseElement_Option(iter->second);
- options.add(o2);
- }
- ++iter;
- }
- option.setOptions(options);
- }
-
// filenames in the XML are fixed up as follows:
// - if absolute path, leave it alone
// - if relative path, make it absolute using the XML file's directory
diff --git a/src/PluginManager.cpp b/src/PluginManager.cpp
index c4e6fca..7eea778 100644
--- a/src/PluginManager.cpp
+++ b/src/PluginManager.cpp
@@ -303,6 +303,13 @@ bool PluginManager::guessLoadByPath(const std::string& driverName)
pluginDir = oss.str();
}
+ std::string plugin_debug("PDAL_DEBUG");
+ std::string plugin_debug_path = Utils::getenv(plugin_debug);
+ if (plugin_debug_path.size())
+ {
+ std::cerr << "PDAL: plugin search path '" << pluginDir <<"'"<<std::endl;
+ }
+
std::vector<std::string> pluginPathVec = Utils::split2(pluginDir, ':');
for (const auto& pluginPath : pluginPathVec)
{
@@ -372,18 +379,40 @@ bool PluginManager::loadByPath(const std::string& pluginPath,
// If we are a valid type, and we're not yet already
// loaded in the LibraryMap, load it.
+
+ std::string plugin_debug("PDAL_DEBUG");
+ std::string plugin_debug_path = Utils::getenv(plugin_debug);
+
if (pluginTypeValid(pathname, type) &&
m_dynamicLibraryMap.find(path.string()) == m_dynamicLibraryMap.end())
{
std::string errorString;
auto completePath(boost::filesystem::complete(path).string());
+ if (plugin_debug_path.size())
+ {
+ std::cerr << "PDAL: attempting to load plugin '" << completePath <<"'"<<std::endl;
+ }
if (DynamicLibrary *d = loadLibrary(completePath, errorString))
{
+ if (plugin_debug_path.size())
+ {
+ std::cerr << "PDAL: loaded plugin '" << completePath <<"'"<<std::endl;
+ }
if (PF_InitFunc initFunc =
(PF_InitFunc)(d->getSymbol("PF_initPlugin")))
{
loaded = initializePlugin(initFunc);
+ if (plugin_debug_path.size())
+ {
+ std::cerr << "PDAL: initialized plugin '" << completePath <<"'"<<std::endl;
+ }
+ } else
+ {
+ if (plugin_debug_path.size())
+ {
+ std::cerr << "PDAL: failed to initialize plugin '" << completePath <<"'"<<std::endl;
+ }
}
}
}
diff --git a/src/PointLayout.cpp b/src/PointLayout.cpp
index 5803ac6..883ddcf 100644
--- a/src/PointLayout.cpp
+++ b/src/PointLayout.cpp
@@ -33,7 +33,7 @@
****************************************************************************/
#include <pdal/PointLayout.hpp>
-#include <pdal/util/Utils.hpp>
+#include <pdal/util/Algorithm.hpp>
namespace pdal
{
diff --git a/src/PointTable.cpp b/src/PointTable.cpp
index 6f5cc64..8f10b3f 100644
--- a/src/PointTable.cpp
+++ b/src/PointTable.cpp
@@ -37,22 +37,6 @@
namespace pdal
{
-SpatialReference BasePointTable::spatialRef() const
-{
- MetadataNode m = m_metadata->m_private.findChild("spatialreference");
- SpatialReference sref;
- sref.setWKT(m.value());
- return sref;
-}
-
-
-void BasePointTable::setSpatialRef(const SpatialReference& sref)
-{
- MetadataNode mp = m_metadata->m_private;
- mp.addOrUpdate("spatialreference", sref.getRawWKT());
-}
-
-
MetadataNode BasePointTable::privateMetadata(const std::string& name)
{
MetadataNode mp = m_metadata->m_private;
diff --git a/src/PointView.cpp b/src/PointView.cpp
index 241e988..4b2cc5e 100644
--- a/src/PointView.cpp
+++ b/src/PointView.cpp
@@ -42,8 +42,6 @@
namespace pdal
{
-bool PointView::m_ok;
-
PointViewIter PointView::begin()
{
return PointViewIter(this, 0);
diff --git a/src/SpatialReference.cpp b/src/SpatialReference.cpp
index 05c3f67..8b14af1 100644
--- a/src/SpatialReference.cpp
+++ b/src/SpatialReference.cpp
@@ -69,6 +69,18 @@ bool SpatialReference::empty() const
return getWKT().empty();
}
+bool SpatialReference::valid() const
+{
+ std::string wkt = getWKT();
+ OGRSpatialReferenceH current =
+ OSRNewSpatialReference(wkt.c_str());
+
+ OGRErr err = OSRValidate(current);
+
+ OSRDestroySpatialReference(current);
+ return err == OGRERR_NONE;
+}
+
std::string SpatialReference::getWKT(WKTModeFlag mode_flag) const
{
@@ -267,7 +279,7 @@ int SpatialReference::calculateZone(double lon, double lat)
if (lat >= 56.0 && lat < 64.0 && lon >= 3.0 && lon < 12.0 )
zone = 32;
// Special Svalbard processing.
- else if (lat >= 72.0 && lat < 84.0)
+ else if (lat >= 72.0 && lat < 84.0)
{
if (lon >= 0.0 && lon < 9.0)
zone = 31;
@@ -356,9 +368,7 @@ int SpatialReference::computeUTMZone(const BOX3D& box) const
int min_zone(0);
int max_zone(0);
min_zone = calculateZone(minx, miny);
- std::cerr << "Min X/Y/zone = " << minx << "/" << miny << "/" << min_zone << "!\n";
max_zone = calculateZone(maxx, maxy);
- std::cerr << "Max X/Y/zone = " << maxx << "/" << maxy << "/" << max_zone << "!\n";
if (min_zone != max_zone)
{
diff --git a/src/Stage.cpp b/src/Stage.cpp
index fc190bc..6ca50ab 100644
--- a/src/Stage.cpp
+++ b/src/Stage.cpp
@@ -81,7 +81,7 @@ void Stage::prepare(PointTableRef table)
l_processOptions(m_options);
processOptions(m_options);
l_initialize(table);
- initialize();
+ initialize(table);
addDimensions(table.layout());
prepared(table);
}
@@ -92,6 +92,8 @@ PointViewSet Stage::execute(PointTableRef table)
table.layout()->finalize();
PointViewSet views;
+
+ // If the inputs are empty, we're a reader.
if (m_inputs.empty())
{
views.insert(PointViewPtr(new PointView(table)));
@@ -109,6 +111,19 @@ PointViewSet Stage::execute(PointTableRef table)
PointViewSet outViews;
std::vector<StageRunnerPtr> runners;
+ // Put the spatial references from the views onto the table.
+ // The table's spatial references are only valid as long as the stage
+ // is running.
+ // ABELL - Should we clear the references once the stage run has
+ // completed? Wondering if that would break something where a
+ // writer wants to check a table's SRS.
+ SpatialReference srs;
+ table.clearSpatialReferences();
+ for (auto const& it : views)
+ table.addSpatialReference(it->spatialReference());
+
+ // Do the ready operation and then start running all the views
+ // through the stage.
ready(table);
for (auto const& it : views)
{
@@ -116,13 +131,22 @@ PointViewSet Stage::execute(PointTableRef table)
runners.push_back(runner);
runner->run();
}
+
+ // As the stages complete (synchronously at this time), propagate the
+ // spatial reference and merge the output views.
+ srs = getSpatialReference();
for (auto const& it : runners)
{
StageRunnerPtr runner(it);
PointViewSet temp = runner->wait();
+
+ // If our stage has a spatial reference, the view takes it on once
+ // the stage has been run.
+ if (!srs.empty())
+ for (PointViewPtr v : temp)
+ v->setSpatialReference(srs);
outViews.insert(temp.begin(), temp.end());
}
- l_done(table);
done(table);
return outViews;
}
@@ -184,12 +208,6 @@ void Stage::l_processOptions(const Options& options)
}
-void Stage::l_done(PointTableRef table)
-{
- if (!m_spatialReference.empty())
- table.setSpatialRef(m_spatialReference);
-}
-
const SpatialReference& Stage::getSpatialReference() const
{
return m_spatialReference;
diff --git a/src/StageFactory.cpp b/src/StageFactory.cpp
index 59ac097..c6cd431 100644
--- a/src/StageFactory.cpp
+++ b/src/StageFactory.cpp
@@ -53,6 +53,8 @@
// readers
#include <bpf/BpfReader.hpp>
#include <faux/FauxReader.hpp>
+#include <gdal/GDALReader.hpp>
+#include <ilvis2/Ilvis2Reader.hpp>
#include <las/LasReader.hpp>
#include <optech/OptechReader.hpp>
#include <pdal/BufferReader.hpp>
@@ -60,6 +62,7 @@
#include <qfit/QfitReader.hpp>
#include <sbet/SbetReader.hpp>
#include <terrasolid/TerrasolidReader.hpp>
+#include <tindex/TIndexReader.hpp>
// writers
#include <bpf/BpfWriter.hpp>
@@ -105,6 +108,7 @@ std::string StageFactory::inferReaderDriver(const std::string& filename)
drivers["sbet"] = "readers.sbet";
drivers["sqlite"] = "readers.sqlite";
drivers["sid"] = "readers.mrsid";
+ drivers["tindex"] = "readers.tindex";
if (ext == "") return "";
ext = ext.substr(1, ext.length()-1);
@@ -200,12 +204,15 @@ StageFactory::StageFactory(bool no_plugins)
// readers
PluginManager::initializePlugin(BpfReader_InitPlugin);
PluginManager::initializePlugin(FauxReader_InitPlugin);
+ PluginManager::initializePlugin(GDALReader_InitPlugin);
+ PluginManager::initializePlugin(Ilvis2Reader_InitPlugin);
PluginManager::initializePlugin(LasReader_InitPlugin);
PluginManager::initializePlugin(OptechReader_InitPlugin);
PluginManager::initializePlugin(PlyReader_InitPlugin);
PluginManager::initializePlugin(QfitReader_InitPlugin);
PluginManager::initializePlugin(SbetReader_InitPlugin);
PluginManager::initializePlugin(TerrasolidReader_InitPlugin);
+ PluginManager::initializePlugin(TIndexReader_InitPlugin);
// writers
PluginManager::initializePlugin(BpfWriter_InitPlugin);
diff --git a/src/gitsha.cpp b/src/gitsha.cpp
index bd149e6..477c591 100644
--- a/src/gitsha.cpp
+++ b/src/gitsha.cpp
@@ -1,3 +1,3 @@
#include <pdal/gitsha.h>
-#define GIT_SHA1 "a9d6693901c7f8c7bb8e57f640a2954c9115343f"
+#define GIT_SHA1 "5ba8ee566c5c4faf5285768ed4567668888b223a"
const char g_GIT_SHA1[] = GIT_SHA1;
diff --git a/src/plang/Environment.cpp b/src/plang/Environment.cpp
index f6702a3..497f798 100644
--- a/src/plang/Environment.cpp
+++ b/src/plang/Environment.cpp
@@ -32,6 +32,10 @@
* OF SUCH DAMAGE.
****************************************************************************/
+#ifndef _WIN32
+#include <dlfcn.h>
+#endif
+
#include <pdal/plang/Environment.hpp>
#include <pdal/plang/Redirector.hpp>
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
@@ -51,6 +55,20 @@
#undef tolower
#undef isspace
+// See ticket #1010. This function runs when libplang is loaded. It makes
+// sure python symbols can be found by extention module .so's since on some
+// platforms (notably Ubuntu), they aren't linked with libpython even though
+// they depend on it. If a platform doesn't support
+// __attribute__ ((constructor)) this does nothing. We'll have to deal with
+// those as they come up.
+#ifndef _WIN32
+__attribute__ ((constructor))
+static void loadPython()
+{
+ std::cerr << "Force load python.\n";
+ ::dlopen(PDAL_PYTHON_LIBRARY, RTLD_LAZY | RTLD_GLOBAL);
+}
+#endif
// http://www.linuxjournal.com/article/3641
// http://www.codeproject.com/Articles/11805/Embedding-Python-in-C-C-Part-I
diff --git a/test/data/autzen/attributes.json b/test/data/autzen/attributes.json
new file mode 100644
index 0000000..6a1ccd5
--- /dev/null
+++ b/test/data/autzen/attributes.json
@@ -0,0 +1,11 @@
+{
+"type": "FeatureCollection",
+
+"features": [
+{ "type": "Feature", "properties": { "id": 6, "cls": 2 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -123.067019000727967, 44.059524946819884 ], [ -123.066697831944637, 44.059771500882199 ], [ -123.065494970755537, 44.059838504937517 ], [ -123.064074882074451, 44.059742872480356 ], [ -123.063707784110264, 44.059184772926969 ], [ -123.06401206144227, 44.05752667418929 ], [ -123.065925935478475, 44.057786669839672 ], [ -123.065745673821624, 44.058221493390228 ], [ -123.066333794 [...]
+{ "type": "Feature", "properties": { "id": 4, "cls": 5 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -123.064404672110015, 44.062248205780641 ], [ -123.063001791092177, 44.062295757390288 ], [ -123.062938948566199, 44.061866413306625 ], [ -123.063711529699802, 44.061825083575727 ], [ -123.062903757506561, 44.060798284876931 ], [ -123.0634590922878, 44.06084959530147 ], [ -123.063939134831102, 44.061205726019097 ], [ -123.064707560079256, 44.061834553141757 ], [ -123.0644046721 [...]
+{ "type": "Feature", "properties": { "id": 3, "cls": 6 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -123.071105494548775, 44.059121603563895 ], [ -123.070160265697027, 44.059007342229378 ], [ -123.070431650409773, 44.058379004056327 ], [ -123.071225617617372, 44.058576450660659 ], [ -123.071105494548775, 44.059121603563895 ] ] ] } },
+{ "type": "Feature", "properties": { "id": 2, "cls": 6 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -123.06887558672102, 44.059227793751305 ], [ -123.068425255931515, 44.059301773132752 ], [ -123.067936238335534, 44.059248990941661 ], [ -123.06749590912527, 44.059043544671049 ], [ -123.06710185170931, 44.058629650191868 ], [ -123.067099413306224, 44.058063335596437 ], [ -123.067333190514816, 44.057587417330502 ], [ -123.067852567837207, 44.057320435256116 ], [ -123.0682904503 [...]
+{ "type": "Feature", "properties": { "id": 1, "cls": 6 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -123.071871740947586, 44.058426242457685 ], [ -123.070376025800414, 44.058117017731242 ], [ -123.07060216253906, 44.057465769662898 ], [ -123.072144836409578, 44.057837746292243 ], [ -123.071871740947586, 44.058426242457685 ] ] ] } }
+]
+}
diff --git a/test/data/autzen/attributes.vrt b/test/data/autzen/attributes.vrt
new file mode 100644
index 0000000..e0175a7
--- /dev/null
+++ b/test/data/autzen/attributes.vrt
@@ -0,0 +1,9 @@
+<OGRVRTDataSource>
+ <OGRVRTWarpedLayer>
+ <OGRVRTLayer name="OGRGeoJSON">
+ <SrcDataSource>attributes.json</SrcDataSource>
+ <LayerSRS>EPSG:4326</LayerSRS>
+ </OGRVRTLayer>
+ <TargetSRS>+proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=399999.9999999999 +y_0=0 +ellps=GRS80 +units=ft +no_defs</TargetSRS>
+ </OGRVRTWarpedLayer>
+</OGRVRTDataSource>
diff --git a/test/data/autzen/autzen-APMF.json b/test/data/autzen/autzen-APMF.json
new file mode 100644
index 0000000..0d90a73
--- /dev/null
+++ b/test/data/autzen/autzen-APMF.json
@@ -0,0 +1,19 @@
+{
+ "pipeline":
+ {
+ "filters":
+ [
+ {
+ "name": "ApproximateProgressiveMorphologicalFilter",
+ "setMaxWindowSize": 33,
+ "setSlope": 1.0,
+ "setMaxDistance": 2.5,
+ "setInitialDistance": 0.15,
+ "setCellSize": 1.0,
+ "setBase": 2.0,
+ "setExponential": true,
+ "setNegative": false
+ }
+ ]
+ }
+}
diff --git a/test/data/autzen/autzen-interpolate.xml b/test/data/autzen/autzen-interpolate.xml
new file mode 100644
index 0000000..c8391c1
--- /dev/null
+++ b/test/data/autzen/autzen-interpolate.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+ <Writer type="writers.p2g">
+ <Option name="filename">
+ autzen-surface.tif
+ </Option>
+ <Option name="output_type">
+ min
+ </Option>
+ <Option name="output_format">
+ tif
+ </Option>
+ <Option name="grid_dist_x">
+ 1.0
+ </Option>
+ <Option name="grid_dist_y">
+ 1.0
+ </Option>
+ <Filter type="filters.pclblock">
+ <Option name="filename">
+ ./autzen-APMF.json
+ </Option>
+ <Reader type="readers.las">
+ <Option name="filename">
+ /Users/hobu/dev/git/pdal/test/data/local/autzen/autzen-full.las
+ </Option>
+ </Reader>
+ </Filter>
+ </Writer>
+</Pipeline>
diff --git a/test/data/autzen/hag.py b/test/data/autzen/hag.py
new file mode 100644
index 0000000..3c123ff
--- /dev/null
+++ b/test/data/autzen/hag.py
@@ -0,0 +1,53 @@
+
+from osgeo import gdal
+gdal.UseExceptions()
+
+import struct
+
+objs = {}
+
+def wakeup(filename):
+
+ objs['ds'] = gdal.Open(filename)
+ objs['gt'] = objs['ds'].GetGeoTransform()
+ objs['band'] = objs['ds'].GetRasterBand(1)
+ return objs
+
+
+def read(x, y, objs):
+
+ # stolen from http://stackoverflow.com/questions/24537450/python-struct-error-unpack-requires-a-string-argument-of-length-2
+ gt = objs['gt']
+ ds = objs['ds']
+ band = objs['band']
+
+ px = int((x - gt[0]) / gt[1])
+ py = int((y - gt[3]) / gt[5])
+
+ val = band.ReadRaster(px,py,1,1,buf_type=gdal.GDT_Float32)
+ z = struct.unpack('f' , val)
+ return z[0]
+
+def filter(ins,outs):
+ HAG = ins['HAG']
+ X = ins['X']
+ Y = ins['Y']
+ Z = ins['Z']
+
+ objs = wakeup('autzen-surface.tif.min.tif')
+ print (objs)
+ for i in range(len(X)):
+ x = X[i]
+ y = Y[i]
+ z = Z[i]
+ surface_z = read(x, y, objs)
+# print (x, y, z, surface_z)
+ hag = z - surface_z
+ if (surface_z != -9999):
+ HAG[i] = hag
+ outs['Z'] = HAG
+ return True
+
+if __name__=='__main__':
+ objs = wakeup('autzen-surface.tif.min.tif')
+ print (read(636436,850412, objs))
diff --git a/test/data/autzen/hag.xml.in b/test/data/autzen/hag.xml.in
new file mode 100644
index 0000000..8e57514
--- /dev/null
+++ b/test/data/autzen/hag.xml.in
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+ <Writer type="writers.las">
+ <Option name="filename">
+ autzen-hag.las
+ </Option>
+ <Filter type="filters.programmable">
+ <Option name="script">
+ hag.py
+ </Option>
+ <Option name="function">
+ filter
+ </Option>
+ <Option name="module">
+ anything
+ </Option>
+ <Filter type="filters.ferry">
+ <Option name="dimension">
+ Z
+ <Options>
+ <Option name="to">
+ HAG
+ </Option>
+ </Options>
+ </Option>
+ <Reader type="readers.las">
+ <Option name="filename">
+ @CMAKE_SOURCE_DIR@/autzen/autzen.las
+ </Option>
+ </Reader>
+ </Filter>
+ </Filter>
+ </Writer>
+</Pipeline>
diff --git a/test/data/bpf/simple-extra.bpf b/test/data/bpf/simple-extra.bpf
new file mode 100644
index 0000000..3508c11
Binary files /dev/null and b/test/data/bpf/simple-extra.bpf differ
diff --git a/test/data/filters/colorize.xml.in b/test/data/filters/colorize.xml.in
index 5fc7c0b..bbcf6cb 100644
--- a/test/data/filters/colorize.xml.in
+++ b/test/data/filters/colorize.xml.in
@@ -5,38 +5,8 @@
@CMAKE_SOURCE_DIR@/test/temp/colorized.las
</Option>
<Filter type="filters.colorization">
- <Option name="dimension">
- Red
- <Options>
- <Option name="band">
- 1
- </Option>
- <Option name="scale">
- 1.0
- </Option>
- </Options>
- </Option>
- <Option name="dimension">
- Green
- <Options>
- <Option name="band">
- 2
- </Option>
- <Option name="scale">
- 1.0
- </Option>
- </Options>
- </Option>
- <Option name="dimension">
- Blue
- <Options>
- <Option name="band">
- 3
- </Option>
- <Option name="scale">
- 256
- </Option>
- </Options>
+ <Option name="dimensions">
+ Red, Green, Blue::256
</Option>
<Option name="raster">
@CMAKE_SOURCE_DIR@/test/data/autzen/autzen.jpg
diff --git a/test/data/filters/ferry.xml.in b/test/data/filters/ferry.xml.in
index 849e7a8..b73e0d1 100644
--- a/test/data/filters/ferry.xml.in
+++ b/test/data/filters/ferry.xml.in
@@ -15,21 +15,8 @@
0.0000001
</Option>
<Filter type="filters.ferry">
- <Option name="dimension">
- X
- <Options>
- <Option name="to">
- StatePlaneX
- </Option>
- </Options>
- </Option>
- <Option name="dimension">
- Y
- <Options>
- <Option name="to">
- StatePlaneY
- </Option>
- </Options>
+ <Option name="dimensions">
+ X=StatePlaneX, Y=StatePlaneY
</Option>
<Reader type="readers.las">
<Option name="filename">
diff --git a/test/data/filters/merge2.xml.in b/test/data/filters/merge2.xml.in
new file mode 100644
index 0000000..d8ad037
--- /dev/null
+++ b/test/data/filters/merge2.xml.in
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+ <Filter type="filters.reprojection">
+ <Option name="out_srs">EPSG:2028</Option>
+ <Filter type="filters.merge">
+ <Reader type="readers.las">
+ <Option name="spatialreference">EPSG:2027</Option>
+ <Option name="filename">
+ @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+ </Option>
+ </Reader>
+ <Reader type="readers.las">
+ <Option name="spatialreference">EPSG:2027</Option>
+ <Option name="filename">
+ @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+ </Option>
+ </Reader>
+ </Filter>
+ </Filter>
+</Pipeline>
diff --git a/test/data/filters/merge3.xml.in b/test/data/filters/merge3.xml.in
new file mode 100644
index 0000000..b407e29
--- /dev/null
+++ b/test/data/filters/merge3.xml.in
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+ <Filter type="filters.merge">
+ <Option name="verbose">5</Option>
+ <Reader type="readers.las">
+ <Option name="spatialreference">EPSG:2028</Option>
+ <Option name="filename">
+ @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+ </Option>
+ </Reader>
+ <Reader type="readers.las">
+ <Option name="spatialreference">EPSG:2027</Option>
+ <Option name="filename">
+ @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+ </Option>
+ </Reader>
+ </Filter>
+</Pipeline>
diff --git a/test/data/filters/range_classification.xml.in b/test/data/filters/range_classification.xml.in
index 489c17f..6e6d22b 100644
--- a/test/data/filters/range_classification.xml.in
+++ b/test/data/filters/range_classification.xml.in
@@ -5,11 +5,8 @@
@CMAKE_SOURCE_DIR@/test/temp/only_class_equals_2.las
</Option>
<Filter type="filters.range">
- <Option name="dimension">
- Classification
- <Options>
- <Option name="equals">2</Option>
- </Options>
+ <Option name="limits">
+ Classification[2:2]
</Option>
<Reader type="readers.las">
<Option name="filename">
diff --git a/test/data/filters/range_z.xml.in b/test/data/filters/range_z.xml.in
index 1fa29ba..b59a6fc 100644
--- a/test/data/filters/range_z.xml.in
+++ b/test/data/filters/range_z.xml.in
@@ -5,12 +5,8 @@
@CMAKE_SOURCE_DIR@/test/temp/only_z_400-500.las
</Option>
<Filter type="filters.range">
- <Option name="dimension">
- Z
- <Options>
- <Option name="min">400</Option>
- <Option name="max">500</Option>
- </Options>
+ <Option name="limits">
+ Z[400:500]
</Option>
<Reader type="readers.las">
<Option name="filename">
diff --git a/test/data/filters/range_z_classification.xml.in b/test/data/filters/range_z_classification.xml.in
index 9785a73..2c98b6e 100644
--- a/test/data/filters/range_z_classification.xml.in
+++ b/test/data/filters/range_z_classification.xml.in
@@ -5,18 +5,8 @@
@CMAKE_SOURCE_DIR@/test/temp/only_z_400-500_class_equals_2.las
</Option>
<Filter type="filters.range">
- <Option name="dimension">
- Z
- <Options>
- <Option name="min">400</Option>
- <Option name="max">500</Option>
- </Options>
- </Option>
- <Option name="dimension">
- Classification
- <Options>
- <Option name="equals">2</Option>
- </Options>
+ <Option name="limits">
+ Z[400:500], Classification[2:2]
</Option>
<Reader type="readers.las">
<Option name="filename">
diff --git a/test/data/hole/crop.xml.in b/test/data/hole/crop.xml.in
index edd4d86..574920d 100644
--- a/test/data/hole/crop.xml.in
+++ b/test/data/hole/crop.xml.in
@@ -2,11 +2,11 @@
<Pipeline version="1.0">
<Writer type="writers.las">
<Option name="filename">
- @CMAKE_SOURCE_DIR/test/temp/hole.las
+ @CMAKE_SOURCE_DIR@/test/temp/hole.las
</Option>
<Option name="compression">
false
- </Option>
+ </Option>
<Filter type="filters.crop">
<Option name="polygon">
POLYGON ((-123.070497025496451 44.058766662574463,-123.065624990686828 44.058248360998967,-123.068009177934087 44.057108097532883,-123.066350612892521 44.056486135642295,-123.066661593837807 44.054101948395022,-123.070289704866255 44.054412929340323,-123.070497025496451 44.058766662574463))
diff --git a/test/data/ilvis2/ILVIS2_GL2009_0414_R1401_042504.TXT b/test/data/ilvis2/ILVIS2_GL2009_0414_R1401_042504.TXT
new file mode 100644
index 0000000..75398d1
--- /dev/null
+++ b/test/data/ilvis2/ILVIS2_GL2009_0414_R1401_042504.TXT
@@ -0,0 +1,1000 @@
+# Several elevations are derived from the LVIS Level 1B waveform product. Please visit lvis.gsfc.nasa.gov for discussion on the elevation product that may be most appropriate for your use.
+# LVIS_LFID SHOTNUMBER TIME LONGITUDE_CENTROID LATITUDE_CENTROID ELEVATION_CENTROID LONGITUDE_LOW LATITUDE_LOW ELEVATION_LOW LONGITUDE_HIGH LATITUDE_HIGH ELEVATION_HIGH
+1654935003 1103940 42504.48313 301.214787 78.307673 1956.583 301.214787 78.307672 1956.777 301.214787 78.307672 1956.777
+1654935003 1103941 42504.48512 301.215096 78.307592 1956.292 301.215097 78.307592 1956.588 301.215097 78.307592 1956.588
+1654935003 1103942 42504.48712 301.215410 78.307512 1956.353 301.215410 78.307512 1956.667 301.215410 78.307512 1956.667
+1654935003 1103943 42504.48912 301.215723 78.307432 1956.372 301.215723 78.307431 1956.576 301.215723 78.307431 1956.576
+1654935003 1103944 42504.49112 301.216035 78.307352 1956.359 301.216036 78.307352 1956.679 301.216036 78.307352 1956.679
+1654935003 1103945 42504.49312 301.216346 78.307272 1956.408 301.216346 78.307272 1956.689 301.216346 78.307272 1956.689
+1654935003 1103946 42504.49512 301.216655 78.307192 1956.404 301.216655 78.307191 1956.642 301.216655 78.307191 1956.642
+1654935003 1103947 42504.49712 301.216963 78.307111 1956.501 301.216963 78.307110 1956.743 301.216963 78.307110 1956.743
+1654935003 1103948 42504.49912 301.217270 78.307030 1956.528 301.217271 78.307029 1956.812 301.217271 78.307029 1956.812
+1654935003 1103949 42504.50112 301.217577 78.306949 1956.516 301.217577 78.306949 1956.791 301.217577 78.306949 1956.791
+1654935003 1103950 42504.50312 301.217884 78.306869 1956.645 301.217885 78.306868 1956.854 301.217885 78.306868 1956.854
+1654935003 1103951 42504.50512 301.218192 78.306788 1956.665 301.218192 78.306788 1956.919 301.218192 78.306788 1956.919
+1654935003 1103953 42504.50912 301.218807 78.306627 1956.772 301.218807 78.306627 1957.083 301.218807 78.306627 1957.083
+1654935003 1103954 42504.51112 301.219115 78.306546 1956.727 301.219115 78.306546 1957.006 301.219115 78.306546 1957.006
+1654935003 1103955 42504.51312 301.219424 78.306466 1956.856 301.219424 78.306466 1957.061 301.219424 78.306466 1957.061
+1654935003 1103956 42504.51512 301.219735 78.306386 1956.881 301.219735 78.306386 1957.026 301.219735 78.306386 1957.026
+1654935003 1103957 42504.51712 301.220047 78.306306 1956.878 301.220048 78.306306 1957.113 301.220048 78.306306 1957.113
+1654935003 1103958 42504.51911 301.220359 78.306227 1956.789 301.220359 78.306226 1957.073 301.220359 78.306226 1957.073
+1654935003 1103959 42504.52111 301.220669 78.306147 1956.928 301.220669 78.306147 1957.211 301.220669 78.306147 1957.211
+1654935003 1103960 42504.52311 301.220977 78.306067 1956.980 301.220978 78.306067 1957.280 301.220978 78.306067 1957.280
+1654935003 1103961 42504.52511 301.221283 78.305987 1957.051 301.221284 78.305987 1957.316 301.221284 78.305987 1957.316
+1654935003 1103962 42504.52711 301.221587 78.305906 1957.037 301.221588 78.305906 1957.332 301.221588 78.305906 1957.332
+1654935003 1103963 42504.52911 301.221892 78.305826 1957.098 301.221892 78.305825 1957.469 301.221892 78.305825 1957.469
+1654935003 1103964 42504.53111 301.222198 78.305745 1957.152 301.222198 78.305745 1957.455 301.222198 78.305745 1957.455
+1654935003 1103965 42504.53311 301.222504 78.305665 1957.079 301.222504 78.305665 1957.418 301.222504 78.305665 1957.418
+1654935003 1103966 42504.53511 301.222811 78.305586 1957.131 301.222811 78.305586 1957.370 301.222811 78.305586 1957.370
+1654935003 1103967 42504.53711 301.223117 78.305506 1957.133 301.223117 78.305506 1957.443 301.223117 78.305506 1957.443
+1654935003 1103968 42504.53911 301.223424 78.305427 1957.157 301.223424 78.305426 1957.473 301.223424 78.305426 1957.473
+1654935003 1103969 42504.54111 301.223729 78.305347 1957.229 301.223729 78.305347 1957.464 301.223729 78.305347 1957.464
+1654935003 1103970 42504.54311 301.224036 78.305267 1957.418 301.224036 78.305267 1957.654 301.224036 78.305267 1957.654
+1654935003 1103972 42504.54711 301.224651 78.305108 1957.367 301.224651 78.305108 1957.681 301.224651 78.305108 1957.681
+1654935003 1103973 42504.54911 301.224958 78.305029 1957.452 301.224958 78.305029 1957.647 301.224958 78.305029 1957.647
+1654935003 1103974 42504.55111 301.225266 78.304949 1957.571 301.225266 78.304949 1957.810 301.225266 78.304949 1957.810
+1654935003 1103975 42504.55311 301.225573 78.304869 1957.473 301.225573 78.304869 1957.800 301.225573 78.304869 1957.800
+1654935003 1103976 42504.55510 301.225879 78.304789 1957.555 301.225879 78.304789 1957.780 301.225879 78.304789 1957.780
+1654935003 1103977 42504.55710 301.226184 78.304708 1957.579 301.226184 78.304708 1957.862 301.226184 78.304708 1957.862
+1654935003 1103978 42504.55910 301.226490 78.304628 1957.625 301.226490 78.304628 1957.850 301.226490 78.304628 1957.850
+1654935003 1103979 42504.56110 301.226797 78.304549 1957.746 301.226797 78.304548 1958.025 301.226797 78.304548 1958.025
+1654935003 1103980 42504.56310 301.227105 78.304469 1957.674 301.227105 78.304469 1957.987 301.227105 78.304469 1957.987
+1654935003 1103981 42504.56510 301.227412 78.304390 1957.796 301.227412 78.304390 1958.013 301.227412 78.304390 1958.013
+1654935003 1103982 42504.56710 301.227719 78.304310 1957.835 301.227719 78.304310 1958.047 301.227719 78.304310 1958.047
+1654935003 1103983 42504.56910 301.228026 78.304231 1957.864 301.228026 78.304231 1958.017 301.228026 78.304231 1958.017
+1654935003 1103984 42504.57110 301.228331 78.304150 1957.930 301.228331 78.304150 1958.132 301.228331 78.304150 1958.132
+1654935003 1103985 42504.57310 301.228634 78.304071 1958.025 301.228634 78.304071 1958.168 301.228634 78.304071 1958.168
+1654935003 1103987 42504.57710 301.229249 78.303911 1957.980 301.229248 78.303911 1958.235 301.229248 78.303911 1958.235
+1654935003 1103989 42504.58110 301.229862 78.303752 1958.068 301.229862 78.303752 1958.322 301.229862 78.303752 1958.322
+1654935003 1103990 42504.58310 301.230168 78.303673 1958.078 301.230167 78.303673 1958.312 301.230167 78.303673 1958.312
+1654935003 1103992 42504.58710 301.230779 78.303514 1958.196 301.230779 78.303514 1958.471 301.230779 78.303514 1958.471
+1654935003 1103993 42504.58909 301.231086 78.303434 1958.196 301.231086 78.303434 1958.472 301.231086 78.303434 1958.472
+1654935003 1103994 42504.59109 301.231394 78.303354 1958.252 301.231394 78.303354 1958.519 301.231394 78.303354 1958.519
+1654935003 1103995 42504.59309 301.231702 78.303275 1958.328 301.231702 78.303275 1958.564 301.231702 78.303275 1958.564
+1654935003 1103996 42504.59509 301.232009 78.303195 1958.342 301.232008 78.303195 1958.609 301.232008 78.303195 1958.609
+1654935003 1103997 42504.59709 301.232315 78.303115 1958.320 301.232315 78.303115 1958.531 301.232315 78.303115 1958.531
+1654935003 1103998 42504.59909 301.232620 78.303035 1958.486 301.232620 78.303035 1958.635 301.232620 78.303035 1958.635
+1654935003 1103999 42504.60109 301.232923 78.302955 1958.610 301.232922 78.302955 1958.838 301.232922 78.302955 1958.838
+1654935003 1104000 42504.60309 301.233225 78.302875 1958.592 301.233225 78.302875 1958.748 301.233225 78.302875 1958.748
+1654935003 1104001 42504.60509 301.233531 78.302795 1958.599 301.233530 78.302795 1958.802 301.233530 78.302795 1958.802
+1654935003 1104002 42504.60709 301.233839 78.302717 1958.629 301.233838 78.302717 1958.835 301.233838 78.302717 1958.835
+1654935003 1104003 42504.60909 301.234147 78.302638 1958.651 301.234146 78.302638 1958.869 301.234146 78.302638 1958.869
+1654935003 1104004 42504.61109 301.234456 78.302558 1958.698 301.234456 78.302558 1958.877 301.234456 78.302558 1958.877
+1654935003 1104005 42504.61309 301.234766 78.302479 1958.646 301.234765 78.302479 1958.836 301.234765 78.302479 1958.836
+1654935003 1104006 42504.61509 301.235073 78.302399 1958.796 301.235073 78.302399 1958.973 301.235073 78.302399 1958.973
+1654935003 1104008 42504.61909 301.235683 78.302238 1958.926 301.235683 78.302238 1959.063 301.235683 78.302238 1959.063
+1654935003 1104010 42504.62308 301.236292 78.302078 1959.002 301.236292 78.302078 1959.140 301.236292 78.302078 1959.140
+1654935003 1104011 42504.62508 301.236597 78.301998 1959.097 301.236597 78.301998 1959.253 301.236597 78.301998 1959.253
+1654935003 1104012 42504.62708 301.236902 78.301919 1959.175 301.236901 78.301919 1959.402 301.236901 78.301919 1959.402
+1654935003 1104039 42504.68107 301.242260 78.300445 1959.800 301.242259 78.300445 1960.111 301.242259 78.300445 1960.111
+1654935003 1104040 42504.68307 301.241974 78.300529 1959.478 301.241973 78.300529 1959.740 301.241973 78.300529 1959.740
+1654935003 1104041 42504.68507 301.241689 78.300613 1959.396 301.241688 78.300613 1959.729 301.241688 78.300613 1959.729
+1654935003 1104042 42504.68707 301.241405 78.300697 1959.404 301.241404 78.300697 1959.701 301.241404 78.300697 1959.701
+1654935003 1104043 42504.68907 301.241121 78.300781 1959.337 301.241120 78.300781 1959.642 301.241120 78.300781 1959.642
+1654935003 1104044 42504.69106 301.240837 78.300864 1959.259 301.240836 78.300864 1959.562 301.240836 78.300864 1959.562
+1654935003 1104045 42504.69306 301.240553 78.300947 1959.262 301.240552 78.300947 1959.548 301.240552 78.300947 1959.548
+1654935003 1104046 42504.69506 301.240269 78.301030 1959.291 301.240268 78.301030 1959.554 301.240268 78.301030 1959.554
+1654935003 1104047 42504.69706 301.239983 78.301113 1959.256 301.239983 78.301113 1959.520 301.239983 78.301113 1959.520
+1654935003 1104048 42504.69906 301.239697 78.301196 1959.231 301.239696 78.301197 1959.515 301.239696 78.301197 1959.515
+1654935003 1104049 42504.70106 301.239407 78.301279 1959.231 301.239406 78.301280 1959.491 301.239406 78.301280 1959.491
+1654935003 1104050 42504.70306 301.239117 78.301363 1959.129 301.239116 78.301363 1959.394 301.239116 78.301363 1959.394
+1654935003 1104051 42504.70506 301.238829 78.301446 1958.998 301.238828 78.301446 1959.282 301.238828 78.301446 1959.282
+1654935003 1104052 42504.70706 301.238543 78.301529 1958.968 301.238542 78.301529 1959.277 301.238542 78.301529 1959.277
+1654935003 1104053 42504.70906 301.238259 78.301612 1958.875 301.238258 78.301612 1959.173 301.238258 78.301612 1959.173
+1654935003 1104054 42504.71106 301.237977 78.301696 1958.831 301.237977 78.301696 1959.138 301.237977 78.301696 1959.138
+1654935003 1104055 42504.71306 301.237696 78.301780 1958.785 301.237696 78.301780 1959.094 301.237696 78.301780 1959.094
+1654935003 1104056 42504.71506 301.237414 78.301863 1958.795 301.237413 78.301863 1959.081 301.237413 78.301863 1959.081
+1654935003 1104057 42504.71706 301.237129 78.301946 1958.749 301.237129 78.301946 1959.048 301.237129 78.301946 1959.048
+1654935003 1104058 42504.71906 301.236845 78.302029 1958.740 301.236844 78.302029 1958.997 301.236844 78.302029 1958.997
+1654935003 1104059 42504.72106 301.236558 78.302111 1958.722 301.236558 78.302111 1959.033 301.236558 78.302111 1959.033
+1654935003 1104060 42504.72306 301.236272 78.302194 1958.643 301.236271 78.302194 1958.951 301.236271 78.302194 1958.951
+1654935003 1104061 42504.72506 301.235985 78.302277 1958.593 301.235985 78.302277 1958.905 301.235985 78.302277 1958.905
+1654935003 1104062 42504.72705 301.235699 78.302361 1958.531 301.235699 78.302361 1958.872 301.235699 78.302361 1958.872
+1654935003 1104063 42504.72905 301.235413 78.302444 1958.454 301.235413 78.302444 1958.748 301.235413 78.302444 1958.748
+1654935003 1104064 42504.73105 301.235127 78.302527 1958.407 301.235127 78.302527 1958.727 301.235127 78.302527 1958.727
+1654935003 1104065 42504.73305 301.234844 78.302609 1958.393 301.234843 78.302609 1958.740 301.234843 78.302609 1958.740
+1654935003 1104066 42504.73505 301.234561 78.302691 1958.386 301.234560 78.302691 1958.726 301.234560 78.302691 1958.726
+1654935003 1104067 42504.73705 301.234279 78.302774 1958.296 301.234279 78.302774 1958.600 301.234279 78.302774 1958.600
+1654935003 1104068 42504.73905 301.233997 78.302857 1958.245 301.233997 78.302857 1958.604 301.233997 78.302857 1958.604
+1654935003 1104069 42504.74105 301.233715 78.302940 1958.250 301.233714 78.302940 1958.587 301.233714 78.302940 1958.587
+1654935003 1104070 42504.74305 301.233430 78.303024 1958.162 301.233430 78.303024 1958.506 301.233430 78.303024 1958.506
+1654935003 1104071 42504.74505 301.233145 78.303108 1958.130 301.233145 78.303108 1958.456 301.233145 78.303108 1958.456
+1654935003 1104072 42504.74705 301.232859 78.303190 1958.118 301.232859 78.303190 1958.441 301.232859 78.303190 1958.441
+1654935003 1104073 42504.74905 301.232574 78.303273 1958.040 301.232574 78.303273 1958.348 301.232574 78.303273 1958.348
+1654935003 1104075 42504.75305 301.232010 78.303437 1958.043 301.232009 78.303437 1958.371 301.232009 78.303437 1958.371
+1654935003 1104076 42504.75505 301.231727 78.303520 1957.970 301.231726 78.303520 1958.299 301.231726 78.303520 1958.299
+1654935003 1104077 42504.75705 301.231442 78.303603 1957.974 301.231442 78.303603 1958.285 301.231442 78.303603 1958.285
+1654935003 1104078 42504.75905 301.231157 78.303686 1957.880 301.231157 78.303686 1958.173 301.231157 78.303686 1958.173
+1654935003 1104079 42504.76104 301.230870 78.303768 1957.839 301.230870 78.303768 1958.181 301.230870 78.303768 1958.181
+1654935003 1104080 42504.76304 301.230584 78.303851 1957.831 301.230584 78.303851 1958.141 301.230584 78.303851 1958.141
+1654935003 1104081 42504.76504 301.230300 78.303934 1957.835 301.230299 78.303934 1958.143 301.230299 78.303934 1958.143
+1654935003 1104082 42504.76704 301.230018 78.304018 1957.855 301.230018 78.304018 1958.168 301.230018 78.304018 1958.168
+1654935003 1104083 42504.76904 301.229736 78.304101 1957.773 301.229736 78.304101 1958.099 301.229736 78.304101 1958.099
+1654935003 1104084 42504.77104 301.229454 78.304184 1957.696 301.229454 78.304184 1958.004 301.229454 78.304184 1958.004
+1654935003 1104085 42504.77304 301.229173 78.304267 1957.582 301.229173 78.304267 1957.917 301.229173 78.304267 1957.917
+1654935003 1104086 42504.77504 301.228889 78.304349 1957.556 301.228889 78.304349 1957.891 301.228889 78.304349 1957.891
+1654935003 1104087 42504.77704 301.228602 78.304431 1957.515 301.228602 78.304431 1957.842 301.228602 78.304431 1957.842
+1654935003 1104088 42504.77904 301.228316 78.304513 1957.486 301.228316 78.304513 1957.799 301.228316 78.304513 1957.799
+1654935003 1104089 42504.78104 301.228031 78.304595 1957.462 301.228031 78.304595 1957.790 301.228031 78.304595 1957.790
+1654935003 1104090 42504.78304 301.227746 78.304679 1957.428 301.227746 78.304679 1957.758 301.227746 78.304679 1957.758
+1654935003 1104091 42504.78504 301.227462 78.304762 1957.457 301.227462 78.304762 1957.811 301.227462 78.304762 1957.811
+1654935003 1104092 42504.78704 301.227180 78.304846 1957.446 301.227180 78.304846 1957.753 301.227180 78.304846 1957.753
+1654935003 1104093 42504.78904 301.226898 78.304929 1957.364 301.226898 78.304929 1957.676 301.226898 78.304929 1957.676
+1654935003 1104094 42504.79104 301.226616 78.305012 1957.214 301.226616 78.305012 1957.565 301.226616 78.305012 1957.565
+1654935003 1104095 42504.79304 301.226335 78.305094 1957.216 301.226335 78.305094 1957.500 301.226335 78.305094 1957.500
+1654935003 1104096 42504.79503 301.226052 78.305177 1957.167 301.226052 78.305177 1957.473 301.226052 78.305177 1957.473
+1654935003 1104097 42504.79703 301.225768 78.305259 1957.170 301.225768 78.305259 1957.505 301.225768 78.305259 1957.505
+1654935003 1104098 42504.79903 301.225482 78.305342 1957.168 301.225482 78.305342 1957.483 301.225482 78.305342 1957.483
+1654935003 1104099 42504.80103 301.225193 78.305425 1957.113 301.225193 78.305425 1957.416 301.225193 78.305425 1957.416
+1654935003 1104100 42504.80303 301.224903 78.305508 1957.044 301.224903 78.305507 1957.331 301.224903 78.305507 1957.331
+1654935003 1104101 42504.80503 301.224614 78.305590 1956.953 301.224615 78.305590 1957.286 301.224615 78.305590 1957.286
+1654935003 1104102 42504.80703 301.224327 78.305673 1956.901 301.224327 78.305673 1957.218 301.224327 78.305673 1957.218
+1654935003 1104103 42504.80903 301.224043 78.305756 1956.919 301.224043 78.305755 1957.234 301.224043 78.305755 1957.234
+1654935003 1104104 42504.81103 301.223765 78.305839 1956.902 301.223765 78.305839 1957.245 301.223765 78.305839 1957.245
+1654935003 1104105 42504.81303 301.223488 78.305923 1956.844 301.223488 78.305923 1957.139 301.223488 78.305923 1957.139
+1654935003 1104106 42504.81503 301.223208 78.306007 1956.808 301.223209 78.306006 1957.138 301.223209 78.306006 1957.138
+1654935003 1104107 42504.81703 301.222926 78.306090 1956.763 301.222926 78.306090 1957.077 301.222926 78.306090 1957.077
+1654935003 1104108 42504.81903 301.222641 78.306174 1956.796 301.222641 78.306173 1957.113 301.222641 78.306173 1957.113
+1654935003 1104109 42504.82103 301.222353 78.306256 1956.787 301.222353 78.306256 1957.089 301.222353 78.306256 1957.089
+1654935003 1104110 42504.82303 301.222064 78.306339 1956.655 301.222065 78.306338 1956.967 301.222065 78.306338 1956.967
+1654935003 1104111 42504.82503 301.221776 78.306421 1956.661 301.221776 78.306421 1956.987 301.221776 78.306421 1956.987
+1654935003 1104112 42504.82703 301.221487 78.306504 1956.659 301.221488 78.306504 1956.947 301.221488 78.306504 1956.947
+1654935003 1104113 42504.82902 301.221199 78.306587 1956.609 301.221199 78.306587 1956.881 301.221199 78.306587 1956.881
+1654935003 1104114 42504.83102 301.220911 78.306670 1956.562 301.220911 78.306670 1956.856 301.220911 78.306670 1956.856
+1654935003 1104115 42504.83302 301.220623 78.306753 1956.550 301.220623 78.306753 1956.878 301.220623 78.306753 1956.878
+1654935003 1104116 42504.83502 301.220337 78.306836 1956.513 301.220337 78.306836 1956.806 301.220337 78.306836 1956.806
+1654935003 1104117 42504.83702 301.220054 78.306920 1956.521 301.220055 78.306920 1956.779 301.220055 78.306920 1956.779
+1654935003 1104118 42504.83902 301.219772 78.307004 1956.463 301.219772 78.307003 1956.749 301.219772 78.307003 1956.749
+1654935003 1104119 42504.84102 301.219491 78.307088 1956.350 301.219492 78.307088 1956.638 301.219492 78.307088 1956.638
+1654935003 1104120 42504.84302 301.219210 78.307173 1956.348 301.219210 78.307173 1956.608 301.219210 78.307173 1956.608
+1654935003 1104121 42504.84502 301.218925 78.307257 1956.353 301.218925 78.307257 1956.626 301.218925 78.307257 1956.626
+1654935003 1104122 42504.84702 301.218636 78.307340 1956.336 301.218637 78.307340 1956.613 301.218637 78.307340 1956.613
+1654935003 1104123 42504.84902 301.218347 78.307423 1956.339 301.218348 78.307422 1956.621 301.218348 78.307422 1956.621
+1654935003 1104124 42504.85102 301.218056 78.307505 1956.215 301.218057 78.307504 1956.480 301.218057 78.307504 1956.480
+1654935003 1104125 42504.85302 301.217768 78.307587 1956.147 301.217768 78.307586 1956.378 301.217768 78.307586 1956.378
+1654935003 1104126 42504.85502 301.217480 78.307669 1956.097 301.217481 78.307669 1956.325 301.217481 78.307669 1956.325
+1654935003 1104129 42504.86102 301.216619 78.307922 1956.153 301.216620 78.307922 1956.429 301.216620 78.307922 1956.429
+1654935003 1104144 42504.89101 301.217698 78.307574 1956.125 301.217698 78.307573 1956.354 301.217698 78.307573 1956.354
+1654935003 1104146 42504.89501 301.218321 78.307411 1956.270 301.218321 78.307411 1956.513 301.218321 78.307411 1956.513
+1654935003 1104148 42504.89900 301.218937 78.307249 1956.279 301.218938 78.307249 1956.489 301.218938 78.307249 1956.489
+1654935003 1104149 42504.90100 301.219244 78.307169 1956.286 301.219244 78.307168 1956.509 301.219244 78.307168 1956.509
+1654935003 1104151 42504.90500 301.219855 78.307008 1956.409 301.219855 78.307008 1956.640 301.219855 78.307008 1956.640
+1654935003 1104152 42504.90700 301.220160 78.306927 1956.402 301.220161 78.306927 1956.683 301.220161 78.306927 1956.683
+1654935003 1104153 42504.90900 301.220468 78.306846 1956.436 301.220468 78.306846 1956.723 301.220468 78.306846 1956.723
+1654935003 1104154 42504.91100 301.220779 78.306765 1956.488 301.220779 78.306765 1956.767 301.220779 78.306765 1956.767
+1654935003 1104155 42504.91300 301.221092 78.306685 1956.495 301.221093 78.306685 1956.774 301.221093 78.306685 1956.774
+1654935003 1104156 42504.91500 301.221405 78.306605 1956.536 301.221405 78.306605 1956.793 301.221405 78.306605 1956.793
+1654935003 1104157 42504.91700 301.221717 78.306525 1956.606 301.221717 78.306525 1956.895 301.221717 78.306525 1956.895
+1654935003 1104158 42504.91900 301.222027 78.306446 1956.617 301.222027 78.306446 1956.920 301.222027 78.306446 1956.920
+1654935003 1104159 42504.92100 301.222334 78.306365 1956.679 301.222334 78.306365 1956.971 301.222334 78.306365 1956.971
+1654935003 1104161 42504.92500 301.222947 78.306204 1956.739 301.222947 78.306204 1956.989 301.222947 78.306204 1956.989
+1654935003 1104162 42504.92700 301.223253 78.306123 1956.696 301.223253 78.306123 1957.000 301.223253 78.306123 1957.000
+1654935003 1104163 42504.92900 301.223561 78.306042 1956.760 301.223561 78.306042 1957.069 301.223561 78.306042 1957.069
+1654935003 1104164 42504.93100 301.223869 78.305962 1956.771 301.223869 78.305962 1957.047 301.223869 78.305962 1957.047
+1654935003 1104165 42504.93299 301.224177 78.305882 1956.774 301.224177 78.305882 1957.074 301.224177 78.305882 1957.074
+1654935003 1104166 42504.93499 301.224485 78.305802 1956.820 301.224485 78.305802 1957.134 301.224485 78.305802 1957.134
+1654935003 1104167 42504.93699 301.224792 78.305722 1956.838 301.224792 78.305722 1957.173 301.224792 78.305722 1957.173
+1654935003 1104168 42504.93899 301.225098 78.305642 1956.967 301.225099 78.305642 1957.242 301.225099 78.305642 1957.242
+1654935003 1104169 42504.94099 301.225405 78.305563 1957.062 301.225406 78.305563 1957.330 301.225406 78.305563 1957.330
+1654935003 1104170 42504.94299 301.225712 78.305484 1957.076 301.225712 78.305483 1957.330 301.225712 78.305483 1957.330
+1654935003 1104171 42504.94499 301.226019 78.305404 1957.108 301.226019 78.305404 1957.378 301.226019 78.305404 1957.378
+1654935003 1104172 42504.94699 301.226326 78.305325 1957.106 301.226326 78.305325 1957.464 301.226326 78.305325 1957.464
+1654935003 1104173 42504.94899 301.226632 78.305245 1957.146 301.226632 78.305245 1957.484 301.226632 78.305245 1957.484
+1654935003 1104174 42504.95099 301.226937 78.305164 1957.193 301.226937 78.305164 1957.555 301.226937 78.305164 1957.555
+1654935003 1104175 42504.95299 301.227243 78.305083 1957.221 301.227243 78.305083 1957.536 301.227243 78.305083 1957.536
+1654935003 1104176 42504.95499 301.227549 78.305003 1957.312 301.227549 78.305003 1957.609 301.227549 78.305003 1957.609
+1654935003 1104177 42504.95699 301.227856 78.304923 1957.317 301.227856 78.304923 1957.596 301.227856 78.304923 1957.596
+1654935003 1104178 42504.95899 301.228163 78.304843 1957.298 301.228163 78.304843 1957.639 301.228163 78.304843 1957.639
+1654935003 1104179 42504.96099 301.228471 78.304764 1957.343 301.228471 78.304764 1957.646 301.228471 78.304764 1957.646
+1654935003 1104180 42504.96299 301.228777 78.304685 1957.340 301.228777 78.304684 1957.640 301.228777 78.304684 1957.640
+1654935003 1104181 42504.96499 301.229084 78.304605 1957.354 301.229084 78.304605 1957.650 301.229084 78.304605 1957.650
+1654935003 1104182 42504.96698 301.229390 78.304525 1957.440 301.229390 78.304525 1957.727 301.229390 78.304525 1957.727
+1654935003 1104183 42504.96898 301.229698 78.304445 1957.478 301.229698 78.304445 1957.798 301.229698 78.304445 1957.798
+1654935003 1104184 42504.97098 301.230006 78.304365 1957.626 301.230006 78.304365 1957.893 301.230006 78.304365 1957.893
+1654935003 1104185 42504.97298 301.230313 78.304286 1957.628 301.230313 78.304286 1957.916 301.230313 78.304286 1957.916
+1654935003 1104186 42504.97498 301.230622 78.304206 1957.596 301.230622 78.304206 1957.918 301.230622 78.304206 1957.918
+1654935003 1104187 42504.97698 301.230929 78.304126 1957.665 301.230929 78.304125 1958.001 301.230929 78.304125 1958.001
+1654935003 1104188 42504.97898 301.231235 78.304045 1957.745 301.231235 78.304045 1958.045 301.231235 78.304045 1958.045
+1654935003 1104189 42504.98098 301.231538 78.303965 1957.755 301.231538 78.303965 1958.063 301.231538 78.303965 1958.063
+1654935003 1104190 42504.98298 301.231840 78.303885 1957.839 301.231840 78.303885 1958.127 301.231840 78.303885 1958.127
+1654935003 1104191 42504.98498 301.232144 78.303805 1957.876 301.232144 78.303805 1958.181 301.232144 78.303805 1958.181
+1654935003 1104192 42504.98698 301.232449 78.303725 1957.831 301.232448 78.303725 1958.118 301.232448 78.303725 1958.118
+1654935003 1104193 42504.98898 301.232755 78.303646 1957.870 301.232754 78.303646 1958.135 301.232754 78.303646 1958.135
+1654935003 1104194 42504.99098 301.233064 78.303566 1957.913 301.233063 78.303566 1958.204 301.233063 78.303566 1958.204
+1654935003 1104195 42504.99298 301.233374 78.303486 1957.939 301.233374 78.303486 1958.312 301.233374 78.303486 1958.312
+1654935003 1104196 42504.99498 301.233683 78.303407 1957.951 301.233683 78.303407 1958.286 301.233683 78.303407 1958.286
+1654935003 1104197 42504.99698 301.233992 78.303327 1957.993 301.233991 78.303327 1958.300 301.233991 78.303327 1958.300
+1654935003 1104198 42504.99898 301.234299 78.303247 1958.115 301.234299 78.303247 1958.406 301.234299 78.303247 1958.406
+1654935003 1104199 42505.00097 301.234606 78.303167 1958.136 301.234605 78.303168 1958.416 301.234605 78.303168 1958.416
+1654935003 1104200 42505.00297 301.234911 78.303088 1958.191 301.234911 78.303088 1958.517 301.234911 78.303088 1958.517
+1654935003 1104201 42505.00497 301.235216 78.303008 1958.209 301.235216 78.303008 1958.478 301.235216 78.303008 1958.478
+1654935003 1104202 42505.00697 301.235521 78.302929 1958.318 301.235521 78.302929 1958.615 301.235521 78.302929 1958.615
+1654935003 1104203 42505.00897 301.235826 78.302849 1958.329 301.235826 78.302849 1958.626 301.235826 78.302849 1958.626
+1654935003 1104204 42505.01097 301.236131 78.302768 1958.473 301.236131 78.302768 1958.815 301.236131 78.302768 1958.815
+1654935003 1104205 42505.01297 301.236438 78.302688 1958.458 301.236437 78.302688 1958.712 301.236437 78.302688 1958.712
+1654935003 1104206 42505.01497 301.236745 78.302607 1958.526 301.236744 78.302607 1958.816 301.236744 78.302607 1958.816
+1654935003 1104207 42505.01697 301.237052 78.302527 1958.559 301.237052 78.302527 1958.826 301.237052 78.302527 1958.826
+1654935003 1104208 42505.01897 301.237360 78.302447 1958.609 301.237359 78.302447 1958.907 301.237359 78.302447 1958.907
+1654935003 1104209 42505.02097 301.237668 78.302368 1958.655 301.237667 78.302368 1958.954 301.237667 78.302368 1958.954
+1654935003 1104210 42505.02297 301.237976 78.302288 1958.593 301.237975 78.302288 1958.947 301.237975 78.302288 1958.947
+1654935003 1104211 42505.02497 301.238283 78.302209 1958.665 301.238282 78.302209 1958.982 301.238282 78.302209 1958.982
+1654935003 1104212 42505.02697 301.238590 78.302128 1958.685 301.238589 78.302128 1958.984 301.238589 78.302128 1958.984
+1654935003 1104213 42505.02897 301.238897 78.302048 1958.732 301.238896 78.302048 1959.013 301.238896 78.302048 1959.013
+1654935003 1104214 42505.03097 301.239206 78.301968 1958.756 301.239205 78.301968 1959.061 301.239205 78.301968 1959.061
+1654935003 1104215 42505.03297 301.239514 78.301887 1958.860 301.239513 78.301887 1959.167 301.239513 78.301887 1959.167
+1654935003 1104216 42505.03496 301.239822 78.301807 1958.877 301.239821 78.301807 1959.141 301.239821 78.301807 1959.141
+1654935003 1104217 42505.03696 301.240130 78.301727 1958.931 301.240129 78.301727 1959.186 301.240129 78.301727 1959.186
+1654935003 1104218 42505.03896 301.240438 78.301647 1958.922 301.240437 78.301647 1959.253 301.240437 78.301647 1959.253
+1654935003 1104219 42505.04096 301.240745 78.301566 1959.000 301.240744 78.301566 1959.270 301.240744 78.301566 1959.270
+1654935003 1104220 42505.04296 301.241052 78.301486 1958.940 301.241051 78.301486 1959.302 301.241051 78.301486 1959.302
+1654935003 1104221 42505.04496 301.241359 78.301405 1959.059 301.241358 78.301405 1959.351 301.241358 78.301405 1959.351
+1654935003 1104222 42505.04696 301.241667 78.301325 1959.120 301.241666 78.301325 1959.404 301.241666 78.301325 1959.404
+1654935003 1104223 42505.04896 301.241975 78.301244 1959.126 301.241974 78.301245 1959.397 301.241974 78.301245 1959.397
+1654935003 1104224 42505.05096 301.242284 78.301164 1959.184 301.242283 78.301164 1959.497 301.242283 78.301164 1959.497
+1654935003 1104228 42505.05896 301.243518 78.300841 1959.369 301.243518 78.300841 1959.617 301.243518 78.300841 1959.617
+1654935003 1104230 42505.06296 301.244135 78.300681 1959.467 301.244134 78.300682 1959.733 301.244134 78.300682 1959.733
+1654935003 1104238 42505.07895 301.244227 78.300567 1960.353 301.244227 78.300567 1960.489 301.244227 78.300567 1960.489
+1654935003 1104244 42505.09095 301.242521 78.301067 1959.238 301.242520 78.301067 1959.478 301.242520 78.301067 1959.478
+1654935003 1104245 42505.09295 301.242237 78.301150 1959.164 301.242237 78.301150 1959.463 301.242237 78.301150 1959.463
+1654935003 1104247 42505.09695 301.241667 78.301317 1959.151 301.241666 78.301317 1959.416 301.241666 78.301317 1959.416
+1654935003 1104248 42505.09895 301.241381 78.301400 1959.024 301.241380 78.301400 1959.319 301.241380 78.301400 1959.319
+1654935003 1104249 42505.10095 301.241092 78.301482 1958.948 301.241091 78.301483 1959.290 301.241091 78.301483 1959.290
+1654935003 1104250 42505.10295 301.240803 78.301565 1958.932 301.240802 78.301565 1959.284 301.240802 78.301565 1959.284
+1654935003 1104251 42505.10494 301.240516 78.301648 1958.924 301.240515 78.301648 1959.181 301.240515 78.301648 1959.181
+1654935003 1104252 42505.10694 301.240231 78.301730 1958.911 301.240230 78.301731 1959.208 301.240230 78.301731 1959.208
+1654935003 1104253 42505.10894 301.239947 78.301813 1958.860 301.239946 78.301813 1959.169 301.239946 78.301813 1959.169
+1654935003 1104254 42505.11094 301.239664 78.301896 1958.810 301.239663 78.301896 1959.078 301.239663 78.301896 1959.078
+1654935003 1104255 42505.11294 301.239382 78.301979 1958.714 301.239381 78.301979 1959.052 301.239381 78.301979 1959.052
+1654935003 1104256 42505.11494 301.239099 78.302062 1958.740 301.239098 78.302062 1959.032 301.239098 78.302062 1959.032
+1654935003 1104257 42505.11694 301.238815 78.302145 1958.676 301.238814 78.302145 1958.940 301.238814 78.302145 1958.940
+1654935003 1104259 42505.12094 301.238248 78.302311 1958.639 301.238247 78.302311 1958.927 301.238247 78.302311 1958.927
+1654935003 1104260 42505.12294 301.237963 78.302394 1958.595 301.237963 78.302394 1958.896 301.237963 78.302394 1958.896
+1654935003 1104261 42505.12494 301.237679 78.302477 1958.587 301.237678 78.302477 1958.872 301.237678 78.302477 1958.872
+1654935003 1104262 42505.12694 301.237394 78.302560 1958.538 301.237393 78.302560 1958.837 301.237393 78.302560 1958.837
+1654935003 1104263 42505.12894 301.237109 78.302643 1958.521 301.237109 78.302643 1958.786 301.237109 78.302643 1958.786
+1654935003 1104264 42505.13094 301.236823 78.302725 1958.410 301.236823 78.302725 1958.726 301.236823 78.302725 1958.726
+1654935003 1104265 42505.13294 301.236538 78.302807 1958.415 301.236537 78.302807 1958.735 301.236537 78.302807 1958.735
+1654935003 1104266 42505.13494 301.236253 78.302890 1958.331 301.236252 78.302890 1958.660 301.236252 78.302890 1958.660
+1654935003 1104267 42505.13694 301.235969 78.302972 1958.237 301.235969 78.302972 1958.555 301.235969 78.302972 1958.555
+1654935003 1104268 42505.13893 301.235686 78.303055 1958.215 301.235685 78.303055 1958.580 301.235685 78.303055 1958.580
+1654935003 1104269 42505.14093 301.235401 78.303137 1958.180 301.235400 78.303137 1958.503 301.235400 78.303137 1958.503
+1654935003 1104270 42505.14293 301.235116 78.303220 1958.136 301.235116 78.303220 1958.451 301.235116 78.303220 1958.451
+1654935003 1104271 42505.14493 301.234832 78.303302 1958.076 301.234832 78.303302 1958.409 301.234832 78.303302 1958.409
+1654935003 1104272 42505.14693 301.234549 78.303385 1958.078 301.234549 78.303385 1958.368 301.234549 78.303385 1958.368
+1654935003 1104273 42505.14893 301.234266 78.303468 1958.034 301.234266 78.303468 1958.322 301.234266 78.303468 1958.322
+1654935003 1104274 42505.15093 301.233986 78.303551 1958.006 301.233986 78.303551 1958.328 301.233986 78.303551 1958.328
+1654935003 1104275 42505.15293 301.233705 78.303634 1958.063 301.233705 78.303635 1958.397 301.233705 78.303635 1958.397
+1654935003 1104276 42505.15493 301.233423 78.303717 1957.983 301.233423 78.303717 1958.275 301.233423 78.303717 1958.275
+1654935003 1104277 42505.15693 301.233139 78.303800 1957.897 301.233139 78.303800 1958.145 301.233139 78.303800 1958.145
+1654935003 1104278 42505.15893 301.232854 78.303882 1957.891 301.232854 78.303882 1958.193 301.232854 78.303882 1958.193
+1654935003 1104279 42505.16093 301.232568 78.303964 1957.801 301.232567 78.303964 1958.115 301.232567 78.303964 1958.115
+1654935003 1104280 42505.16293 301.232281 78.304046 1957.790 301.232280 78.304046 1958.068 301.232280 78.304046 1958.068
+1654935003 1104281 42505.16493 301.231994 78.304128 1957.755 301.231994 78.304128 1958.072 301.231994 78.304128 1958.072
+1654935003 1104282 42505.16693 301.231708 78.304210 1957.687 301.231708 78.304210 1958.040 301.231708 78.304210 1958.040
+1654935003 1104283 42505.16893 301.231423 78.304293 1957.718 301.231423 78.304293 1958.026 301.231423 78.304293 1958.026
+1654935003 1104284 42505.17093 301.231138 78.304376 1957.643 301.231137 78.304376 1957.918 301.231137 78.304376 1957.918
+1654935003 1104286 42505.17492 301.230573 78.304541 1957.511 301.230572 78.304541 1957.815 301.230572 78.304541 1957.815
+1654935003 1104287 42505.17692 301.230293 78.304624 1957.498 301.230293 78.304624 1957.841 301.230293 78.304624 1957.841
+1654935003 1104288 42505.17892 301.230013 78.304707 1957.447 301.230013 78.304707 1957.745 301.230013 78.304707 1957.745
+1654935003 1104289 42505.18092 301.229734 78.304790 1957.391 301.229734 78.304790 1957.698 301.229734 78.304790 1957.698
+1654935003 1104290 42505.18292 301.229454 78.304873 1957.341 301.229454 78.304873 1957.680 301.229454 78.304873 1957.680
+1654935003 1104291 42505.18492 301.229170 78.304956 1957.290 301.229170 78.304956 1957.564 301.229170 78.304956 1957.564
+1654935003 1104292 42505.18692 301.228883 78.305038 1957.308 301.228883 78.305038 1957.627 301.228883 78.305038 1957.627
+1654935003 1104293 42505.18892 301.228595 78.305120 1957.224 301.228595 78.305120 1957.541 301.228595 78.305120 1957.541
+1654935003 1104294 42505.19092 301.228306 78.305201 1957.208 301.228306 78.305201 1957.521 301.228306 78.305201 1957.521
+1654935003 1104295 42505.19292 301.228019 78.305283 1957.201 301.228019 78.305283 1957.491 301.228019 78.305283 1957.491
+1654935003 1104296 42505.19492 301.227733 78.305366 1957.129 301.227733 78.305366 1957.434 301.227733 78.305366 1957.434
+1654935003 1104297 42505.19692 301.227450 78.305449 1957.145 301.227450 78.305449 1957.416 301.227450 78.305449 1957.416
+1654935003 1104298 42505.19892 301.227167 78.305532 1957.094 301.227167 78.305532 1957.423 301.227167 78.305532 1957.423
+1654935003 1104299 42505.20092 301.226883 78.305615 1957.146 301.226883 78.305615 1957.433 301.226883 78.305615 1957.433
+1654935003 1104300 42505.20292 301.226599 78.305698 1957.181 301.226599 78.305698 1957.445 301.226599 78.305698 1957.445
+1654935003 1104301 42505.20492 301.226316 78.305781 1957.119 301.226316 78.305781 1957.408 301.226316 78.305781 1957.408
+1654935003 1104302 42505.20691 301.226035 78.305864 1957.021 301.226035 78.305864 1957.258 301.226035 78.305864 1957.258
+1654935003 1104303 42505.20891 301.225753 78.305948 1956.952 301.225753 78.305947 1957.264 301.225753 78.305947 1957.264
+1654935003 1104304 42505.21091 301.225469 78.306031 1956.871 301.225469 78.306031 1957.165 301.225469 78.306031 1957.165
+1654935003 1104305 42505.21291 301.225184 78.306114 1956.809 301.225184 78.306114 1957.051 301.225184 78.306114 1957.051
+1654935003 1104306 42505.21491 301.224897 78.306196 1956.812 301.224897 78.306196 1957.071 301.224897 78.306196 1957.071
+1654935003 1104307 42505.21691 301.224607 78.306278 1956.754 301.224607 78.306278 1957.005 301.224607 78.306278 1957.005
+1654935003 1104308 42505.21891 301.224319 78.306360 1956.733 301.224319 78.306360 1956.984 301.224319 78.306360 1956.984
+1654935003 1104309 42505.22091 301.224031 78.306442 1956.672 301.224032 78.306442 1956.934 301.224032 78.306442 1956.934
+1654935003 1104310 42505.22291 301.223746 78.306525 1956.636 301.223746 78.306525 1956.892 301.223746 78.306525 1956.892
+1654935003 1104311 42505.22491 301.223461 78.306608 1956.640 301.223462 78.306608 1956.880 301.223462 78.306608 1956.880
+1654935003 1104312 42505.22691 301.223177 78.306692 1956.568 301.223177 78.306692 1956.840 301.223177 78.306692 1956.840
+1654935003 1104313 42505.22891 301.222891 78.306775 1956.640 301.222892 78.306775 1956.850 301.222892 78.306775 1956.850
+1654935003 1104314 42505.23091 301.222605 78.306859 1956.528 301.222606 78.306859 1956.850 301.222606 78.306859 1956.850
+1654935003 1104316 42505.23491 301.222034 78.307026 1956.411 301.222035 78.307026 1956.680 301.222035 78.307026 1956.680
+1654935003 1104317 42505.23691 301.221752 78.307110 1956.474 301.221753 78.307109 1956.775 301.221753 78.307109 1956.775
+1654935003 1104318 42505.23891 301.221469 78.307193 1956.396 301.221469 78.307193 1956.662 301.221469 78.307193 1956.662
+1654935003 1104319 42505.24091 301.221184 78.307276 1956.387 301.221184 78.307276 1956.663 301.221184 78.307276 1956.663
+1654935003 1104320 42505.24290 301.220897 78.307359 1956.386 301.220897 78.307359 1956.643 301.220897 78.307359 1956.643
+1654935003 1104321 42505.24490 301.220608 78.307442 1956.252 301.220608 78.307442 1956.484 301.220608 78.307442 1956.484
+1654935003 1104330 42505.26290 301.218024 78.308191 1956.424 301.218025 78.308191 1956.738 301.218025 78.308191 1956.738
+1654935003 1104339 42505.28089 301.217825 78.308157 1956.516 301.217826 78.308157 1956.883 301.217826 78.308157 1956.883
+1654935003 1104349 42505.30089 301.220942 78.307353 1956.391 301.220942 78.307352 1956.687 301.220942 78.307352 1956.687
+1654935003 1104350 42505.30289 301.221245 78.307271 1956.335 301.221246 78.307271 1956.582 301.221246 78.307271 1956.582
+1654935003 1104352 42505.30689 301.221852 78.307108 1956.471 301.221852 78.307108 1956.744 301.221852 78.307108 1956.744
+1654935003 1104353 42505.30889 301.222157 78.307027 1956.403 301.222157 78.307027 1956.657 301.222157 78.307027 1956.657
+1654935003 1104354 42505.31088 301.222465 78.306947 1956.488 301.222466 78.306947 1956.757 301.222466 78.306947 1956.757
+1654935003 1104355 42505.31288 301.222776 78.306867 1956.556 301.222776 78.306867 1956.804 301.222776 78.306867 1956.804
+1654935003 1104356 42505.31488 301.223087 78.306788 1956.556 301.223088 78.306788 1956.833 301.223088 78.306788 1956.833
+1654935003 1104357 42505.31688 301.223400 78.306708 1956.585 301.223401 78.306708 1956.851 301.223401 78.306708 1956.851
+1654935003 1104359 42505.32088 301.224025 78.306549 1956.631 301.224025 78.306548 1956.915 301.224025 78.306548 1956.915
+1654935003 1104361 42505.32488 301.224649 78.306387 1956.698 301.224649 78.306387 1956.969 301.224649 78.306387 1956.969
+1654935003 1104362 42505.32688 301.224959 78.306307 1956.716 301.224959 78.306307 1957.000 301.224959 78.306307 1957.000
+1654935003 1104363 42505.32888 301.225267 78.306226 1956.743 301.225267 78.306226 1957.016 301.225267 78.306226 1957.016
+1654935003 1104364 42505.33088 301.225570 78.306145 1956.809 301.225570 78.306145 1957.086 301.225570 78.306145 1957.086
+1654935003 1104365 42505.33288 301.225870 78.306064 1956.866 301.225870 78.306064 1957.169 301.225870 78.306064 1957.169
+1654935003 1104366 42505.33488 301.226172 78.305983 1956.978 301.226172 78.305983 1957.209 301.226172 78.305983 1957.209
+1654935003 1104367 42505.33688 301.226475 78.305902 1956.979 301.226475 78.305901 1957.252 301.226475 78.305901 1957.252
+1654935003 1104368 42505.33888 301.226781 78.305821 1957.046 301.226781 78.305821 1957.298 301.226781 78.305821 1957.298
+1654935003 1104369 42505.34088 301.227091 78.305741 1957.037 301.227091 78.305741 1957.280 301.227091 78.305741 1957.280
+1654935003 1104370 42505.34288 301.227402 78.305662 1957.060 301.227402 78.305662 1957.360 301.227402 78.305662 1957.360
+1654935003 1104371 42505.34487 301.227714 78.305583 1957.059 301.227714 78.305583 1957.367 301.227714 78.305583 1957.367
+1654935003 1104372 42505.34687 301.228026 78.305504 1957.102 301.228026 78.305504 1957.360 301.228026 78.305504 1957.360
+1654935003 1104373 42505.34887 301.228336 78.305425 1957.115 301.228336 78.305425 1957.428 301.228336 78.305425 1957.428
+1654935003 1104374 42505.35087 301.228646 78.305345 1957.239 301.228646 78.305345 1957.491 301.228646 78.305345 1957.491
+1654935003 1104375 42505.35287 301.228955 78.305265 1957.214 301.228955 78.305265 1957.498 301.228955 78.305265 1957.498
+1654935003 1104376 42505.35487 301.229262 78.305185 1957.237 301.229262 78.305185 1957.588 301.229262 78.305185 1957.588
+1654935003 1104377 42505.35687 301.229566 78.305105 1957.326 301.229566 78.305105 1957.645 301.229566 78.305105 1957.645
+1654935003 1104378 42505.35887 301.229870 78.305025 1957.370 301.229870 78.305025 1957.686 301.229870 78.305025 1957.686
+1654935003 1104379 42505.36087 301.230173 78.304944 1957.398 301.230173 78.304944 1957.755 301.230173 78.304944 1957.755
+1654935003 1104380 42505.36287 301.230475 78.304863 1957.517 301.230475 78.304863 1957.810 301.230475 78.304863 1957.810
+1654935003 1104381 42505.36487 301.230780 78.304782 1957.589 301.230780 78.304782 1957.888 301.230780 78.304782 1957.888
+1654935003 1104382 42505.36687 301.231086 78.304701 1957.527 301.231086 78.304701 1957.778 301.231086 78.304701 1957.778
+1654935003 1104383 42505.36887 301.231394 78.304621 1957.466 301.231394 78.304621 1957.758 301.231394 78.304621 1957.758
+1654935003 1104384 42505.37087 301.231704 78.304541 1957.543 301.231704 78.304541 1957.862 301.231704 78.304541 1957.862
+1654935003 1104385 42505.37287 301.232011 78.304463 1957.612 301.232011 78.304463 1957.916 301.232011 78.304463 1957.916
+1654935003 1104386 42505.37487 301.232320 78.304384 1957.611 301.232320 78.304384 1957.931 301.232320 78.304384 1957.931
+1654935003 1104387 42505.37687 301.232628 78.304305 1957.672 301.232628 78.304305 1957.961 301.232628 78.304305 1957.961
+1654935003 1104388 42505.37886 301.232937 78.304225 1957.758 301.232936 78.304225 1958.051 301.232936 78.304225 1958.051
+1654935003 1104389 42505.38086 301.233245 78.304145 1957.840 301.233245 78.304145 1958.111 301.233245 78.304145 1958.111
+1654935003 1104390 42505.38286 301.233554 78.304065 1957.885 301.233554 78.304065 1958.198 301.233554 78.304065 1958.198
+1654935003 1104391 42505.38486 301.233862 78.303984 1957.896 301.233862 78.303984 1958.226 301.233862 78.303984 1958.226
+1654935003 1104392 42505.38686 301.234169 78.303904 1957.930 301.234169 78.303904 1958.247 301.234169 78.303904 1958.247
+1654935003 1104393 42505.38886 301.234475 78.303824 1957.978 301.234474 78.303824 1958.282 301.234474 78.303824 1958.282
+1654935003 1104394 42505.39086 301.234778 78.303743 1957.963 301.234778 78.303743 1958.240 301.234778 78.303743 1958.240
+1654935003 1104395 42505.39286 301.235081 78.303662 1957.996 301.235081 78.303662 1958.303 301.235081 78.303662 1958.303
+1654935003 1104396 42505.39486 301.235386 78.303582 1958.053 301.235386 78.303582 1958.345 301.235386 78.303582 1958.345
+1654935003 1104397 42505.39686 301.235693 78.303502 1958.080 301.235693 78.303502 1958.442 301.235693 78.303502 1958.442
+1654935003 1104398 42505.39886 301.236001 78.303422 1958.111 301.236001 78.303422 1958.388 301.236001 78.303422 1958.388
+1654935003 1104399 42505.40086 301.236312 78.303342 1958.185 301.236311 78.303342 1958.503 301.236311 78.303342 1958.503
+1654935003 1104400 42505.40286 301.236623 78.303263 1958.269 301.236622 78.303263 1958.526 301.236622 78.303263 1958.526
+1654935003 1104401 42505.40486 301.236933 78.303183 1958.249 301.236933 78.303183 1958.548 301.236933 78.303183 1958.548
+1654935003 1104402 42505.40686 301.237243 78.303103 1958.298 301.237243 78.303103 1958.609 301.237243 78.303103 1958.609
+1654935003 1104403 42505.40886 301.237552 78.303023 1958.355 301.237552 78.303023 1958.712 301.237552 78.303023 1958.712
+1654935003 1104404 42505.41086 301.237859 78.302942 1958.360 301.237859 78.302942 1958.675 301.237859 78.302942 1958.675
+1654935003 1104405 42505.41285 301.238165 78.302862 1958.421 301.238164 78.302862 1958.718 301.238164 78.302862 1958.718
+1654935003 1104406 42505.41485 301.238470 78.302783 1958.476 301.238470 78.302783 1958.801 301.238470 78.302783 1958.801
+1654935003 1104407 42505.41685 301.238775 78.302703 1958.528 301.238775 78.302703 1958.830 301.238775 78.302703 1958.830
+1654935003 1104408 42505.41885 301.239080 78.302623 1958.569 301.239080 78.302623 1958.841 301.239080 78.302623 1958.841
+1654935003 1104409 42505.42085 301.239386 78.302543 1958.602 301.239386 78.302543 1958.916 301.239386 78.302543 1958.916
+1654935003 1104410 42505.42285 301.239694 78.302462 1958.623 301.239693 78.302462 1958.943 301.239693 78.302462 1958.943
+1654935003 1104411 42505.42485 301.240002 78.302381 1958.615 301.240001 78.302381 1958.925 301.240001 78.302381 1958.925
+1654935003 1104412 42505.42685 301.240311 78.302300 1958.681 301.240310 78.302300 1959.001 301.240310 78.302300 1959.001
+1654935003 1104413 42505.42885 301.240620 78.302220 1958.794 301.240619 78.302220 1959.081 301.240619 78.302220 1959.081
+1654935003 1104414 42505.43085 301.240928 78.302140 1958.917 301.240928 78.302140 1959.168 301.240928 78.302140 1959.168
+1654935003 1104415 42505.43285 301.241236 78.302060 1958.907 301.241235 78.302060 1959.222 301.241235 78.302060 1959.222
+1654935003 1104416 42505.43485 301.241543 78.301980 1958.912 301.241543 78.301981 1959.202 301.241543 78.301981 1959.202
+1654935003 1104417 42505.43685 301.241851 78.301901 1958.956 301.241850 78.301901 1959.225 301.241850 78.301901 1959.225
+1654935003 1104419 42505.44085 301.242469 78.301740 1959.018 301.242469 78.301740 1959.260 301.242469 78.301740 1959.260
+1654935003 1104423 42505.44884 301.243707 78.301418 1959.187 301.243706 78.301418 1959.474 301.243706 78.301418 1959.474
+1654935003 1104430 42505.46284 301.245868 78.300852 1959.517 301.245867 78.300852 1959.736 301.245867 78.300852 1959.736
+1654935003 1104431 42505.46484 301.246178 78.300772 1960.385 301.246177 78.300772 1960.504 301.246177 78.300772 1960.504
+1654935003 1104439 42505.48084 301.245681 78.300821 1959.751 301.245680 78.300821 1960.038 301.245680 78.300821 1960.038
+1654935003 1104441 42505.48483 301.245111 78.300986 1959.395 301.245110 78.300987 1959.673 301.245110 78.300987 1959.673
+1654935003 1104442 42505.48683 301.244826 78.301069 1959.423 301.244826 78.301070 1959.656 301.244826 78.301070 1959.656
+1654935003 1104443 42505.48883 301.244541 78.301152 1959.362 301.244541 78.301153 1959.645 301.244541 78.301153 1959.645
+1654935003 1104444 42505.49083 301.244258 78.301236 1959.316 301.244257 78.301236 1959.607 301.244257 78.301236 1959.607
+1654935003 1104445 42505.49283 301.243974 78.301320 1959.257 301.243973 78.301320 1959.513 301.243973 78.301320 1959.513
+1654935003 1104446 42505.49483 301.243690 78.301403 1959.213 301.243689 78.301403 1959.503 301.243689 78.301403 1959.503
+1654935003 1104447 42505.49683 301.243405 78.301486 1959.182 301.243405 78.301486 1959.411 301.243405 78.301486 1959.411
+1654935003 1104448 42505.49883 301.243121 78.301569 1959.100 301.243120 78.301569 1959.380 301.243120 78.301569 1959.380
+1654935003 1104449 42505.50083 301.242836 78.301652 1959.091 301.242835 78.301652 1959.358 301.242835 78.301652 1959.358
+1654935003 1104450 42505.50283 301.242550 78.301735 1959.007 301.242549 78.301735 1959.367 301.242549 78.301735 1959.367
+1654935003 1104451 42505.50483 301.242265 78.301817 1959.011 301.242264 78.301817 1959.327 301.242264 78.301817 1959.327
+1654935003 1104452 42505.50683 301.241980 78.301900 1958.990 301.241979 78.301900 1959.280 301.241979 78.301900 1959.280
+1654935003 1104453 42505.50883 301.241696 78.301982 1958.916 301.241695 78.301982 1959.208 301.241695 78.301982 1959.208
+1654935003 1104454 42505.51083 301.241411 78.302065 1958.883 301.241410 78.302065 1959.186 301.241410 78.302065 1959.186
+1654935003 1104455 42505.51283 301.241127 78.302147 1958.857 301.241127 78.302147 1959.107 301.241127 78.302147 1959.107
+1654935003 1104456 42505.51483 301.240844 78.302230 1958.851 301.240843 78.302230 1959.150 301.240843 78.302230 1959.150
+1654935003 1104457 42505.51682 301.240561 78.302313 1958.789 301.240561 78.302313 1959.105 301.240561 78.302313 1959.105
+1654935003 1104458 42505.51882 301.240278 78.302396 1958.680 301.240277 78.302396 1959.008 301.240277 78.302396 1959.008
+1654935003 1104459 42505.52082 301.239996 78.302480 1958.662 301.239996 78.302480 1958.961 301.239996 78.302480 1958.961
+1654935003 1104460 42505.52282 301.239715 78.302563 1958.584 301.239715 78.302563 1958.910 301.239715 78.302563 1958.910
+1654935003 1104461 42505.52482 301.239433 78.302646 1958.609 301.239432 78.302646 1958.904 301.239432 78.302646 1958.904
+1654935003 1104462 42505.52682 301.239149 78.302728 1958.581 301.239149 78.302728 1958.866 301.239149 78.302728 1958.866
+1654935003 1104463 42505.52882 301.238865 78.302810 1958.621 301.238864 78.302810 1958.896 301.238864 78.302810 1958.896
+1654935003 1104464 42505.53082 301.238579 78.302892 1958.508 301.238578 78.302892 1958.822 301.238578 78.302892 1958.822
+1654935003 1104465 42505.53282 301.238291 78.302975 1958.392 301.238291 78.302975 1958.748 301.238291 78.302975 1958.748
+1654935003 1104466 42505.53482 301.238004 78.303058 1958.376 301.238004 78.303058 1958.673 301.238004 78.303058 1958.673
+1654935003 1104467 42505.53682 301.237718 78.303141 1958.368 301.237718 78.303141 1958.659 301.237718 78.303141 1958.659
+1654935003 1104468 42505.53882 301.237433 78.303224 1958.309 301.237433 78.303224 1958.602 301.237433 78.303224 1958.602
+1654935003 1104469 42505.54082 301.237149 78.303306 1958.297 301.237149 78.303306 1958.609 301.237149 78.303306 1958.609
+1654935003 1104470 42505.54282 301.236866 78.303389 1958.218 301.236866 78.303389 1958.523 301.236866 78.303389 1958.523
+1654935003 1104471 42505.54482 301.236584 78.303472 1958.191 301.236584 78.303472 1958.547 301.236584 78.303472 1958.547
+1654935003 1104472 42505.54682 301.236305 78.303555 1958.155 301.236305 78.303555 1958.483 301.236305 78.303555 1958.483
+1654935003 1104473 42505.54882 301.236025 78.303638 1958.135 301.236024 78.303638 1958.425 301.236024 78.303638 1958.425
+1654935003 1104474 42505.55081 301.235744 78.303720 1958.099 301.235743 78.303720 1958.462 301.235743 78.303720 1958.462
+1654935003 1104475 42505.55281 301.235462 78.303803 1958.023 301.235461 78.303803 1958.306 301.235461 78.303803 1958.306
+1654935003 1104476 42505.55481 301.235178 78.303885 1958.007 301.235178 78.303885 1958.325 301.235178 78.303885 1958.325
+1654935003 1104477 42505.55681 301.234892 78.303967 1957.903 301.234892 78.303967 1958.193 301.234892 78.303967 1958.193
+1654935003 1104478 42505.55881 301.234607 78.304049 1957.849 301.234607 78.304049 1958.156 301.234607 78.304049 1958.156
+1654935003 1104479 42505.56081 301.234323 78.304131 1957.904 301.234323 78.304131 1958.259 301.234323 78.304131 1958.259
+1654935003 1104480 42505.56281 301.234040 78.304214 1957.852 301.234040 78.304214 1958.176 301.234040 78.304214 1958.176
+1654935003 1104481 42505.56481 301.233758 78.304296 1957.789 301.233757 78.304296 1958.094 301.233757 78.304296 1958.094
+1654935003 1104482 42505.56681 301.233475 78.304378 1957.821 301.233475 78.304378 1958.132 301.233475 78.304378 1958.132
+1654935003 1104483 42505.56881 301.233192 78.304461 1957.725 301.233192 78.304461 1958.029 301.233192 78.304461 1958.029
+1654935003 1104484 42505.57081 301.232909 78.304543 1957.658 301.232909 78.304543 1958.009 301.232909 78.304543 1958.009
+1654935003 1104485 42505.57281 301.232628 78.304625 1957.686 301.232628 78.304625 1958.028 301.232628 78.304625 1958.028
+1654935003 1104486 42505.57481 301.232345 78.304707 1957.632 301.232345 78.304707 1957.996 301.232345 78.304707 1957.996
+1654935003 1104487 42505.57681 301.232064 78.304790 1957.624 301.232064 78.304790 1957.944 301.232064 78.304790 1957.944
+1654935003 1104488 42505.57881 301.231782 78.304873 1957.500 301.231782 78.304873 1957.804 301.231782 78.304873 1957.804
+1654935003 1104489 42505.58081 301.231499 78.304956 1957.484 301.231499 78.304956 1957.777 301.231499 78.304956 1957.777
+1654935003 1104490 42505.58281 301.231217 78.305038 1957.438 301.231217 78.305038 1957.793 301.231217 78.305038 1957.793
+1654935003 1104491 42505.58480 301.230933 78.305121 1957.448 301.230933 78.305121 1957.740 301.230933 78.305121 1957.740
+1654935003 1104492 42505.58680 301.230649 78.305203 1957.356 301.230649 78.305203 1957.689 301.230649 78.305203 1957.689
+1654935003 1104493 42505.58880 301.230364 78.305285 1957.365 301.230365 78.305285 1957.688 301.230365 78.305285 1957.688
+1654935003 1104494 42505.59080 301.230081 78.305368 1957.368 301.230081 78.305368 1957.706 301.230081 78.305368 1957.706
+1654935003 1104495 42505.59280 301.229796 78.305451 1957.305 301.229797 78.305451 1957.671 301.229797 78.305451 1957.671
+1654935003 1104496 42505.59480 301.229512 78.305534 1957.278 301.229512 78.305534 1957.627 301.229512 78.305534 1957.627
+1654935003 1104497 42505.59680 301.229226 78.305617 1957.299 301.229227 78.305617 1957.630 301.229227 78.305617 1957.630
+1654935003 1104498 42505.59880 301.228941 78.305700 1957.172 301.228941 78.305700 1957.502 301.228941 78.305700 1957.502
+1654935003 1104499 42505.60080 301.228655 78.305782 1957.203 301.228655 78.305782 1957.553 301.228655 78.305782 1957.553
+1654935003 1104500 42505.60280 301.228369 78.305864 1957.094 301.228370 78.305864 1957.404 301.228370 78.305864 1957.404
+1654935003 1104501 42505.60480 301.228085 78.305947 1957.081 301.228086 78.305947 1957.399 301.228086 78.305947 1957.399
+1654935003 1104502 42505.60680 301.227804 78.306030 1957.077 301.227804 78.306030 1957.399 301.227804 78.306030 1957.399
+1654935003 1104503 42505.60880 301.227522 78.306113 1957.020 301.227522 78.306113 1957.389 301.227522 78.306113 1957.389
+1654935003 1104504 42505.61080 301.227239 78.306196 1956.993 301.227240 78.306196 1957.297 301.227240 78.306196 1957.297
+1654935003 1104505 42505.61280 301.226956 78.306278 1956.977 301.226957 78.306278 1957.335 301.226957 78.306278 1957.335
+1654935003 1104506 42505.61480 301.226673 78.306361 1956.956 301.226673 78.306361 1957.289 301.226673 78.306361 1957.289
+1654935003 1104507 42505.61680 301.226390 78.306444 1956.897 301.226390 78.306444 1957.216 301.226390 78.306444 1957.216
+1654935003 1104508 42505.61880 301.226106 78.306526 1956.883 301.226107 78.306526 1957.248 301.226107 78.306526 1957.248
+1654935003 1104509 42505.62079 301.225823 78.306609 1956.790 301.225823 78.306609 1957.111 301.225823 78.306609 1957.111
+1654935003 1104510 42505.62279 301.225539 78.306692 1956.779 301.225539 78.306692 1957.110 301.225539 78.306692 1957.110
+1654935003 1104511 42505.62479 301.225253 78.306775 1956.728 301.225254 78.306775 1957.041 301.225254 78.306775 1957.041
+1654935003 1104512 42505.62679 301.224965 78.306857 1956.729 301.224966 78.306857 1957.039 301.224966 78.306857 1957.039
+1654935003 1104513 42505.62879 301.224678 78.306940 1956.645 301.224678 78.306940 1956.975 301.224678 78.306940 1956.975
+1654935003 1104514 42505.63079 301.224390 78.307022 1956.665 301.224390 78.307022 1956.974 301.224390 78.307022 1956.974
+1654935003 1104515 42505.63279 301.224104 78.307105 1956.642 301.224104 78.307105 1956.915 301.224104 78.307105 1956.915
+1654935003 1104516 42505.63479 301.223819 78.307188 1956.562 301.223820 78.307188 1956.887 301.223820 78.307188 1956.887
+1654935003 1104517 42505.63679 301.223537 78.307272 1956.497 301.223538 78.307272 1956.752 301.223538 78.307272 1956.752
+1654935003 1104518 42505.63879 301.223254 78.307356 1956.488 301.223255 78.307356 1956.814 301.223255 78.307356 1956.814
+1654935003 1104519 42505.64079 301.222971 78.307439 1956.460 301.222971 78.307439 1956.764 301.222971 78.307439 1956.764
+1654935003 1104520 42505.64279 301.222686 78.307523 1956.483 301.222686 78.307522 1956.769 301.222686 78.307522 1956.769
+1654935003 1104521 42505.64479 301.222400 78.307606 1956.385 301.222401 78.307605 1956.677 301.222401 78.307605 1956.677
+1654935003 1104522 42505.64679 301.222115 78.307689 1956.351 301.222115 78.307688 1956.671 301.222115 78.307688 1956.671
+1654935003 1104523 42505.64879 301.221829 78.307772 1956.362 301.221830 78.307771 1956.682 301.221830 78.307771 1956.682
+1654935003 1104524 42505.65079 301.221543 78.307855 1956.324 301.221544 78.307855 1956.636 301.221544 78.307855 1956.636
+1654935003 1104525 42505.65279 301.221256 78.307938 1956.336 301.221256 78.307938 1956.614 301.221256 78.307938 1956.614
+1654935003 1104526 42505.65478 301.220968 78.308021 1956.282 301.220968 78.308021 1956.545 301.220968 78.308021 1956.545
+1654935003 1104527 42505.65678 301.220677 78.308104 1956.259 301.220677 78.308104 1956.568 301.220677 78.308104 1956.568
+1654935003 1104528 42505.65878 301.220387 78.308187 1956.227 301.220387 78.308187 1956.593 301.220387 78.308187 1956.593
+1654935003 1104529 42505.66078 301.220099 78.308270 1956.337 301.220099 78.308270 1956.667 301.220099 78.308270 1956.667
+1654935003 1104551 42505.70477 301.223375 78.307353 1956.518 301.223375 78.307353 1956.767 301.223375 78.307353 1956.767
+1654935003 1104560 42505.72276 301.226162 78.306629 1956.900 301.226163 78.306629 1957.054 301.226163 78.306629 1957.054
+1654935003 1104561 42505.72476 301.226470 78.306549 1956.972 301.226471 78.306549 1957.202 301.226471 78.306549 1957.202
+1654935003 1104562 42505.72676 301.226779 78.306469 1957.049 301.226779 78.306469 1957.338 301.226779 78.306469 1957.338
+1654935003 1104565 42505.73276 301.227706 78.306228 1957.203 301.227706 78.306228 1957.383 301.227706 78.306228 1957.383
+1654935003 1104568 42505.73876 301.228647 78.305988 1957.172 301.228647 78.305988 1957.514 301.228647 78.305988 1957.514
+1654935003 1104571 42505.74476 301.229578 78.305747 1957.299 301.229578 78.305747 1957.536 301.229578 78.305747 1957.536
+1654935003 1104575 42505.75276 301.230801 78.305424 1957.366 301.230801 78.305424 1957.663 301.230801 78.305424 1957.663
+1654935003 1104577 42505.75675 301.231418 78.305265 1957.574 301.231418 78.305265 1957.846 301.231418 78.305265 1957.846
+1654935003 1104578 42505.75875 301.231727 78.305185 1957.644 301.231727 78.305185 1957.860 301.231727 78.305185 1957.860
+1654935003 1104580 42505.76275 301.232344 78.305026 1957.707 301.232344 78.305026 1957.991 301.232344 78.305026 1957.991
+1654935003 1104581 42505.76475 301.232653 78.304947 1957.680 301.232653 78.304947 1957.935 301.232653 78.304947 1957.935
+1654935003 1104583 42505.76875 301.233273 78.304788 1957.842 301.233273 78.304787 1958.112 301.233273 78.304787 1958.112
+1654935003 1104584 42505.77075 301.233581 78.304707 1957.749 301.233581 78.304707 1958.019 301.233581 78.304707 1958.019
+1654935003 1104585 42505.77275 301.233886 78.304628 1957.795 301.233886 78.304628 1958.075 301.233886 78.304628 1958.075
+1654935003 1104586 42505.77475 301.234192 78.304547 1957.921 301.234192 78.304547 1958.193 301.234192 78.304547 1958.193
+1654935003 1104587 42505.77675 301.234497 78.304466 1957.864 301.234497 78.304466 1958.148 301.234497 78.304466 1958.148
+1654935003 1104588 42505.77875 301.234803 78.304385 1957.941 301.234802 78.304385 1958.144 301.234802 78.304385 1958.144
+1654935003 1104589 42505.78075 301.235111 78.304305 1958.061 301.235111 78.304305 1958.234 301.235111 78.304305 1958.234
+1654935003 1104590 42505.78275 301.235420 78.304225 1958.110 301.235420 78.304225 1958.417 301.235420 78.304225 1958.417
+1654935003 1104591 42505.78475 301.235729 78.304146 1958.155 301.235729 78.304146 1958.384 301.235729 78.304146 1958.384
+1654935003 1104593 42505.78875 301.236349 78.303987 1958.172 301.236348 78.303987 1958.423 301.236348 78.303987 1958.423
+1654935003 1104594 42505.79075 301.236657 78.303907 1958.210 301.236657 78.303907 1958.505 301.236657 78.303907 1958.505
+1654935003 1104595 42505.79274 301.236967 78.303827 1958.194 301.236966 78.303827 1958.499 301.236966 78.303827 1958.499
+1654935003 1104596 42505.79474 301.237276 78.303747 1958.361 301.237275 78.303747 1958.616 301.237275 78.303747 1958.616
+1654935003 1104597 42505.79674 301.237585 78.303667 1958.471 301.237585 78.303667 1958.721 301.237585 78.303667 1958.721
+1654935003 1104598 42505.79874 301.237894 78.303587 1958.392 301.237893 78.303587 1958.579 301.237893 78.303587 1958.579
+1654935003 1104599 42505.80074 301.238201 78.303507 1958.329 301.238200 78.303507 1958.613 301.238200 78.303507 1958.613
+1654935003 1104600 42505.80274 301.238506 78.303427 1958.455 301.238506 78.303427 1958.696 301.238506 78.303427 1958.696
+1654935003 1104601 42505.80474 301.238812 78.303346 1958.546 301.238812 78.303346 1958.812 301.238812 78.303346 1958.812
+1654935003 1104602 42505.80674 301.239118 78.303265 1958.566 301.239118 78.303265 1958.779 301.239118 78.303265 1958.779
+1654935003 1104603 42505.80874 301.239426 78.303184 1958.616 301.239426 78.303185 1958.895 301.239426 78.303185 1958.895
+1654935003 1104604 42505.81074 301.239737 78.303104 1958.697 301.239737 78.303104 1958.929 301.239737 78.303104 1958.929
+1654935003 1104605 42505.81274 301.240049 78.303024 1958.691 301.240049 78.303024 1958.955 301.240049 78.303024 1958.955
+1654935003 1104606 42505.81474 301.240361 78.302944 1958.586 301.240360 78.302944 1958.892 301.240360 78.302944 1958.892
+1654935003 1104607 42505.81674 301.240672 78.302864 1958.731 301.240671 78.302864 1959.045 301.240671 78.302864 1959.045
+1654935003 1104608 42505.81874 301.240983 78.302784 1958.750 301.240982 78.302784 1959.008 301.240982 78.302784 1959.008
+1654935003 1104609 42505.82074 301.241292 78.302704 1958.763 301.241292 78.302704 1959.105 301.241292 78.302704 1959.105
+1654935003 1104610 42505.82274 301.241601 78.302624 1958.891 301.241600 78.302624 1959.180 301.241600 78.302624 1959.180
+1654935003 1104611 42505.82474 301.241909 78.302544 1958.919 301.241909 78.302544 1959.219 301.241909 78.302544 1959.219
+1654935003 1104612 42505.82673 301.242218 78.302464 1959.012 301.242218 78.302464 1959.244 301.242218 78.302464 1959.244
+1654935003 1104613 42505.82873 301.242527 78.302384 1959.029 301.242526 78.302384 1959.298 301.242526 78.302384 1959.298
+1654935003 1104614 42505.83073 301.242834 78.302304 1959.085 301.242834 78.302304 1959.412 301.242834 78.302304 1959.412
+1654935003 1104615 42505.83273 301.243143 78.302223 1959.182 301.243142 78.302223 1959.319 301.243142 78.302223 1959.319
+1654935003 1104616 42505.83473 301.243450 78.302143 1959.219 301.243450 78.302143 1959.547 301.243450 78.302143 1959.547
+1654935003 1104617 42505.83673 301.243756 78.302061 1959.122 301.243756 78.302061 1959.369 301.243756 78.302061 1959.369
+1654935003 1104618 42505.83873 301.244063 78.301980 1959.213 301.244063 78.301980 1959.429 301.244063 78.301980 1959.429
+1654935003 1104619 42505.84073 301.244372 78.301900 1959.274 301.244372 78.301900 1959.579 301.244372 78.301900 1959.579
+1654935003 1104620 42505.84273 301.244682 78.301820 1959.274 301.244681 78.301820 1959.594 301.244681 78.301820 1959.594
+1654935003 1104621 42505.84473 301.244992 78.301740 1959.384 301.244991 78.301740 1959.710 301.244991 78.301740 1959.710
+1654935003 1104623 42505.84873 301.245616 78.301579 1959.347 301.245615 78.301580 1959.620 301.245615 78.301580 1959.620
+1654935003 1104624 42505.85073 301.245927 78.301499 1959.414 301.245927 78.301499 1959.658 301.245927 78.301499 1959.658
+1654935003 1104625 42505.85273 301.246240 78.301418 1959.419 301.246240 78.301418 1959.703 301.246240 78.301418 1959.703
+1654935003 1104626 42505.85473 301.246552 78.301337 1959.515 301.246551 78.301337 1959.764 301.246551 78.301337 1959.764
+1654935003 1104627 42505.85673 301.246863 78.301257 1959.521 301.246862 78.301257 1959.859 301.246862 78.301257 1959.859
+1654935003 1104628 42505.85873 301.247172 78.301176 1959.574 301.247171 78.301176 1959.886 301.247171 78.301176 1959.886
+1654935003 1104629 42505.86072 301.247479 78.301095 1959.665 301.247478 78.301096 1959.976 301.247478 78.301096 1959.976
+1654935003 1111542 42519.68271 301.310316 78.320202 1958.941 301.310316 78.320202 1959.130 301.310316 78.320202 1959.130
+1654935003 1111543 42519.68470 301.310622 78.320121 1959.066 301.310623 78.320121 1959.225 301.310623 78.320121 1959.225
+1654935003 1111545 42519.68870 301.311236 78.319958 1959.200 301.311237 78.319958 1959.357 301.311237 78.319958 1959.357
+1654935003 1111546 42519.69070 301.311546 78.319877 1959.143 301.311546 78.319877 1959.318 301.311546 78.319877 1959.318
+1654935003 1111548 42519.69470 301.312166 78.319717 1959.134 301.312166 78.319717 1959.449 301.312166 78.319717 1959.449
+1654935003 1111549 42519.69670 301.312473 78.319636 1959.216 301.312474 78.319636 1959.414 301.312474 78.319636 1959.414
+1654935003 1111550 42519.69870 301.312780 78.319555 1959.233 301.312781 78.319555 1959.451 301.312781 78.319555 1959.451
+1654935003 1111551 42519.70070 301.313087 78.319474 1959.409 301.313087 78.319474 1959.553 301.313087 78.319474 1959.553
+1654935003 1111553 42519.70470 301.313701 78.319311 1959.364 301.313701 78.319311 1959.519 301.313701 78.319311 1959.519
+1654935003 1111554 42519.70670 301.314010 78.319231 1959.336 301.314010 78.319230 1959.524 301.314010 78.319230 1959.524
+1654935003 1111557 42519.71270 301.314928 78.318988 1959.383 301.314928 78.318988 1959.540 301.314928 78.318988 1959.540
+1654935003 1111559 42519.71670 301.315537 78.318827 1959.451 301.315537 78.318827 1959.643 301.315537 78.318827 1959.643
+1654935003 1111560 42519.71869 301.315842 78.318746 1959.460 301.315842 78.318746 1959.601 301.315842 78.318746 1959.601
+1654935003 1111565 42519.72869 301.317374 78.318345 1959.670 301.317374 78.318345 1959.745 301.317374 78.318345 1959.745
+1654935003 1111566 42519.73069 301.317678 78.318265 1959.668 301.317678 78.318264 1959.924 301.317678 78.318264 1959.924
+1654935003 1111568 42519.73469 301.318290 78.318103 1959.728 301.318290 78.318103 1959.946 301.318290 78.318103 1959.946
+1654935003 1111569 42519.73669 301.318596 78.318023 1959.781 301.318596 78.318023 1960.029 301.318596 78.318023 1960.029
+1654935003 1111570 42519.73869 301.318902 78.317943 1959.825 301.318902 78.317943 1960.011 301.318902 78.317943 1960.011
+1654935003 1111571 42519.74069 301.319207 78.317862 1959.703 301.319207 78.317862 1959.847 301.319207 78.317862 1959.847
+1654935003 1111575 42519.74869 301.320424 78.317539 1959.982 301.320424 78.317539 1960.091 301.320424 78.317539 1960.091
+1654935003 1111583 42519.76468 301.322867 78.316898 1960.314 301.322867 78.316898 1960.459 301.322867 78.316898 1960.459
+1654935003 1111589 42519.77668 301.324686 78.316416 1960.348 301.324686 78.316416 1960.498 301.324686 78.316416 1960.498
+1654935003 1111653 42519.90464 301.333304 78.314286 1960.879 301.333303 78.314286 1961.160 301.333303 78.314286 1961.160
+1654935003 1111656 42519.91064 301.332460 78.314535 1960.855 301.332459 78.314535 1961.068 301.332459 78.314535 1961.068
+1654935003 1111658 42519.91464 301.331890 78.314701 1960.919 301.331890 78.314701 1961.068 301.331890 78.314701 1961.068
+1654935003 1111659 42519.91664 301.331606 78.314784 1960.899 301.331606 78.314784 1961.043 301.331606 78.314784 1961.043
+1654935003 1111660 42519.91864 301.331323 78.314866 1960.753 301.331323 78.314866 1960.918 301.331323 78.314866 1960.918
+1654935003 1111661 42519.92064 301.331039 78.314949 1960.800 301.331039 78.314949 1960.978 301.331039 78.314949 1960.978
+1654935003 1111663 42519.92463 301.330474 78.315115 1960.694 301.330473 78.315115 1960.965 301.330473 78.315115 1960.965
+1654935003 1111664 42519.92663 301.330193 78.315198 1960.656 301.330193 78.315198 1960.804 301.330193 78.315198 1960.804
+1654935003 1111665 42519.92863 301.329912 78.315281 1960.564 301.329912 78.315281 1960.739 301.329912 78.315281 1960.739
+1654935003 1111666 42519.93063 301.329632 78.315364 1960.601 301.329632 78.315364 1960.848 301.329632 78.315364 1960.848
+1654935003 1111667 42519.93263 301.329352 78.315448 1960.489 301.329352 78.315448 1960.770 301.329352 78.315448 1960.770
+1654935003 1111668 42519.93463 301.329072 78.315531 1960.577 301.329072 78.315531 1960.765 301.329072 78.315531 1960.765
+1654935003 1111669 42519.93663 301.328792 78.315614 1960.475 301.328792 78.315614 1960.849 301.328792 78.315614 1960.849
+1654935003 1111670 42519.93863 301.328512 78.315697 1960.572 301.328511 78.315697 1960.793 301.328511 78.315697 1960.793
+1654935003 1111671 42519.94063 301.328231 78.315780 1960.561 301.328231 78.315780 1960.803 301.328231 78.315780 1960.803
+1654935003 1111672 42519.94263 301.327950 78.315864 1960.542 301.327949 78.315864 1960.730 301.327949 78.315864 1960.730
+1654935003 1111673 42519.94463 301.327667 78.315946 1960.353 301.327667 78.315946 1960.649 301.327667 78.315946 1960.649
+1654935003 1111674 42519.94663 301.327384 78.316028 1960.334 301.327383 78.316028 1960.575 301.327383 78.316028 1960.575
+1654935003 1111675 42519.94863 301.327100 78.316111 1960.384 301.327100 78.316111 1960.592 301.327100 78.316111 1960.592
+1654935003 1111676 42519.95063 301.326816 78.316193 1960.286 301.326815 78.316193 1960.505 301.326815 78.316193 1960.505
+1654935003 1111677 42519.95263 301.326531 78.316275 1960.269 301.326531 78.316275 1960.563 301.326531 78.316275 1960.563
+1654935003 1111678 42519.95463 301.326248 78.316358 1960.179 301.326248 78.316358 1960.410 301.326248 78.316358 1960.410
+1654935003 1111679 42519.95663 301.325967 78.316441 1960.147 301.325967 78.316441 1960.325 301.325967 78.316441 1960.325
+1654935003 1111680 42519.95862 301.325686 78.316525 1960.102 301.325686 78.316525 1960.358 301.325686 78.316525 1960.358
+1654935003 1111681 42519.96062 301.325408 78.316609 1960.148 301.325407 78.316609 1960.458 301.325407 78.316609 1960.458
+1654935003 1111682 42519.96262 301.325131 78.316692 1960.128 301.325131 78.316692 1960.252 301.325131 78.316692 1960.252
+1654935003 1111683 42519.96462 301.324854 78.316775 1960.047 301.324853 78.316775 1960.325 301.324853 78.316775 1960.325
+1654935003 1111684 42519.96662 301.324575 78.316858 1960.102 301.324575 78.316858 1960.354 301.324575 78.316858 1960.354
+1654935003 1111685 42519.96862 301.324298 78.316940 1960.062 301.324298 78.316940 1960.395 301.324298 78.316940 1960.395
+1654935003 1111686 42519.97062 301.324018 78.317023 1960.081 301.324018 78.317023 1960.268 301.324018 78.317023 1960.268
+1654935003 1111687 42519.97262 301.323736 78.317105 1959.982 301.323736 78.317105 1960.285 301.323736 78.317105 1960.285
+1654935003 1111688 42519.97462 301.323453 78.317188 1959.983 301.323453 78.317188 1960.253 301.323453 78.317188 1960.253
+1654935003 1111689 42519.97662 301.323167 78.317270 1959.956 301.323167 78.317270 1960.242 301.323167 78.317270 1960.242
+1654935003 1111690 42519.97862 301.322882 78.317352 1959.953 301.322882 78.317352 1960.293 301.322882 78.317352 1960.293
+1654935003 1111691 42519.98062 301.322598 78.317435 1960.015 301.322597 78.317434 1960.295 301.322597 78.317434 1960.295
+1654935003 1111692 42519.98262 301.322316 78.317517 1959.896 301.322315 78.317517 1960.219 301.322315 78.317517 1960.219
+1654935003 1111693 42519.98462 301.322035 78.317600 1959.854 301.322035 78.317600 1960.108 301.322035 78.317600 1960.108
+1654935003 1111694 42519.98662 301.321759 78.317683 1959.807 301.321759 78.317683 1960.167 301.321759 78.317683 1960.167
+1654935003 1111695 42519.98862 301.321482 78.317767 1959.767 301.321482 78.317767 1959.996 301.321482 78.317767 1959.996
+1654935003 1111696 42519.99062 301.321205 78.317850 1959.734 301.321205 78.317850 1959.918 301.321205 78.317850 1959.918
+1654935003 1111697 42519.99261 301.320926 78.317933 1959.685 301.320926 78.317933 1959.966 301.320926 78.317933 1959.966
+1654935003 1111698 42519.99461 301.320645 78.318016 1959.772 301.320645 78.318016 1959.978 301.320645 78.318016 1959.978
+1654935003 1111699 42519.99661 301.320361 78.318100 1959.674 301.320361 78.318099 1959.978 301.320361 78.318099 1959.978
+1654935003 1111700 42519.99861 301.320077 78.318183 1959.658 301.320077 78.318183 1959.949 301.320077 78.318183 1959.949
+1654935003 1111701 42520.00061 301.319793 78.318266 1959.632 301.319793 78.318266 1959.987 301.319793 78.318266 1959.987
+1654935003 1111702 42520.00261 301.319509 78.318349 1959.563 301.319509 78.318349 1959.890 301.319509 78.318349 1959.890
+1654935003 1111703 42520.00461 301.319225 78.318432 1959.665 301.319225 78.318432 1959.894 301.319225 78.318432 1959.894
+1654935003 1111704 42520.00661 301.318942 78.318514 1959.592 301.318942 78.318514 1959.922 301.318942 78.318514 1959.922
+1654935003 1111705 42520.00861 301.318660 78.318596 1959.624 301.318660 78.318596 1959.848 301.318660 78.318596 1959.848
+1654935003 1111706 42520.01061 301.318377 78.318679 1959.496 301.318378 78.318679 1959.766 301.318378 78.318679 1959.766
+1654935003 1111707 42520.01261 301.318096 78.318762 1959.503 301.318096 78.318762 1959.752 301.318096 78.318762 1959.752
+1654935003 1111708 42520.01461 301.317815 78.318845 1959.346 301.317815 78.318845 1959.696 301.317815 78.318845 1959.696
+1654935003 1111709 42520.01661 301.317536 78.318929 1959.411 301.317536 78.318929 1959.661 301.317536 78.318929 1959.661
+1654935003 1111710 42520.01861 301.317256 78.319014 1959.391 301.317256 78.319013 1959.688 301.317256 78.319013 1959.688
+1654935003 1111711 42520.02061 301.316976 78.319097 1959.503 301.316976 78.319097 1959.791 301.316976 78.319097 1959.791
+1654935003 1111712 42520.02261 301.316694 78.319181 1959.427 301.316695 78.319181 1959.724 301.316695 78.319181 1959.724
+1654935003 1111713 42520.02461 301.316412 78.319264 1959.427 301.316412 78.319264 1959.616 301.316412 78.319264 1959.616
+1654935003 1111714 42520.02661 301.316129 78.319347 1959.307 301.316130 78.319346 1959.568 301.316130 78.319346 1959.568
+1654935003 1111715 42520.02860 301.315847 78.319429 1959.276 301.315847 78.319429 1959.622 301.315847 78.319429 1959.622
+1654935003 1111716 42520.03060 301.315563 78.319512 1959.272 301.315564 78.319512 1959.544 301.315564 78.319512 1959.544
+1654935003 1111717 42520.03260 301.315279 78.319595 1959.219 301.315279 78.319595 1959.471 301.315279 78.319595 1959.471
+1654935003 1111718 42520.03460 301.314994 78.319678 1959.174 301.314994 78.319678 1959.487 301.314994 78.319678 1959.487
+1654935003 1111719 42520.03660 301.314707 78.319761 1959.106 301.314707 78.319761 1959.411 301.314707 78.319761 1959.411
+1654935003 1111720 42520.03860 301.314420 78.319845 1959.051 301.314421 78.319845 1959.356 301.314421 78.319845 1959.356
+1654935003 1111721 42520.04060 301.314136 78.319928 1959.142 301.314137 78.319928 1959.448 301.314137 78.319928 1959.448
+1654935003 1111722 42520.04260 301.313855 78.320012 1959.116 301.313855 78.320012 1959.457 301.313855 78.320012 1959.457
+1654935003 1111723 42520.04460 301.313575 78.320096 1959.200 301.313575 78.320096 1959.433 301.313575 78.320096 1959.433
+1654935003 1111724 42520.04660 301.313298 78.320180 1959.184 301.313299 78.320180 1959.458 301.313299 78.320180 1959.458
+1654935003 1111725 42520.04860 301.313020 78.320264 1959.076 301.313020 78.320264 1959.291 301.313020 78.320264 1959.291
+1654935003 1111726 42520.05060 301.312739 78.320347 1959.058 301.312739 78.320347 1959.305 301.312739 78.320347 1959.305
+1654935003 1111727 42520.05260 301.312455 78.320430 1959.053 301.312455 78.320430 1959.341 301.312455 78.320430 1959.341
+1654935003 1111728 42520.05460 301.312169 78.320514 1959.018 301.312170 78.320513 1959.283 301.312170 78.320513 1959.283
+1654935003 1111729 42520.05660 301.311881 78.320597 1959.283 301.311882 78.320597 1959.444 301.311882 78.320597 1959.444
+1654935003 1111740 42520.07859 301.311953 78.320603 1959.114 301.311953 78.320603 1959.371 301.311953 78.320603 1959.371
+1654935003 1111741 42520.08059 301.312259 78.320523 1958.882 301.312260 78.320522 1959.231 301.312260 78.320522 1959.231
+1654935003 1111742 42520.08259 301.312564 78.320441 1958.952 301.312565 78.320441 1959.293 301.312565 78.320441 1959.293
+1654935003 1111743 42520.08459 301.312870 78.320360 1958.970 301.312870 78.320360 1959.289 301.312870 78.320360 1959.289
+1654935003 1111744 42520.08659 301.313178 78.320278 1959.066 301.313179 78.320278 1959.402 301.313179 78.320278 1959.402
+1654935003 1111745 42520.08859 301.313488 78.320196 1959.125 301.313489 78.320196 1959.441 301.313489 78.320196 1959.441
+1654935003 1111746 42520.09059 301.313797 78.320115 1959.033 301.313798 78.320114 1959.331 301.313798 78.320114 1959.331
+1654935003 1111747 42520.09259 301.314106 78.320033 1959.121 301.314106 78.320033 1959.454 301.314106 78.320033 1959.454
+1654935003 1111748 42520.09459 301.314413 78.319952 1959.073 301.314414 78.319952 1959.412 301.314414 78.319952 1959.412
+1654935003 1111749 42520.09658 301.314718 78.319871 1959.129 301.314718 78.319870 1959.422 301.314718 78.319870 1959.422
+1654935003 1111750 42520.09858 301.315022 78.319790 1959.096 301.315022 78.319789 1959.460 301.315022 78.319789 1959.460
+1654935003 1111751 42520.10058 301.315328 78.319709 1959.177 301.315329 78.319708 1959.490 301.315329 78.319708 1959.490
+1654935003 1111752 42520.10258 301.315637 78.319628 1959.155 301.315638 78.319628 1959.506 301.315638 78.319628 1959.506
+1654935003 1111753 42520.10458 301.315947 78.319547 1959.230 301.315947 78.319547 1959.539 301.315947 78.319547 1959.539
+1654935003 1111754 42520.10658 301.316257 78.319467 1959.246 301.316258 78.319466 1959.562 301.316258 78.319466 1959.562
+1654935003 1111755 42520.10858 301.316567 78.319386 1959.364 301.316567 78.319385 1959.661 301.316567 78.319385 1959.661
+1654935003 1111756 42520.11058 301.316874 78.319305 1959.355 301.316875 78.319304 1959.698 301.316875 78.319304 1959.698
+1654935003 1111757 42520.11258 301.317180 78.319223 1959.292 301.317180 78.319223 1959.567 301.317180 78.319223 1959.567
+1654935003 1111758 42520.11458 301.317485 78.319142 1959.305 301.317485 78.319142 1959.614 301.317485 78.319142 1959.614
+1654935003 1111759 42520.11658 301.317789 78.319062 1959.294 301.317790 78.319062 1959.602 301.317790 78.319062 1959.602
+1654935003 1111760 42520.11858 301.318093 78.318982 1959.304 301.318094 78.318982 1959.651 301.318094 78.318982 1959.651
+1654935003 1111761 42520.12058 301.318398 78.318901 1959.349 301.318398 78.318901 1959.668 301.318398 78.318901 1959.668
+1654935003 1111762 42520.12258 301.318703 78.318821 1959.463 301.318703 78.318821 1959.796 301.318703 78.318821 1959.796
+1654935003 1111763 42520.12458 301.319008 78.318740 1959.477 301.319008 78.318740 1959.802 301.319008 78.318740 1959.802
+1654935003 1111764 42520.12658 301.319312 78.318659 1959.558 301.319313 78.318659 1959.852 301.319313 78.318659 1959.852
+1654935003 1111765 42520.12858 301.319618 78.318577 1959.552 301.319618 78.318577 1959.870 301.319618 78.318577 1959.870
+1654935003 1111766 42520.13057 301.319925 78.318497 1959.619 301.319925 78.318496 1959.990 301.319925 78.318496 1959.990
+1654935003 1111767 42520.13257 301.320233 78.318416 1959.559 301.320233 78.318416 1959.921 301.320233 78.318416 1959.921
+1654935003 1111768 42520.13457 301.320541 78.318336 1959.605 301.320541 78.318336 1959.908 301.320541 78.318336 1959.908
+1654935003 1111769 42520.13657 301.320848 78.318256 1959.626 301.320848 78.318256 1959.990 301.320848 78.318256 1959.990
+1654935003 1111770 42520.13857 301.321153 78.318177 1959.672 301.321153 78.318177 1959.975 301.321153 78.318177 1959.975
+1654935003 1111771 42520.14057 301.321457 78.318097 1959.731 301.321457 78.318097 1960.085 301.321457 78.318097 1960.085
+1654935003 1111772 42520.14257 301.321761 78.318016 1959.752 301.321761 78.318016 1960.093 301.321761 78.318016 1960.093
+1654935003 1111773 42520.14457 301.322065 78.317935 1959.784 301.322065 78.317935 1960.094 301.322065 78.317935 1960.094
+1654935003 1111774 42520.14657 301.322371 78.317854 1959.775 301.322371 78.317854 1960.115 301.322371 78.317854 1960.115
+1654935003 1111775 42520.14857 301.322678 78.317773 1959.828 301.322678 78.317773 1960.192 301.322678 78.317773 1960.192
+1654935003 1111776 42520.15057 301.322983 78.317692 1959.850 301.322983 78.317692 1960.196 301.322983 78.317692 1960.196
+1654935003 1111777 42520.15257 301.323288 78.317611 1959.844 301.323288 78.317611 1960.148 301.323288 78.317611 1960.148
+1654935003 1111778 42520.15457 301.323592 78.317531 1959.838 301.323592 78.317531 1960.178 301.323592 78.317531 1960.178
+1654935003 1111779 42520.15657 301.323894 78.317450 1959.899 301.323894 78.317450 1960.247 301.323894 78.317450 1960.247
+1654935003 1111780 42520.15857 301.324198 78.317370 1959.813 301.324198 78.317369 1960.154 301.324198 78.317369 1960.154
+1654935003 1111781 42520.16057 301.324505 78.317289 1959.875 301.324504 78.317289 1960.222 301.324504 78.317289 1960.222
+1654935003 1111782 42520.16257 301.324813 78.317209 1959.862 301.324813 78.317209 1960.200 301.324813 78.317209 1960.200
+1654935003 1111783 42520.16456 301.325121 78.317129 1960.033 301.325121 78.317129 1960.380 301.325121 78.317129 1960.380
+1654935003 1111784 42520.16656 301.325431 78.317049 1960.000 301.325430 78.317049 1960.341 301.325430 78.317049 1960.341
+1654935003 1111785 42520.16856 301.325737 78.316969 1960.037 301.325737 78.316968 1960.311 301.325737 78.316968 1960.311
+1654935003 1111786 42520.17056 301.326043 78.316888 1960.080 301.326042 78.316888 1960.410 301.326042 78.316888 1960.410
+1654935003 1111787 42520.17256 301.326347 78.316807 1960.054 301.326347 78.316807 1960.330 301.326347 78.316807 1960.330
+1654935003 1111788 42520.17456 301.326651 78.316726 1960.151 301.326651 78.316726 1960.396 301.326651 78.316726 1960.396
+1654935003 1111789 42520.17656 301.326955 78.316645 1960.126 301.326954 78.316645 1960.425 301.326954 78.316645 1960.425
+1654935003 1111790 42520.17856 301.327257 78.316565 1960.090 301.327257 78.316565 1960.457 301.327257 78.316565 1960.457
+1654935003 1111791 42520.18056 301.327560 78.316485 1960.089 301.327560 78.316485 1960.441 301.327560 78.316485 1960.441
+1654935003 1111792 42520.18256 301.327862 78.316405 1960.153 301.327862 78.316405 1960.441 301.327862 78.316405 1960.441
+1654935003 1111793 42520.18456 301.328166 78.316324 1960.204 301.328165 78.316324 1960.523 301.328165 78.316324 1960.523
+1654935003 1111794 42520.18656 301.328470 78.316243 1960.302 301.328470 78.316243 1960.639 301.328470 78.316243 1960.639
+1654935003 1111795 42520.18856 301.328777 78.316162 1960.247 301.328776 78.316162 1960.596 301.328776 78.316162 1960.596
+1654935003 1111796 42520.19056 301.329084 78.316082 1960.320 301.329084 78.316082 1960.600 301.329084 78.316082 1960.600
+1654935003 1111797 42520.19256 301.329391 78.316002 1960.351 301.329390 78.316002 1960.694 301.329390 78.316002 1960.694
+1654935003 1111798 42520.19456 301.329697 78.315922 1960.389 301.329697 78.315922 1960.752 301.329697 78.315922 1960.752
+1654935003 1111799 42520.19656 301.330003 78.315842 1960.450 301.330002 78.315842 1960.742 301.330002 78.315842 1960.742
+1654935003 1111800 42520.19856 301.330307 78.315762 1960.486 301.330307 78.315762 1960.817 301.330307 78.315762 1960.817
+1654935003 1111801 42520.20055 301.330612 78.315682 1960.570 301.330611 78.315682 1960.869 301.330611 78.315682 1960.869
+1654935003 1111802 42520.20255 301.330917 78.315601 1960.569 301.330917 78.315601 1960.900 301.330917 78.315601 1960.900
+1654935003 1111803 42520.20455 301.331224 78.315520 1960.558 301.331223 78.315520 1960.966 301.331223 78.315520 1960.966
+1654935003 1111804 42520.20655 301.331531 78.315439 1960.637 301.331531 78.315439 1960.959 301.331531 78.315439 1960.959
+1654935003 1111805 42520.20855 301.331838 78.315358 1960.610 301.331838 78.315358 1960.909 301.331838 78.315358 1960.909
+1654935003 1111806 42520.21055 301.332144 78.315277 1960.735 301.332143 78.315277 1961.032 301.332143 78.315277 1961.032
+1654935003 1111807 42520.21255 301.332448 78.315196 1960.627 301.332448 78.315196 1960.978 301.332448 78.315196 1960.978
+1654935003 1111808 42520.21455 301.332753 78.315115 1960.631 301.332752 78.315115 1960.960 301.332752 78.315115 1960.960
+1654935003 1111809 42520.21655 301.333056 78.315034 1960.664 301.333055 78.315035 1961.027 301.333055 78.315035 1961.027
+1654935003 1111810 42520.21855 301.333360 78.314954 1960.794 301.333359 78.314954 1961.101 301.333359 78.314954 1961.101
+1654935003 1111811 42520.22055 301.333666 78.314873 1960.926 301.333666 78.314874 1961.093 301.333666 78.314874 1961.093
+1654935003 1111812 42520.22255 301.333973 78.314793 1960.851 301.333973 78.314793 1961.146 301.333973 78.314793 1961.146
+1654935003 1111813 42520.22455 301.334281 78.314713 1960.917 301.334280 78.314713 1961.189 301.334280 78.314713 1961.189
+1654935003 1111814 42520.22655 301.334589 78.314632 1960.855 301.334588 78.314632 1961.224 301.334588 78.314632 1961.224
+1654935003 1111815 42520.22855 301.334898 78.314551 1960.861 301.334897 78.314551 1961.260 301.334897 78.314551 1961.260
+1654935003 1111816 42520.23055 301.335206 78.314470 1960.915 301.335205 78.314470 1961.200 301.335205 78.314470 1961.200
+1654935003 1111817 42520.23255 301.335513 78.314389 1961.085 301.335513 78.314389 1961.315 301.335513 78.314389 1961.315
+1654935003 1111818 42520.23454 301.335821 78.314308 1961.016 301.335820 78.314308 1961.270 301.335820 78.314308 1961.270
+1654935003 1111819 42520.23654 301.336127 78.314227 1961.059 301.336127 78.314227 1961.281 301.336127 78.314227 1961.281
+1654935003 1111820 42520.23854 301.336433 78.314146 1961.099 301.336432 78.314146 1961.438 301.336432 78.314146 1961.438
+1654935003 1111821 42520.24054 301.336737 78.314065 1961.204 301.336737 78.314065 1961.504 301.336737 78.314065 1961.504
+1654935003 1111822 42520.24254 301.337044 78.313984 1961.151 301.337043 78.313984 1961.430 301.337043 78.313984 1961.430
+1654935003 1111823 42520.24454 301.337350 78.313903 1961.159 301.337350 78.313903 1961.378 301.337350 78.313903 1961.378
+1654935003 1111824 42520.24654 301.337657 78.313821 1961.224 301.337657 78.313821 1961.472 301.337657 78.313821 1961.472
+1654935003 1111825 42520.24854 301.337966 78.313740 1961.185 301.337965 78.313740 1961.404 301.337965 78.313740 1961.404
+1654935003 1111826 42520.25054 301.338274 78.313659 1961.265 301.338273 78.313659 1961.460 301.338273 78.313659 1961.460
+1654935003 1111827 42520.25254 301.338581 78.313578 1961.316 301.338581 78.313578 1961.489 301.338581 78.313578 1961.489
+1654935003 1111828 42520.25454 301.338889 78.313498 1961.256 301.338889 78.313498 1961.449 301.338889 78.313498 1961.449
+1654935003 1111829 42520.25654 301.339197 78.313418 1961.371 301.339196 78.313418 1961.517 301.339196 78.313418 1961.517
+1654935003 1111840 42520.27853 301.339274 78.313420 1961.241 301.339272 78.313420 1961.598 301.339272 78.313420 1961.598
+1654935003 1111841 42520.28053 301.338993 78.313504 1961.097 301.338992 78.313504 1961.442 301.338992 78.313504 1961.442
+1654935003 1111842 42520.28253 301.338713 78.313588 1961.151 301.338712 78.313588 1961.469 301.338712 78.313588 1961.469
+1654935003 1111843 42520.28453 301.338433 78.313671 1961.017 301.338432 78.313672 1961.324 301.338432 78.313672 1961.324
+1654935003 1111844 42520.28653 301.338151 78.313755 1960.998 301.338150 78.313755 1961.373 301.338150 78.313755 1961.373
+1654935003 1111845 42520.28853 301.337870 78.313838 1961.010 301.337869 78.313838 1961.412 301.337869 78.313838 1961.412
+1654935003 1111846 42520.29053 301.337587 78.313921 1961.021 301.337586 78.313922 1961.341 301.337586 78.313922 1961.341
+1654935003 1111847 42520.29253 301.337302 78.314004 1961.049 301.337301 78.314005 1961.293 301.337301 78.314005 1961.293
+1654935003 1111848 42520.29453 301.337017 78.314088 1961.085 301.337016 78.314088 1961.378 301.337016 78.314088 1961.378
+1654935003 1111849 42520.29653 301.336732 78.314171 1961.001 301.336731 78.314171 1961.323 301.336731 78.314171 1961.323
+1654935003 1111850 42520.29853 301.336448 78.314255 1960.957 301.336447 78.314255 1961.266 301.336447 78.314255 1961.266
+1654935003 1111851 42520.30053 301.336163 78.314338 1960.970 301.336162 78.314338 1961.337 301.336162 78.314338 1961.337
+1654935003 1111852 42520.30252 301.335881 78.314421 1960.970 301.335880 78.314421 1961.322 301.335880 78.314421 1961.322
+1654935003 1111853 42520.30452 301.335599 78.314504 1960.923 301.335599 78.314504 1961.228 301.335599 78.314504 1961.228
+1654935003 1111854 42520.30652 301.335320 78.314587 1960.820 301.335319 78.314587 1961.108 301.335319 78.314587 1961.108
+1654935003 1111855 42520.30852 301.335041 78.314670 1960.839 301.335040 78.314670 1961.135 301.335040 78.314670 1961.135
+1654935003 1111856 42520.31052 301.334761 78.314754 1960.765 301.334761 78.314754 1961.101 301.334761 78.314754 1961.101
+1654935003 1111857 42520.31252 301.334481 78.314837 1960.764 301.334480 78.314837 1961.123 301.334480 78.314837 1961.123
+1654935003 1111858 42520.31452 301.334200 78.314921 1960.757 301.334199 78.314921 1961.061 301.334199 78.314921 1961.061
+1654935003 1111859 42520.31652 301.333917 78.315004 1960.681 301.333916 78.315004 1961.016 301.333916 78.315004 1961.016
+1654935003 1111860 42520.31852 301.333634 78.315087 1960.738 301.333634 78.315087 1961.073 301.333634 78.315087 1961.073
+1654935003 1111861 42520.32052 301.333353 78.315170 1960.697 301.333352 78.315170 1960.991 301.333352 78.315170 1960.991
+1654935003 1111862 42520.32252 301.333072 78.315252 1960.656 301.333071 78.315253 1960.998 301.333071 78.315253 1960.998
+1654935003 1111863 42520.32452 301.332791 78.315335 1960.612 301.332790 78.315335 1960.919 301.332790 78.315335 1960.919
+1654935003 1111864 42520.32652 301.332509 78.315418 1960.589 301.332509 78.315418 1960.892 301.332509 78.315418 1960.892
+1654935003 1111865 42520.32852 301.332227 78.315501 1960.597 301.332227 78.315501 1960.935 301.332227 78.315501 1960.935
+1654935003 1111866 42520.33052 301.331945 78.315584 1960.502 301.331944 78.315584 1960.800 301.331944 78.315584 1960.800
+1654935003 1111867 42520.33252 301.331662 78.315667 1960.450 301.331662 78.315667 1960.859 301.331662 78.315667 1960.859
+1654935003 1111868 42520.33452 301.331381 78.315749 1960.500 301.331380 78.315749 1960.829 301.331380 78.315749 1960.829
+1654935003 1111869 42520.33651 301.331100 78.315832 1960.542 301.331099 78.315833 1960.891 301.331099 78.315833 1960.891
+1654935003 1111870 42520.33851 301.330820 78.315916 1960.545 301.330819 78.315916 1960.825 301.330819 78.315916 1960.825
+1654935003 1111871 42520.34051 301.330541 78.315999 1960.403 301.330541 78.315999 1960.690 301.330541 78.315999 1960.690
+1654935003 1111872 42520.34251 301.330263 78.316082 1960.343 301.330262 78.316082 1960.680 301.330262 78.316082 1960.680
+1654935003 1111873 42520.34451 301.329984 78.316164 1960.332 301.329984 78.316164 1960.661 301.329984 78.316164 1960.661
+1654935003 1111874 42520.34651 301.329706 78.316247 1960.332 301.329705 78.316247 1960.662 301.329705 78.316247 1960.662
+1654935003 1111875 42520.34851 301.329427 78.316330 1960.284 301.329426 78.316330 1960.648 301.329426 78.316330 1960.648
+1654935003 1111876 42520.35051 301.329147 78.316413 1960.279 301.329147 78.316413 1960.604 301.329147 78.316413 1960.604
+1654935003 1111877 42520.35251 301.328867 78.316496 1960.160 301.328867 78.316496 1960.513 301.328867 78.316496 1960.513
+1654935003 1111878 42520.35451 301.328585 78.316578 1960.202 301.328585 78.316578 1960.497 301.328585 78.316578 1960.497
+1654935003 1111879 42520.35651 301.328302 78.316661 1960.313 301.328301 78.316661 1960.659 301.328301 78.316661 1960.659
+1654935003 1111880 42520.35851 301.328018 78.316744 1960.255 301.328018 78.316744 1960.630 301.328018 78.316744 1960.630
+1654935003 1111881 42520.36051 301.327734 78.316827 1960.128 301.327734 78.316827 1960.456 301.327734 78.316827 1960.456
+1654935003 1111882 42520.36251 301.327452 78.316909 1960.106 301.327452 78.316909 1960.460 301.327452 78.316909 1960.460
+1654935003 1111883 42520.36451 301.327171 78.316991 1960.057 301.327171 78.316991 1960.347 301.327171 78.316991 1960.347
+1654935003 1111884 42520.36651 301.326893 78.317074 1960.011 301.326893 78.317074 1960.337 301.326893 78.317074 1960.337
+1654935003 1111885 42520.36851 301.326617 78.317157 1960.040 301.326617 78.317157 1960.362 301.326617 78.317157 1960.362
+1654935003 1111886 42520.37051 301.326340 78.317240 1959.931 301.326340 78.317240 1960.252 301.326340 78.317240 1960.252
+1654935003 1111887 42520.37250 301.326062 78.317324 1959.990 301.326061 78.317324 1960.276 301.326061 78.317324 1960.276
+1654935003 1111888 42520.37450 301.325783 78.317408 1959.941 301.325783 78.317408 1960.228 301.325783 78.317408 1960.228
+1654935003 1111889 42520.37650 301.325504 78.317491 1959.915 301.325503 78.317490 1960.215 301.325503 78.317490 1960.215
+1654935003 1111890 42520.37850 301.325224 78.317573 1959.864 301.325224 78.317573 1960.199 301.325224 78.317573 1960.199
+1654935003 1111891 42520.38050 301.324943 78.317656 1959.966 301.324943 78.317655 1960.250 301.324943 78.317655 1960.250
+1654935003 1111892 42520.38250 301.324662 78.317738 1959.830 301.324661 78.317738 1960.191 301.324661 78.317738 1960.191
+1654935003 1111893 42520.38450 301.324380 78.317820 1959.806 301.324380 78.317820 1960.164 301.324380 78.317820 1960.164
+1654935003 1111894 42520.38650 301.324097 78.317902 1959.738 301.324097 78.317902 1960.079 301.324097 78.317902 1960.079
+1654935003 1111895 42520.38850 301.323814 78.317985 1959.731 301.323814 78.317985 1960.109 301.323814 78.317985 1960.109
+1654935003 1111896 42520.39050 301.323533 78.318067 1959.695 301.323532 78.318067 1960.030 301.323532 78.318067 1960.030
+1654935003 1111897 42520.39250 301.323251 78.318151 1959.739 301.323251 78.318150 1960.030 301.323251 78.318150 1960.030
+1654935003 1111898 42520.39450 301.322972 78.318234 1959.634 301.322972 78.318234 1959.949 301.322972 78.318234 1959.949
+1654935003 1111899 42520.39650 301.322695 78.318318 1959.663 301.322695 78.318318 1959.969 301.322695 78.318318 1959.969
+1654935003 1111900 42520.39850 301.322418 78.318401 1959.524 301.322418 78.318401 1959.974 301.322418 78.318401 1959.974
+1654935003 1111901 42520.40050 301.322140 78.318485 1959.627 301.322140 78.318485 1959.968 301.322140 78.318485 1959.968
+1654935003 1111902 42520.40250 301.321862 78.318567 1959.519 301.321862 78.318567 1959.844 301.321862 78.318567 1959.844
+1654935003 1111903 42520.40450 301.321582 78.318650 1959.605 301.321582 78.318650 1959.894 301.321582 78.318650 1959.894
+1654935003 1111904 42520.40649 301.321299 78.318732 1959.597 301.321300 78.318732 1959.881 301.321300 78.318732 1959.881
+1654935003 1111905 42520.40849 301.321016 78.318815 1959.557 301.321016 78.318814 1959.935 301.321016 78.318814 1959.935
+1654935003 1111906 42520.41049 301.320733 78.318897 1959.557 301.320733 78.318897 1959.843 301.320733 78.318897 1959.843
+1654935003 1111907 42520.41249 301.320448 78.318981 1959.474 301.320448 78.318981 1959.777 301.320448 78.318981 1959.777
+1654935003 1111908 42520.41449 301.320165 78.319064 1959.406 301.320165 78.319064 1959.728 301.320165 78.319064 1959.728
+1654935003 1111909 42520.41649 301.319883 78.319148 1959.408 301.319883 78.319148 1959.697 301.319883 78.319148 1959.697
+1654935003 1111910 42520.41849 301.319602 78.319231 1959.468 301.319602 78.319231 1959.821 301.319602 78.319231 1959.821
+1654935003 1111911 42520.42049 301.319322 78.319314 1959.419 301.319322 78.319314 1959.721 301.319322 78.319314 1959.721
+1654935003 1111912 42520.42249 301.319045 78.319397 1959.345 301.319046 78.319397 1959.684 301.319046 78.319397 1959.684
+1654935003 1111913 42520.42449 301.318767 78.319480 1959.300 301.318768 78.319480 1959.616 301.318768 78.319480 1959.616
+1654935003 1111914 42520.42649 301.318489 78.319563 1959.325 301.318489 78.319563 1959.631 301.318489 78.319563 1959.631
+1654935003 1111915 42520.42849 301.318208 78.319647 1959.239 301.318209 78.319647 1959.539 301.318209 78.319647 1959.539
+1654935003 1111916 42520.43049 301.317926 78.319730 1959.218 301.317927 78.319730 1959.547 301.317927 78.319730 1959.547
+1654935003 1111917 42520.43249 301.317642 78.319814 1959.253 301.317642 78.319814 1959.532 301.317642 78.319814 1959.532
+1654935003 1111918 42520.43449 301.317357 78.319897 1959.153 301.317357 78.319897 1959.483 301.317357 78.319897 1959.483
+1654935003 1111919 42520.43649 301.317073 78.319980 1959.205 301.317073 78.319980 1959.508 301.317073 78.319980 1959.508
+1654935003 1111920 42520.43849 301.316789 78.320063 1959.197 301.316790 78.320063 1959.535 301.316790 78.320063 1959.535
+1654935003 1111921 42520.44048 301.316507 78.320146 1959.136 301.316508 78.320146 1959.446 301.316508 78.320146 1959.446
+1654935003 1111922 42520.44248 301.316228 78.320229 1959.079 301.316228 78.320229 1959.415 301.316228 78.320229 1959.415
+1654935003 1111923 42520.44448 301.315947 78.320313 1959.071 301.315948 78.320312 1959.409 301.315948 78.320312 1959.409
+1654935003 1111924 42520.44648 301.315666 78.320396 1958.978 301.315666 78.320396 1959.265 301.315666 78.320396 1959.265
+1654935003 1111925 42520.44848 301.315383 78.320479 1959.003 301.315384 78.320479 1959.323 301.315384 78.320479 1959.323
+1654935003 1111926 42520.45048 301.315101 78.320563 1959.102 301.315101 78.320562 1959.393 301.315101 78.320562 1959.393
+1654935003 1111927 42520.45248 301.314816 78.320647 1959.067 301.314817 78.320646 1959.382 301.314817 78.320646 1959.382
+1654935003 1111928 42520.45448 301.314533 78.320731 1958.965 301.314533 78.320730 1959.251 301.314533 78.320730 1959.251
+1654935003 1111929 42520.45648 301.314250 78.320815 1959.048 301.314251 78.320815 1959.331 301.314251 78.320815 1959.331
+1654935003 1111940 42520.47847 301.314328 78.320820 1958.972 301.314329 78.320820 1959.288 301.314329 78.320820 1959.288
+1654935003 1111941 42520.48047 301.314636 78.320739 1958.969 301.314637 78.320738 1959.252 301.314637 78.320738 1959.252
+1654935003 1111942 42520.48247 301.314947 78.320657 1959.045 301.314947 78.320657 1959.331 301.314947 78.320657 1959.331
+1654935003 1111943 42520.48447 301.315257 78.320575 1959.015 301.315257 78.320575 1959.291 301.315257 78.320575 1959.291
+1654935003 1111944 42520.48647 301.315567 78.320494 1958.961 301.315567 78.320494 1959.194 301.315567 78.320494 1959.194
+1654935003 1111945 42520.48847 301.315876 78.320413 1958.928 301.315877 78.320413 1959.274 301.315877 78.320413 1959.274
+1654935003 1111946 42520.49047 301.316184 78.320332 1958.995 301.316185 78.320332 1959.250 301.316185 78.320332 1959.250
+1654935003 1111947 42520.49247 301.316489 78.320251 1959.055 301.316490 78.320251 1959.382 301.316490 78.320251 1959.382
+1654935003 1111948 42520.49447 301.316795 78.320171 1959.055 301.316795 78.320170 1959.341 301.316795 78.320170 1959.341
+1654935003 1111949 42520.49647 301.317100 78.320090 1959.102 301.317101 78.320089 1959.399 301.317101 78.320089 1959.399
+1654935003 1111950 42520.49847 301.317407 78.320009 1959.087 301.317408 78.320008 1959.382 301.317408 78.320008 1959.382
+1654935003 1111951 42520.50047 301.317716 78.319927 1959.126 301.317716 78.319927 1959.412 301.317716 78.319927 1959.412
+1654935003 1111952 42520.50247 301.318027 78.319846 1959.211 301.318027 78.319846 1959.521 301.318027 78.319846 1959.521
+1654935003 1111953 42520.50447 301.318336 78.319765 1959.249 301.318337 78.319765 1959.537 301.318337 78.319765 1959.537
+1654935003 1111954 42520.50647 301.318644 78.319683 1959.208 301.318645 78.319683 1959.545 301.318645 78.319683 1959.545
+1654935003 1111955 42520.50846 301.318952 78.319602 1959.310 301.318952 78.319602 1959.607 301.318952 78.319602 1959.607
+1654935003 1111956 42520.51046 301.319258 78.319521 1959.263 301.319259 78.319521 1959.549 301.319259 78.319521 1959.549
+1654935003 1111957 42520.51246 301.319564 78.319440 1959.284 301.319564 78.319440 1959.613 301.319564 78.319440 1959.613
+1654935003 1111958 42520.51446 301.319870 78.319360 1959.349 301.319870 78.319360 1959.660 301.319870 78.319360 1959.660
+1654935003 1111959 42520.51646 301.320177 78.319280 1959.324 301.320177 78.319280 1959.665 301.320177 78.319280 1959.665
+1654935003 1111960 42520.51846 301.320484 78.319200 1959.389 301.320485 78.319199 1959.720 301.320485 78.319199 1959.720
+1654935003 1111961 42520.52046 301.320793 78.319119 1959.433 301.320793 78.319119 1959.728 301.320793 78.319119 1959.728
+1654935003 1111962 42520.52246 301.321103 78.319037 1959.425 301.321103 78.319037 1959.733 301.321103 78.319037 1959.733
+1654935003 1111963 42520.52446 301.321412 78.318955 1959.420 301.321412 78.318955 1959.744 301.321412 78.318955 1959.744
+1654935003 1111964 42520.52646 301.321719 78.318874 1959.438 301.321719 78.318874 1959.753 301.321719 78.318874 1959.753
+1654935003 1111965 42520.52846 301.322025 78.318793 1959.526 301.322025 78.318793 1959.827 301.322025 78.318793 1959.827
+1654935003 1111966 42520.53046 301.322331 78.318712 1959.555 301.322331 78.318712 1959.889 301.322331 78.318712 1959.889
+1654935003 1111967 42520.53246 301.322635 78.318632 1959.595 301.322635 78.318632 1959.901 301.322635 78.318632 1959.901
+1654935003 1111968 42520.53446 301.322939 78.318552 1959.546 301.322939 78.318552 1959.873 301.322939 78.318552 1959.873
+1654935003 1111969 42520.53646 301.323243 78.318472 1959.569 301.323243 78.318472 1959.861 301.323243 78.318472 1959.861
+1654935003 1111970 42520.53846 301.323547 78.318392 1959.593 301.323547 78.318392 1959.893 301.323547 78.318392 1959.893
+1654935003 1111971 42520.54046 301.323853 78.318312 1959.645 301.323853 78.318311 1959.977 301.323853 78.318311 1959.977
+1654935003 1111972 42520.54246 301.324162 78.318231 1959.654 301.324162 78.318231 1959.974 301.324162 78.318231 1959.974
+1654935003 1111973 42520.54445 301.324470 78.318150 1959.659 301.324470 78.318150 1959.997 301.324470 78.318150 1959.997
+1654935003 1111974 42520.54645 301.324779 78.318069 1959.767 301.324779 78.318069 1960.082 301.324779 78.318069 1960.082
+1654935003 1111975 42520.54845 301.325086 78.317989 1959.806 301.325086 78.317989 1960.137 301.325086 78.317989 1960.137
+1654935003 1111976 42520.55045 301.325392 78.317908 1959.872 301.325391 78.317908 1960.221 301.325391 78.317908 1960.221
+1654935003 1111977 42520.55245 301.325694 78.317828 1959.811 301.325694 78.317828 1960.156 301.325694 78.317828 1960.156
+1654935003 1111978 42520.55445 301.325997 78.317747 1959.862 301.325997 78.317747 1960.133 301.325997 78.317747 1960.133
+1654935003 1111979 42520.55645 301.326300 78.317667 1959.818 301.326300 78.317667 1960.143 301.326300 78.317667 1960.143
+1654935003 1111980 42520.55845 301.326604 78.317586 1959.914 301.326604 78.317586 1960.242 301.326604 78.317586 1960.242
+1654935003 1111981 42520.56045 301.326910 78.317506 1959.928 301.326910 78.317506 1960.260 301.326910 78.317506 1960.260
+1654935003 1111982 42520.56245 301.327218 78.317425 1959.963 301.327218 78.317425 1960.299 301.327218 78.317425 1960.299
+1654935003 1111983 42520.56445 301.327526 78.317344 1960.014 301.327526 78.317344 1960.363 301.327526 78.317344 1960.363
+1654935003 1111984 42520.56645 301.327834 78.317264 1960.033 301.327834 78.317264 1960.369 301.327834 78.317264 1960.369
+1654935003 1111985 42520.56845 301.328140 78.317184 1960.033 301.328140 78.317184 1960.355 301.328140 78.317184 1960.355
+1654935003 1111986 42520.57045 301.328446 78.317103 1960.107 301.328446 78.317103 1960.457 301.328446 78.317103 1960.457
+1654935003 1111987 42520.57245 301.328749 78.317024 1960.098 301.328749 78.317024 1960.437 301.328749 78.317024 1960.437
+1654935003 1111988 42520.57445 301.329053 78.316944 1960.014 301.329053 78.316944 1960.330 301.329053 78.316944 1960.330
+1654935003 1111989 42520.57645 301.329359 78.316864 1960.090 301.329358 78.316864 1960.401 301.329358 78.316864 1960.401
+1654935003 1111990 42520.57844 301.329664 78.316784 1960.187 301.329664 78.316784 1960.463 301.329664 78.316784 1960.463
+1654935003 1111991 42520.58044 301.329969 78.316703 1960.175 301.329969 78.316703 1960.504 301.329969 78.316703 1960.504
+1654935003 1111992 42520.58244 301.330275 78.316621 1960.223 301.330275 78.316621 1960.571 301.330275 78.316621 1960.571
+1654935003 1111993 42520.58444 301.330582 78.316540 1960.265 301.330581 78.316540 1960.599 301.330581 78.316540 1960.599
+1654935003 1111994 42520.58644 301.330888 78.316459 1960.277 301.330888 78.316459 1960.618 301.330888 78.316459 1960.618
+1654935003 1111995 42520.58844 301.331195 78.316378 1960.389 301.331194 78.316378 1960.699 301.331194 78.316378 1960.699
+1654935003 1111996 42520.59044 301.331501 78.316297 1960.344 301.331501 78.316297 1960.667 301.331501 78.316297 1960.667
+1654935003 1111997 42520.59244 301.331807 78.316217 1960.362 301.331806 78.316217 1960.724 301.331806 78.316217 1960.724
+1654935003 1111998 42520.59444 301.332112 78.316138 1960.403 301.332111 78.316138 1960.768 301.332111 78.316138 1960.768
+1654935003 1111999 42520.59644 301.332418 78.316058 1960.426 301.332417 78.316058 1960.783 301.332417 78.316058 1960.783
+1654935003 1112000 42520.59844 301.332724 78.315978 1960.470 301.332723 78.315978 1960.806 301.332723 78.315978 1960.806
+1654935003 1112001 42520.60044 301.333030 78.315897 1960.603 301.333030 78.315897 1960.903 301.333030 78.315897 1960.903
+1654935003 1112002 42520.60244 301.333339 78.315816 1960.497 301.333338 78.315816 1960.874 301.333338 78.315816 1960.874
+1654935003 1112003 42520.60444 301.333647 78.315735 1960.547 301.333646 78.315735 1960.884 301.333646 78.315735 1960.884
+1654935003 1112004 42520.60644 301.333953 78.315654 1960.571 301.333952 78.315654 1960.922 301.333952 78.315654 1960.922
+1654935003 1112005 42520.60844 301.334258 78.315573 1960.602 301.334257 78.315573 1960.943 301.334257 78.315573 1960.943
+1654935003 1112006 42520.61044 301.334561 78.315493 1960.699 301.334561 78.315493 1960.973 301.334561 78.315493 1960.973
+1654935003 1112007 42520.61243 301.334864 78.315412 1960.726 301.334864 78.315412 1961.037 301.334864 78.315412 1961.037
+1654935003 1112008 42520.61443 301.335169 78.315332 1960.658 301.335168 78.315332 1961.008 301.335168 78.315332 1961.008
+1654935003 1112009 42520.61643 301.335475 78.315251 1960.669 301.335474 78.315251 1960.990 301.335474 78.315251 1960.990
+1654935003 1112010 42520.61843 301.335780 78.315171 1960.825 301.335780 78.315171 1961.154 301.335780 78.315171 1961.154
+1654935003 1112011 42520.62043 301.336089 78.315090 1960.782 301.336088 78.315091 1961.127 301.336088 78.315091 1961.127
+1654935003 1112012 42520.62243 301.336401 78.315010 1960.819 301.336400 78.315010 1961.204 301.336400 78.315010 1961.204
+1654935003 1112013 42520.62443 301.336711 78.314929 1960.892 301.336710 78.314929 1961.204 301.336710 78.314929 1961.204
+1654935003 1112014 42520.62643 301.337019 78.314847 1960.881 301.337018 78.314847 1961.242 301.337018 78.314847 1961.242
+1654935003 1112015 42520.62843 301.337327 78.314766 1960.904 301.337326 78.314766 1961.238 301.337326 78.314766 1961.238
+1654935003 1112016 42520.63043 301.337633 78.314685 1960.957 301.337632 78.314685 1961.223 301.337632 78.314685 1961.223
+1654935003 1112017 42520.63243 301.337936 78.314604 1960.878 301.337935 78.314604 1961.179 301.337935 78.314604 1961.179
+1654935003 1112018 42520.63443 301.338240 78.314523 1960.990 301.338239 78.314523 1961.295 301.338239 78.314523 1961.295
+1654935003 1112019 42520.63643 301.338546 78.314443 1961.052 301.338545 78.314443 1961.370 301.338545 78.314443 1961.370
+1654935003 1112020 42520.63843 301.338853 78.314362 1961.031 301.338852 78.314362 1961.338 301.338852 78.314362 1961.338
+1654935003 1112021 42520.64043 301.339161 78.314281 1961.082 301.339160 78.314281 1961.406 301.339160 78.314281 1961.406
+1654935003 1112022 42520.64243 301.339471 78.314200 1961.080 301.339470 78.314200 1961.442 301.339470 78.314200 1961.442
+1654935003 1112023 42520.64443 301.339781 78.314119 1961.199 301.339780 78.314119 1961.520 301.339780 78.314119 1961.520
+1654935003 1112024 42520.64642 301.340092 78.314037 1961.193 301.340092 78.314037 1961.477 301.340092 78.314037 1961.477
+1654935003 1112025 42520.64842 301.340403 78.313956 1961.295 301.340402 78.313956 1961.610 301.340402 78.313956 1961.610
+1654935003 1112026 42520.65042 301.340713 78.313875 1961.265 301.340712 78.313875 1961.567 301.340712 78.313875 1961.567
+1654935003 1112027 42520.65242 301.341020 78.313794 1961.310 301.341019 78.313795 1961.651 301.341019 78.313795 1961.651
+1654935003 1112028 42520.65442 301.341328 78.313714 1961.303 301.341327 78.313714 1961.668 301.341327 78.313714 1961.668
+1654935003 1112029 42520.65642 301.341634 78.313632 1961.382 301.341633 78.313633 1961.664 301.341633 78.313633 1961.664
+1654935003 1112030 42520.65842 301.341938 78.313551 1961.835 301.341938 78.313551 1962.047 301.341938 78.313551 1962.047
+1654935003 1112039 42520.67642 301.341996 78.313555 1961.614 301.341995 78.313555 1961.932 301.341995 78.313555 1961.932
+1654935003 1112040 42520.67842 301.341715 78.313638 1961.273 301.341714 78.313639 1961.577 301.341714 78.313639 1961.577
+1654935003 1112041 42520.68041 301.341433 78.313722 1961.218 301.341432 78.313722 1961.534 301.341432 78.313722 1961.534
+1654935003 1112042 42520.68241 301.341154 78.313805 1961.164 301.341153 78.313805 1961.515 301.341153 78.313805 1961.515
+1654935003 1112043 42520.68441 301.340873 78.313888 1961.133 301.340872 78.313888 1961.418 301.340872 78.313888 1961.418
+1654935003 1112044 42520.68641 301.340589 78.313970 1961.149 301.340588 78.313970 1961.500 301.340588 78.313970 1961.500
+1654935003 1112045 42520.68841 301.340305 78.314053 1961.161 301.340304 78.314053 1961.450 301.340304 78.314053 1961.450
+1654935003 1112046 42520.69041 301.340023 78.314136 1961.124 301.340022 78.314136 1961.420 301.340022 78.314136 1961.420
+1654935003 1112047 42520.69241 301.339738 78.314220 1961.149 301.339737 78.314220 1961.476 301.339737 78.314220 1961.476
+1654935003 1112048 42520.69441 301.339456 78.314304 1961.089 301.339455 78.314304 1961.403 301.339455 78.314304 1961.403
+1654935003 1112049 42520.69641 301.339177 78.314388 1961.032 301.339176 78.314388 1961.328 301.339176 78.314388 1961.328
+1654935003 1112050 42520.69841 301.338898 78.314472 1960.971 301.338897 78.314472 1961.322 301.338897 78.314472 1961.322
+1654935003 1112051 42520.70041 301.338619 78.314555 1960.984 301.338618 78.314555 1961.281 301.338618 78.314555 1961.281
+1654935003 1112052 42520.70241 301.338341 78.314638 1960.849 301.338340 78.314638 1961.192 301.338340 78.314638 1961.192
+1654935003 1112053 42520.70441 301.338062 78.314721 1960.874 301.338061 78.314721 1961.178 301.338061 78.314721 1961.178
+1654935003 1112054 42520.70641 301.337781 78.314804 1960.863 301.337781 78.314804 1961.180 301.337781 78.314804 1961.180
+1654935003 1112055 42520.70841 301.337500 78.314887 1960.780 301.337499 78.314887 1961.110 301.337499 78.314887 1961.110
+1654935003 1112056 42520.71041 301.337216 78.314970 1960.833 301.337215 78.314970 1961.147 301.337215 78.314970 1961.147
+1654935003 1112057 42520.71241 301.336930 78.315054 1960.759 301.336930 78.315054 1961.101 301.336930 78.315054 1961.101
+1654935003 1112058 42520.71441 301.336646 78.315137 1960.767 301.336646 78.315137 1961.077 301.336646 78.315137 1961.077
+1654935003 1112059 42520.71640 301.336364 78.315220 1960.746 301.336364 78.315220 1961.028 301.336364 78.315220 1961.028
+1654935003 1112060 42520.71840 301.336084 78.315303 1960.724 301.336083 78.315303 1961.014 301.336083 78.315303 1961.014
+1654935003 1112061 42520.72040 301.335807 78.315386 1960.617 301.335806 78.315386 1960.959 301.335806 78.315386 1960.959
+1654935003 1112062 42520.72240 301.335531 78.315470 1960.631 301.335530 78.315470 1960.931 301.335530 78.315470 1960.931
+1654935003 1112063 42520.72440 301.335254 78.315553 1960.554 301.335253 78.315553 1960.849 301.335253 78.315553 1960.849
+1654935003 1112064 42520.72640 301.334976 78.315636 1960.578 301.334975 78.315636 1960.875 301.334975 78.315636 1960.875
+1654935003 1112065 42520.72840 301.334696 78.315719 1960.660 301.334695 78.315719 1960.993 301.334695 78.315719 1960.993
+1654935003 1112066 42520.73040 301.334414 78.315802 1960.535 301.334413 78.315802 1960.857 301.334413 78.315802 1960.857
+1654935003 1112067 42520.73240 301.334129 78.315885 1960.468 301.334129 78.315885 1960.819 301.334129 78.315885 1960.819
+1654935003 1112068 42520.73440 301.333846 78.315968 1960.537 301.333845 78.315968 1960.864 301.333845 78.315968 1960.864
+1654935003 1112069 42520.73640 301.333564 78.316051 1960.496 301.333563 78.316051 1960.828 301.333563 78.316051 1960.828
+1654935003 1112070 42520.73840 301.333283 78.316134 1960.405 301.333282 78.316134 1960.724 301.333282 78.316134 1960.724
+1654935003 1112071 42520.74040 301.333003 78.316217 1960.351 301.333002 78.316217 1960.674 301.333002 78.316217 1960.674
+1654935003 1112072 42520.74240 301.332725 78.316299 1960.351 301.332724 78.316299 1960.677 301.332724 78.316299 1960.677
+1654935003 1112073 42520.74440 301.332447 78.316382 1960.289 301.332446 78.316382 1960.568 301.332446 78.316382 1960.568
+1654935003 1112074 42520.74640 301.332169 78.316465 1960.322 301.332168 78.316465 1960.651 301.332168 78.316465 1960.651
+1654935003 1112075 42520.74840 301.331891 78.316547 1960.332 301.331891 78.316547 1960.630 301.331891 78.316547 1960.630
+1654935003 1112076 42520.75039 301.331614 78.316630 1960.266 301.331614 78.316630 1960.578 301.331614 78.316630 1960.578
+1654935003 1112077 42520.75239 301.331336 78.316714 1960.177 301.331336 78.316714 1960.526 301.331336 78.316714 1960.526
+1654935003 1112078 42520.75439 301.331058 78.316797 1960.182 301.331057 78.316797 1960.457 301.331057 78.316797 1960.457
+1654935003 1112079 42520.75639 301.330777 78.316880 1960.171 301.330777 78.316880 1960.485 301.330777 78.316880 1960.485
+1654935003 1112080 42520.75839 301.330497 78.316962 1960.100 301.330497 78.316962 1960.404 301.330497 78.316962 1960.404
+1654935003 1112081 42520.76039 301.330217 78.317044 1960.116 301.330217 78.317044 1960.448 301.330217 78.317044 1960.448
+1654935003 1112082 42520.76239 301.329938 78.317127 1960.133 301.329937 78.317127 1960.457 301.329937 78.317127 1960.457
+1654935003 1112083 42520.76439 301.329658 78.317209 1960.017 301.329658 78.317209 1960.326 301.329658 78.317209 1960.326
+1654935003 1112084 42520.76639 301.329380 78.317292 1960.015 301.329379 78.317292 1960.298 301.329379 78.317292 1960.298
+1654935003 1112085 42520.76839 301.329102 78.317375 1959.967 301.329102 78.317375 1960.306 301.329102 78.317375 1960.306
+1654935003 1112086 42520.77039 301.328821 78.317458 1959.943 301.328821 78.317458 1960.270 301.328821 78.317458 1960.270
+1654935003 1112087 42520.77239 301.328540 78.317542 1959.987 301.328540 78.317542 1960.295 301.328540 78.317542 1960.295
+1654935003 1112088 42520.77439 301.328259 78.317625 1960.014 301.328259 78.317625 1960.311 301.328259 78.317625 1960.311
+1654935003 1112089 42520.77639 301.327979 78.317708 1960.027 301.327979 78.317708 1960.349 301.327979 78.317708 1960.349
+1654935003 1112090 42520.77839 301.327699 78.317791 1959.909 301.327699 78.317791 1960.202 301.327699 78.317791 1960.202
+1654935003 1112091 42520.78039 301.327420 78.317874 1959.880 301.327420 78.317874 1960.176 301.327420 78.317874 1960.176
+1654935003 1112092 42520.78239 301.327141 78.317957 1959.856 301.327141 78.317957 1960.196 301.327141 78.317957 1960.196
+1654935003 1112093 42520.78438 301.326862 78.318040 1959.768 301.326862 78.318040 1960.110 301.326862 78.318040 1960.110
+1654935003 1112094 42520.78638 301.326580 78.318123 1959.717 301.326580 78.318123 1960.068 301.326580 78.318123 1960.068
+1654935003 1112095 42520.78838 301.326299 78.318205 1959.693 301.326299 78.318205 1960.002 301.326299 78.318205 1960.002
+1654935003 1112096 42520.79038 301.326019 78.318288 1959.717 301.326019 78.318288 1960.020 301.326019 78.318288 1960.020
+1654935003 1112097 42520.79238 301.325739 78.318371 1959.681 301.325739 78.318371 1960.003 301.325739 78.318371 1960.003
+1654935003 1112098 42520.79438 301.325461 78.318454 1959.617 301.325461 78.318454 1959.941 301.325461 78.318454 1959.941
+1654935003 1112099 42520.79638 301.325184 78.318537 1959.548 301.325184 78.318537 1959.881 301.325184 78.318537 1959.881
+1654935003 1112100 42520.79838 301.324906 78.318620 1959.606 301.324906 78.318620 1959.885 301.324906 78.318620 1959.885
+1654935003 1112101 42520.80038 301.324627 78.318703 1959.618 301.324627 78.318703 1959.898 301.324627 78.318703 1959.898
+1654935003 1112102 42520.80238 301.324347 78.318786 1959.586 301.324347 78.318786 1959.912 301.324347 78.318786 1959.912
+1654935003 1112103 42520.80438 301.324066 78.318869 1959.554 301.324066 78.318868 1959.872 301.324066 78.318868 1959.872
+1654935003 1112104 42520.80638 301.323786 78.318951 1959.570 301.323786 78.318951 1959.840 301.323786 78.318951 1959.840
+1654935003 1112105 42520.80838 301.323506 78.319034 1959.525 301.323506 78.319034 1959.813 301.323506 78.319034 1959.813
+1654935003 1112106 42520.81038 301.323226 78.319117 1959.441 301.323226 78.319117 1959.765 301.323226 78.319117 1959.765
+1654935003 1112107 42520.81238 301.322946 78.319200 1959.459 301.322946 78.319200 1959.772 301.322946 78.319200 1959.772
+1654935003 1112108 42520.81438 301.322666 78.319283 1959.469 301.322666 78.319283 1959.750 301.322666 78.319283 1959.750
+1654935003 1112109 42520.81638 301.322385 78.319367 1959.520 301.322385 78.319366 1959.792 301.322385 78.319366 1959.792
+1654935003 1112110 42520.81837 301.322105 78.319450 1959.409 301.322105 78.319450 1959.706 301.322105 78.319450 1959.706
+1654935003 1112111 42520.82037 301.321825 78.319533 1959.365 301.321825 78.319533 1959.669 301.321825 78.319533 1959.669
+1654935003 1112112 42520.82237 301.321547 78.319616 1959.297 301.321547 78.319616 1959.660 301.321547 78.319616 1959.660
+1654935003 1112113 42520.82437 301.321268 78.319700 1959.255 301.321268 78.319700 1959.557 301.321268 78.319700 1959.557
+1654935003 1112114 42520.82637 301.320988 78.319783 1959.256 301.320988 78.319783 1959.569 301.320988 78.319783 1959.569
+1654935003 1112115 42520.82837 301.320706 78.319867 1959.222 301.320707 78.319867 1959.508 301.320707 78.319867 1959.508
+1654935003 1112116 42520.83037 301.320423 78.319950 1959.209 301.320424 78.319950 1959.519 301.320424 78.319950 1959.519
+1654935003 1112117 42520.83237 301.320138 78.320033 1959.260 301.320139 78.320033 1959.533 301.320139 78.320033 1959.533
+1654935003 1112118 42520.83437 301.319855 78.320116 1959.227 301.319855 78.320116 1959.524 301.319855 78.320116 1959.524
+1654935003 1112119 42520.83637 301.319574 78.320199 1959.188 301.319574 78.320199 1959.516 301.319574 78.320199 1959.516
+1654935003 1112120 42520.83837 301.319294 78.320283 1959.102 301.319295 78.320283 1959.375 301.319295 78.320283 1959.375
+1654935003 1112121 42520.84037 301.319015 78.320366 1959.075 301.319015 78.320366 1959.342 301.319015 78.320366 1959.342
+1654935003 1112122 42520.84237 301.318735 78.320451 1959.037 301.318735 78.320450 1959.329 301.318735 78.320450 1959.329
+1654935003 1112123 42520.84437 301.318454 78.320535 1959.110 301.318454 78.320534 1959.367 301.318454 78.320534 1959.367
+1654935003 1112124 42520.84637 301.318172 78.320618 1958.953 301.318172 78.320618 1959.213 301.318172 78.320618 1959.213
+1654935003 1112125 42520.84837 301.317890 78.320702 1958.997 301.317890 78.320701 1959.240 301.317890 78.320701 1959.240
+1654935003 1112126 42520.85037 301.317607 78.320785 1958.889 301.317608 78.320785 1959.154 301.317608 78.320785 1959.154
+1654935003 1112127 42520.85236 301.317326 78.320869 1958.876 301.317326 78.320869 1959.190 301.317326 78.320869 1959.190
+1654935003 1112128 42520.85436 301.317043 78.320953 1958.907 301.317044 78.320952 1959.209 301.317044 78.320952 1959.209
+1654935003 1112129 42520.85636 301.316759 78.321036 1959.081 301.316760 78.321036 1959.370 301.316760 78.321036 1959.370
+1654935003 1112139 42520.87636 301.316543 78.321121 1959.666 301.316543 78.321121 1959.850 301.316543 78.321121 1959.850
+1654935003 1112140 42520.87836 301.316849 78.321040 1958.975 301.316850 78.321040 1959.229 301.316850 78.321040 1959.229
+1654935003 1112141 42520.88036 301.317158 78.320959 1958.911 301.317158 78.320958 1959.191 301.317158 78.320958 1959.191
+1654935003 1112142 42520.88236 301.317467 78.320877 1958.852 301.317468 78.320877 1959.113 301.317468 78.320877 1959.113
+1654935003 1112143 42520.88436 301.317776 78.320796 1958.891 301.317777 78.320796 1959.136 301.317777 78.320796 1959.136
+1654935003 1112144 42520.88636 301.318084 78.320715 1958.966 301.318084 78.320715 1959.269 301.318084 78.320715 1959.269
+1654935003 1112145 42520.88835 301.318390 78.320634 1958.976 301.318390 78.320634 1959.244 301.318390 78.320634 1959.244
+1654935003 1112146 42520.89035 301.318696 78.320553 1959.050 301.318697 78.320553 1959.318 301.318697 78.320553 1959.318
+1654935003 1112147 42520.89235 301.319003 78.320472 1959.027 301.319003 78.320472 1959.338 301.319003 78.320472 1959.338
+1654935003 1112148 42520.89435 301.319310 78.320391 1959.081 301.319310 78.320391 1959.350 301.319310 78.320391 1959.350
+1654935003 1112149 42520.89635 301.319618 78.320310 1959.141 301.319619 78.320310 1959.401 301.319619 78.320310 1959.401
+1654935003 1112150 42520.89835 301.319927 78.320230 1959.131 301.319927 78.320230 1959.439 301.319927 78.320230 1959.439
+1654935003 1112151 42520.90035 301.320235 78.320149 1959.206 301.320236 78.320149 1959.482 301.320236 78.320149 1959.482
+1654935003 1112152 42520.90235 301.320543 78.320069 1959.176 301.320543 78.320069 1959.459 301.320543 78.320069 1959.459
diff --git a/test/data/ilvis2/ILVIS2_GL2009_0414_R1401_042504.TXT.xml b/test/data/ilvis2/ILVIS2_GL2009_0414_R1401_042504.TXT.xml
new file mode 100644
index 0000000..bbc969b
--- /dev/null
+++ b/test/data/ilvis2/ILVIS2_GL2009_0414_R1401_042504.TXT.xml
@@ -0,0 +1,780 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE GranuleMetaDataFile SYSTEM "http://ecsinfo.gsfc.nasa.gov/ECSInfo/ecsmetadata/dtds/DPL/ECS/ScienceGranuleMetadata.dtd">
+<GranuleMetaDataFile>
+ <DTDVersion>1.0</DTDVersion>
+ <DataCenterId>NSIDC</DataCenterId>
+ <GranuleURMetaData>
+ <GranuleUR>SC:ILVIS2.001:51203496</GranuleUR>
+ <DbID>51203496</DbID>
+ <InsertTime>2014-08-15 14:06:54.441</InsertTime>
+ <LastUpdate>2014-08-15 14:06:54.441</LastUpdate>
+ <CollectionMetaData>
+ <ShortName>ILVIS2</ShortName>
+ <VersionID>1</VersionID>
+ </CollectionMetaData>
+ <DataFiles>
+ <DataFileContainer>
+ <DistributedFileName>ILVIS2_GL2009_0414_R1401_042504.TXT</DistributedFileName>
+ <FileSize>93100358</FileSize>
+ <ChecksumType>MD5</ChecksumType>
+ <Checksum>4047b1ed5f3a0c19712ae3117ddc0f78</Checksum>
+ <ChecksumOrigin>DPLIngst</ChecksumOrigin>
+ </DataFileContainer>
+ </DataFiles>
+ <ECSDataGranule>
+ <SizeMBECSDataGranule>88.7874</SizeMBECSDataGranule>
+ <LocalGranuleID>ILVIS2_GL2009_0414_R1401_042504.TXT</LocalGranuleID>
+ <ProductionDateTime>2014-01-16 15:43:57.000</ProductionDateTime>
+ <LocalVersionID>001</LocalVersionID>
+ </ECSDataGranule>
+ <RangeDateTime>
+ <RangeEndingTime>12:16:19.682080</RangeEndingTime>
+ <RangeEndingDate>2009-04-14</RangeEndingDate>
+ <RangeBeginningTime>11:48:24.483130</RangeBeginningTime>
+ <RangeBeginningDate>2009-04-14</RangeBeginningDate>
+ </RangeDateTime>
+ <SpatialDomainContainer>
+ <HorizontalSpatialDomainContainer>
+ <GPolygon>
+ <Boundary>
+ <Point>
+ <PointLongitude>-47.14842</PointLongitude>
+ <PointLatitude>79.51872</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-46.9909</PointLongitude>
+ <PointLatitude>79.51872</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-47.0166</PointLongitude>
+ <PointLatitude>79.50434</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-48.8528</PointLongitude>
+ <PointLatitude>79.36034</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-49.07076</PointLongitude>
+ <PointLatitude>79.34234</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-50.1236</PointLongitude>
+ <PointLatitude>79.25234</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-50.76171</PointLongitude>
+ <PointLatitude>79.19474</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-51.18166</PointLongitude>
+ <PointLatitude>79.15514</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-51.56231</PointLongitude>
+ <PointLatitude>79.11914</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-51.78311</PointLongitude>
+ <PointLatitude>79.09754</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-51.96401</PointLongitude>
+ <PointLatitude>79.07954</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-52.04428</PointLongitude>
+ <PointLatitude>79.07234</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-52.2254</PointLongitude>
+ <PointLatitude>79.05434</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-52.30574</PointLongitude>
+ <PointLatitude>79.04714</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-52.48705</PointLongitude>
+ <PointLatitude>79.02914</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-52.58806</PointLongitude>
+ <PointLatitude>79.01834</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-52.72934</PointLongitude>
+ <PointLatitude>79.00394</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-52.87074</PointLongitude>
+ <PointLatitude>78.98954</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-52.95132</PointLongitude>
+ <PointLatitude>78.98234</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-53.01223</PointLongitude>
+ <PointLatitude>78.97514</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-53.11351</PointLongitude>
+ <PointLatitude>78.96434</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-53.19416</PointLongitude>
+ <PointLatitude>78.95714</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-53.25516</PointLongitude>
+ <PointLatitude>78.94994</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-53.35655</PointLongitude>
+ <PointLatitude>78.93914</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-53.458</PointLongitude>
+ <PointLatitude>78.92834</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-53.5999</PointLongitude>
+ <PointLatitude>78.91394</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-53.70146</PointLongitude>
+ <PointLatitude>78.90314</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-53.76264</PointLongitude>
+ <PointLatitude>78.89594</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-53.8643</PointLongitude>
+ <PointLatitude>78.88514</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-53.966</PointLongitude>
+ <PointLatitude>78.87434</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-54.06776</PointLongitude>
+ <PointLatitude>78.86354</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-54.16956</PointLongitude>
+ <PointLatitude>78.85274</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-54.27143</PointLongitude>
+ <PointLatitude>78.84194</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-54.39421</PointLongitude>
+ <PointLatitude>78.82754</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-54.45564</PointLongitude>
+ <PointLatitude>78.82034</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-54.55765</PointLongitude>
+ <PointLatitude>78.80954</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-54.61911</PointLongitude>
+ <PointLatitude>78.80234</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-54.72112</PointLongitude>
+ <PointLatitude>78.79154</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-54.82312</PointLongitude>
+ <PointLatitude>78.78074</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-54.88453</PointLongitude>
+ <PointLatitude>78.77354</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-54.94588</PointLongitude>
+ <PointLatitude>78.76634</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.00717</PointLongitude>
+ <PointLatitude>78.75914</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.06837</PointLongitude>
+ <PointLatitude>78.75194</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.12944</PointLongitude>
+ <PointLatitude>78.74474</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.19036</PointLongitude>
+ <PointLatitude>78.73754</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.25115</PointLongitude>
+ <PointLatitude>78.73034</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.35178</PointLongitude>
+ <PointLatitude>78.71954</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.43267</PointLongitude>
+ <PointLatitude>78.70874</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.53263</PointLongitude>
+ <PointLatitude>78.69794</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.59264</PointLongitude>
+ <PointLatitude>78.69074</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.69202</PointLongitude>
+ <PointLatitude>78.67994</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.77183</PointLongitude>
+ <PointLatitude>78.66914</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.83129</PointLongitude>
+ <PointLatitude>78.66194</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.89062</PointLongitude>
+ <PointLatitude>78.65474</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.98892</PointLongitude>
+ <PointLatitude>78.64394</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.04789</PointLongitude>
+ <PointLatitude>78.63674</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.16544</PointLongitude>
+ <PointLatitude>78.62234</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.32109</PointLongitude>
+ <PointLatitude>78.60434</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.37932</PointLongitude>
+ <PointLatitude>78.59714</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.43741</PointLongitude>
+ <PointLatitude>78.58994</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.53372</PointLongitude>
+ <PointLatitude>78.57914</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.64911</PointLongitude>
+ <PointLatitude>78.56474</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.70661</PointLongitude>
+ <PointLatitude>78.55754</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.76399</PointLongitude>
+ <PointLatitude>78.55034</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.85913</PointLongitude>
+ <PointLatitude>78.53954</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.93535</PointLongitude>
+ <PointLatitude>78.52874</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.99222</PointLongitude>
+ <PointLatitude>78.52154</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.06804</PointLongitude>
+ <PointLatitude>78.51074</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.1246</PointLongitude>
+ <PointLatitude>78.50354</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.18104</PointLongitude>
+ <PointLatitude>78.49634</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.27468</PointLongitude>
+ <PointLatitude>78.48554</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.3308</PointLongitude>
+ <PointLatitude>78.47834</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.3868</PointLongitude>
+ <PointLatitude>78.47114</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.44267</PointLongitude>
+ <PointLatitude>78.46394</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.49842</PointLongitude>
+ <PointLatitude>78.45674</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.55403</PointLongitude>
+ <PointLatitude>78.44954</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.60954</PointLongitude>
+ <PointLatitude>78.44234</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.66493</PointLongitude>
+ <PointLatitude>78.43514</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.77533</PointLongitude>
+ <PointLatitude>78.42074</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.83035</PointLongitude>
+ <PointLatitude>78.41354</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.88526</PointLongitude>
+ <PointLatitude>78.40634</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.97643</PointLongitude>
+ <PointLatitude>78.39554</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-58.08549</PointLongitude>
+ <PointLatitude>78.38114</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-58.1941</PointLongitude>
+ <PointLatitude>78.36674</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-58.24823</PointLongitude>
+ <PointLatitude>78.35954</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-58.35613</PointLongitude>
+ <PointLatitude>78.34514</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-58.40991</PointLongitude>
+ <PointLatitude>78.33794</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-58.49927</PointLongitude>
+ <PointLatitude>78.32714</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-58.57057</PointLongitude>
+ <PointLatitude>78.31634</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-58.69479</PointLongitude>
+ <PointLatitude>78.30194</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-58.78521</PointLongitude>
+ <PointLatitude>78.29474</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-58.78521</PointLongitude>
+ <PointLatitude>78.31274</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-58.69463</PointLongitude>
+ <PointLatitude>78.33074</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-58.58805</PointLongitude>
+ <PointLatitude>78.33434</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-58.57021</PointLongitude>
+ <PointLatitude>78.33794</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-58.48069</PointLongitude>
+ <PointLatitude>78.35954</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-58.44489</PointLongitude>
+ <PointLatitude>78.36314</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-58.39105</PointLongitude>
+ <PointLatitude>78.37034</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-58.33709</PointLongitude>
+ <PointLatitude>78.37754</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-58.28301</PointLongitude>
+ <PointLatitude>78.38474</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-58.21085</PointLongitude>
+ <PointLatitude>78.39194</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-58.06556</PointLongitude>
+ <PointLatitude>78.41354</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.95612</PointLongitude>
+ <PointLatitude>78.42794</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.90122</PointLongitude>
+ <PointLatitude>78.43514</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.84621</PointLongitude>
+ <PointLatitude>78.44234</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.77288</PointLongitude>
+ <PointLatitude>78.44954</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.62495</PointLongitude>
+ <PointLatitude>78.47114</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.56935</PointLongitude>
+ <PointLatitude>78.47834</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.5136</PointLongitude>
+ <PointLatitude>78.48554</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.45773</PointLongitude>
+ <PointLatitude>78.49274</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.40174</PointLongitude>
+ <PointLatitude>78.49994</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.30832</PointLongitude>
+ <PointLatitude>78.51074</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.25201</PointLongitude>
+ <PointLatitude>78.51794</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.13901</PointLongitude>
+ <PointLatitude>78.53234</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-57.08232</PointLongitude>
+ <PointLatitude>78.53954</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.98775</PointLongitude>
+ <PointLatitude>78.55034</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.81631</PointLongitude>
+ <PointLatitude>78.57194</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.7014</PointLongitude>
+ <PointLatitude>78.58634</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.64374</PointLongitude>
+ <PointLatitude>78.59354</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.58597</PointLongitude>
+ <PointLatitude>78.60074</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.52805</PointLongitude>
+ <PointLatitude>78.60794</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.47</PointLongitude>
+ <PointLatitude>78.61514</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.41183</PointLongitude>
+ <PointLatitude>78.62234</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.35353</PointLongitude>
+ <PointLatitude>78.62954</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.29509</PointLongitude>
+ <PointLatitude>78.63674</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.23651</PointLongitude>
+ <PointLatitude>78.64394</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.15878</PointLongitude>
+ <PointLatitude>78.65114</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.07998</PointLongitude>
+ <PointLatitude>78.66194</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-56.02091</PointLongitude>
+ <PointLatitude>78.66914</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.96172</PointLongitude>
+ <PointLatitude>78.67634</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.80355</PointLongitude>
+ <PointLatitude>78.69434</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.68407</PointLongitude>
+ <PointLatitude>78.70874</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.62412</PointLongitude>
+ <PointLatitude>78.71594</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.5038</PointLongitude>
+ <PointLatitude>78.73034</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.40349</PointLongitude>
+ <PointLatitude>78.74114</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.30281</PointLongitude>
+ <PointLatitude>78.75194</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.24199</PointLongitude>
+ <PointLatitude>78.75914</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.14071</PointLongitude>
+ <PointLatitude>78.76994</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.07955</PointLongitude>
+ <PointLatitude>78.77714</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-55.01829</PointLongitude>
+ <PointLatitude>78.78434</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-54.95697</PointLongitude>
+ <PointLatitude>78.79154</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-54.85508</PointLongitude>
+ <PointLatitude>78.80234</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-54.79369</PointLongitude>
+ <PointLatitude>78.80954</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-54.73229</PointLongitude>
+ <PointLatitude>78.81674</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-54.67089</PointLongitude>
+ <PointLatitude>78.82394</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-54.56895</PointLongitude>
+ <PointLatitude>78.83474</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-54.46705</PointLongitude>
+ <PointLatitude>78.84554</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-54.36521</PointLongitude>
+ <PointLatitude>78.85634</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-54.3039</PointLongitude>
+ <PointLatitude>78.86354</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-54.24261</PointLongitude>
+ <PointLatitude>78.87074</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-54.18135</PointLongitude>
+ <PointLatitude>78.87794</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-53.99878</PointLongitude>
+ <PointLatitude>78.89594</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-53.93761</PointLongitude>
+ <PointLatitude>78.90314</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-53.83605</PointLongitude>
+ <PointLatitude>78.91394</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-53.77492</PointLongitude>
+ <PointLatitude>78.92114</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-53.63308</PointLongitude>
+ <PointLatitude>78.93554</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-53.53167</PointLongitude>
+ <PointLatitude>78.94634</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-53.43031</PointLongitude>
+ <PointLatitude>78.95714</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-53.2887</PointLongitude>
+ <PointLatitude>78.97154</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-53.14719</PointLongitude>
+ <PointLatitude>78.98594</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-53.08629</PointLongitude>
+ <PointLatitude>78.99314</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-52.94492</PointLongitude>
+ <PointLatitude>79.00754</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-52.76342</PointLongitude>
+ <PointLatitude>79.02554</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-52.62227</PointLongitude>
+ <PointLatitude>79.03994</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-52.40088</PointLongitude>
+ <PointLatitude>79.06154</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-52.25998</PointLongitude>
+ <PointLatitude>79.07594</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-52.07906</PointLongitude>
+ <PointLatitude>79.09394</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-51.85822</PointLongitude>
+ <PointLatitude>79.11554</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-51.77808</PointLongitude>
+ <PointLatitude>79.12274</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-51.4775</PointLongitude>
+ <PointLatitude>79.15154</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-51.13736</PointLongitude>
+ <PointLatitude>79.18394</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-50.97762</PointLongitude>
+ <PointLatitude>79.19834</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-50.85788</PointLongitude>
+ <PointLatitude>79.20914</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-50.77808</PointLongitude>
+ <PointLatitude>79.21634</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-50.10077</PointLongitude>
+ <PointLatitude>79.27754</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-49.86215</PointLongitude>
+ <PointLatitude>79.29914</PointLatitude>
+ </Point>
+ <Point>
+ <PointLongitude>-47.21337</PointLongitude>
+ <PointLatitude>79.51514</PointLatitude>
+ </Point>
+ </Boundary>
+ </GPolygon>
+ </HorizontalSpatialDomainContainer>
+ </SpatialDomainContainer>
+ <Platform>
+ <PlatformShortName>P-3B</PlatformShortName>
+ <Instrument>
+ <InstrumentShortName>LVIS</InstrumentShortName>
+ <Sensor>
+ <SensorShortName>LVIS</SensorShortName>
+ </Sensor>
+ </Instrument>
+ </Platform>
+ <Campaign>
+ <CampaignShortName>2009_GR_NASA</CampaignShortName>
+ </Campaign>
+ <PSAs>
+ <PSA>
+ <PSAName>SIPSMetGenVersion</PSAName>
+ <PSAValue>0.1.0.0</PSAValue>
+ </PSA>
+ <PSA>
+ <PSAName>ThemeID</PSAName>
+ <PSAValue>2009_GR_NASA</PSAValue>
+ </PSA>
+ <PSA>
+ <PSAName>AircraftID</PSAName>
+ <PSAValue>N426NA</PSAValue>
+ </PSA>
+ </PSAs>
+ </GranuleURMetaData>
+</GranuleMetaDataFile>
+
diff --git a/test/data/ilvis2/ilvis.xml b/test/data/ilvis2/ilvis.xml
new file mode 100644
index 0000000..321c625
--- /dev/null
+++ b/test/data/ilvis2/ilvis.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+ <Writer type="writers.las">
+ <Option name="filename">
+ ilvis.las
+ </Option>
+ <Reader type="readers.ilvis2">
+ <Option name="filename">
+ ILVIS2_GL2009_0414_R1401_042504.TXT
+ </Option>
+ </Reader>
+ </Writer>
+</Pipeline>
diff --git a/test/data/las/autzen_trim.las b/test/data/las/autzen_trim.las
new file mode 100644
index 0000000..0eee55d
Binary files /dev/null and b/test/data/las/autzen_trim.las differ
diff --git a/test/data/las/test_epsg_4047.las b/test/data/las/test_epsg_4047.las
new file mode 100644
index 0000000..9bea647
Binary files /dev/null and b/test/data/las/test_epsg_4047.las differ
diff --git a/test/data/las/test_epsg_4326.las b/test/data/las/test_epsg_4326.las
new file mode 100644
index 0000000..dcd5c9a
Binary files /dev/null and b/test/data/las/test_epsg_4326.las differ
diff --git a/test/data/las/test_epsg_4326x3.las b/test/data/las/test_epsg_4326x3.las
new file mode 100644
index 0000000..fb860f1
Binary files /dev/null and b/test/data/las/test_epsg_4326x3.las differ
diff --git a/test/data/las/test_utm16.las b/test/data/las/test_utm16.las
new file mode 100644
index 0000000..467fbe0
Binary files /dev/null and b/test/data/las/test_utm16.las differ
diff --git a/test/data/las/test_utm17.las b/test/data/las/test_utm17.las
new file mode 100644
index 0000000..74f3d3d
Binary files /dev/null and b/test/data/las/test_utm17.las differ
diff --git a/test/data/laz/autzen_trim.laz b/test/data/laz/autzen_trim.laz
new file mode 100644
index 0000000..a17c67d
Binary files /dev/null and b/test/data/laz/autzen_trim.laz differ
diff --git a/test/data/misc/opts2json.txt b/test/data/misc/opts2json.txt
index 7bf6c6c..5db3e80 100644
--- a/test/data/misc/opts2json.txt
+++ b/test/data/misc/opts2json.txt
@@ -1,42 +1,24 @@
{
"options" :
{
- "test1" :
+ "testa" :
{
"value" : "This is a test",
"description" : ""
},
- "test2" :
+ "testb" :
{
"value" : "56",
"description" : ""
},
- "test3" :
+ "testc" :
{
"value" : "27.5",
- "description" : "Testing test3"
+ "description" : "Testing testc"
},
- "test3.5" :
+ "teste" :
{
- "value" : "3.5",
- "description" : ""
- "options" :
- {
- "subtest1" :
- {
- "value" : "Subtest1",
- "description" : ""
- },
- "subtest2" :
- {
- "value" : "Subtest2",
- "description" : ""
- }
- }
- },
- "test4" :
- {
- "value" : "Testing option test 4",
+ "value" : "Testing option test e",
"description" : ""
}
}
diff --git a/test/data/misc/opts2json_meta.txt b/test/data/misc/opts2json_meta.txt
index 57b7950..ec38103 100644
--- a/test/data/misc/opts2json_meta.txt
+++ b/test/data/misc/opts2json_meta.txt
@@ -1,43 +1,25 @@
{
"options":
{
- "test1":
+ "testa":
{
"description": "",
"value": "This is a test"
},
- "test2":
+ "testb":
{
"description": "",
"value": "56"
},
- "test3":
+ "testc":
{
- "description": "Testing test3",
+ "description": "Testing testc",
"value": "27.5"
},
- "test3.5":
+ "teste":
{
"description": "",
- "options":
- {
- "subtest1":
- {
- "description": "",
- "value": "Subtest1"
- },
- "subtest2":
- {
- "description": "",
- "value": "Subtest2"
- }
- },
- "value": "3.5"
- },
- "test4":
- {
- "description": "",
- "value": "Testing option test 4"
+ "value": "Testing option test e"
}
}
}
diff --git a/test/data/pipeline/tindex.xml b/test/data/pipeline/tindex.xml
new file mode 100644
index 0000000..c55b553
--- /dev/null
+++ b/test/data/pipeline/tindex.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+ <Writer type="writers.las">
+ <Option name="filename">
+ out.las
+ </Option>
+ <Reader type="readers.tindex">
+ <Option name="sql">
+ SELECT * from pdal
+ </Option>
+ <Option name="filter_srs">
+ +proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=399999.9999999999 +y_0=0 +ellps=GRS80 +units=ft +no_defs
+ </Option>
+ <Option name="merge">
+ true
+ </Option>
+ <Option name="filename">
+ /Users/hobu/dev/git/pdal/test/temp/index.sqlite
+ </Option>
+ <Option name="where">
+ location LIKE '%nteresting.las%'
+ </Option>
+ <Option name="boundary">
+ ([635629.85, 638982.55], [848999.70 , 853535.43])
+ </Option>
+ <Option name="polygon">
+ POLYGON ((635629.85000000 848999.70000000, 635629.85000000 853535.43000000, 638982.55000000 853535.43000000, 638982.55000000 848999.70000000, 635629.85000000 848999.70000000))
+ </Option>
+ </Reader>
+ </Writer>
+</Pipeline>
diff --git a/test/data/pipeline/tindex.xml.in b/test/data/pipeline/tindex.xml.in
new file mode 100644
index 0000000..050fc97
--- /dev/null
+++ b/test/data/pipeline/tindex.xml.in
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+ <Writer type="writers.las">
+ <Option name="filename">
+ out.las
+ </Option>
+ <Reader type="readers.tindex">
+ <Option name="sql">
+ SELECT * from pdal
+ </Option>
+ <Option name="filter_srs">
+ +proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=399999.9999999999 +y_0=0 +ellps=GRS80 +units=ft +no_defs
+ </Option>
+ <Option name="merge">
+ true
+ </Option>
+ <Option name="filename">
+ @CMAKE_SOURCE_DIR@/test/temp/index.sqlite
+ </Option>
+ <Option name="where">
+ location LIKE '%nteresting.las%'
+ </Option>
+ <Option name="boundary">
+ ([635629.85, 638982.55], [848999.70 , 853535.43])
+ </Option>
+ <Option name="polygon">
+ POLYGON ((635629.85000000 848999.70000000, 635629.85000000 853535.43000000, 638982.55000000 853535.43000000, 638982.55000000 848999.70000000, 635629.85000000 848999.70000000))
+ </Option>
+ </Reader>
+ </Writer>
+</Pipeline>
diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt
index ec161f0..f7fe820 100644
--- a/test/unit/CMakeLists.txt
+++ b/test/unit/CMakeLists.txt
@@ -21,6 +21,7 @@ include_directories(
${PROJECT_SOURCE_DIR}/io/bpf
${PROJECT_SOURCE_DIR}/io/buffer
${PROJECT_SOURCE_DIR}/io/faux
+ ${PROJECT_SOURCE_DIR}/io/ilvis2
${PROJECT_SOURCE_DIR}/io/las
${PROJECT_SOURCE_DIR}/io/optech
${PROJECT_SOURCE_DIR}/io/ply
@@ -32,8 +33,11 @@ include_directories(
${PROJECT_SOURCE_DIR}/filters/colorization
${PROJECT_SOURCE_DIR}/filters/crop
${PROJECT_SOURCE_DIR}/filters/decimation
+ ${PROJECT_SOURCE_DIR}/filters/divider
${PROJECT_SOURCE_DIR}/filters/ferry
+ ${PROJECT_SOURCE_DIR}/filters/merge
${PROJECT_SOURCE_DIR}/filters/mortonorder
+ ${PROJECT_SOURCE_DIR}/filters/randomize
${PROJECT_SOURCE_DIR}/filters/reprojection
${PROJECT_SOURCE_DIR}/filters/range
${PROJECT_SOURCE_DIR}/filters/sort
@@ -74,6 +78,7 @@ endif()
PDAL_ADD_TEST(pdal_io_bpf_test FILES io/bpf/BPFTest.cpp)
PDAL_ADD_TEST(pdal_io_buffer_test FILES io/buffer/BufferTest.cpp)
PDAL_ADD_TEST(pdal_io_faux_test FILES io/faux/FauxReaderTest.cpp)
+PDAL_ADD_TEST(pdal_io_ilvis2_test FILES io/ilvis2/Ilvis2ReaderTest.cpp)
PDAL_ADD_TEST(pdal_io_las_reader_test FILES io/las/LasReaderTest.cpp)
PDAL_ADD_TEST(pdal_io_las_writer_test FILES io/las/LasWriterTest.cpp)
PDAL_ADD_TEST(pdal_io_optech_test FILES io/optech/OptechReaderTest.cpp)
@@ -91,10 +96,12 @@ PDAL_ADD_TEST(pdal_filters_chipper_test FILES filters/ChipperTest.cpp)
PDAL_ADD_TEST(pdal_filters_colorization_test FILES filters/ColorizationFilterTest.cpp)
PDAL_ADD_TEST(pdal_filters_crop_test FILES filters/CropFilterTest.cpp)
PDAL_ADD_TEST(pdal_filters_decimation_test FILES filters/DecimationFilterTest.cpp)
+PDAL_ADD_TEST(pdal_filters_divider_test FILES filters/DividerFilterTest.cpp)
PDAL_ADD_TEST(pdal_filters_ferry_test FILES filters/FerryFilterTest.cpp)
PDAL_ADD_TEST(pdal_filters_merge_test FILES filters/MergeTest.cpp)
PDAL_ADD_TEST(pdal_filters_reprojection_test FILES filters/ReprojectionFilterTest.cpp)
PDAL_ADD_TEST(pdal_filters_range_test FILES filters/RangeFilterTest.cpp)
+PDAL_ADD_TEST(pdal_filters_randomize_test FILES filters/RandomizeFilterTest.cpp)
PDAL_ADD_TEST(pdal_filters_sort_test FILES filters/SortFilterTest.cpp)
PDAL_ADD_TEST(pdal_filters_splitter_test FILES filters/SplitterTest.cpp)
PDAL_ADD_TEST(pdal_filters_stats_test FILES filters/StatsFilterTest.cpp)
diff --git a/test/unit/MetadataTest.cpp b/test/unit/MetadataTest.cpp
index ceece14..91cb420 100644
--- a/test/unit/MetadataTest.cpp
+++ b/test/unit/MetadataTest.cpp
@@ -283,30 +283,13 @@ TEST(MetadataTest, sanitize)
}
**/
-TEST(MetadataTest, test_metadata_stage)
+// Make sure that we handle double-precision values to 10 decimal places.
+TEST(MetadataTest, test_float)
{
-//ABELL
-/**
- PointTable table;
-
- LasReader reader(Support::datapath("interesting.las"));
- reader.prepare(table);
-
- MetadataNode file_metadata = table->metadata();
+ MetadataNode n("top");
+ MetadataNode n2 = n.add("test", 1e-20);
+ EXPECT_DOUBLE_EQ(n2.value<double>(), 1e-20);
- EXPECT_EQ(file_metadata.toPTree().get_child("metadata").size(),
- 32);
-
- PointTable readerTable;
- PipelineManager mgr;
- PipelineReader specReader(mgr);
- specReader.readPipeline(
- Support::datapath("pipeline/pipeline_metadata_reader.xml"));
- std::shared_ptr<Stage> stage(mgr.getStage());
-
- stage->prepare(readerTable);
- MetadataNode pipeline_metadata = readerTable->metadata();
- EXPECT_EQ(
- pipeline_metadata.toPTree().get_child("metadata").size(), 32);
-**/
+ n2 = n.add("test2", 1.12345678);
+ EXPECT_DOUBLE_EQ(n2.value<double>(), 1.12345678);
}
diff --git a/test/unit/OptionsTest.cpp b/test/unit/OptionsTest.cpp
index 35f88fb..7d0728d 100644
--- a/test/unit/OptionsTest.cpp
+++ b/test/unit/OptionsTest.cpp
@@ -132,33 +132,10 @@ TEST(OptionsTest, test_options_copy_ctor)
Options copy(opts);
- opt_i.setOptions(copy);
-
EXPECT_TRUE(copy.hasOption("my_int"));
EXPECT_TRUE(copy.hasOption("my_string"));
}
-TEST(OptionsTest, test_options_multi)
-{
- Option opt_i("a", 1, "This is my integral option.");
- const Option opt_s("b", "2", "This is my stringy option.");
-
- Options opts;
- opts.add(opt_i);
- opts.add(opt_s);
-
- Option opt;
- opt.setOptions(opts);
-
- boost::optional<Options const&> o = opt.getOptions();
-
- Option const& i = o->getOption("a");
- EXPECT_EQ(i.getValue<int>(), 1);
-
- Option const& s = o->getOption("b");
- EXPECT_EQ(s.getValue<std::string>(), "2");
-}
-
TEST(OptionsTest, test_options_writing)
{
Options opts;
@@ -305,20 +282,13 @@ TEST(OptionsTest, implicitdefault)
TEST(OptionsTest, metadata)
{
Options ops;
- ops.add("test1", "This is a test");
- ops.add("test2", 56);
- ops.add("test3", 27.5, "Testing test3");
+ ops.add("testa", "This is a test");
+ ops.add("testb", 56);
+ ops.add("testc", 27.5, "Testing testc");
- Option op35("test3.5", 3.5);
+ Option op35("testd", 3.5);
- Options subops;
- subops.add("subtest1", "Subtest1");
- subops.add("subtest2", "Subtest2");
-
- op35.setOptions(subops);
-
- ops.add(op35);
- ops.add("test4", "Testing option test 4");
+ ops.add("teste", "Testing option test e");
MetadataNode node = ops.toMetadata();
@@ -361,3 +331,11 @@ TEST(OptionsTest, conditional)
EXPECT_EQ(ops.getValueOrDefault("bazel", std::string()), "win");
}
+TEST(OptionsTest, valid)
+{
+ EXPECT_TRUE(Option::nameValid("foo_123_bar_baz", false));
+ EXPECT_FALSE(Option::nameValid("foo_123_bar-baz", false));
+ EXPECT_FALSE(Option::nameValid("Afoo_123_bar_baz", false));
+ EXPECT_FALSE(Option::nameValid("1foo_123_bar_baz", false));
+ EXPECT_FALSE(Option::nameValid("1foo_123_bar_baz", false));
+}
diff --git a/test/unit/PDALUtilsTest.cpp b/test/unit/PDALUtilsTest.cpp
index 3a1c731..b91ebf6 100644
--- a/test/unit/PDALUtilsTest.cpp
+++ b/test/unit/PDALUtilsTest.cpp
@@ -43,20 +43,13 @@ using namespace pdal;
TEST(PDALUtilsTest, options1)
{
Options ops;
- ops.add("test1", "This is a test");
- ops.add("test2", 56);
- ops.add("test3", 27.5, "Testing test3");
+ ops.add("testa", "This is a test");
+ ops.add("testb", 56);
+ ops.add("testc", 27.5, "Testing testc");
- Option op35("test3.5", 3.5);
+ Option op35("testd", 3.5);
- Options subops;
- subops.add("subtest1", "Subtest1");
- subops.add("subtest2", "Subtest2");
-
- op35.setOptions(subops);
-
- ops.add(op35);
- ops.add("test4", "Testing option test 4");
+ ops.add("teste", "Testing option test e");
std::string goodfile(Support::datapath("misc/opts2json.txt"));
std::string testfile(Support::temppath("opts2json.txt"));
diff --git a/test/unit/PointViewTest.cpp b/test/unit/PointViewTest.cpp
index ce62a3c..c6e39d2 100644
--- a/test/unit/PointViewTest.cpp
+++ b/test/unit/PointViewTest.cpp
@@ -446,3 +446,14 @@ TEST(PointViewTest, order)
pi = si;
}
}
+
+// Per discussions with @abellgithub (https://github.com/gadomski/PDAL/commit/c1d54e56e2de841d37f2a1b1c218ed723053f6a9#commitcomment-14415138)
+// we only do bounds checking on `PointView`s when in debug mode.
+#ifndef NDEBUG
+TEST(PointViewDeathTest, out_of_bounds)
+{
+ PointTable point_table;
+ auto point_view = makeTestView(point_table, 1);
+ EXPECT_DEATH(point_view->getFieldAs<uint8_t>(Dimension::Id::X, 1), "< m_size");
+}
+#endif
diff --git a/test/unit/SpatialReferenceTest.cpp b/test/unit/SpatialReferenceTest.cpp
index 138c549..c826d0a 100644
--- a/test/unit/SpatialReferenceTest.cpp
+++ b/test/unit/SpatialReferenceTest.cpp
@@ -36,6 +36,8 @@
#include <pdal/SpatialReference.hpp>
#include <pdal/util/FileUtils.hpp>
+#include <ReprojectionFilter.hpp>
+#include <MergeFilter.hpp>
#include <LasWriter.hpp>
#include <LasReader.hpp>
@@ -185,18 +187,21 @@ TEST(SpatialReferenceTest, test_read_srs)
#endif
-//NOTE - The source file uses Geotiff spatial reference, so this only
-// works if we have the necessary library.
#ifdef PDAL_HAVE_LIBGEOTIFF
// Try writing a compound coordinate system to file and ensure we get back
// WKT with the geoidgrids (from the WKT VLR).
+
+//ABELL - Commenting out for now. If someone can find a good vertical
+// datum that transforms consistently in and out of GeoTiff encoding,
+// throw it in and turn this on.
+/**
TEST(SpatialReferenceTest, test_vertical_datums)
{
std::string tmpfile(Support::temppath("tmp_srs.las"));
FileUtils::deleteFile(tmpfile);
- const std::string wkt = "COMPD_CS[\"WGS 84 + VERT_CS\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],VERT_CS[\"NAVD88 height\",VERT_DATUM[\"North American Vertical Datum 1988\",2005,AUTHORITY[\"EPSG\",\"5103\"],EXTENSION[\"PROJ4_GRIDS\",\"g2003con [...]
+ const std::string wkt = "COMPD_CS[\"unknown\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433],AUTHORITY[\"EPSG\",\"4326\"]],VERT_CS[\"NAVD88 height\",VERT_DATUM[\"North American Vertical Datum 1988\",2005,AUTHORITY[\"EPSG\",\"5103\"],EXTENSION[\"PROJ4_GRIDS\",\"g2012a_conus.gtx,g2012a_alaska.gtx,g2012a_guam.gtx,g2012a_hawaii.gtx,g2012a [...]
SpatialReference ref;
ref.setFromUserInput(wkt);
@@ -210,7 +215,6 @@ TEST(SpatialReferenceTest, test_vertical_datums)
LasReader reader;
reader.setOptions(ops1);
- // need to scope the writer, so that's it dtor can use the stream
Options opts;
opts.add("filename", tmpfile);
@@ -232,11 +236,12 @@ TEST(SpatialReferenceTest, test_vertical_datums)
const SpatialReference ref2 = reader2.getSpatialReference();
const std::string wkt2 = ref2.getWKT(SpatialReference::eCompoundOK);
- EXPECT_TRUE(wkt == wkt2);
+ EXPECT_EQ(wkt, wkt2);
// Cleanup
FileUtils::deleteFile(tmpfile);
}
+**/
#endif //PDAL_HAVE_LIBGEOTIFF
@@ -270,6 +275,7 @@ TEST(SpatialReferenceTest, test_writing_vlr)
LasWriter writer;
writerOpts.add("filename", tmpfile);
+ writerOpts.add("minor_version", 4);
writer.setOptions(writerOpts);
writer.setInput(readerx);
writer.prepare(table);
@@ -289,7 +295,7 @@ TEST(SpatialReferenceTest, test_writing_vlr)
SpatialReference result_ref = reader.getSpatialReference();
- EXPECT_EQ(reader.header().vlrCount(), 5u);
+ EXPECT_EQ(reader.header().vlrCount(), 2u);
std::string wkt = result_ref.getWKT();
EXPECT_EQ(wkt, reference_wkt);
}
@@ -332,3 +338,52 @@ TEST(SpatialReferenceTest, test_vertical_and_horizontal)
EXPECT_EQ(vert, vertical);
}
+
+#if defined(PDAL_HAVE_LIBGEOTIFF)
+TEST(SpatialReferenceTest, merge)
+{
+ Options o1;
+ o1.add("filename", Support::datapath("las/test_utm17.las"));
+ LasReader r1;
+ r1.setOptions(o1);
+
+ Options o2;
+ o2.add("filename", Support::datapath("las/test_epsg_4326.las"));
+ LasReader r2;
+ r2.setOptions(o2);
+
+ Options o3;
+// o3.add("filename", Support::datapath("las/test_epsg_4047.las"));
+ o3.add("filename", Support::datapath("las/test_utm16.las"));
+ LasReader r3;
+ r3.setOptions(o3);
+
+ Options o4;
+ o4.add("out_srs", "EPSG:4326");
+ ReprojectionFilter repro;
+ repro.setOptions(o4);
+ repro.setInput(r1);
+ repro.setInput(r2);
+ repro.setInput(r3);
+
+ MergeFilter merge;
+ merge.setInput(repro);
+
+ FileUtils::deleteFile(Support::temppath("triple.las"));
+ Options o5;
+ o5.add("filename", Support::temppath("triple.las"));
+ o5.add("scale_x", .0001);
+ o5.add("scale_y", .0001);
+ o5.add("scale_z", .0001);
+ LasWriter w;
+ w.setOptions(o5);
+ w.setInput(merge);
+
+ PointTable t1;
+ w.prepare(t1);
+ w.execute(t1);
+
+ Support::checkXYZ(Support::temppath("triple.las"),
+ Support::datapath("las/test_epsg_4326x3.las"));
+}
+#endif
diff --git a/test/unit/Support.cpp b/test/unit/Support.cpp
index 349c110..0bc7f06 100644
--- a/test/unit/Support.cpp
+++ b/test/unit/Support.cpp
@@ -46,6 +46,7 @@
#include <pdal/util/FileUtils.hpp>
#include <pdal/Options.hpp>
#include <pdal/Stage.hpp>
+#include <pdal/StageFactory.hpp>
#include "TestConfig.hpp"
using namespace pdal;
@@ -283,6 +284,56 @@ bool Support::compare_text_files(std::istream& str1, std::istream& str2)
return diff_text_files(str1, str2) == 0;
}
+
+void Support::checkXYZ(const std::string& file1, const std::string& file2)
+{
+ StageFactory f;
+
+ const std::string driver1 = f.inferReaderDriver(file1);
+ EXPECT_NE(driver1, "") << "Can't find driver";
+
+ const std::string driver2 = f.inferReaderDriver(file2);
+ EXPECT_NE(driver2, "") << "Can't find driver";
+
+ Stage *reader1 = f.createStage(driver1);
+ EXPECT_NE(reader1, (Stage *)NULL) << "Couldn't create stage";
+
+ Stage *reader2 = f.createStage(driver2);
+ EXPECT_NE(reader1, (Stage *)NULL) << "Couldn't create stage";
+
+ Options o1;
+ o1.add("filename", file1);
+ reader1->setOptions(o1);
+ PointTable t1;
+ reader1->prepare(t1);
+ PointViewSet s1 = reader1->execute(t1);
+ EXPECT_EQ(s1.size(), 1u);
+ PointViewPtr v1 = *s1.begin();
+
+ Options o2;
+ o2.add("filename", file2);
+ reader2->setOptions(o2);
+ PointTable t2;
+ reader2->prepare(t2);
+ PointViewSet s2 = reader2->execute(t2);
+ EXPECT_EQ(s2.size(), 1u);
+ PointViewPtr v2 = *s2.begin();
+
+ EXPECT_EQ(v1->size(), v2->size()) << "Files " << file1 << " and " <<
+ file2 << " have different point counts.";
+ for (PointId idx = 0; idx < v1->size(); ++idx)
+ {
+ using namespace Dimension;
+ ASSERT_DOUBLE_EQ(v1->getFieldAs<double>(Id::X, idx),
+ v2->getFieldAs<double>(Id::X, idx)) << "Index = " << idx;
+ ASSERT_DOUBLE_EQ(v1->getFieldAs<double>(Id::Y, idx),
+ v2->getFieldAs<double>(Id::Y, idx)) << "Index = " << idx;
+ ASSERT_DOUBLE_EQ(v1->getFieldAs<double>(Id::Z, idx),
+ v2->getFieldAs<double>(Id::Z, idx)) << "Index = " << idx;
+ }
+}
+
+
void Support::check_pN(const pdal::PointView& data, PointId index,
double xref, double yref, double zref)
{
diff --git a/test/unit/Support.hpp b/test/unit/Support.hpp
index 6b68be8..4fad864 100644
--- a/test/unit/Support.hpp
+++ b/test/unit/Support.hpp
@@ -117,6 +117,8 @@ public:
const std::string& file2);
static bool compare_text_files(std::istream& str1, std::istream& str2);
+ static void checkXYZ(const std::string& file1, const std::string& file2);
+
// validate a point's XYZ values
static void check_pN(const pdal::PointView& data,
pdal::PointId index,
diff --git a/test/unit/filters/ColorizationFilterTest.cpp b/test/unit/filters/ColorizationFilterTest.cpp
index bd1d888..926fb3c 100644
--- a/test/unit/filters/ColorizationFilterTest.cpp
+++ b/test/unit/filters/ColorizationFilterTest.cpp
@@ -86,27 +86,7 @@ TEST(ColorizationFilterTest, test1)
{
Options options;
- Option red("dimension", "Red");
- Options subRed;
- subRed.add("band", 1);
- subRed.add("scale", 1.0f, "scale factor for this dimension");
- red.setOptions(subRed);
- options.add(red);
-
- Option green("dimension", "Green");
- Options subGreen;
- subGreen.add("band", 2);
- subGreen.add("scale", 1.0f, "scale factor for this dimension");
- green.setOptions(subGreen);
- options.add(green);
-
- Option blue("dimension", "Blue", "");
- Options subBlue;
- subBlue.add("band", 3);
- subBlue.add("scale", 255.0f, "scale factor for this dimension");
- blue.setOptions(subBlue);
- options.add(blue);
-
+ options.add("dimensions", "Red, Green,Blue::255 ");
options.add("raster", Support::datapath("autzen/autzen.jpg"),
"raster to read");
@@ -138,27 +118,7 @@ TEST(ColorizationFilterTest, test3)
{
Options options;
- Option red("dimension", "Foo");
- Options subRed;
- subRed.add("band", 1);
- subRed.add("scale", 1.0f, "scale factor for this dimension");
- red.setOptions(subRed);
- options.add(red);
-
- Option green("dimension", "Bar");
- Options subGreen;
- subGreen.add("band", 2);
- subGreen.add("scale", 1.0f, "scale factor for this dimension");
- green.setOptions(subGreen);
- options.add(green);
-
- Option blue("dimension", "Baz", "");
- Options subBlue;
- subBlue.add("band", 3);
- subBlue.add("scale", 255.0f, "scale factor for this dimension");
- blue.setOptions(subBlue);
- options.add(blue);
-
+ options.add("dimensions", "Foo:1,Bar:2,Baz:3:255");
options.add("raster", Support::datapath("autzen/autzen.jpg"),
"raster to read");
diff --git a/test/unit/filters/CropFilterTest.cpp b/test/unit/filters/CropFilterTest.cpp
index 29829d0..4740528 100644
--- a/test/unit/filters/CropFilterTest.cpp
+++ b/test/unit/filters/CropFilterTest.cpp
@@ -159,40 +159,22 @@ TEST(CropFilterTest, test_crop_polygon_reprojection)
#ifdef PDAL_HAVE_GEOS
Options options;
- Option in_srs("spatialreference",Support::datapath("autzen/autzen-srs.wkt"), "Input SRS");
- Option out_srs("out_srs","EPSG:4326", "Output SRS to reproject to");
- Option x_dim("x_dim", std::string("readers.las.X"),
- "Dimension name to use for 'X' data");
- Option y_dim("y_dim", std::string("readers.las.Y"),
- "Dimension name to use for 'Y' data");
- Option z_dim("z_dim", std::string("readers.las.Z"),
- "Dimension name to use for 'Z' data");
- Option x_scale("scale_x", 0.0000001f, "Scale for output X data "
- "in the case when 'X' dimension data are to be scaled. Defaults "
- "to '1.0'. If not set, the Dimensions's scale will be used");
- Option y_scale("scale_y", 0.0000001f, "Scale for output Y data "
- "in the case when 'Y' dimension data are to be scaled. Defaults "
- "to '1.0'. If not set, the Dimensions's scale will be used");
- Option filename("filename", Support::datapath("las/1.2-with-color.las"));
- Option debug("debug", true, "");
- Option verbose("verbose", 9, "");
- // options.add(debug);
- // options.add(verbose);
- options.add(in_srs);
- options.add(out_srs);
- options.add(x_dim);
- options.add(y_dim);
- options.add(z_dim);
- options.add(x_scale);
- options.add(y_scale);
- options.add(filename);
+ options.add("spatialreference", Support::datapath("autzen/autzen-srs.wkt"));
+ options.add("out_srs", "EPSG:4326");
+ options.add("x_dim", std::string("readers.las.X"));
+ options.add("y_dim", std::string("readers.las.Y"));
+ options.add("z_dim", std::string("readers.las.Z"));
+ options.add("scale_x", 0.0000001f);
+ options.add("scale_y", 0.0000001f);
+ options.add("filename", Support::datapath("las/1.2-with-color.las"));
std::istream* wkt_stream = FileUtils::openFile(
Support::datapath("autzen/autzen-selection-dd.wkt"));
std::stringstream strbuf;
strbuf << wkt_stream->rdbuf();
std::string wkt(strbuf.str());
- Option polygon("polygon", wkt, "");
+
+ Option polygon("polygon", wkt);
options.add(polygon);
LasReader reader;
diff --git a/test/unit/filters/DividerFilterTest.cpp b/test/unit/filters/DividerFilterTest.cpp
new file mode 100644
index 0000000..5b43411
--- /dev/null
+++ b/test/unit/filters/DividerFilterTest.cpp
@@ -0,0 +1,204 @@
+/******************************************************************************
+* Copyright (c) 2015, Hobu Inc. (hobu at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in
+* the documentation and/or other materials provided
+* with the distribution.
+* * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+* names of its contributors may be used to endorse or promote
+* products derived from this software without specific prior
+* written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <FauxReader.hpp>
+#include <DividerFilter.hpp>
+
+using namespace pdal;
+
+TEST(DividerFilterTest, partition_count)
+{
+ point_count_t count = 1000;
+
+ Options readerOps;
+ readerOps.add("bounds", BOX3D(1, 1, 1, count, count, count));
+ readerOps.add("mode", "ramp");
+ readerOps.add("num_points", count);
+
+ FauxReader r;
+ r.setOptions(readerOps);
+
+ Options filterOps;
+ filterOps.add("count", 10);
+ DividerFilter f;
+ f.setInput(r);
+ f.setOptions(filterOps);
+
+ PointTable t;
+ f.prepare(t);
+ PointViewSet s = f.execute(t);
+
+ EXPECT_EQ(s.size(), 10u);
+
+ PointId i = 0;
+ for (PointViewPtr v : s)
+ {
+ EXPECT_EQ(v->size(), 100u);
+ for (PointId p = 0; p < v->size(); ++p)
+ {
+ EXPECT_DOUBLE_EQ((double)(i + 1),
+ v->getFieldAs<double>(Dimension::Id::X, p));
+ i++;
+ }
+ }
+}
+
+TEST(DividerFilterTest, partition_capacity)
+{
+ point_count_t count = 1000;
+
+ Options readerOps;
+ readerOps.add("bounds", BOX3D(1, 1, 1, count, count, count));
+ readerOps.add("mode", "ramp");
+ readerOps.add("num_points", count);
+
+ FauxReader r;
+ r.setOptions(readerOps);
+
+ Options filterOps;
+ filterOps.add("capacity", 25);
+ DividerFilter f;
+ f.setInput(r);
+ f.setOptions(filterOps);
+
+ PointTable t;
+ f.prepare(t);
+ PointViewSet s = f.execute(t);
+
+ EXPECT_EQ(s.size(), 40u);
+
+ PointId i = 0;
+ for (PointViewPtr v : s)
+ {
+ EXPECT_EQ(v->size(), 25u);
+ for (PointId p = 0; p < v->size(); ++p)
+ {
+ EXPECT_DOUBLE_EQ((double)(i + 1),
+ v->getFieldAs<double>(Dimension::Id::X, p));
+ i++;
+ }
+ }
+}
+
+TEST(DividerFilterTest, round_robin_count)
+{
+ point_count_t count = 1000;
+
+ Options readerOps;
+ readerOps.add("bounds", BOX3D(1, 1, 1, count, count, count));
+ readerOps.add("mode", "ramp");
+ readerOps.add("num_points", count);
+
+ FauxReader r;
+ r.setOptions(readerOps);
+
+ Options filterOps;
+ filterOps.add("count", 10);
+ filterOps.add("mode", "round_robin");
+ DividerFilter f;
+ f.setInput(r);
+ f.setOptions(filterOps);
+
+ PointTable t;
+ f.prepare(t);
+ PointViewSet s = f.execute(t);
+
+ EXPECT_EQ(s.size(), 10u);
+
+ PointId i = 0;
+ for (PointViewPtr v : s)
+ EXPECT_EQ(v->size(), 100u);
+
+ unsigned viewNum = 0;
+ PointId start = 1;
+ for (PointViewPtr v : s)
+ {
+ double value = start;
+ for (PointId i = 0 ; i < v->size(); i++)
+ {
+ EXPECT_DOUBLE_EQ((double)value,
+ v->getFieldAs<double>(Dimension::Id::X, i));
+ value += 10;
+ }
+ start++;
+ }
+}
+
+
+TEST(DividerFilterTest, round_robin_capacity)
+{
+ point_count_t count = 1000;
+
+ Options readerOps;
+ readerOps.add("bounds", BOX3D(1, 1, 1, count, count, count));
+ readerOps.add("mode", "ramp");
+ readerOps.add("num_points", count);
+
+ FauxReader r;
+ r.setOptions(readerOps);
+
+ Options filterOps;
+ filterOps.add("capacity", 25);
+ filterOps.add("mode", "round_robin");
+ DividerFilter f;
+ f.setInput(r);
+ f.setOptions(filterOps);
+
+ PointTable t;
+ f.prepare(t);
+ PointViewSet s = f.execute(t);
+
+ EXPECT_EQ(s.size(), 40u);
+
+ PointId i = 0;
+ for (PointViewPtr v : s)
+ EXPECT_EQ(v->size(), 25u);
+
+ unsigned viewNum = 0;
+ PointId start = 1;
+ for (PointViewPtr v : s)
+ {
+ double value = start;
+ for (PointId i = 0 ; i < v->size(); i++)
+ {
+ EXPECT_DOUBLE_EQ((double)value,
+ v->getFieldAs<double>(Dimension::Id::X, i));
+ value += 40;
+ }
+ start++;
+ }
+}
+
diff --git a/test/unit/filters/FerryFilterTest.cpp b/test/unit/filters/FerryFilterTest.cpp
index 57dba86..442941f 100644
--- a/test/unit/filters/FerryFilterTest.cpp
+++ b/test/unit/filters/FerryFilterTest.cpp
@@ -88,21 +88,47 @@ TEST(FerryFilterTest, test_ferry_invalid)
LasReader reader;
reader.setOptions(ops1);
- Options options;
+ Options op1;
+
+ op1.add("dimensions", "X=X");
- Option x("dimension", "X", "");
- Option toX("to","X", "");
- Options xO;
- xO.add(toX);
- x.setOptions(xO);
- options.add(x);
-
- FerryFilter ferry;
- ferry.setInput(reader);
- ferry.setOptions(options);
+ FerryFilter f1;
+ f1.setInput(reader);
+ f1.setOptions(op1);
PointTable table;
- EXPECT_THROW(ferry.prepare(table), pdal_error);
+ // Make sure we can't ferry to ourselves.
+ EXPECT_THROW(f1.prepare(table), pdal_error);
+
+ Options op2;
+
+ op2.add("dimension", "X=NewX");
+ FerryFilter f2;
+ f2.setInput(reader);
+ f2.setOptions(op2);
+
+ // Make sure we reject old option name.
+ EXPECT_THROW(f2.prepare(table), pdal_error);
+
+ Options op3;
+
+ op3.add("dimensions", "NewX = X");
+ FerryFilter f3;
+ f3.setInput(reader);
+ f3.setOptions(op3);
+
+ // Make sure we reject bad source dimension.
+ EXPECT_THROW(f3.prepare(table), pdal_error);
+
+ Options op4;
+
+ op4.add("dimensions", "X = Y, X = NewZ = NewQ");
+ FerryFilter f4;
+ f4.setInput(reader);
+ f4.setOptions(op4);
+
+ // Make sure we reject bad option format.
+ EXPECT_THROW(f4.prepare(table), pdal_error);
}
diff --git a/test/unit/filters/MergeTest.cpp b/test/unit/filters/MergeTest.cpp
index bee0b74..1c67e2b 100644
--- a/test/unit/filters/MergeTest.cpp
+++ b/test/unit/filters/MergeTest.cpp
@@ -54,3 +54,43 @@ TEST(MergeTest, test1)
PointViewPtr view = *viewSet.begin();
EXPECT_EQ(view->size(), 2130u);
}
+
+TEST(MergeTest, test2)
+{
+ using namespace pdal;
+
+ PipelineManager mgr;
+ PipelineReader specReader(mgr);
+ specReader.readPipeline(Support::configuredpath("filters/merge2.xml"));
+ mgr.execute();
+
+ PointViewSet viewSet = mgr.views();
+
+ EXPECT_EQ(viewSet.size(), 1u);
+ PointViewPtr view = *viewSet.begin();
+ EXPECT_EQ(view->size(), 2130u);
+}
+
+TEST(MergeTest, test3)
+{
+ using namespace pdal;
+
+ PipelineManager mgr;
+ PipelineReader specReader(mgr);
+ specReader.readPipeline(Support::configuredpath("filters/merge3.xml"));
+
+ std::ostringstream oss;
+ std::ostream& o = std::clog;
+ auto ctx = Utils::redirect(o, oss);
+
+ mgr.execute();
+ std::string s = oss.str();
+ EXPECT_TRUE(s.find("inconsistent spatial references") != s.npos);
+ Utils::restore(o, ctx);
+
+ PointViewSet viewSet = mgr.views();
+
+ EXPECT_EQ(viewSet.size(), 1u);
+ PointViewPtr view = *viewSet.begin();
+ EXPECT_EQ(view->size(), 2130u);
+}
diff --git a/test/unit/filters/MergeTest.cpp b/test/unit/filters/RandomizeFilterTest.cpp
similarity index 67%
copy from test/unit/filters/MergeTest.cpp
copy to test/unit/filters/RandomizeFilterTest.cpp
index bee0b74..44dcb7a 100644
--- a/test/unit/filters/MergeTest.cpp
+++ b/test/unit/filters/RandomizeFilterTest.cpp
@@ -1,5 +1,5 @@
/******************************************************************************
-* Copyright (c) 2014, Hobu Inc., hobu.inc at gmail.com
+* Copyright (c) 2015, Hobu Inc. (hobu at hobu.co)
*
* All rights reserved.
*
@@ -34,23 +34,40 @@
#include <pdal/pdal_test_main.hpp>
-#include <pdal/PipelineManager.hpp>
-#include <pdal/PipelineReader.hpp>
+#include <FauxReader.hpp>
+#include <RandomizeFilter.hpp>
-#include "Support.hpp"
+using namespace pdal;
-TEST(MergeTest, test1)
+TEST(RandomizeFilterTest, simple)
{
- using namespace pdal;
+ // This isn't a real test. It's just here to allow easy debugging.
- PipelineManager mgr;
- PipelineReader specReader(mgr);
- specReader.readPipeline(Support::configuredpath("filters/merge.xml"));
- mgr.execute();
+ point_count_t count = 1000;
- PointViewSet viewSet = mgr.views();
+ Options readerOps;
+ readerOps.add("bounds", BOX3D(1, 1, 1, count, count, count));
+ readerOps.add("mode", "ramp");
+ readerOps.add("num_points", count);
- EXPECT_EQ(viewSet.size(), 1u);
- PointViewPtr view = *viewSet.begin();
- EXPECT_EQ(view->size(), 2130u);
+ FauxReader r;
+ r.setOptions(readerOps);
+
+ RandomizeFilter f;
+ f.setInput(r);
+
+ PointTable t;
+ f.prepare(t);
+ PointViewSet s = f.execute(t);
+
+ EXPECT_EQ(s.size(), 1u);
+ PointViewPtr v = *s.begin();
+ EXPECT_EQ(v->size(), (size_t)count);
+
+/**
+ for (PointId i = 0; i < count; i++)
+ std::cerr << "X[" << i << "] = " <<
+ v->getFieldAs<double>(Dimension::Id::X, i) << "!\n";
+**/
}
+
diff --git a/test/unit/filters/RangeFilterTest.cpp b/test/unit/filters/RangeFilterTest.cpp
index a57fc45..0e3f550 100644
--- a/test/unit/filters/RangeFilterTest.cpp
+++ b/test/unit/filters/RangeFilterTest.cpp
@@ -48,7 +48,7 @@ TEST(RangeFilterTest, createStage)
EXPECT_TRUE(filter.get());
}
-TEST(RangeFilterTest, noDimension)
+TEST(RangeFilterTest, noLimits)
{
RangeFilter filter;
@@ -56,18 +56,6 @@ TEST(RangeFilterTest, noDimension)
EXPECT_THROW(filter.prepare(table), pdal_error);
}
-TEST(RangeFilterTest, noRange)
-{
- Options rangeOps;
- rangeOps.add("dimension", "Z");
-
- RangeFilter filter;
- filter.setOptions(rangeOps);
-
- PointTable table;
- EXPECT_THROW(filter.prepare(table), pdal_error);
-}
-
TEST(RangeFilterTest, singleDimension)
{
BOX3D srcBounds(0.0, 0.0, 1.0, 0.0, 0.0, 10.0);
@@ -80,15 +68,8 @@ TEST(RangeFilterTest, singleDimension)
FauxReader reader;
reader.setOptions(ops);
- Options range;
- range.add("min", 4);
- range.add("max", 6);
-
- Option dim("dimension", "Z");
- dim.setOptions(range);
-
Options rangeOps;
- rangeOps.add(dim);
+ rangeOps.add("limits", "Z(3.50:6] ");
RangeFilter filter;
filter.setOptions(rangeOps);
@@ -118,23 +99,9 @@ TEST(RangeFilterTest, multipleDimensions)
FauxReader reader;
reader.setOptions(ops);
- Options y_range;
- y_range.add("min", 4);
- y_range.add("max", 6);
-
- Option y_dim("dimension", "Y");
- y_dim.setOptions(y_range);
-
- Options z_range;
- z_range.add("min", 4);
- z_range.add("max", 6);
-
- Option z_dim("dimension", "Z");
- z_dim.setOptions(z_range);
-
Options rangeOps;
- rangeOps.add(y_dim);
- rangeOps.add(z_dim);
+ rangeOps.add("limits", "Y[4.00e0:+6]");
+ rangeOps.add("limits", "Z[4:6]");
RangeFilter filter;
filter.setOptions(rangeOps);
@@ -155,6 +122,45 @@ TEST(RangeFilterTest, multipleDimensions)
EXPECT_FLOAT_EQ(6.0, view->getFieldAs<double>(Dimension::Id::Z, 2));
}
+TEST(RangeFilterTest, multipleDimsBusted)
+{
+ BOX3D srcBounds(1, 3, 5, 1, 3, 5);
+
+ Options ops;
+ ops.add("bounds", srcBounds);
+ ops.add("mode", "ramp");
+ ops.add("num_points", 1);
+
+ FauxReader reader;
+ reader.setOptions(ops);
+
+ Options rangeOps1;
+ rangeOps1.add("limits", "X[1:1], Y[27:27]");
+
+ RangeFilter f1;
+ f1.setOptions(rangeOps1);
+ f1.setInput(reader);
+
+ PointTable t1;
+ f1.prepare(t1);
+ PointViewSet s1 = f1.execute(t1);
+ PointViewPtr v1 = *s1.begin();
+
+ Options rangeOps2;
+ rangeOps2.add("limits", "Y[27:27], X[1:1]");
+
+ RangeFilter f2;
+ f2.setOptions(rangeOps2);
+ f2.setInput(reader);
+
+ PointTable t2;
+ f2.prepare(t2);
+ PointViewSet s2 = f2.execute(t2);
+ PointViewPtr v2 = *s2.begin();
+
+ EXPECT_EQ(v1->size(), v2->size());
+}
+
TEST(RangeFilterTest, onlyMin)
{
BOX3D srcBounds(0.0, 0.0, 1.0, 0.0, 0.0, 10.0);
@@ -167,14 +173,8 @@ TEST(RangeFilterTest, onlyMin)
FauxReader reader;
reader.setOptions(ops);
- Options range;
- range.add("min", 6);
-
- Option dim("dimension", "Z");
- dim.setOptions(range);
-
Options rangeOps;
- rangeOps.add(dim);
+ rangeOps.add("limits", "Z[6:]");
RangeFilter filter;
filter.setOptions(rangeOps);
@@ -207,14 +207,8 @@ TEST(RangeFilterTest, onlyMax)
FauxReader reader;
reader.setOptions(ops);
- Options range;
- range.add("max", 5);
-
- Option dim("dimension", "Z");
- dim.setOptions(range);
-
Options rangeOps;
- rangeOps.add(dim);
+ rangeOps.add("limits", "Z[:5]");
RangeFilter filter;
filter.setOptions(rangeOps);
@@ -234,8 +228,7 @@ TEST(RangeFilterTest, onlyMax)
EXPECT_FLOAT_EQ(5.0, view->getFieldAs<double>(Dimension::Id::Z, 4));
}
-
-TEST(RangeFilterTest, equals)
+TEST(RangeFilterTest, negation)
{
BOX3D srcBounds(0.0, 0.0, 1.0, 0.0, 0.0, 10.0);
@@ -244,17 +237,46 @@ TEST(RangeFilterTest, equals)
ops.add("mode", "ramp");
ops.add("num_points", 10);
+ StageFactory f;
FauxReader reader;
reader.setOptions(ops);
- Options range;
- range.add("equals", 5);
+ Options rangeOps;
+ rangeOps.add("limits", "Z![2:5]");
+
+ RangeFilter filter;
+ filter.setOptions(rangeOps);
+ filter.setInput(reader);
+
+ PointTable table;
+ filter.prepare(table);
+ PointViewSet viewSet = filter.execute(table);
+ PointViewPtr view = *viewSet.begin();
+
+ EXPECT_EQ(1u, viewSet.size());
+ EXPECT_EQ(6u, view->size());
+ EXPECT_FLOAT_EQ(1.0, view->getFieldAs<double>(Dimension::Id::Z, 0));
+ EXPECT_FLOAT_EQ(6.0, view->getFieldAs<double>(Dimension::Id::Z, 1));
+ EXPECT_FLOAT_EQ(7.0, view->getFieldAs<double>(Dimension::Id::Z, 2));
+ EXPECT_FLOAT_EQ(8.0, view->getFieldAs<double>(Dimension::Id::Z, 3));
+ EXPECT_FLOAT_EQ(9.0, view->getFieldAs<double>(Dimension::Id::Z, 4));
+ EXPECT_FLOAT_EQ(10.0, view->getFieldAs<double>(Dimension::Id::Z, 5));
+}
- Option dim("dimension", "Z");
- dim.setOptions(range);
+TEST(RangeFilterTest, equals)
+{
+ BOX3D srcBounds(0.0, 0.0, 1.0, 0.0, 0.0, 10.0);
+
+ Options ops;
+ ops.add("bounds", srcBounds);
+ ops.add("mode", "ramp");
+ ops.add("num_points", 10);
+
+ FauxReader reader;
+ reader.setOptions(ops);
Options rangeOps;
- rangeOps.add(dim);
+ rangeOps.add("limits", "Z[5:5]");
RangeFilter filter;
filter.setOptions(rangeOps);
@@ -282,15 +304,8 @@ TEST(RangeFilterTest, negativeValues)
FauxReader reader;
reader.setOptions(ops);
- Options range;
- range.add("min", -1);
- range.add("max", 1);
-
- Option dim("dimension", "Z");
- dim.setOptions(range);
-
Options rangeOps;
- rangeOps.add(dim);
+ rangeOps.add("limits", "Z[-1:1)");
RangeFilter filter;
filter.setOptions(rangeOps);
@@ -302,9 +317,40 @@ TEST(RangeFilterTest, negativeValues)
PointViewPtr view = *viewSet.begin();
EXPECT_EQ(1u, viewSet.size());
- EXPECT_EQ(3u, view->size());
+ EXPECT_EQ(2u, view->size());
EXPECT_FLOAT_EQ(-1.0, view->getFieldAs<double>(Dimension::Id::Z, 0));
EXPECT_FLOAT_EQ(0.0, view->getFieldAs<double>(Dimension::Id::Z, 1));
- EXPECT_FLOAT_EQ(1.0, view->getFieldAs<double>(Dimension::Id::Z, 2));
+}
+
+TEST(RangeFilterTest, simple_logic)
+{
+
+ Options ops;
+ ops.add("bounds", BOX3D(1, 101, 201, 10, 110, 210));
+ ops.add("mode", "ramp");
+ ops.add("num_points", 10);
+
+ FauxReader reader;
+ reader.setOptions(ops);
+
+ Options rangeOps;
+ rangeOps.add("limits", "Y[108:109], X[2:5], Z[1:1000], X[7:9], Y[103:105]");
+
+ RangeFilter filter;
+ filter.setOptions(rangeOps);
+ filter.setInput(reader);
+
+ PointTable table;
+ filter.prepare(table);
+ PointViewSet viewSet = filter.execute(table);
+ PointViewPtr view = *viewSet.begin();
+
+ EXPECT_EQ(1u, viewSet.size());
+ EXPECT_EQ(5u, view->size());
+ EXPECT_EQ(view->getFieldAs<int>(Dimension::Id::X, 0), 3);
+ EXPECT_EQ(view->getFieldAs<int>(Dimension::Id::X, 1), 4);
+ EXPECT_EQ(view->getFieldAs<int>(Dimension::Id::X, 2), 5);
+ EXPECT_EQ(view->getFieldAs<int>(Dimension::Id::X, 3), 8);
+ EXPECT_EQ(view->getFieldAs<int>(Dimension::Id::X, 4), 9);
}
diff --git a/test/unit/filters/StatsFilterTest.cpp b/test/unit/filters/StatsFilterTest.cpp
index 901d142..299fe47 100644
--- a/test/unit/filters/StatsFilterTest.cpp
+++ b/test/unit/filters/StatsFilterTest.cpp
@@ -167,17 +167,17 @@ TEST(Stats, metadata)
{
if (findNode(*mi, "name", "X").valid())
{
- EXPECT_EQ(mi->findChild("average").value(), "1");
- EXPECT_EQ(mi->findChild("minimum").value(), "1");
- EXPECT_EQ(mi->findChild("maximum").value(), "1");
- EXPECT_EQ(mi->findChild("count").value(), "1000");
+ EXPECT_DOUBLE_EQ(mi->findChild("average").value<double>(), 1.0);
+ EXPECT_DOUBLE_EQ(mi->findChild("minimum").value<double>(), 1.0);
+ EXPECT_DOUBLE_EQ(mi->findChild("maximum").value<double>(), 1.0);
+ EXPECT_DOUBLE_EQ(mi->findChild("count").value<double>(), 1000.0);
}
if (findNode(*mi, "name", "Z").valid())
{
- EXPECT_EQ(mi->findChild("average").value(), "3");
- EXPECT_EQ(mi->findChild("minimum").value(), "3");
- EXPECT_EQ(mi->findChild("maximum").value(), "3");
- EXPECT_EQ(mi->findChild("count").value(), "1000");
+ EXPECT_DOUBLE_EQ(mi->findChild("average").value<double>(), 3.0);
+ EXPECT_DOUBLE_EQ(mi->findChild("minimum").value<double>(), 3.0);
+ EXPECT_DOUBLE_EQ(mi->findChild("maximum").value<double>(), 3.0);
+ EXPECT_DOUBLE_EQ(mi->findChild("count").value<double>(), 1000.0);
}
}
}
diff --git a/test/unit/io/bpf/BPFTest.cpp b/test/unit/io/bpf/BPFTest.cpp
index 7fcc40a..b81d7dd 100644
--- a/test/unit/io/bpf/BPFTest.cpp
+++ b/test/unit/io/bpf/BPFTest.cpp
@@ -553,3 +553,68 @@ TEST(BPFTest, flex2)
r.setOptions(ops);
EXPECT_EQ(r.preview().m_pointCount, 1065u);
}
+
+TEST(BPFTest, outputdims)
+{
+ Options ops;
+ ops.add("filename", Support::datapath("bpf/autzen-dd.bpf"));
+
+ BpfReader reader;
+ reader.setOptions(ops);
+
+ std::string testfile(Support::temppath("test.bpf"));
+
+ FileUtils::deleteFile(testfile);
+ Options writerOps;
+ writerOps.add("filename", testfile);
+ writerOps.add("output_dims", "X, Y, Z, Red, Green");
+
+ BpfWriter writer;
+ writer.setInput(reader);
+ writer.setOptions(writerOps);
+
+ PointTable t;
+ writer.prepare(t);
+ writer.execute(t);
+
+ Options o2;
+ o2.add("filename", testfile);
+
+ BpfReader r;
+ r.setOptions(o2);
+
+ PointTable t2;
+ r.prepare(t2);
+
+ StringList dimNames;
+ Dimension::IdList dimList = t2.layout()->dims();
+ EXPECT_EQ(dimList.size(), 5u);
+ for (auto di : dimList)
+ dimNames.push_back(t2.layout()->dimName(di));
+
+ const char *dims[] =
+ {
+ "Green",
+ "Red",
+ "X",
+ "Y",
+ "Z"
+ };
+
+ std::sort(dimNames.begin(), dimNames.end());
+ EXPECT_TRUE(CheckEqualCollections(dimNames.begin(),
+ dimNames.end(), std::begin(dims)));
+
+ Options o3;
+ o3.add("filename", testfile);
+ o3.add("output_dims", "Y, Z, Red, Green");
+
+ BpfWriter w3;
+ w3.setOptions(o3);
+
+ // Missing X dimension.
+ PointTable t3;
+ EXPECT_THROW(w3.prepare(t3), pdal_error);
+
+}
+
diff --git a/test/unit/io/faux/FauxReaderTest.cpp b/test/unit/io/faux/FauxReaderTest.cpp
index f0195dd..365e8a3 100644
--- a/test/unit/io/faux/FauxReaderTest.cpp
+++ b/test/unit/io/faux/FauxReaderTest.cpp
@@ -214,3 +214,26 @@ TEST(FauxReaderTest, test_return_number)
EXPECT_EQ(numberOfReturns, 9);
}
}
+
+
+TEST(FauxReaderTest, one_point)
+{
+ Options ops;
+
+ ops.add("bounds", BOX3D(1, 2, 3, 1, 2, 3));
+ ops.add("count", 1);
+ ops.add("mode", "ramp");
+ FauxReader reader;
+ reader.setOptions(ops);
+
+ PointTable table;
+ reader.prepare(table);
+ PointViewSet viewSet = reader.execute(table);
+ EXPECT_EQ(viewSet.size(), 1u);
+ PointViewPtr view = *viewSet.begin();
+ EXPECT_EQ(view->size(), 1u);
+
+ EXPECT_EQ(1, view->getFieldAs<int>(Dimension::Id::X, 0));
+ EXPECT_EQ(2, view->getFieldAs<int>(Dimension::Id::Y, 0));
+ EXPECT_EQ(3, view->getFieldAs<int>(Dimension::Id::Z, 0));
+}
diff --git a/test/unit/filters/MergeTest.cpp b/test/unit/io/ilvis2/Ilvis2ReaderTest.cpp
similarity index 59%
copy from test/unit/filters/MergeTest.cpp
copy to test/unit/io/ilvis2/Ilvis2ReaderTest.cpp
index bee0b74..0eb2c1a 100644
--- a/test/unit/filters/MergeTest.cpp
+++ b/test/unit/io/ilvis2/Ilvis2ReaderTest.cpp
@@ -1,5 +1,5 @@
/******************************************************************************
-* Copyright (c) 2014, Hobu Inc., hobu.inc at gmail.com
+* Copyright (c) 2015, Howard Butler (howard at hobu.co)
*
* All rights reserved.
*
@@ -34,23 +34,55 @@
#include <pdal/pdal_test_main.hpp>
-#include <pdal/PipelineManager.hpp>
+#include <pdal/Options.hpp>
#include <pdal/PipelineReader.hpp>
+#include <pdal/PipelineManager.hpp>
+#include <pdal/PointView.hpp>
+
+#include <Ilvis2Reader.hpp>
#include "Support.hpp"
-TEST(MergeTest, test1)
+using namespace pdal;
+
+void checkPoint(const PointView& data, PointId index, double time,
+ double latitude, double longitude, double altitude)
{
- using namespace pdal;
+ auto checkDimension = [&data,index](Dimension::Id::Enum dim,
+ double expected)
+ {
+ double actual = data.getFieldAs<double>(dim, index);
+ EXPECT_FLOAT_EQ(expected, actual);
+ };
- PipelineManager mgr;
- PipelineReader specReader(mgr);
- specReader.readPipeline(Support::configuredpath("filters/merge.xml"));
- mgr.execute();
+ checkDimension(Dimension::Id::Y, latitude);
+ checkDimension(Dimension::Id::X, longitude);
+ checkDimension(Dimension::Id::Z, altitude);
+ checkDimension(Dimension::Id::GpsTime, time);
+}
- PointViewSet viewSet = mgr.views();
+TEST(Ilvis2ReaderTest, testRead)
+{
+ Option filename("filename", Support::datapath("ilvis2/ILVIS2_GL2009_0414_R1401_042504.TXT"), "");
+ Options options(filename);
+ std::shared_ptr<Ilvis2Reader> reader(new Ilvis2Reader);
+ reader->setOptions(options);
+ PointTable table;
+
+ reader->prepare(table);
+ PointViewSet viewSet = reader->execute(table);
EXPECT_EQ(viewSet.size(), 1u);
PointViewPtr view = *viewSet.begin();
- EXPECT_EQ(view->size(), 2130u);
+
+ EXPECT_EQ(view->size(), 998u);
+
+ checkPoint(*view.get(), 0, 42504.48313,
+ 78.307673,121.21479,1956.583
+ );
+
+ checkPoint(*view.get(), 996, 42520.90035,
+ 78.320149, 121.32024, 1959.206
+ );
}
+
diff --git a/test/unit/io/las/LasReaderTest.cpp b/test/unit/io/las/LasReaderTest.cpp
index e967dcd..269671c 100644
--- a/test/unit/io/las/LasReaderTest.cpp
+++ b/test/unit/io/las/LasReaderTest.cpp
@@ -393,6 +393,53 @@ TEST(LasReaderTest, callback)
EXPECT_EQ(count, (point_count_t)1065);
}
+#ifdef PDAL_HAVE_LAZPERF
+// LAZ files are normally written in chunks of 50,000, so a file of size
+// 110,000 ensures we read some whole chunks and a partial.
+TEST(LasReaderTest, lazperf)
+{
+ Options ops1;
+ ops1.add("filename", Support::datapath("laz/autzen_trim.laz"));
+ ops1.add("compression", "lazperf");
+
+ LasReader lazReader;
+ lazReader.setOptions(ops1);
+
+ PointTable t1;
+ lazReader.prepare(t1);
+ PointViewSet pbSet = lazReader.execute(t1);
+ EXPECT_EQ(pbSet.size(), 1UL);
+ PointViewPtr view1 = *pbSet.begin();
+ EXPECT_EQ(view1->size(), (point_count_t)110000);
+
+ Options ops2;
+ ops2.add("filename", Support::datapath("las/autzen_trim.las"));
+
+ LasReader lasReader;
+ lasReader.setOptions(ops2);
+
+ PointTable t2;
+ lasReader.prepare(t2);
+ pbSet = lasReader.execute(t2);
+ EXPECT_EQ(pbSet.size(), 1UL);
+ PointViewPtr view2 = *pbSet.begin();
+ EXPECT_EQ(view2->size(), (point_count_t)110000);
+
+ DimTypeList dims = view1->dimTypes();
+ size_t pointSize = view1->pointSize();
+ EXPECT_EQ(view1->pointSize(), view2->pointSize());
+ // Validate some point data.
+ std::unique_ptr<char> buf1(new char[pointSize]);
+ std::unique_ptr<char> buf2(new char[pointSize]);
+ for (PointId i = 0; i < 110000; i += 100)
+ {
+ view1->getPackedPoint(dims, i, buf1.get());
+ view2->getPackedPoint(dims, i, buf2.get());
+ EXPECT_EQ(memcmp(buf1.get(), buf2.get(), pointSize), 0);
+ }
+}
+#endif
+
// The header of 1.2-with-color-clipped says that it has 1065 points,
// but it really only has 1064.
diff --git a/test/unit/io/las/LasWriterTest.cpp b/test/unit/io/las/LasWriterTest.cpp
index 7f2c96f..acb83e9 100644
--- a/test/unit/io/las/LasWriterTest.cpp
+++ b/test/unit/io/las/LasWriterTest.cpp
@@ -41,6 +41,7 @@
#include <LasHeader.hpp>
#include <LasReader.hpp>
#include <LasWriter.hpp>
+#include <BpfReader.hpp>
#include <pdal/PointView.hpp>
#include <pdal/StageFactory.hpp>
@@ -127,10 +128,13 @@ TEST(LasWriterTest, auto_offset)
table.layout()->registerDim(Id::X);
+ BufferReader bufferReader;
+
PointViewPtr view(new PointView(table));
view->setField(Id::X, 0, 125000.00);
view->setField(Id::X, 1, 74529.00);
view->setField(Id::X, 2, 523523.02);
+ bufferReader.addView(view);
Options writerOps;
writerOps.add("filename", FILENAME);
@@ -139,12 +143,10 @@ TEST(LasWriterTest, auto_offset)
LasWriter writer;
writer.setOptions(writerOps);
+ writer.setInput(bufferReader);
writer.prepare(table);
-
- WriterWrapper::ready(writer, table);
- WriterWrapper::write(writer, view);
- WriterWrapper::done(writer, table);
+ writer.execute(table);
Options readerOps;
readerOps.add("filename", FILENAME);
@@ -207,12 +209,13 @@ TEST(LasWriterTest, extra_dims)
Options reader2Ops;
reader2Ops.add("filename", Support::temppath("simple.las"));
reader2Ops.add("extra_dims", "R1 =int32, B1= int16 ,G1=int32_t");
- std::shared_ptr<LasReader> reader2(new LasReader);
- reader2->setOptions(reader2Ops);
+
+ LasReader reader2;
+ reader2.setOptions(reader2Ops);
PointTable readTable;
- reader2->prepare(readTable);
- viewSet = reader2->execute(readTable);
+ reader2.prepare(readTable);
+ viewSet = reader2.execute(readTable);
pb = *viewSet.begin();
Dimension::Id::Enum r1 = readTable.layout()->findDim("R1");
EXPECT_TRUE(r1 != Dimension::Id::Unknown);
@@ -231,6 +234,60 @@ TEST(LasWriterTest, extra_dims)
}
}
+TEST(LasWriterTest, all_extra_dims)
+{
+ Options readerOps;
+
+ readerOps.add("filename", Support::datapath("bpf/simple-extra.bpf"));
+ BpfReader reader;
+ reader.setOptions(readerOps);
+
+ FileUtils::deleteFile(Support::temppath("simple.las"));
+
+ Options writerOps;
+ writerOps.add("extra_dims", "all");
+ writerOps.add("filename", Support::temppath("simple.las"));
+ writerOps.add("minor_version", 4);
+ LasWriter writer;
+ writer.setInput(reader);
+ writer.setOptions(writerOps);
+
+ PointTable table;
+ writer.prepare(table);
+ writer.execute(table);
+
+ Options ops;
+ ops.add("filename", Support::temppath("simple.las"));
+
+ LasReader r;
+ r.setOptions(ops);
+
+ PointTable t2;
+ r.prepare(t2);
+ Dimension::Id::Enum foo = t2.layout()->findDim("Foo");
+ Dimension::Id::Enum bar = t2.layout()->findDim("Bar");
+ Dimension::Id::Enum baz = t2.layout()->findDim("Baz");
+
+ PointViewSet s = r.execute(t2);
+ EXPECT_EQ(s.size(), 1u);
+ PointViewPtr v = *s.begin();
+
+ // We test for floats instead of doubles because when X, Y and Z
+ // get written, they are written scaled, which loses precision. The
+ // foo, bar and baz values are written as full-precision doubles.
+ for (PointId i = 0; i < v->size(); ++i)
+ {
+ using namespace Dimension;
+
+ EXPECT_FLOAT_EQ(v->getFieldAs<float>(Id::X, i),
+ v->getFieldAs<float>(foo, i));
+ EXPECT_FLOAT_EQ(v->getFieldAs<float>(Id::Y, i),
+ v->getFieldAs<float>(bar, i));
+ EXPECT_FLOAT_EQ(v->getFieldAs<float>(Id::Z, i),
+ v->getFieldAs<float>(baz, i));
+ }
+}
+
// Merge a couple of 1.4 LAS files with point formats 1 and 6. Write the
// output with version 3. Verify that you get point format 3 (default),
// LAS 1.3 output and other header data forwarded.
@@ -461,6 +518,76 @@ TEST(LasWriterTest, flex2)
EXPECT_EQ(r.preview().m_pointCount, 1065u);
}
+#if defined(PDAL_HAVE_LAZPERF) && defined(PDAL_HAVE_LASZIP)
+// LAZ files are normally written in chunks of 50,000, so a file of size
+// 110,000 ensures we read some whole chunks and a partial.
+TEST(LasWriterTest, lazperf)
+{
+ Options readerOps;
+ readerOps.add("filename", Support::datapath("las/autzen_trim.las"));
+
+ LasReader lazReader;
+ lazReader.setOptions(readerOps);
+
+ std::string testfile(Support::temppath("temp.laz"));
+
+ FileUtils::deleteFile(testfile);
+
+ Options writerOps;
+ writerOps.add("filename", testfile);
+ writerOps.add("compression", "lazperf");
+
+ LasWriter lazWriter;
+ lazWriter.setOptions(writerOps);
+ lazWriter.setInput(lazReader);
+
+ PointTable t;
+ lazWriter.prepare(t);
+ lazWriter.execute(t);
+
+ // Now test the points were properly written. Use laszip.
+ Options ops1;
+ ops1.add("filename", testfile);
+
+ LasReader r1;
+ r1.setOptions(ops1);
+
+ PointTable t1;
+ r1.prepare(t1);
+ PointViewSet set1 = r1.execute(t1);
+ PointViewPtr view1 = *set1.begin();
+
+ Options ops2;
+ ops2.add("filename", Support::datapath("las/autzen_trim.las"));
+
+ LasReader r2;
+ r2.setOptions(ops2);
+
+ PointTable t2;
+ r2.prepare(t2);
+ PointViewSet set2 = r2.execute(t2);
+ PointViewPtr view2 = *set2.begin();
+
+ EXPECT_EQ(view1->size(), view2->size());
+ EXPECT_EQ(view1->size(), (point_count_t)110000);
+
+ DimTypeList dims = view1->dimTypes();
+ size_t pointSize = view1->pointSize();
+ EXPECT_EQ(view1->pointSize(), view2->pointSize());
+
+ // Validate some point data.
+ std::unique_ptr<char> buf1(new char[pointSize]);
+ std::unique_ptr<char> buf2(new char[pointSize]);
+ for (PointId i = 0; i < view1->pointSize(); i += 100)
+ {
+ view1->getPackedPoint(dims, i, buf1.get());
+ view2->getPackedPoint(dims, i, buf2.get());
+ EXPECT_EQ(memcmp(buf1.get(), buf2.get(), pointSize), 0);
+ }
+}
+#endif
+
+
/**
namespace
{
@@ -522,57 +649,6 @@ TEST(LasWriterTest, simple)
//ABELL
/**
-TEST(LasWriterTest, LasWriterTest_test_simple_laz)
-{
- PointTable table;
-
- WriterOpts writerOpts;
- writerOpts.add("compressed", true);
- writerOpts.add("creation_year", 0);
- writerOpts.add("creation_doy", 0);
- writerOpts.add("system_id", "");
- writerOpts.add("software_id", "TerraScan");
-
-
- // remove file from earlier run, if needed
- FileUtils::deleteFile("laszip/LasWriterTest_test_simple_laz.laz");
-
- LasReader reader(Support::datapath("laszip/basefile.las"));
-
- std::ostream* ofs = FileUtils::createFile(
- Support::temppath("LasWriterTest_test_simple_laz.laz"));
-
- // need to scope the writer, so that's it dtor can use the stream
- std::shared_ptr<LasWriter> writer(new LasWriter)(ofs);
- writer->setOptions(writer);
- writer->setInput(&reader);
-
- writer->prepare(table);
- writer->execute(table);
-
- FileUtils::closeFile(ofs);
-
- {
- LasReader reader(
- Support::temppath("LasWriterTest_test_simple_laz.laz"));
- }
-
- // these two files only differ by the description string in the VLR.
- // This now skips the entire LASzip VLR for comparison.
- const uint32_t numdiffs =Support::diff_files(
- Support::temppath("LasWriterTest_test_simple_laz.laz"),
- Support::datapath("laszip/laszip-generated.laz"),
- 227, 106);
- EXPECT_EQ(numdiffs, 0u);
-
- if (numdiffs == 0)
- FileUtils::deleteFile(
- Support::temppath("LasWriterTest_test_simple_laz.laz"));
-}
-**/
-
-//ABELL
-/**
static void test_a_format(const std::string& refFile, uint8_t majorVersion,
uint8_t minorVersion, int pointFormat)
{
diff --git a/vendor/rply-1.1.3/LICENSE b/vendor/rply-1.1.4/LICENSE
similarity index 94%
rename from vendor/rply-1.1.3/LICENSE
rename to vendor/rply-1.1.4/LICENSE
index 5c07c9a..ca893cb 100644
--- a/vendor/rply-1.1.3/LICENSE
+++ b/vendor/rply-1.1.4/LICENSE
@@ -1,5 +1,5 @@
-RPly 1.1.3 license
-Copyright � 2003-2013 Diego Nehab.
+RPly 1.1.4 license
+Copyright � 2003-2015 Diego Nehab.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
diff --git a/vendor/rply-1.1.3/etc/convert.c b/vendor/rply-1.1.4/etc/convert.c
similarity index 100%
rename from vendor/rply-1.1.3/etc/convert.c
rename to vendor/rply-1.1.4/etc/convert.c
diff --git a/vendor/rply-1.1.3/etc/dump.c b/vendor/rply-1.1.4/etc/dump.c
similarity index 100%
rename from vendor/rply-1.1.3/etc/dump.c
rename to vendor/rply-1.1.4/etc/dump.c
diff --git a/vendor/rply-1.1.3/etc/input.ply b/vendor/rply-1.1.4/etc/input.ply
similarity index 100%
rename from vendor/rply-1.1.3/etc/input.ply
rename to vendor/rply-1.1.4/etc/input.ply
diff --git a/vendor/rply-1.1.3/etc/sconvert.c b/vendor/rply-1.1.4/etc/sconvert.c
similarity index 100%
rename from vendor/rply-1.1.3/etc/sconvert.c
rename to vendor/rply-1.1.4/etc/sconvert.c
diff --git a/vendor/rply-1.1.3/manual/manual.html b/vendor/rply-1.1.4/manual/manual.html
similarity index 79%
rename from vendor/rply-1.1.3/manual/manual.html
rename to vendor/rply-1.1.4/manual/manual.html
index 62f5b95..fa8e9f5 100644
--- a/vendor/rply-1.1.3/manual/manual.html
+++ b/vendor/rply-1.1.4/manual/manual.html
@@ -35,7 +35,7 @@ RPly: ANSI C library for PLY file format input and output
<p>RPly is a library that lets applications read and write PLY files. The
PLY file format is widely used to store geometric information, such as 3D
-models, but is general enough to be useful for other purposes.
+models, but is general enough to be useful for other purposes.
</p>
<p>There are other libraries out there, of course. I tried using them and
@@ -46,23 +46,23 @@ hope you are as happy with it as I am. </p>
open-source, ANSI C, efficient, and well tested. I will keep supporting it
for a while because all my tools use the library for input/output. The highlights are: </p>
<ul>
-<li> A callback mechanism that makes PLY file input straightforward;
-<li> Support for the full range of numeric formats though the user only
+<li> A callback mechanism that makes PLY file input straightforward;
+<li> Support for the full range of numeric formats though the user only
deals with doubles;
<li> Binary (big and little endian) and text modes are fully supported;
<li> Input and output are buffered for efficiency;
-<li> Available under the
-<a href=http://www.opensource.org/licenses/mit-license.html>MIT license</a>
+<li> Available under the
+<a href=http://www.opensource.org/licenses/mit-license.html>MIT license</a>
for added freedom.
</ul>
<p>
The format was developed at <a
-href=http://graphics.stanford.edu/data/3Dscanrep/>Stanford University</a>
+href=http://graphics.stanford.edu/data/3Dscanrep/>Stanford University</a>
for use with their 3D scanning projects. Greg Turk's PLY library, available
from <a href=http://www.cc.gatech.edu/projects/large_models>
Georgia Institute of Technology</a>, seems to be the standard reference
-to the PLY file format, although there are some variations out there.
+to the PLY file format, although there are some variations out there.
</p>
<p> Whatever documentation and examples were found, were taken into
@@ -73,20 +73,25 @@ In practice, the library works with all PLY files that I could find. </p>
<h2>Download</h2>
<p>
-Version 1.1.3 of RPly is available for download in source
-code from <a href=rply-1.1.3.tar.gz>this link</a>. Examples and documentation
+Version 1.1.4 of RPly is available for download in source
+code from <a href=rply-1.1.4.tar.gz>this link</a>. Examples and documentation
are packed inside the tarball. Have fun!
</p>
<p>
-Copyright © 2003-2013 Diego Nehab. All rights reserved. <br>
+Copyright © 2003-2015 Diego Nehab. All rights reserved. <br>
Author: <A href="http://www.impa.br/~diego">Diego Nehab</a>
</p>
<h2>What's new?</h2>
<ul>
-<li> Remove trailing white space from lines in ASCII output.
+<li> Fixed bug that prevented reading of ASCII files that
+are not terminated by a whitespace;
+<li> Added <tt>ply_open_from_file</tt> and
+<tt>ply_create_to_file</tt> variants to <tt>ply_open</tt>
+and <tt>ply_create</tt>, respectively, that receive file
+pointers instead of file names.
</ul>
<h2> RPly's idea of what a PLY file is </h2>
@@ -105,20 +110,20 @@ of its properties. Properties values also appear in the order of their
declaration. Here is a sample PLY file describing a triangle: </p>
<pre class=example>
-ply
+ply
format ascii 1.0
comment this is a simple file
obj_info any data, in one line of free form text
element vertex 3
property float x
property float y
-property float z
+property float z
element face 1
property list uchar int vertex_indices
end_header
-1 0 0
0 1 0
- 1 0 0
+ 1 0 0
3 0 1 2
</pre>
@@ -158,7 +163,7 @@ instance will be given. This element consists of a <tt>list</tt> property,
named <tt>vertex_indices</tt>. Lists are sequences on which the
first value, the <em>length</em>, gives the number of remaining values. List properties are described by the scalar
type of their length field and the scalar type of the remaining fields.
-In the case of <tt>vertex_indices</tt>, the length field
+In the case of <tt>vertex_indices</tt>, the length field
is of type <tt>uchar</tt> and the remaining values are of type
<tt>int</tt>. </p>
@@ -166,7 +171,7 @@ is of type <tt>uchar</tt> and the remaining values are of type
declared in the header. First come the 3 elements of type <tt>vertex</tt>,
each represented by the value of their properties <tt>x</tt>, <tt>y</tt>
and <tt>z</tt>. Then comes the single <tt>face</tt> element, composed by a
-single list of type <tt>vertex_indices</tt> containing 3 values
+single list of type <tt>vertex_indices</tt> containing 3 values
(0 1 2).</p>
<h2> How to read a file with RPly </h2>
@@ -183,7 +188,7 @@ header come the vertices, and finally the triangles. Here is the sample
code for the program:</p>
<pre class=example>
-#include <stdio.h>
+#include <stdio.h>
#include "rply.h"
static int vertex_cb(p_ply_argument argument) {
@@ -200,13 +205,13 @@ static int face_cb(p_ply_argument argument) {
ply_get_argument_property(argument, NULL, &length, &value_index);
switch (value_index) {
case 0:
- case 1:
+ case 1:
printf("%g ", ply_get_argument_value(argument));
break;
case 2:
printf("%g\n", ply_get_argument_value(argument));
break;
- default:
+ default:
break;
}
return 1;
@@ -232,9 +237,9 @@ int main(void) {
can be associated with each property of each element. For scalar
properties, the callback is invoked once for each instance. For list
properties, the callback is invoked first with the number of
-entries in the instance, and then once for each of the data entries.
+entries in the instance, and then once for each of the data entries.
<em>This is exactly the order in which the data items appear in the
-file.</em></p>
+file.</em></p>
<p> To keep things simple, values are always passed as <tt>double</tt>,
regardless of how they are stored in the file. From its parameters,
@@ -250,7 +255,7 @@ of the <tt>vertex</tt> element properties and the <tt>face</tt> property
(using <tt>ply_set_read_cb</tt>). Finally, we invoke the main RPly reading
function, <tt>ply_read</tt>. This function reads all data in the file,
passing the data to the appropriate callbacks. After all reading is done,
-we call <tt>ply_close</tt> to release any resources used by RPly.</p>
+we call <tt>ply_close</tt> to release any resources used by RPly.</p>
<p>There are some details, of course. <tt>Ply_set_read_cb</tt> returns the
number of instances of the target property (which is the same as the number
@@ -266,7 +271,7 @@ property (notice the last argument of <tt>ply_set_read_cb</tt>).</p>
<p><tt>Vertex_cb</tt> gets the user data and the property value from it's
argument and prints accordingly. The <tt>face_cb</tt> callback is a bit
more complicated because lists are more complicated. Since the
-simple file format only supports triangles, it only prints the first
+simple file format only supports triangles, it only prints the first
3 list values, after which it breaks the line. </p>
<p> The output of the program, as expected, is: </p>
@@ -302,10 +307,10 @@ properties, we add comments and obj_infos. We then write the header with
one by one, with calls to <tt>ply_write</tt>, <em>in the same order they
are to appear in the file</em>. Again, to simplify things, this function
receives data as <tt>double</tt> and performs the needed conversion. Here
-is the code for the example: </p>
+is the code for the example: </p>
<pre class=example>
-#include <stdio.h>
+#include <stdio.h>
#include "rply.h"
static int callback(p_ply_argument argument) {
@@ -330,13 +335,13 @@ static int setup_callbacks(p_ply iply, p_ply oply) {
while ((property = ply_get_next_property(element, property))) {
const char *property_name;
e_ply_type type, length_type, value_type;
- ply_get_property_info(property, &property_name, &type,
+ ply_get_property_info(property, &property_name, &type,
&length_type, &value_type);
/* setup input callback for this property */
- if (!ply_set_read_cb(iply, element_name, property_name, callback,
+ if (!ply_set_read_cb(iply, element_name, property_name, callback,
oply, 0)) return 0;
/* add this property to output file */
- if (!ply_add_property(oply, property_name, type, length_type,
+ if (!ply_add_property(oply, property_name, type, length_type,
value_type)) return 0;
}
}
@@ -345,26 +350,26 @@ static int setup_callbacks(p_ply iply, p_ply oply) {
int main(int argc, char *argv[]) {
const char *value;
- p_ply iply, oply;
+ p_ply iply, oply;
iply = ply_open("input.ply", NULL, 0, NULL);
- if (!iply) return 1;
- if (!ply_read_header(iply)) return 1;
+ if (!iply) return 1;
+ if (!ply_read_header(iply)) return 1;
oply = ply_create("output.ply", PLY_LITTLE_ENDIAN, NULL, 0, NULL);
if (!oply) return 1;
- if (!setup_callbacks(iply, oply)) return 1;
+ if (!setup_callbacks(iply, oply)) return 1;
/* pass comments and obj_infos from input to output */
value = NULL;
while ((value = ply_get_next_comment(iply, value)))
- if (!ply_add_comment(oply, value)) return 1;
+ if (!ply_add_comment(oply, value)) return 1;
value = NULL;
while ((value = ply_get_next_obj_info(iply, value)))
if (!ply_add_obj_info(oply, value)) return 1;;
/* write output header */
- if (!ply_write_header(oply)) return 1;
+ if (!ply_write_header(oply)) return 1;
/* read input file generating callbacks that pass data to output file */
- if (!ply_read(iply)) return 1;
+ if (!ply_read(iply)) return 1;
/* close up, we are done */
- if (!ply_close(iply)) return 1;
+ if (!ply_close(iply)) return 1;
if (!ply_close(oply)) return 1;
return 0;
}
@@ -393,7 +398,7 @@ locale for numeric formatting. RPly relies on library
functions (such as <tt>fprintf</tt> and <tt>strtod</tt>)
that are affected by the current locale. If your software
modifies the locale (or if it uses another library/toolkit that
-does) and you use RPly under the modified locale, you may be
+does) and you use RPly under the modified locale, you may be
unable to read or write properly formatted ASCII PLY files.
</p>
@@ -431,11 +436,11 @@ and returns a handle to it.
<p class=arguments>
<tt>Name</tt> is the file name, and <tt>error_cb</tt> is a function to
-be called when an error is found.
+be called when an error is found.
Arguments <tt>idata</tt>
and <tt>pdata</tt> are available to the error callback via the
-<a href=#ply_get_ply_user_data><tt>ply_get_ply_user_data</tt></a>
-function.
+<a href=#ply_get_ply_user_data><tt>ply_get_ply_user_data</tt></a>
+function.
If <tt>error_cb</tt> is NULL, the default
error callback is used. It prints a message to the standard error stream.
</p>
@@ -449,6 +454,41 @@ Note: <tt>Error_cb</tt> is of type <tt>void
(*p_ply_error_cb)(p_ply ply, const char *message)</tt>.
</p>
+<!-- ply_open_from_file ++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_open_from_file>
+p_ply <b>ply_open_from_file</b>(FILE *file_pointer, p_ply_error_cb error_cb, long idata, void *pdata)
+</p>
+
+<p class=description>
+Checks if the FILE pointer points to a valid PLY file and returns a
+handle to it. The handle can be used wherever a handle returned by <a
+href=#ply_open><tt>ply_open</tt></a> is accepted.
+</p>
+
+<p class=arguments>
+<tt>File_pointer</tt> is the FILE pointer open for reading, and <tt>error_cb</tt> is a function to be called when an error is found.
+Arguments <tt>idata</tt>
+and <tt>pdata</tt> are available to the error callback via the
+<a href=#ply_get_ply_user_data><tt>ply_get_ply_user_data</tt></a>
+function.
+If <tt>error_cb</tt> is NULL, the default
+error callback is used. It prints a message to the standard error stream.
+</p>
+
+<p class=return>
+Returns a handle to the file or NULL on error.
+</p>
+
+<p class=note>
+Note: <tt>Error_cb</tt> is of type <tt>void
+ (*p_ply_error_cb)(p_ply ply, const char *message)</tt>.
+</p>
+
+<p class=note>
+Note: This function is declared in header <tt>rplyfile.h</tt>.
+</p>
+
<!-- ply_get_ply_user_data ++++++++++++++++++++++++++++++++++++++++ -->
<p class=name id=ply_get_ply_user_data>
@@ -456,7 +496,7 @@ int <b>ply_get_ply_user_data</b>(p_ply_ply ply, void *pdata, long *idata)
</p>
<p class=description>
-Retrieves user data from the ply handle.
+Retrieves user data from the ply handle.
</p>
<p class=arguments>
@@ -467,7 +507,7 @@ Retrieves user data from the ply handle.
</p>
<p class=return>
-Returns 1 in case of success, 0 otherwise.
+Returns 1 in case of success, 0 otherwise.
</p>
@@ -478,22 +518,23 @@ int <b>ply_read_header</b>(p_ply ply)
</p>
<p class=description>
-Reads and parses the header of a PLY file.
-After a call to this function, the query functions
+Reads and parses the header of a PLY file.
+After a call to this function, the query functions
<a href=#ply_get_next_element><tt>ply_get_next_element</tt></a>,
<a href=#ply_get_next_property><tt>ply_get_next_property</tt></a>,
<a href=#ply_get_next_comment><tt>ply_get_next_comment</tt></a>, and
<a href=#ply_get_next_obj_info><tt>ply_get_next_obj_info</tt></a> can be
-called. Callbacks can also be set with the
-<a href=#ply_set_read_cb><tt>ply_set_read_cb</tt></a> function.
+called. Callbacks can also be set with the
+<a href=#ply_set_read_cb><tt>ply_set_read_cb</tt></a> function.
</p>
<p class=arguments>
-<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>.
+<tt>Ply</tt> is a handle returned by <a
+href=#ply_open><tt>ply_open</tt></a>.
</p>
<p class=return>
-Returns 1 in case of success, 0 otherwise.
+Returns 1 in case of success, 0 otherwise.
</p>
<!-- ply_set_read_cb +++++++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -518,35 +559,35 @@ Sets up the callback to be invoked when the value of a property is read.
<tt>Element_name</tt> and <tt>property_name</tt> are the names of the
element and property of interest. <tt>Read_cb</tt> is the callback
function. <tt>Pdata</tt> and <tt>idata</tt> are user data to be passed to
-the callback function.
+the callback function.
</p>
<p class=return>
-Returns the number of instances of the element of interest.
+Returns the number of instances of the element of interest.
</p>
<p class=note>
-Note: <tt>Read_cb</tt> is of type
-<tt>int (*p_ply_read_cb)(p_ply_argument argument)</tt>.
-The callback should return 1 to continue the reading process,
-or return 0 to abort.
+Note: <tt>Read_cb</tt> is of type
+<tt>int (*p_ply_read_cb)(p_ply_argument argument)</tt>.
+The callback should return 1 to continue the reading process,
+or return 0 to abort.
<!-- ply_get_argument_element ++++++++++++++++++++++++++++++++++++++++ -->
<p class=name id=ply_get_argument_element>
int <b>ply_get_argument_element</b>(<br>
p_ply_argument argument,<br>
- p_ply_element *element,<br>
+ p_ply_element *element,<br>
long *instance_index<br>
)
</p>
<p class=description>
-Retrieves element information from the callback argument.
+Retrieves element information from the callback argument.
</p>
<p class=arguments>
-<tt>Argument</tt> is the handle passed to the callback.
+<tt>Argument</tt> is the handle passed to the callback.
<tt>Element</tt> receives a handle to the element
originating the callback. <tt>Instance_index</tt> receives
the index of the instance of the element
@@ -554,7 +595,7 @@ being read. <tt>Element</tt> and <tt>instance_index</tt> can be NULL.
</p>
<p class=return>
-Returns 1 in case of success, 0 otherwise.
+Returns 1 in case of success, 0 otherwise.
</p>
<p class=note>
@@ -574,11 +615,11 @@ int <b>ply_get_argument_property</b>(<br>
</p>
<p class=description>
-Retrieves property information from the callback argument.
+Retrieves property information from the callback argument.
</p>
<p class=arguments>
-<tt>Argument</tt> is the handle passed to the callback.
+<tt>Argument</tt> is the handle passed to the callback.
<tt>Property</tt> receives a handle to the property
originating the callback. <tt>Length</tt> receives the number
of values in the list property (1 for scalar properties).
@@ -589,7 +630,7 @@ gives the number of entries). <tt>Property</tt>, <tt>length</tt> and
</p>
<p class=return>
-Returns 1 in case of success, 0 otherwise.
+Returns 1 in case of success, 0 otherwise.
</p>
<p class=note>
@@ -605,7 +646,7 @@ int <b>ply_get_argument_user_data</b>(p_ply_argument argument, void *pdata,
</p>
<p class=description>
-Retrieves the user data from the callback argument.
+Retrieves the user data from the callback argument.
</p>
<p class=arguments>
@@ -616,7 +657,7 @@ Retrieves the user data from the callback argument.
</p>
<p class=return>
-Returns 1 in case of success, 0 otherwise.
+Returns 1 in case of success, 0 otherwise.
</p>
<!-- ply_get_argument_value +++++++++++++++++++++++++++++++++++++++++++ -->
@@ -626,7 +667,7 @@ double <b>ply_get_argument_value</b>(p_ply_argument argument)
</p>
<p class=description>
-Retrieves the property value from the callback argument.
+Retrieves the property value from the callback argument.
</p>
<p class=arguments>
@@ -634,7 +675,7 @@ Retrieves the property value from the callback argument.
</p>
<p class=return>
-Returns the property value.
+Returns the property value.
</p>
<!-- ply_read +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -644,15 +685,15 @@ int <b>ply_read</b>(p_ply ply)
</p>
<p class=description>
-Reads all data in file, calling appropriate callbacks.
+Reads all data in file, calling appropriate callbacks.
</p>
<p class=arguments>
-<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>.
+<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>.
</p>
<p class=return>
-Returns 1 in case of success, 0 otherwise.
+Returns 1 in case of success, 0 otherwise.
</p>
<!-- ply_get_next_element ++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -662,11 +703,11 @@ p_ply_element <b>ply_get_next_element</b>(p_ply ply, p_ply_element last)
</p>
<p class=description>
-Iterates over all elements on the header of a PLY file.
+Iterates over all elements on the header of a PLY file.
</p>
<p class=arguments>
-<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>.
+<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>.
<a href=#ply_read_header><tt>Ply_read_header</tt></a> must have been called
on the handle otherwise no elements will be found.
<tt>Last</tt> is NULL to retrieve the first element, and an element to
@@ -674,7 +715,7 @@ retrieve the next element.
</p>
<p class=return>
-Returns the next element, or NULL if no more elements.
+Returns the next element, or NULL if no more elements.
</p>
<p class=note>
@@ -689,17 +730,17 @@ p_ply_property <b>ply_get_next_property</b>(p_ply_element element, p_ply_propert
</p>
<p class=description>
-Iterates over all properties of an element.
+Iterates over all properties of an element.
</p>
<p class=arguments>
-<tt>Element</tt> is an element handle.
+<tt>Element</tt> is an element handle.
<tt>Last</tt> is NULL to retrieve the first property, and a property to
retrieve the next property.
</p>
<p class=return>
-Returns the next property, or NULL if no more properties.
+Returns the next property, or NULL if no more properties.
</p>
<p class=note>
@@ -714,11 +755,11 @@ const char *<b>ply_get_next_comment</b>(p_ply ply, const char *last)
</p>
<p class=description>
-Iterates over all comments on the header of a PLY file.
+Iterates over all comments on the header of a PLY file.
</p>
<p class=arguments>
-<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>.
+<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>.
<a href=#ply_read_header><tt>Ply_read_header</tt></a> must have been called
on the handle otherwise no comments will be found.
<tt>Last</tt> is NULL to retrieve the first comment, and a comment to
@@ -726,7 +767,7 @@ retrieve the next comment.
</p>
<p class=return>
-Returns the next comment, or NULL if no more comments.
+Returns the next comment, or NULL if no more comments.
</p>
<!-- ply_get_next_obj_info +++++++++++++++++++++++++++++++++++++++++++ -->
@@ -736,11 +777,11 @@ const char *<b>ply_get_next_obj_info</b>(p_ply ply, const char *last)
</p>
<p class=description>
-Iterates over all obj_infos on the header of a PLY file.
+Iterates over all obj_infos on the header of a PLY file.
</p>
<p class=arguments>
-<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>.
+<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>.
<a href=#ply_read_header><tt>Ply_read_header</tt></a> must have been called
on the handle otherwise no obj_infos will be found.
<tt>Last</tt> is NULL to retrieve the first obj_info, and a obj_info to
@@ -748,7 +789,7 @@ retrieve the next obj_info.
</p>
<p class=return>
-Returns the next obj_info, or NULL if no more obj_infos.
+Returns the next obj_info, or NULL if no more obj_infos.
</p>
<!-- ply_get_element_info ++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -759,18 +800,18 @@ int <b>ply_get_element_info</b>(p_ply_element element, const char** name,
</p>
<p class=description>
-Retrieves information from an element handle.
+Retrieves information from an element handle.
</p>
<p class=arguments>
-<tt>Element</tt> is the handle of the element of interest.
-<tt>Name</tt> receives the internal copy of the element name.
-<tt>Ninstances</tt> receives the number of instances of this element
+<tt>Element</tt> is the handle of the element of interest.
+<tt>Name</tt> receives the internal copy of the element name.
+<tt>Ninstances</tt> receives the number of instances of this element
in the file. Both <tt>name</tt> and <tt>ninstances</tt> can be NULL.
</p>
<p class=return>
-Returns 1 in case of success, 0 otherwise.
+Returns 1 in case of success, 0 otherwise.
</p>
<!-- ply_get_property_info +++++++++++++++++++++++++++++++++++++++++++ -->
@@ -786,30 +827,30 @@ int <b>ply_get_property_info</b>(<br>
</p>
<p class=description>
-Retrieves information from a property handle.
+Retrieves information from a property handle.
</p>
<p class=arguments>
-<tt>Property</tt> is the handle of the property of interest.
-<tt>Name</tt> receives the internal copy of the property name.
-<tt>Type</tt> receives the property type.
-<tt>Length_type</tt> receives the scalar type of the first entry
-in a list property (the one that gives the number of entries).
-<tt>Value_type</tt> receives the scalar type of the remaining list entries.
+<tt>Property</tt> is the handle of the property of interest.
+<tt>Name</tt> receives the internal copy of the property name.
+<tt>Type</tt> receives the property type.
+<tt>Length_type</tt> receives the scalar type of the first entry
+in a list property (the one that gives the number of entries).
+<tt>Value_type</tt> receives the scalar type of the remaining list entries.
<tt>Name</tt>, <tt>type</tt>, <tt>length_type</tt>, and
<tt>value_type</tt> can be NULL.
</p>
<p class=return>
-Returns 1 in case of success, 0 otherwise.
+Returns 1 in case of success, 0 otherwise.
</p>
-<p class=note>
+<p class=note>
Note: <tt>Length_type</tt> and <tt>value_type</tt> can
receive any of the constants for scalar types defined in
<tt>e_ply_type</tt>. <tt>Type</tt> can, in addition, be <tt>PLY_LIST</tt>,
in which case the property is a list property and the fields
-<tt>length_type</tt> and <tt>value_type</tt> become meaningful.
+<tt>length_type</tt> and <tt>value_type</tt> become meaningful.
</p>
<!-- ply_create ++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -820,19 +861,55 @@ p_ply <b>ply_create</b>(const char *name, e_ply_storage_mode storage_mode,
</p>
<p class=description>
-Creates a PLY file for writing.
+Creates a PLY file for writing.
</p>
<p class=arguments>
<tt>Name</tt> is the file name, <tt>storage_mode</tt> is the file storage mode
(<tt>PLY_ASCII</tt>, <tt>PLY_LITTLE_ENDIAN</tt>,
<tt>PLY_BIG_ENDIAN</tt>, or <tt>PLY_DEFAULT</tt> to
-automatically detect host endianess).
-<tt>Error_cb</tt> is a function to be called when an error is found.
+automatically detect host endianess).
+<tt>Error_cb</tt> is a function to be called when an error is found.
+Arguments <tt>idata</tt>
+and <tt>pdata</tt> are available to the error callback via the
+<a href=#ply_get_ply_user_data><tt>ply_get_ply_user_data</tt></a>
+function.
+If <tt>error_cb</tt> is NULL, the default
+error callback is used. It prints a message to the standard error stream.
+</p>
+
+<p class=return>
+Returns a handle to the file or NULL on error.
+</p>
+
+<p class=note>
+Note: <tt>Error_cb</tt> is of type <tt>void
+ (*p_ply_error_cb)(const char *message)</tt>
+</p>
+
+<!-- ply_create_to_file ++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_create_to_file>
+p_ply <b>ply_create_to_file</b>(FILE *file_pointer, e_ply_storage_mode storage_mode, p_ply_error_cb error_cb)
+</p>
+
+<p class=description>
+Creates a PLY file to be written to a FILE pointer and
+returns a handle to it.
+The handle can be used wherever a handle returned by <a
+href=#ply_create><tt>ply_create</tt></a> is accepted.
+</p>
+
+<p class=arguments>
+<tt>File_pointer</tt> a pointer to a file open for writing, <tt>storage_mode</tt> is the file storage mode
+(<tt>PLY_ASCII</tt>, <tt>PLY_LITTLE_ENDIAN</tt>,
+<tt>PLY_BIG_ENDIAN</tt>, or <tt>PLY_DEFAULT</tt> to
+automatically detect host endianess).
+<tt>Error_cb</tt> is a function to be called when an error is found.
Arguments <tt>idata</tt>
and <tt>pdata</tt> are available to the error callback via the
-<a href=#ply_get_ply_user_data><tt>ply_get_ply_user_data</tt></a>
-function.
+<a href=#ply_get_ply_user_data><tt>ply_get_ply_user_data</tt></a>
+function.
If <tt>error_cb</tt> is NULL, the default
error callback is used. It prints a message to the standard error stream.
</p>
@@ -846,6 +923,10 @@ Note: <tt>Error_cb</tt> is of type <tt>void
(*p_ply_error_cb)(const char *message)</tt>
</p>
+<p class=note>
+Note: This function is declared in header <tt>rplyfile.h</tt>.
+</p>
+
<!-- ply_add_element +++++++++++++++++++++++++++++++++++++++++++++++++ -->
<p class=name id=ply_add_element>
@@ -853,18 +934,18 @@ int <b>ply_add_element</b>(p_ply ply, const char *name, long ninstances)
</p>
<p class=description>
-Adds a new element to the ply file.
+Adds a new element to the ply file.
</p>
<p class=arguments>
-<tt>Ply</tt> is a handle returned by
+<tt>Ply</tt> is a handle returned by
<a href=#ply_create><tt>ply_create</tt></a>, <tt>name</tt> is the element
name and <tt>ninstances</tt> is the number of instances of this element that
will be written to the file.
</p>
<p class=return>
-Returns 1 in case of success, 0 otherwise.
+Returns 1 in case of success, 0 otherwise.
</p>
<!-- ply_add_property ++++++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -874,29 +955,29 @@ int <b>ply_add_property</b>(<br>
p_ply ply,<br>
const char *name,<br>
e_ply_type type,<br>
- e_ply_type length_type,<br>
+ e_ply_type length_type,<br>
e_ply_type value_type<br>
)
</p>
<p class=description>
-Adds a new property to the last element added to the ply file.
+Adds a new property to the last element added to the ply file.
</p>
<p class=arguments>
-<tt>Ply</tt> is a handle returned by
-<a href=#ply_create><tt>ply_create</tt></a> and <tt>name</tt> is the
-property name.
-<tt>Type</tt> is the property type.
-<tt>Length_type</tt> is the scalar type of the first entry
-in a list property (the one that gives the number of entries).
-<tt>Value_type</tt> is the scalar type of the remaining list entries.
-If <tt>type</tt> is not <tt>PLY_LIST</tt>, <tt>length_type</tt> and
+<tt>Ply</tt> is a handle returned by
+<a href=#ply_create><tt>ply_create</tt></a> and <tt>name</tt> is the
+property name.
+<tt>Type</tt> is the property type.
+<tt>Length_type</tt> is the scalar type of the first entry
+in a list property (the one that gives the number of entries).
+<tt>Value_type</tt> is the scalar type of the remaining list entries.
+If <tt>type</tt> is not <tt>PLY_LIST</tt>, <tt>length_type</tt> and
<tt>value_type</tt> are ignored.
</p>
<p class=return>
-Returns 1 in case of success, 0 otherwise.
+Returns 1 in case of success, 0 otherwise.
</p>
<p class=note>
@@ -920,7 +1001,7 @@ int <b>ply_add_list_property</b>(<br>
<p class=description>
Same as <a href=#ply_add_property><tt>ply_add_property</tt></a> if
-<tt>type</tt> is <tt>PLY_LIST</tt>.
+<tt>type</tt> is <tt>PLY_LIST</tt>.
</p>
<!-- ply_add_scalar_property +++++++++++++++++++++++++++++++++++++++++ -->
@@ -931,7 +1012,7 @@ int <b>ply_add_scalar_property</b>(p_ply ply, const char *name, e_ply_type type)
<p class=description>
Same as <a href=#ply_add_property><tt>ply_add_property</tt></a> if
-<tt>type</tt> is <em>not</em> <tt>PLY_LIST</tt>.
+<tt>type</tt> is <em>not</em> <tt>PLY_LIST</tt>.
</p>
<!-- ply_add_comment +++++++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -941,17 +1022,17 @@ int <b>ply_add_comment</b>(p_ply ply, const char *comment);
</p>
<p class=description>
-Adds a comment to a PLY file.
+Adds a comment to a PLY file.
</p>
<p class=arguments>
-<tt>Ply</tt> is a handle returned by
-<a href=#ply_create><tt>ply_create</tt></a> and <tt>comment</tt> is the
-comment text.
+<tt>Ply</tt> is a handle returned by
+<a href=#ply_create><tt>ply_create</tt></a> and <tt>comment</tt> is the
+comment text.
</p>
<p class=return>
-Returns 1 in case of success, 0 otherwise.
+Returns 1 in case of success, 0 otherwise.
</p>
<!-- ply_add_obj_info ++++++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -961,17 +1042,17 @@ int <b>ply_add_obj_info</b>(p_ply ply, const char *obj_info);
</p>
<p class=description>
-Adds a obj_info to a PLY file.
+Adds a obj_info to a PLY file.
</p>
<p class=arguments>
-<tt>Ply</tt> is a handle returned by
-<a href=#ply_create><tt>ply_create</tt></a> and <tt>obj_info</tt> is the
-obj_info text.
+<tt>Ply</tt> is a handle returned by
+<a href=#ply_create><tt>ply_create</tt></a> and <tt>obj_info</tt> is the
+obj_info text.
</p>
<p class=return>
-Returns 1 in case of success, 0 otherwise.
+Returns 1 in case of success, 0 otherwise.
</p>
<!-- ply_write_header ++++++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -982,17 +1063,17 @@ int <b>ply_write_header</b>(p_ply ply);
<p class=description>
Writes the PLY file header to disk, after all elements, properties,
-comments and obj_infos have been added to the handle.
+comments and obj_infos have been added to the handle.
</p>
<p class=arguments>
-<tt>Ply</tt> is a handle returned by
-<a href=#ply_create><tt>ply_create</tt></a> and <tt>comment</tt> is the
-comment text.
+<tt>Ply</tt> is a handle returned by
+<a href=#ply_create><tt>ply_create</tt></a> and <tt>comment</tt> is the
+comment text.
</p>
<p class=return>
-Returns 1 in case of success, 0 otherwise.
+Returns 1 in case of success, 0 otherwise.
</p>
<!-- ply_write +++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -1002,19 +1083,19 @@ int <b>ply_write</b>(p_ply ply, double value);
</p>
<p class=description>
-Passes a value to be stored in the PLY file.
-Values must be passed in the order they will appear in the file.
+Passes a value to be stored in the PLY file.
+Values must be passed in the order they will appear in the file.
</p>
<p class=arguments>
-<tt>Ply</tt> is a handle returned by
+<tt>Ply</tt> is a handle returned by
<a href=#ply_create><tt>ply_create</tt></a> and <tt>value</tt> is the
-value to be stored. For simplicity, values are always passed as
+value to be stored. For simplicity, values are always passed as
<tt>double</tt> and conversion is performed as needed.
</p>
<p class=return>
-Returns 1 in case of success, 0 otherwise.
+Returns 1 in case of success, 0 otherwise.
</p>
<!-- ply_close +++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -1025,17 +1106,17 @@ int <b>ply_close</b>(p_ply ply);
<p class=description>
Closes the handle and ensures that all resources have been freed and data
-have been written.
+have been written.
</p>
<p class=arguments>
-<tt>Ply</tt> is a handle returned by
-<a href=#ply_create><tt>ply_create</tt></a> or by
-<a href=#ply_open><tt>ply_open</tt></a>.
+<tt>Ply</tt> is a handle returned by
+<a href=#ply_create><tt>ply_create</tt></a> or by
+<a href=#ply_open><tt>ply_open</tt></a>.
</p>
<p class=return>
-Returns 1 in case of success, 0 otherwise.
+Returns 1 in case of success, 0 otherwise.
</p>
<!-- footer ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
@@ -1046,7 +1127,7 @@ Returns 1 in case of success, 0 otherwise.
<p>
<small>
Last modified by Diego Nehab on <br>
-Thu Jul 4 15:25:50 BRT 2013
+Fri Aug 21 17:11:09 BRT 2015
</small>
</p>
</center>
diff --git a/vendor/rply-1.1.3/manual/reference.css b/vendor/rply-1.1.4/manual/reference.css
similarity index 100%
rename from vendor/rply-1.1.3/manual/reference.css
rename to vendor/rply-1.1.4/manual/reference.css
diff --git a/vendor/rply-1.1.3/manual/rply.png b/vendor/rply-1.1.4/manual/rply.png
similarity index 100%
rename from vendor/rply-1.1.3/manual/rply.png
rename to vendor/rply-1.1.4/manual/rply.png
diff --git a/vendor/rply-1.1.3/rply.c b/vendor/rply-1.1.4/rply.c
similarity index 91%
rename from vendor/rply-1.1.3/rply.c
rename to vendor/rply-1.1.4/rply.c
index 6cbb82a..c4105ef 100644
--- a/vendor/rply-1.1.3/rply.c
+++ b/vendor/rply-1.1.4/rply.c
@@ -17,6 +17,7 @@
#include <stddef.h>
#include "rply.h"
+#include "rplyfile.h"
/* ----------------------------------------------------------------------
* Make sure we get our integer types right
@@ -58,14 +59,14 @@ typedef uint32_t t_ply_uint32;
#endif
/* ----------------------------------------------------------------------
- * Constants
+ * Constants
* ---------------------------------------------------------------------- */
#define WORDSIZE 256
#define LINESIZE 1024
#define BUFFERSIZE (8*1024)
typedef enum e_ply_io_mode_ {
- PLY_READ,
+ PLY_READ,
PLY_WRITE
} e_ply_io_mode;
@@ -74,9 +75,9 @@ static const char *const ply_storage_mode_list[] = {
}; /* order matches e_ply_storage_mode enum */
static const char *const ply_type_list[] = {
- "int8", "uint8", "int16", "uint16",
+ "int8", "uint8", "int16", "uint16",
"int32", "uint32", "float32", "float64",
- "char", "uchar", "short", "ushort",
+ "char", "uchar", "short", "ushort",
"int", "uint", "float", "double",
"list", NULL
}; /* order matches e_ply_type enum */
@@ -121,7 +122,7 @@ typedef struct t_ply_property_ {
p_ply_read_cb read_cb;
void *pdata;
long idata;
-} t_ply_property;
+} t_ply_property;
/* ----------------------------------------------------------------------
* Element information
@@ -143,8 +144,8 @@ typedef struct t_ply_element_ {
/* ----------------------------------------------------------------------
* Input/output driver
*
- * Depending on file mode, different functions are used to read/write
- * property fields. The drivers make it transparent to read/write in ascii,
+ * Depending on file mode, different functions are used to read/write
+ * property fields. The drivers make it transparent to read/write in ascii,
* big endian or little endian cases.
* ---------------------------------------------------------------------- */
typedef int (*p_ply_ihandler)(p_ply ply, double *value);
@@ -166,7 +167,7 @@ typedef struct t_ply_odriver_ {
typedef t_ply_odriver *p_ply_odriver;
/* ----------------------------------------------------------------------
- * Ply file handle.
+ * Ply file handle.
*
* io_mode: read or write (from e_ply_io_mode)
* storage_mode: mode of file associated with handle (from e_ply_storage_mode)
@@ -177,15 +178,15 @@ typedef t_ply_odriver *p_ply_odriver;
* obj_info: obj_info items for this file
* nobj_infos: number of obj_info items in file
* fp: file pointer associated with ply file
- * rn: skip extra char after end_header?
+ * rn: skip extra char after end_header?
* buffer: last word/chunck of data read from ply file
* buffer_first, buffer_last: interval of untouched good data in buffer
* buffer_token: start of parsed token (line or word) in buffer
- * idriver, odriver: input driver used to get property fields from file
+ * idriver, odriver: input driver used to get property fields from file
* argument: storage space for callback arguments
* welement, wproperty: element/property type being written
* winstance_index: index of instance of current element being written
- * wvalue_index: index of list property value being written
+ * wvalue_index: index of list property value being written
* wlength: number of values in list property being written
* error_cb: error callback
* pdata/idata: user data defined with ply_open/ply_create
@@ -200,6 +201,7 @@ typedef struct t_ply_ {
char *obj_info;
long nobj_infos;
FILE *fp;
+ int own_fp;
int rn;
char buffer[BUFFERSIZE];
size_t buffer_first, buffer_token, buffer_last;
@@ -239,13 +241,13 @@ static void ply_reverse(void *anydata, size_t size);
* ---------------------------------------------------------------------- */
static int ply_find_string(const char *item, const char* const list[]);
static p_ply_element ply_find_element(p_ply ply, const char *name);
-static p_ply_property ply_find_property(p_ply_element element,
+static p_ply_property ply_find_property(p_ply_element element,
const char *name);
/* ----------------------------------------------------------------------
* Header parsing
* ---------------------------------------------------------------------- */
-static int ply_read_header_magic(p_ply ply);
+static int ply_read_header_magic(p_ply ply);
static int ply_read_header_format(p_ply ply);
static int ply_read_header_comment(p_ply ply);
static int ply_read_header_obj_info(p_ply ply);
@@ -273,18 +275,18 @@ static void *ply_grow_array(p_ply ply, void **pointer, long *nmemb, long size);
* Special functions
* ---------------------------------------------------------------------- */
static e_ply_storage_mode ply_arch_endian(void);
-static int ply_type_check(void);
+static int ply_type_check(void);
/* ----------------------------------------------------------------------
* Auxiliary read functions
* ---------------------------------------------------------------------- */
-static int ply_read_element(p_ply ply, p_ply_element element,
+static int ply_read_element(p_ply ply, p_ply_element element,
p_ply_argument argument);
-static int ply_read_property(p_ply ply, p_ply_element element,
+static int ply_read_property(p_ply ply, p_ply_element element,
p_ply_property property, p_ply_argument argument);
-static int ply_read_list_property(p_ply ply, p_ply_element element,
+static int ply_read_list_property(p_ply ply, p_ply_element element,
p_ply_property property, p_ply_argument argument);
-static int ply_read_scalar_property(p_ply ply, p_ply_element element,
+static int ply_read_scalar_property(p_ply ply, p_ply_element element,
p_ply_property property, p_ply_argument argument);
/* ----------------------------------------------------------------------
@@ -295,10 +297,10 @@ static int ply_read_scalar_property(p_ply ply, p_ply_element element,
#define BLINE(p) (p->buffer + p->buffer_token)
/* pointer to start of untouched bytes in buffer */
-#define BFIRST(p) (p->buffer + p->buffer_first)
+#define BFIRST(p) (p->buffer + p->buffer_first)
/* number of bytes untouched in buffer */
-#define BSIZE(p) (p->buffer_last - p->buffer_first)
+#define BSIZE(p) (p->buffer_last - p->buffer_first)
/* consumes data from buffer */
#define BSKIP(p, s) (p->buffer_first += s)
@@ -312,18 +314,17 @@ static int BREFILL(p_ply ply) {
ply->buffer_first = ply->buffer_token = 0;
/* fill remaining with new data */
size = fread(ply->buffer+size, 1, BUFFERSIZE-size-1, ply->fp);
- /* place sentinel so we can use str* functions with buffer */
- ply->buffer[BUFFERSIZE-1] = '\0';
- /* check if read failed */
- if (size <= 0) return 0;
/* increase size to account for new data */
ply->buffer_last += size;
- return 1;
+ /* place sentinel so we can use str* functions with buffer */
+ ply->buffer[ply->buffer_last] = '\0';
+ /* check if read failed */
+ return size > 0;
}
/* We don't care about end-of-line, generally, because we
* separate words by any white-space character.
- * Unfortunately, in binary mode, right after 'end_header',
+ * Unfortunately, in binary mode, right after 'end_header',
* we have to know *exactly* how many characters to skip */
/* We use the end-of-line marker after the 'ply' magic
* number to figure out what to do */
@@ -334,7 +335,7 @@ static int ply_read_header_magic(p_ply ply) {
return 0;
}
/* check if it is ply */
- if (magic[0] != 'p' || magic[1] != 'l' || magic[2] != 'y'
+ if (magic[0] != 'p' || magic[1] != 'l' || magic[2] != 'y'
|| !isspace(magic[3])) {
ply->error_cb(ply, "Wrong magic number. Expected 'ply'");
return 0;
@@ -352,32 +353,43 @@ static int ply_read_header_magic(p_ply ply) {
/* ----------------------------------------------------------------------
* Read support functions
* ---------------------------------------------------------------------- */
-p_ply ply_open(const char *name, p_ply_error_cb error_cb,
+p_ply ply_open(const char *name, p_ply_error_cb error_cb,
long idata, void *pdata) {
- FILE *fp = NULL;
- p_ply ply = ply_alloc();
+ FILE *fp;
+ p_ply ply;
if (error_cb == NULL) error_cb = ply_error_cb;
- if (!ply) {
- error_cb(NULL, "Out of memory");
+ assert(name);
+ fp = fopen(name, "rb");
+ if (!fp) {
+ error_cb(NULL, "Unable to open file");
return NULL;
}
- ply->idata = idata;
- ply->pdata = pdata;
- ply->io_mode = PLY_READ;
- ply->error_cb = error_cb;
+ ply = ply_open_from_file(fp, error_cb, idata, pdata);
+ if (ply) ply->own_fp = 1;
+ else fclose(fp);
+ return ply;
+}
+
+p_ply ply_open_from_file(FILE *fp, p_ply_error_cb error_cb,
+ long idata, void *pdata) {
+ p_ply ply;
+ if (error_cb == NULL) error_cb = ply_error_cb;
+ assert(fp);
if (!ply_type_check()) {
error_cb(ply, "Incompatible type system");
- free(ply);
return NULL;
}
- assert(name);
- fp = fopen(name, "rb");
- if (!fp) {
- error_cb(ply, "Unable to open file");
- free(ply);
+ ply = ply_alloc();
+ if (!ply) {
+ error_cb(NULL, "Out of memory");
return NULL;
}
+ ply->idata = idata;
+ ply->pdata = pdata;
+ ply->io_mode = PLY_READ;
+ ply->error_cb = error_cb;
ply->fp = fp;
+ ply->own_fp = 0;
return ply;
}
@@ -392,8 +404,8 @@ int ply_read_header(p_ply ply) {
}
/* parse elements, comments or obj_infos until the end of header */
while (strcmp(BWORD(ply), "end_header")) {
- if (!ply_read_header_comment(ply) &&
- !ply_read_header_element(ply) &&
+ if (!ply_read_header_comment(ply) &&
+ !ply_read_header_element(ply) &&
!ply_read_header_obj_info(ply)) {
ply_ferror(ply, "Unexpected token '%s'", BWORD(ply));
return 0;
@@ -410,10 +422,10 @@ int ply_read_header(p_ply ply) {
return 1;
}
-long ply_set_read_cb(p_ply ply, const char *element_name,
- const char* property_name, p_ply_read_cb read_cb,
+long ply_set_read_cb(p_ply ply, const char *element_name,
+ const char* property_name, p_ply_read_cb read_cb,
void *pdata, long idata) {
- p_ply_element element = NULL;
+ p_ply_element element = NULL;
p_ply_property property = NULL;
assert(ply && element_name && property_name);
element = ply_find_element(ply, element_name);
@@ -444,25 +456,34 @@ int ply_read(p_ply ply) {
/* ----------------------------------------------------------------------
* Write support functions
* ---------------------------------------------------------------------- */
-p_ply ply_create(const char *name, e_ply_storage_mode storage_mode,
+p_ply ply_create(const char *name, e_ply_storage_mode storage_mode,
p_ply_error_cb error_cb, long idata, void *pdata) {
+ p_ply ply = NULL;
FILE *fp = NULL;
- p_ply ply = ply_alloc();
+ assert(name && storage_mode <= PLY_DEFAULT);
if (error_cb == NULL) error_cb = ply_error_cb;
- if (!ply) {
- error_cb(NULL, "Out of memory");
+ fp = fopen(name, "wb");
+ if (!fp) {
+ error_cb(ply, "Unable to create file");
return NULL;
}
+ ply = ply_create_to_file(fp, storage_mode, error_cb, idata, pdata);
+ if (ply) ply->own_fp = 1;
+ else fclose(fp);
+ return ply;
+}
+
+p_ply ply_create_to_file(FILE *fp, e_ply_storage_mode storage_mode,
+ p_ply_error_cb error_cb, long idata, void *pdata) {
+ p_ply ply;
+ assert(fp && storage_mode <= PLY_DEFAULT);
if (!ply_type_check()) {
error_cb(ply, "Incompatible type system");
- free(ply);
return NULL;
}
- assert(name && storage_mode <= PLY_DEFAULT);
- fp = fopen(name, "wb");
- if (!fp) {
- error_cb(ply, "Unable to create file");
- free(ply);
+ ply = ply_alloc();
+ if (!ply) {
+ error_cb(NULL, "Out of memory");
return NULL;
}
ply->idata = idata;
@@ -470,15 +491,17 @@ p_ply ply_create(const char *name, e_ply_storage_mode storage_mode,
ply->io_mode = PLY_WRITE;
if (storage_mode == PLY_DEFAULT) storage_mode = ply_arch_endian();
if (storage_mode == PLY_ASCII) ply->odriver = &ply_odriver_ascii;
- else if (storage_mode == ply_arch_endian())
+ else if (storage_mode == ply_arch_endian())
ply->odriver = &ply_odriver_binary;
else ply->odriver = &ply_odriver_binary_reverse;
ply->storage_mode = storage_mode;
ply->fp = fp;
+ ply->own_fp = 0;
ply->error_cb = error_cb;
return ply;
}
+
int ply_add_element(p_ply ply, const char *name, long ninstances) {
p_ply_element element = NULL;
assert(ply && ply->fp && ply->io_mode == PLY_WRITE);
@@ -512,7 +535,7 @@ int ply_add_scalar_property(p_ply ply, const char *name, e_ply_type type) {
return 1;
}
-int ply_add_list_property(p_ply ply, const char *name,
+int ply_add_list_property(p_ply ply, const char *name,
e_ply_type length_type, e_ply_type value_type) {
p_ply_element element = NULL;
p_ply_property property = NULL;
@@ -540,9 +563,9 @@ int ply_add_list_property(p_ply ply, const char *name,
int ply_add_property(p_ply ply, const char *name, e_ply_type type,
e_ply_type length_type, e_ply_type value_type) {
- if (type == PLY_LIST)
+ if (type == PLY_LIST)
return ply_add_list_property(ply, name, length_type, value_type);
- else
+ else
return ply_add_scalar_property(ply, name, type);
}
@@ -577,9 +600,9 @@ int ply_add_obj_info(p_ply ply, const char *obj_info) {
int ply_write_header(p_ply ply) {
long i, j;
assert(ply && ply->fp && ply->io_mode == PLY_WRITE);
- assert(ply->element || ply->nelements == 0);
- assert(!ply->element || ply->nelements > 0);
- if (fprintf(ply->fp, "ply\nformat %s 1.0\n",
+ assert(ply->element || ply->nelements == 0);
+ assert(!ply->element || ply->nelements > 0);
+ if (fprintf(ply->fp, "ply\nformat %s 1.0\n",
ply_storage_mode_list[ply->storage_mode]) <= 0) goto error;
for (i = 0; i < ply->ncomments; i++)
if (fprintf(ply->fp, "comment %s\n", ply->comment + LINESIZE*i) <= 0)
@@ -589,19 +612,19 @@ int ply_write_header(p_ply ply) {
goto error;
for (i = 0; i < ply->nelements; i++) {
p_ply_element element = &ply->element[i];
- assert(element->property || element->nproperties == 0);
- assert(!element->property || element->nproperties > 0);
- if (fprintf(ply->fp, "element %s %ld\n", element->name,
+ assert(element->property || element->nproperties == 0);
+ assert(!element->property || element->nproperties > 0);
+ if (fprintf(ply->fp, "element %s %ld\n", element->name,
element->ninstances) <= 0) goto error;
for (j = 0; j < element->nproperties; j++) {
p_ply_property property = &element->property[j];
if (property->type == PLY_LIST) {
- if (fprintf(ply->fp, "property list %s %s %s\n",
+ if (fprintf(ply->fp, "property list %s %s %s\n",
ply_type_list[property->length_type],
ply_type_list[property->value_type],
property->name) <= 0) goto error;
} else {
- if (fprintf(ply->fp, "property %s %s\n",
+ if (fprintf(ply->fp, "property %s %s\n",
ply_type_list[property->type],
property->name) <= 0) goto error;
}
@@ -633,9 +656,9 @@ int ply_write(p_ply ply, double value) {
ply->wlength = 0;
}
if (!ply->odriver->ohandler[type](ply, value)) {
- ply_ferror(ply, "Failed writing %s of %s %d (%s: %s)",
- property->name, element->name,
- ply->winstance_index,
+ ply_ferror(ply, "Failed writing %s of %s %d (%s: %s)",
+ property->name, element->name,
+ ply->winstance_index,
ply->odriver->name, ply_type_list[type]);
return 0;
}
@@ -658,9 +681,9 @@ int ply_write(p_ply ply, double value) {
} while (ply->welement < ply->nelements && !element->ninstances);
}
if (ply->storage_mode == PLY_ASCII) {
- return (!spaceafter || putc(' ', ply->fp) > 0) &&
+ return (!spaceafter || putc(' ', ply->fp) > 0) &&
(!breakafter || putc('\n', ply->fp) > 0);
- } else {
+ } else {
return 1;
}
}
@@ -671,12 +694,12 @@ int ply_close(p_ply ply) {
assert(ply->element || ply->nelements == 0);
assert(!ply->element || ply->nelements > 0);
/* write last chunk to file */
- if (ply->io_mode == PLY_WRITE &&
+ if (ply->io_mode == PLY_WRITE &&
fwrite(ply->buffer, 1, ply->buffer_last, ply->fp) < ply->buffer_last) {
ply_ferror(ply, "Error closing up");
return 0;
}
- fclose(ply->fp);
+ if (ply->own_fp) fclose(ply->fp);
/* free all memory used by handle */
if (ply->element) {
for (i = 0; i < ply->nelements; i++) {
@@ -694,7 +717,7 @@ int ply_close(p_ply ply) {
/* ----------------------------------------------------------------------
* Query support functions
* ---------------------------------------------------------------------- */
-p_ply_element ply_get_next_element(p_ply ply,
+p_ply_element ply_get_next_element(p_ply ply,
p_ply_element last) {
assert(ply);
if (!last) return ply->element;
@@ -711,7 +734,7 @@ int ply_get_element_info(p_ply_element element, const char** name,
return 1;
}
-p_ply_property ply_get_next_property(p_ply_element element,
+p_ply_property ply_get_next_property(p_ply_element element,
p_ply_property last) {
assert(element);
if (!last) return element->property;
@@ -733,7 +756,7 @@ int ply_get_property_info(p_ply_property property, const char** name,
const char *ply_get_next_comment(p_ply ply, const char *last) {
assert(ply);
- if (!last) return ply->comment;
+ if (!last) return ply->comment;
last += LINESIZE;
if (last < ply->comment + LINESIZE*ply->ncomments) return last;
else return NULL;
@@ -741,16 +764,16 @@ const char *ply_get_next_comment(p_ply ply, const char *last) {
const char *ply_get_next_obj_info(p_ply ply, const char *last) {
assert(ply);
- if (!last) return ply->obj_info;
+ if (!last) return ply->obj_info;
last += LINESIZE;
if (last < ply->obj_info + LINESIZE*ply->nobj_infos) return last;
else return NULL;
}
/* ----------------------------------------------------------------------
- * Callback argument support functions
+ * Callback argument support functions
* ---------------------------------------------------------------------- */
-int ply_get_argument_element(p_ply_argument argument,
+int ply_get_argument_element(p_ply_argument argument,
p_ply_element *element, long *instance_index) {
assert(argument);
if (!argument) return 0;
@@ -759,7 +782,7 @@ int ply_get_argument_element(p_ply_argument argument,
return 1;
}
-int ply_get_argument_property(p_ply_argument argument,
+int ply_get_argument_property(p_ply_argument argument,
p_ply_property *property, long *length, long *value_index) {
assert(argument);
if (!argument) return 0;
@@ -769,7 +792,7 @@ int ply_get_argument_property(p_ply_argument argument,
return 1;
}
-int ply_get_argument_user_data(p_ply_argument argument, void **pdata,
+int ply_get_argument_user_data(p_ply_argument argument, void **pdata,
long *idata) {
assert(argument);
if (!argument) return 0;
@@ -795,11 +818,11 @@ int ply_get_ply_user_data(p_ply ply, void **pdata, long *idata) {
/* ----------------------------------------------------------------------
* Internal functions
* ---------------------------------------------------------------------- */
-static int ply_read_list_property(p_ply ply, p_ply_element element,
+static int ply_read_list_property(p_ply ply, p_ply_element element,
p_ply_property property, p_ply_argument argument) {
int l;
p_ply_read_cb read_cb = property->read_cb;
- p_ply_ihandler *driver = ply->idriver->ihandler;
+ p_ply_ihandler *driver = ply->idriver->ihandler;
/* get list length */
p_ply_ihandler handler = driver[property->length_type];
double length;
@@ -824,7 +847,7 @@ static int ply_read_list_property(p_ply ply, p_ply_element element,
argument->value_index = l;
if (!handler(ply, &argument->value)) {
ply_ferror(ply, "Error reading value number %d of '%s' of "
- "'%s' number %d", l+1, property->name,
+ "'%s' number %d", l+1, property->name,
element->name, argument->instance_index);
return 0;
}
@@ -837,10 +860,10 @@ static int ply_read_list_property(p_ply ply, p_ply_element element,
return 1;
}
-static int ply_read_scalar_property(p_ply ply, p_ply_element element,
+static int ply_read_scalar_property(p_ply ply, p_ply_element element,
p_ply_property property, p_ply_argument argument) {
p_ply_read_cb read_cb = property->read_cb;
- p_ply_ihandler *driver = ply->idriver->ihandler;
+ p_ply_ihandler *driver = ply->idriver->ihandler;
p_ply_ihandler handler = driver[property->type];
argument->length = 1;
argument->value_index = 0;
@@ -856,15 +879,15 @@ static int ply_read_scalar_property(p_ply ply, p_ply_element element,
return 1;
}
-static int ply_read_property(p_ply ply, p_ply_element element,
+static int ply_read_property(p_ply ply, p_ply_element element,
p_ply_property property, p_ply_argument argument) {
- if (property->type == PLY_LIST)
+ if (property->type == PLY_LIST)
return ply_read_list_property(ply, element, property, argument);
- else
+ else
return ply_read_scalar_property(ply, element, property, argument);
}
-static int ply_read_element(p_ply ply, p_ply_element element,
+static int ply_read_element(p_ply ply, p_ply_element element,
p_ply_argument argument) {
long j, k;
/* for each element of this type */
@@ -886,7 +909,7 @@ static int ply_read_element(p_ply ply, p_ply_element element,
static int ply_find_string(const char *item, const char* const list[]) {
int i;
assert(item && list);
- for (i = 0; list[i]; i++)
+ for (i = 0; list[i]; i++)
if (!strcmp(list[i], item)) return i;
return -1;
}
@@ -894,26 +917,26 @@ static int ply_find_string(const char *item, const char* const list[]) {
static p_ply_element ply_find_element(p_ply ply, const char *name) {
p_ply_element element;
int i, nelements;
- assert(ply && name);
+ assert(ply && name);
element = ply->element;
nelements = ply->nelements;
- assert(element || nelements == 0);
- assert(!element || nelements > 0);
- for (i = 0; i < nelements; i++)
+ assert(element || nelements == 0);
+ assert(!element || nelements > 0);
+ for (i = 0; i < nelements; i++)
if (!strcmp(element[i].name, name)) return &element[i];
return NULL;
}
-static p_ply_property ply_find_property(p_ply_element element,
+static p_ply_property ply_find_property(p_ply_element element,
const char *name) {
p_ply_property property;
int i, nproperties;
- assert(element && name);
+ assert(element && name);
property = element->property;
nproperties = element->nproperties;
- assert(property || nproperties == 0);
- assert(!property || nproperties > 0);
- for (i = 0; i < nproperties; i++)
+ assert(property || nproperties == 0);
+ assert(!property || nproperties > 0);
+ for (i = 0; i < nproperties; i++)
if (!strcmp(property[i].name, name)) return &property[i];
return NULL;
}
@@ -942,9 +965,9 @@ static int ply_read_word(p_ply ply) {
ply_ferror(ply, "Unexpected end of file");
return 0;
}
- } else break;
- }
- BSKIP(ply, t);
+ } else break;
+ }
+ BSKIP(ply, t);
/* look for a space after the current word */
t = strcspn(BFIRST(ply), " \n\r\t");
/* if we didn't reach the end of the buffer, we are done */
@@ -1000,7 +1023,7 @@ static int ply_read_line(p_ply ply) {
BSKIP(ply, 1);
return ply_check_line(ply);
} else {
- end = ply->buffer + BSIZE(ply);
+ end = ply->buffer + BSIZE(ply);
/* otherwise, try to refill buffer */
if (!BREFILL(ply)) {
ply_ferror(ply, "Unexpected end of file");
@@ -1107,7 +1130,7 @@ static void ply_element_init(p_ply_element element) {
element->name[0] = '\0';
element->ninstances = 0;
element->property = NULL;
- element->nproperties = 0;
+ element->nproperties = 0;
}
static void ply_property_init(p_ply_property property) {
@@ -1127,7 +1150,7 @@ static p_ply ply_alloc(void) {
return ply;
}
-static void *ply_grow_array(p_ply ply, void **pointer,
+static void *ply_grow_array(p_ply ply, void **pointer,
long *nmemb, long size) {
void *temp = *pointer;
long count = *nmemb + 1;
@@ -1144,14 +1167,14 @@ static void *ply_grow_array(p_ply ply, void **pointer,
static p_ply_element ply_grow_element(p_ply ply) {
p_ply_element element = NULL;
- assert(ply);
- assert(ply->element || ply->nelements == 0);
- assert(!ply->element || ply->nelements > 0);
- element = (p_ply_element) ply_grow_array(ply, (void **) &ply->element,
+ assert(ply);
+ assert(ply->element || ply->nelements == 0);
+ assert(!ply->element || ply->nelements > 0);
+ element = (p_ply_element) ply_grow_array(ply, (void **) &ply->element,
&ply->nelements, sizeof(t_ply_element));
if (!element) return NULL;
ply_element_init(element);
- return element;
+ return element;
}
static p_ply_property ply_grow_property(p_ply ply, p_ply_element element) {
@@ -1160,8 +1183,8 @@ static p_ply_property ply_grow_property(p_ply ply, p_ply_element element) {
assert(element);
assert(element->property || element->nproperties == 0);
assert(!element->property || element->nproperties > 0);
- property = (p_ply_property) ply_grow_array(ply,
- (void **) &element->property,
+ property = (p_ply_property) ply_grow_array(ply,
+ (void **) &element->property,
&element->nproperties, sizeof(t_ply_property));
if (!property) return NULL;
ply_property_init(property);
@@ -1175,7 +1198,7 @@ static int ply_read_header_format(p_ply ply) {
ply->storage_mode = ply_find_string(BWORD(ply), ply_storage_mode_list);
if (ply->storage_mode == (e_ply_storage_mode) (-1)) return 0;
if (ply->storage_mode == PLY_ASCII) ply->idriver = &ply_idriver_ascii;
- else if (ply->storage_mode == ply_arch_endian())
+ else if (ply->storage_mode == ply_arch_endian())
ply->idriver = &ply_idriver_binary;
else ply->idriver = &ply_idriver_binary_reverse;
if (!ply_read_word(ply)) return 0;
@@ -1250,7 +1273,7 @@ static int ply_read_header_element(p_ply ply) {
element->ninstances = dummy;
/* get all properties for this element */
if (!ply_read_word(ply)) return 0;
- while (ply_read_header_property(ply) ||
+ while (ply_read_header_property(ply) ||
ply_read_header_comment(ply) || ply_read_header_obj_info(ply))
/* do nothing */;
return 1;
@@ -1349,7 +1372,7 @@ static int obinary_int8(p_ply ply, double value) {
static int obinary_uint8(p_ply ply, double value) {
t_ply_uint8 uint8 = (t_ply_uint8) value;
if (value > PLY_UINT8_MAX || value < 0) return 0;
- return ply->odriver->ochunk(ply, &uint8, sizeof(uint8));
+ return ply->odriver->ochunk(ply, &uint8, sizeof(uint8));
}
static int obinary_int16(p_ply ply, double value) {
@@ -1361,7 +1384,7 @@ static int obinary_int16(p_ply ply, double value) {
static int obinary_uint16(p_ply ply, double value) {
t_ply_uint16 uint16 = (t_ply_uint16) value;
if (value > PLY_UINT16_MAX || value < 0) return 0;
- return ply->odriver->ochunk(ply, &uint16, sizeof(uint16));
+ return ply->odriver->ochunk(ply, &uint16, sizeof(uint16));
}
static int obinary_int32(p_ply ply, double value) {
@@ -1383,7 +1406,7 @@ static int obinary_float32(p_ply ply, double value) {
}
static int obinary_float64(p_ply ply, double value) {
- return ply->odriver->ochunk(ply, &value, sizeof(value));
+ return ply->odriver->ochunk(ply, &value, sizeof(value));
}
/* ----------------------------------------------------------------------
@@ -1570,7 +1593,7 @@ static t_ply_odriver ply_odriver_binary_reverse = {
};
/* ----------------------------------------------------------------------
- * Copyright (C) 2003-2011 Diego Nehab. All rights reserved.
+ * Copyright (C) 2003-2015 Diego Nehab. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
diff --git a/vendor/rply-1.1.3/rply.h b/vendor/rply-1.1.4/rply.h
similarity index 92%
rename from vendor/rply-1.1.3/rply.h
rename to vendor/rply-1.1.4/rply.h
index c284568..9fa6da9 100644
--- a/vendor/rply-1.1.3/rply.h
+++ b/vendor/rply-1.1.4/rply.h
@@ -13,8 +13,8 @@
extern "C" {
#endif
-#define RPLY_VERSION "RPly 1.1.3"
-#define RPLY_COPYRIGHT "Copyright (C) 2003-2013 Diego Nehab"
+#define RPLY_VERSION "RPly 1.1.4"
+#define RPLY_COPYRIGHT "Copyright (C) 2003-2015 Diego Nehab"
#define RPLY_AUTHORS "Diego Nehab"
/* ----------------------------------------------------------------------
@@ -30,13 +30,13 @@ typedef struct t_ply_argument_ *p_ply_argument;
typedef enum e_ply_storage_mode_ {
PLY_BIG_ENDIAN,
PLY_LITTLE_ENDIAN,
- PLY_ASCII,
+ PLY_ASCII,
PLY_DEFAULT /* has to be the last in enum */
} e_ply_storage_mode; /* order matches ply_storage_mode_list */
/* ply data type */
typedef enum e_ply_type {
- PLY_INT8, PLY_UINT8, PLY_INT16, PLY_UINT16,
+ PLY_INT8, PLY_UINT8, PLY_INT16, PLY_UINT16,
PLY_INT32, PLY_UIN32, PLY_FLOAT32, PLY_FLOAT64,
PLY_CHAR, PLY_UCHAR, PLY_SHORT, PLY_USHORT,
PLY_INT, PLY_UINT, PLY_FLOAT, PLY_DOUBLE,
@@ -52,7 +52,7 @@ typedef enum e_ply_type {
typedef void (*p_ply_error_cb)(p_ply ply, const char *message);
/* ----------------------------------------------------------------------
- * Gets user data from within an error callback
+ * Gets user data from within an error callback
*
* ply: handle returned by ply_open or ply_create
* idata,pdata: contextual information set in ply_open or ply_create
@@ -68,7 +68,7 @@ int ply_get_ply_user_data(p_ply ply, void **pdata, long *idata);
*
* Returns 1 if successful, 0 otherwise
* ---------------------------------------------------------------------- */
-p_ply ply_open(const char *name, p_ply_error_cb error_cb, long idata,
+p_ply ply_open(const char *name, p_ply_error_cb error_cb, long idata,
void *pdata);
/* ----------------------------------------------------------------------
@@ -99,57 +99,57 @@ typedef int (*p_ply_read_cb)(p_ply_argument argument);
* pdata/idata: user data that will be passed to callback
*
* Returns 0 if no element or no property in element, returns the
- * number of element instances otherwise.
+ * number of element instances otherwise.
* ---------------------------------------------------------------------- */
-long ply_set_read_cb(p_ply ply, const char *element_name,
- const char *property_name, p_ply_read_cb read_cb,
+long ply_set_read_cb(p_ply ply, const char *element_name,
+ const char *property_name, p_ply_read_cb read_cb,
void *pdata, long idata);
/* ----------------------------------------------------------------------
* Returns information about the element originating a callback
*
- * argument: handle to argument
+ * argument: handle to argument
* element: receives a the element handle (if non-null)
- * instance_index: receives the index of the current element instance
+ * instance_index: receives the index of the current element instance
* (if non-null)
*
* Returns 1 if successfull, 0 otherwise
* ---------------------------------------------------------------------- */
-int ply_get_argument_element(p_ply_argument argument,
+int ply_get_argument_element(p_ply_argument argument,
p_ply_element *element, long *instance_index);
/* ----------------------------------------------------------------------
* Returns information about the property originating a callback
*
- * argument: handle to argument
+ * argument: handle to argument
* property: receives the property handle (if non-null)
* length: receives the number of values in this property (if non-null)
* value_index: receives the index of current property value (if non-null)
*
* Returns 1 if successfull, 0 otherwise
* ---------------------------------------------------------------------- */
-int ply_get_argument_property(p_ply_argument argument,
+int ply_get_argument_property(p_ply_argument argument,
p_ply_property *property, long *length, long *value_index);
/* ----------------------------------------------------------------------
- * Returns user data associated with callback
+ * Returns user data associated with callback
*
* pdata: receives a copy of user custom data pointer (if non-null)
* idata: receives a copy of user custom data integer (if non-null)
*
* Returns 1 if successfull, 0 otherwise
* ---------------------------------------------------------------------- */
-int ply_get_argument_user_data(p_ply_argument argument, void **pdata,
+int ply_get_argument_user_data(p_ply_argument argument, void **pdata,
long *idata);
/* ----------------------------------------------------------------------
* Returns the value associated with a callback
*
- * argument: handle to argument
+ * argument: handle to argument
*
* Returns the current data item
* ---------------------------------------------------------------------- */
-double ply_get_argument_value(p_ply_argument argument);
+double ply_get_argument_value(p_ply_argument argument);
/* ----------------------------------------------------------------------
* Reads all elements and properties calling the callbacks defined with
@@ -215,7 +215,7 @@ int ply_get_element_info(p_ply_element element, const char** name,
*
* Returns element if successfull or NULL if no more properties
* ---------------------------------------------------------------------- */
-p_ply_property ply_get_next_property(p_ply_element element,
+p_ply_property ply_get_next_property(p_ply_element element,
p_ply_property last);
/* ----------------------------------------------------------------------
@@ -226,7 +226,7 @@ p_ply_property ply_get_next_property(p_ply_element element,
* type: receives the property type (if non-null)
* length_type: for list properties, receives the scalar type of
* the length field (if non-null)
- * value_type: for list properties, receives the scalar type of the value
+ * value_type: for list properties, receives the scalar type of the value
* fields (if non-null)
*
* Returns 1 if successfull or 0 otherwise
@@ -239,10 +239,12 @@ int ply_get_property_info(p_ply_property property, const char** name,
*
* name: file name
* storage_mode: file format mode
+ * error_cb: error callback function
+ * idata,pdata: contextual information available to users
*
* Returns handle to PLY file if successfull, NULL otherwise
* ---------------------------------------------------------------------- */
-p_ply ply_create(const char *name, e_ply_storage_mode storage_mode,
+p_ply ply_create(const char *name, e_ply_storage_mode storage_mode,
p_ply_error_cb error_cb, long idata, void *pdata);
/* ----------------------------------------------------------------------
@@ -262,7 +264,7 @@ int ply_add_element(p_ply ply, const char *name, long ninstances);
* ply: handle returned by ply_create
* name: name of new property
* type: property type
- * length_type: scalar type of length field of a list property
+ * length_type: scalar type of length field of a list property
* value_type: scalar type of value fields of a list property
*
* Returns 1 if successfull, 0 otherwise
@@ -275,12 +277,12 @@ int ply_add_property(p_ply ply, const char *name, e_ply_type type,
*
* ply: handle returned by ply_create
* name: name of new property
- * length_type: scalar type of length field of a list property
+ * length_type: scalar type of length field of a list property
* value_type: scalar type of value fields of a list property
*
* Returns 1 if successfull, 0 otherwise
* ---------------------------------------------------------------------- */
-int ply_add_list_property(p_ply ply, const char *name,
+int ply_add_list_property(p_ply ply, const char *name,
e_ply_type length_type, e_ply_type value_type);
/* ----------------------------------------------------------------------
@@ -295,7 +297,7 @@ int ply_add_list_property(p_ply ply, const char *name,
int ply_add_scalar_property(p_ply ply, const char *name, e_ply_type type);
/* ----------------------------------------------------------------------
- * Adds a new comment item
+ * Adds a new comment item
*
* ply: handle returned by ply_create
* comment: pointer to string with comment text
@@ -305,7 +307,7 @@ int ply_add_scalar_property(p_ply ply, const char *name, e_ply_type type);
int ply_add_comment(p_ply ply, const char *comment);
/* ----------------------------------------------------------------------
- * Adds a new obj_info item
+ * Adds a new obj_info item
*
* ply: handle returned by ply_create
* comment: pointer to string with obj_info data
@@ -328,7 +330,7 @@ int ply_write_header(p_ply ply);
* Writes one property value, in the order they should be written to the
* file. For each element type, write all elements of that type in order.
* For each element, write all its properties in order. For scalar
- * properties, just write the value. For list properties, write the length
+ * properties, just write the value. For list properties, write the length
* and then each of the values.
*
* ply: handle returned by ply_create
@@ -340,7 +342,7 @@ int ply_write(p_ply ply, double value);
/* ----------------------------------------------------------------------
* Closes a PLY file handle. Releases all memory used by handle
*
- * ply: handle to be closed.
+ * ply: handle to be closed.
*
* Returns 1 if successfull, 0 otherwise
* ---------------------------------------------------------------------- */
@@ -353,7 +355,7 @@ int ply_close(p_ply ply);
#endif /* RPLY_H */
/* ----------------------------------------------------------------------
- * Copyright (C) 2003-2011 Diego Nehab. All rights reserved.
+ * Copyright (C) 2003-2015 Diego Nehab. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
diff --git a/vendor/rply-1.1.4/rplyfile.h b/vendor/rply-1.1.4/rplyfile.h
new file mode 100644
index 0000000..206e716
--- /dev/null
+++ b/vendor/rply-1.1.4/rplyfile.h
@@ -0,0 +1,68 @@
+#ifndef RPLY_FILE_H
+#define RPLY_FILE_H
+/* ----------------------------------------------------------------------
+ * RPly library, read/write PLY files
+ * Diego Nehab, IMPA
+ * http://www.impa.br/~diego/software/rply
+ *
+ * This library is distributed under the MIT License. See notice
+ * at the end of this file.
+ * ---------------------------------------------------------------------- */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ----------------------------------------------------------------------
+ * Opens a PLY file for reading (fails if file is not a PLY file)
+ *
+ * file_pointer: FILE * to file open for reading
+ * error_cb: error callback function
+ * idata,pdata: contextual information available to users
+ *
+ * Returns 1 if successful, 0 otherwise
+ * ---------------------------------------------------------------------- */
+p_ply ply_open_from_file(FILE *file_pointer, p_ply_error_cb error_cb,
+ long idata, void *pdata);
+
+/* ----------------------------------------------------------------------
+ * Creates new PLY file
+ *
+ * file_pointer: FILE * to a file open for writing
+ * storage_mode: file format mode
+ * error_cb: error callback function
+ * idata,pdata: contextual information available to users
+ *
+ * Returns handle to PLY file if successfull, NULL otherwise
+ * ---------------------------------------------------------------------- */
+p_ply ply_create_to_file(FILE *file_pointer, e_ply_storage_mode storage_mode,
+ p_ply_error_cb error_cb, long idata, void *pdata);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* RPLY_FILE_H */
+
+/* ----------------------------------------------------------------------
+ * Copyright (C) 2003-2015 Diego Nehab. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * ---------------------------------------------------------------------- */
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/pdal.git
More information about the Pkg-grass-devel
mailing list