From dc48725c1f54cb30649eea93691d8c5e0711c9c4 Mon Sep 17 00:00:00 2001 From: Andrew Bell Date: Wed, 7 Oct 2015 11:47:40 -0500 Subject: [PATCH] Small bug fixes in attribute filter. Make crop filter work when prepared more than once. Add tests for attribute filter. Remove multi-dimension support for attribute filter. --- filters/crop/CropFilter.cpp | 13 +- plugins/attribute/CMakeLists.txt | 4 + plugins/attribute/filters/AttributeFilter.cpp | 185 ++++++++--------- plugins/attribute/filters/AttributeFilter.hpp | 68 ++----- .../attribute/test/AttributeFilterTest.cpp | 186 ++++++++++++++++++ 5 files changed, 300 insertions(+), 156 deletions(-) create mode 100644 plugins/attribute/test/AttributeFilterTest.cpp diff --git a/filters/crop/CropFilter.cpp b/filters/crop/CropFilter.cpp index 683c39cc42..2029ecedf7 100644 --- a/filters/crop/CropFilter.cpp +++ b/filters/crop/CropFilter.cpp @@ -34,6 +34,8 @@ #include "CropFilter.hpp" +#include + #include #include #include @@ -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); } @@ -123,8 +124,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; @@ -324,8 +329,10 @@ void CropFilter::done(PointTableRef /*table*/) GEOSPreparedGeom_destroy_r(m_geosEnvironment, g.m_prepGeom); GEOSGeom_destroy_r(m_geosEnvironment, g.m_geom); } + m_geoms.clear(); if (m_geosEnvironment) finishGEOS_r(m_geosEnvironment); + m_geosEnvironment = 0; #endif } diff --git a/plugins/attribute/CMakeLists.txt b/plugins/attribute/CMakeLists.txt index 7bce37b71f..7c2096cd2f 100644 --- a/plugins/attribute/CMakeLists.txt +++ b/plugins/attribute/CMakeLists.txt @@ -16,6 +16,10 @@ 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(attrtest 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 f98c06dd98..a5c994a2fa 100644 --- a/plugins/attribute/filters/AttributeFilter.cpp +++ b/plugins/attribute/filters/AttributeFilter.cpp @@ -35,6 +35,7 @@ #include "AttributeFilter.hpp" #include +#include #include #include @@ -99,13 +100,11 @@ Options AttributeFilter::getDefaultOptions() 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); @@ -119,64 +118,66 @@ Options AttributeFilter::getDefaultOptions() void AttributeFilter::processOptions(const Options& options) { - std::vector