[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