From 9cfd7f6122c81860980a32598465abed7fc3ae31 Mon Sep 17 00:00:00 2001 From: Howard Butler Date: Wed, 2 Oct 2024 09:55:40 -0500 Subject: [PATCH] fix filters.geomdistance initialization and distance comparisons (#4510) * fix filters.geomdistance initialization and distance comparisons * use Miniforge3 variant --- .github/workflows/conda.yml | 2 +- filters/GeomDistanceFilter.cpp | 33 +++++++++++++++++++++------------ filters/GeomDistanceFilter.hpp | 2 ++ pdal/Geometry.cpp | 3 +++ 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/.github/workflows/conda.yml b/.github/workflows/conda.yml index 4dbc5989af..81a8a8e6e1 100644 --- a/.github/workflows/conda.yml +++ b/.github/workflows/conda.yml @@ -42,7 +42,7 @@ jobs: - uses: conda-incubator/setup-miniconda@v3 with: - miniforge-variant: Mambaforge + miniforge-variant: Miniforge3 miniforge-version: latest use-mamba: true auto-update-conda: true diff --git a/filters/GeomDistanceFilter.cpp b/filters/GeomDistanceFilter.cpp index 6a5fb7d4ff..bc6e1e2d61 100644 --- a/filters/GeomDistanceFilter.cpp +++ b/filters/GeomDistanceFilter.cpp @@ -86,6 +86,10 @@ void GeomDistanceFilter::addDimensions(PointLayoutPtr layout) Dimension::Type::Double); } +void GeomDistanceFilter::initialize() +{ + gdal::registerDrivers(); +} void GeomDistanceFilter::addArgs(ProgramArgs& args) { @@ -96,18 +100,6 @@ void GeomDistanceFilter::addArgs(ProgramArgs& args) args.add("ring", "Compare edges (demote polygons to linearrings)", m_args->m_doRingMode, false); args.add("ogr", "OGR filter geometries", m_args->m_ogr); - if (!m_args->m_ogr.is_null()) - { - std::vector polys = gdal::getPolygons(m_args->m_ogr); - if (!polys.size()) - throwError("No polygons were selected from 'ogr'!"); - m_args->m_geometry = polys[0]; - // log()->get(LogLevel::Debug) << "First polygon selected from 'ogr' data" << std::endl; - - } - - if (m_args->m_doRingMode) - m_args->m_geometry = m_args->m_geometry.getRing(); } @@ -122,6 +114,23 @@ void GeomDistanceFilter::prepared(PointTableRef table) } +void GeomDistanceFilter::ready(PointTableRef table) +{ + if (!m_args->m_ogr.is_null()) + { + std::vector polys = gdal::getPolygons(m_args->m_ogr); + if (!polys.size()) + throwError("No polygons were selected from 'ogr'!"); + m_args->m_geometry = polys[0]; + } + + if (m_args->m_doRingMode) + m_args->m_geometry = m_args->m_geometry.getRing(); + + if (!m_args->m_geometry.getOGRHandle()) + throwError("Candidate polygon in filters.geomdistance was NULL!"); +} + void GeomDistanceFilter::filter(PointView& view) { diff --git a/filters/GeomDistanceFilter.hpp b/filters/GeomDistanceFilter.hpp index 32ddb91587..a4c38ba75f 100644 --- a/filters/GeomDistanceFilter.hpp +++ b/filters/GeomDistanceFilter.hpp @@ -64,6 +64,8 @@ class PDAL_DLL GeomDistanceFilter : public Filter, public Streamable virtual void filter(PointView& view) override; virtual void addDimensions(PointLayoutPtr layout) override; virtual void prepared(PointTableRef table) override; + virtual void initialize() override; + virtual void ready(PointTableRef table) override; virtual bool processOne(PointRef& point) override; GeomDistanceFilter& operator=(const GeomDistanceFilter&) = delete; diff --git a/pdal/Geometry.cpp b/pdal/Geometry.cpp index 43170c46b2..ae7ce3b6b2 100644 --- a/pdal/Geometry.cpp +++ b/pdal/Geometry.cpp @@ -259,6 +259,9 @@ BOX3D Geometry::bounds() const double Geometry::distance(double x, double y, double z) const { OGRPoint p(x, y, z); + throwNoGeos(); + if(!m_geom) + throw pdal_error("Cannot compare distance of null geometry!"); return m_geom->Distance((OGRGeometry*)&p); }