[Liblas-commits] hg: 3 new changesets
liblas-commits at liblas.org
liblas-commits at liblas.org
Sat Oct 30 17:43:54 EDT 2010
changeset fc991c15f9cc in /Volumes/Data/www/liblas.org/hg
details: http://hg.liblas.orghg?cmd=changeset;node=fc991c15f9cc
summary: Added default switch-case to guarantee CovgStr is always initialised.
changeset 58062455b8b5 in /Volumes/Data/www/liblas.org/hg
details: http://hg.liblas.orghg?cmd=changeset;node=58062455b8b5
summary: Avoid unnecessary creation of iterators - create objects as close to point of their use as possible.
changeset a42b5f8eb37f in /Volumes/Data/www/liblas.org/hg
details: http://hg.liblas.orghg?cmd=changeset;node=a42b5f8eb37f
summary: Added test for writing and reading LAS file larger than 4GB. The issue is related to ticket #147 and problems when using streams from C++ Standard Library shipped with Visual C++. The problem can be solved very easily (2 lines of code) using Boost.IOStreams library. (No dependency of Boost.IOStreams has been introduced.)
diffstat:
CMakeLists.txt | 1 +
apps/CMakeLists.txt | 11 ++-
apps/bigfile_boost_iostreams_test.cpp | 141 ++++++++++++++++++++++++++++++++++
apps/lasindex_test.cpp | 6 +
src/laswriter.cpp | 21 +---
5 files changed, 163 insertions(+), 17 deletions(-)
diffs (255 lines):
diff -r b701def97f83 -r a42b5f8eb37f CMakeLists.txt
--- a/CMakeLists.txt Sat Oct 30 20:53:30 2010 +0100
+++ b/CMakeLists.txt Sat Oct 30 22:43:37 2010 +0100
@@ -132,6 +132,7 @@
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
+# NOTE: Add iostreams to COMPONENTS list to enable bigfile_boost_iostreams_test
find_package(Boost 1.38 COMPONENTS program_options REQUIRED)
if(Boost_FOUND AND Boost_PROGRAM_OPTIONS_FOUND)
diff -r b701def97f83 -r a42b5f8eb37f apps/CMakeLists.txt
--- a/apps/CMakeLists.txt Sat Oct 30 20:53:30 2010 +0100
+++ b/apps/CMakeLists.txt Sat Oct 30 22:43:37 2010 +0100
@@ -27,10 +27,14 @@
set(BIGFILE_TEST bigfile_test)
set(LASINDEX_TEST lasindex_test)
+if(Boost_IOSTREAMS_FOUND)
+ set(BIGFILE_BIO_TEST bigfile_boost_iostreams_test)
+endif()
+
# Set the build type to release if it is not explicitly set by the user and
# isn't in the cache yet
if (NOT CMAKE_BUILD_TYPE )
-set(CMAKE_BUILD_TYPE "Release")
+ set(CMAKE_BUILD_TYPE "Release")
endif()
# Utilities depending on 3rd-pary libraries
@@ -151,6 +155,11 @@
target_link_libraries(${LASINDEX_TEST} ${APPS_CPP_DEPENDENCIES} ${Boost_LIBRARIES})
endif()
+if(BIGFILE_BIO_TEST)
+ add_executable(${BIGFILE_BIO_TEST} bigfile_boost_iostreams_test.cpp)
+ target_link_libraries(${BIGFILE_BIO_TEST} ${APPS_CPP_DEPENDENCIES} ${Boost_LIBRARIES})
+endif()
+
###############################################################################
# Targets installation
diff -r b701def97f83 -r a42b5f8eb37f apps/bigfile_boost_iostreams_test.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/bigfile_boost_iostreams_test.cpp Sat Oct 30 22:43:37 2010 +0100
@@ -0,0 +1,141 @@
+/******************************************************************************
+ *
+ * Project: libLAS - http://liblas.org - A BSD library for LAS format data.
+ * Purpose: Test reading and writing of large LAS files (>4GB)
+ * using portable Boost.IOStreams library.
+ * Author: Mateusz Loskot, mateusz at loskot.net
+ *
+ ******************************************************************************
+ * Copyright (c) 2010, Mateusz Loskot
+ *
+ * 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 the Martin Isenburg or Iowa Department
+ * of Natural Resources 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 <liblas/laspoint.hpp>
+#include <liblas/lasreader.hpp>
+#include <liblas/laswriter.hpp>
+#ifdef _MSC_VER
+# pragma warning(push)
+# pragma warning(disable: 4702)
+#endif
+#include <boost/iostreams/device/file_descriptor.hpp>
+#include <boost/iostreams/positioning.hpp>
+#include <boost/iostreams/stream.hpp>
+#ifdef _MSC_VER
+# pragma warning(pop)
+#endif()
+#include <cassert>
+#include <exception>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+namespace bio = boost::iostreams;
+namespace las = liblas;
+
+int main()
+{
+ try
+ {
+ // name of generated file
+ std::string filename("bigfile_bio_test.las");
+ // test writing mor than 204 million points
+ bio::stream_offset const n_million_points = 210;
+ bio::stream_offset const point_count = 1024 * 1024 * n_million_points;
+
+ std::cout.setf(std::ios::fixed, std::ios::floatfield);
+ std::cout.setf(std::ios::showpoint);
+ std::cout.precision(2);
+
+ std::cout << "LAS file: " << filename << std::endl;
+ std::cout << "Writing " << point_count << " points" << std::endl;
+ {
+ typedef bio::stream<bio::file_descriptor_sink> bio_ostream;
+ bio_ostream bigofs(filename);
+ las::Header header;
+ las::Writer writer(bigofs, header);
+
+ las::Point empty_point;
+ bio::stream_offset i = 0;
+ for (i = 0; i < point_count; ++i)
+ {
+ if (!writer.WritePoint(empty_point))
+ {
+ std::ostringstream oss;
+ oss << "failed to write point #" << i;
+ throw std::runtime_error(oss.str());
+ }
+
+ if (i % 1000 == 0)
+ {
+ std::cout << "\b\b\b\b\b\b\b\b" << double(i)/point_count * 100.0;
+ }
+ }
+ assert(i == point_count);
+ }
+
+ std::cout << std::endl << "Reading " << point_count << " points" << std::endl;
+ {
+ typedef bio::stream<bio::file_descriptor_source> bio_istream;
+ bio_istream bigifs(filename);
+ las::Reader reader(bigifs);
+
+ bio::stream_offset i = 0;
+ while (reader.ReadNextPoint())
+ {
+ las::Point const& p = reader.GetPoint();
+
+ if (!p.Validate())
+ {
+ std::ostringstream oss;
+ oss << "invalid point around #" << i;
+ throw std::runtime_error(oss.str());
+ }
+
+ if (i % 1000 == 0)
+ {
+ std::cout << "\b\b\b\b\b\b\b\b" << double(i)/point_count * 100.0;
+ }
+ ++i;
+ }
+ assert(i == point_count);
+ }
+
+ std::cout << std::endl << "Done." << std::endl;
+
+ return EXIT_SUCCESS;
+ }
+ catch (std::exception const& e)
+ {
+ std::cerr << e.what() << std::endl;
+ }
+
+ return EXIT_FAILURE;
+}
diff -r b701def97f83 -r a42b5f8eb37f apps/lasindex_test.cpp
--- a/apps/lasindex_test.cpp Sat Oct 30 20:53:30 2010 +0100
+++ b/apps/lasindex_test.cpp Sat Oct 30 22:43:37 2010 +0100
@@ -651,7 +651,13 @@
indexBounds.max(2));
break;
} // 5
+ default:
+ {
+ CovgStr = "";
+ break;
+ }
} // switch
+
if (ParamSrc.SetFilterValues(filterBounds, index))
{
const std::vector<uint32_t>& FilterResult = index.Filter(ParamSrc);
diff -r b701def97f83 -r a42b5f8eb37f src/laswriter.cpp
--- a/src/laswriter.cpp Sat Oct 30 20:53:30 2010 +0100
+++ b/src/laswriter.cpp Sat Oct 30 22:43:37 2010 +0100
@@ -86,26 +86,15 @@
return false;
}
- std::vector<liblas::FilterI*>::const_iterator fi;
- std::vector<liblas::TransformI*>::const_iterator ti;
- bool bHaveTransforms = false;
- bool bHaveFilters = false;
-
- if (m_transforms != 0 ) {
- bHaveTransforms = true;
- }
-
- if (m_filters != 0 ) {
- bHaveFilters = true;
- }
-
+ bool bHaveTransforms = (m_transforms != 0);
+ bool bHaveFilters = (m_filters != 0);
if (bHaveFilters) {
if (m_filters->size() != 0) {
// We have filters, filter this point. All filters must
// return true for us to keep it.
bool keep = false;
- for (fi = m_filters->begin(); fi != m_filters->end(); ++fi) {
+ for (std::vector<liblas::FilterI*>::const_iterator fi = m_filters->begin(); fi != m_filters->end(); ++fi) {
liblas::FilterI* filter = *fi;
if (filter->filter(point)){
// if ->filter() is true, we keep the point
@@ -127,7 +116,8 @@
// Apply the transforms to each point
Point p(point);
- for (ti = m_transforms->begin(); ti != m_transforms->end(); ++ti) {
+ for (std::vector<liblas::TransformI*>::const_iterator ti = m_transforms->begin();
+ ti != m_transforms->end(); ++ti) {
liblas::TransformI* transform = *ti;
transform->transform(p);
@@ -137,7 +127,6 @@
// transformations that change the point.
m_pimpl->WritePoint(p, m_header);
return true;
-
}
}
More information about the Liblas-commits
mailing list