Skip to content

Commit

Permalink
Separate scan lines filter (#2724)
Browse files Browse the repository at this point in the history
* First commit for Separatescanline filter

* Add doc for Separatescanline filter

* Add test for separatescanline filter

* Minor changes
- remove unused variables
- match variables type
  • Loading branch information
gui2dev authored and abellgithub committed Sep 8, 2019
1 parent f2086d6 commit abdcb26
Show file tree
Hide file tree
Showing 7 changed files with 10,268 additions and 0 deletions.
4 changes: 4 additions & 0 deletions doc/stages/filters.rst
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,7 @@ filters will invalidate an existing KD-tree.
filters.divider
filters.groupby
filters.returns
filters.separatescanline
filters.splitter

:ref:`filters.chipper`
Expand All @@ -294,6 +295,9 @@ filters will invalidate an existing KD-tree.
:ref:`filters.returns`
Split data by return order (e.g., 'first', 'last', 'intermediate', 'only').

:ref:`filters.separatescanline`
Split data based on scan lines.

:ref:`filters.splitter`
Split data based on a X/Y box length.

Expand Down
33 changes: 33 additions & 0 deletions doc/stages/filters.separatescanline.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
.. _filters.separatescanline:

filters.separatescanline
===============================================================================

The **Separate scan line Filter** takes a single ``PointView`` as its input and
creates a ``PointView`` for each scan line as its output. ``PointView`` must contain
the ``EdgeOfFlightLine`` dimension_.

.. embed::

Example
-------

The following pipeline will create a set of text files, where each file contains
only 10 scan lines.

.. code-block:: json
[
"input.text",
{
"type":"filters.separatescanline",
"groupby":10
},
"output_#.text"
]
Options
-------

_`groupby`
The number of lines to be grouped by. [Default : 1]
97 changes: 97 additions & 0 deletions filters/SeparateScanLineFilter.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
/******************************************************************************
* Copyright (c) 2019, Guilhem Villemin (guilhem.villemin@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 "SeparateScanLineFilter.hpp"

#include <pdal/util/ProgramArgs.hpp>

namespace pdal
{

static StaticPluginInfo const s_info
{
"filters.separatescanline",
"Split data by scan line.",
"http://pdal.io/stages/filters.separatescanline.html"
};
CREATE_STATIC_STAGE(SeparateScanLineFilter, s_info)

SeparateScanLineFilter::SeparateScanLineFilter()
{}

std::string SeparateScanLineFilter::getName() const
{
return s_info.name;
}

void SeparateScanLineFilter::addArgs(ProgramArgs& args)
{
args.add("groupby", "Number of lines to be grouped by", m_groupBy, (uint64_t) 1u);
}

void SeparateScanLineFilter::prepared(PointTableRef table)
{
PointLayoutPtr layout(table.layout());
if (!layout->hasDim(Dimension::Id::EdgeOfFlightLine))
throwError("Layout does not contains EdgeOfFlightLine dimension.");
}

PointViewSet SeparateScanLineFilter::run(PointViewPtr inView)
{
PointViewSet result;
PointViewPtr v(inView->makeNew());
result.insert(v);

uint64_t lineNum = 1;
for (PointId i = 0; i < inView->size();++i)
{
v->appendPoint(*inView, i);
if (inView->getFieldAs<uint8_t>(Dimension::Id::EdgeOfFlightLine, i))
{
if (++lineNum > m_groupBy)
{
v = inView->makeNew();
result.insert(v);
lineNum = 1;
}
}
}
//if last point was an edge of flight line
if (v->empty())
result.erase(v);

return result;
}

} // pdal
66 changes: 66 additions & 0 deletions filters/SeparateScanLineFilter.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/******************************************************************************
* Copyright (c) 2019, Guilhem Villemin (guilhem.villemin@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 <pdal/Filter.hpp>

#include <map>
#include <string>

namespace pdal
{

class PointView;
class ProgramArgs;

class PDAL_DLL SeparateScanLineFilter : public Filter
{
public:
SeparateScanLineFilter();

std::string getName() const;

private:
uint64_t m_groupBy;

virtual void addArgs(ProgramArgs& args);
virtual void prepared(PointTableRef table);
virtual PointViewSet run(PointViewPtr view);

SeparateScanLineFilter& operator=(const SeparateScanLineFilter&); // not implemented
SeparateScanLineFilter(const SeparateScanLineFilter&); // not implemented
};

} // namespace pdal

0 comments on commit abdcb26

Please sign in to comment.