[geos-commits] [SCM] GEOS branch master updated. e4fd106f4f66167b554389c7b441d9bc5ee89b1b

git at osgeo.org git at osgeo.org
Fri Feb 19 04:50:33 PST 2021


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GEOS".

The branch, master has been updated
       via  e4fd106f4f66167b554389c7b441d9bc5ee89b1b (commit)
       via  5e9f7ada73dcbdfd9e9bc1148924ebc4ecd0b087 (commit)
      from  bab2a01a744b5bb300fa7276012cda29a0570f33 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit e4fd106f4f66167b554389c7b441d9bc5ee89b1b
Merge: bab2a01 5e9f7ad
Author: Daniel Baston <dbaston at gmail.com>
Date:   Fri Feb 19 07:49:09 2021 -0500

    Merge branch 'rm-cascaded-union'


commit 5e9f7ada73dcbdfd9e9bc1148924ebc4ecd0b087
Author: Daniel Baston <dbaston at gmail.com>
Date:   Thu Feb 18 15:02:36 2021 -0500

    Remove linear CascadedUnion
    
    This was added as a robustness improvement, but it appears no longer
    necessary with the use of OverlayNG. Removing this eliminates a
    significant amount of duplicated code.

diff --git a/include/geos/operation/union/CascadedUnion.h b/include/geos/operation/union/CascadedUnion.h
deleted file mode 100644
index 91d3f28..0000000
--- a/include/geos/operation/union/CascadedUnion.h
+++ /dev/null
@@ -1,199 +0,0 @@
-/**********************************************************************
- *
- * GEOS - Geometry Engine Open Source
- * http://trac.osgeo.org/geos
- *
- * Copyright (C) 2011 Sandro Santilli <strk at kbt.io>
- *
- * This is free software; you can redistribute and/or modify it under
- * the terms of the GNU Lesser General Public Licence as published
- * by the Free Software Foundation.
- * See the COPYING file for more information.
- *
- **********************************************************************
- *
- * Last port: ORIGINAL WORK, generalization of CascadedPolygonUnion
- *
- **********************************************************************/
-
-#ifndef GEOS_OP_UNION_CASCADEDUNION_H
-#define GEOS_OP_UNION_CASCADEDUNION_H
-
-#include <geos/export.h>
-
-#include <vector>
-#include <algorithm>
-
-#include "GeometryListHolder.h"
-
-// Forward declarations
-namespace geos {
-namespace geom {
-class GeometryFactory;
-class Geometry;
-class Geometry;
-class Envelope;
-}
-namespace index {
-namespace strtree {
-class ItemsList;
-}
-}
-}
-
-namespace geos {
-namespace operation { // geos::operation
-namespace geounion {  // geos::operation::geounion
-
-/**
- * \brief
- * Provides an efficient method of unioning a collection of Geometries
- *
- * This algorithm is more robust than the simple iterated approach
- * of repeatedly unioning each geometry to a result geometry.
- */
-class GEOS_DLL CascadedUnion {
-private:
-    const std::vector<geom::Geometry*>* inputGeoms;
-    geom::GeometryFactory const* geomFactory;
-
-    /**
-     * The effectiveness of the index is somewhat sensitive
-     * to the node capacity.
-     * Testing indicates that a smaller capacity is better.
-     * For an STRtree, 4 is probably a good number (since
-     * this produces 2x2 "squares").
-     */
-    static int const STRTREE_NODE_CAPACITY = 4;
-
-public:
-    CascadedUnion();
-
-    /**
-     * Computes the union of a collection of {@link geom::Geometry}s.
-     *
-     * @param geoms a collection of {@link geom::Geometry}s.
-     *        ownership of elements _and_ vector are left to caller.
-     */
-    static geom::Geometry* Union(std::vector<geom::Geometry*>* geoms);
-
-    /**
-     * Computes the union of a set of {@link geom::Geometry}s.
-     *
-     * @tparam T an iterator yelding something castable to const Geometry *
-     * @param start start iterator
-     * @param end end iterator
-     */
-    template <class T>
-    static geom::Geometry*
-    Union(T start, T end)
-    {
-        std::vector<geom::Geometry*> polys;
-        for(T i = start; i != end; ++i) {
-            const geom::Geometry* p = dynamic_cast<const geom::Geometry*>(*i);
-            polys.push_back(const_cast<geom::Geometry*>(p));
-        }
-        return Union(&polys);
-    }
-
-    /**
-     * Creates a new instance to union
-     * the given collection of {@link geom::Geometry}s.
-     *
-     * @param geoms a collection of {@link geom::Geometry}s.
-     *              Ownership of elements _and_ vector are left to caller.
-     */
-    CascadedUnion(const std::vector<geom::Geometry*>* geoms)
-        : inputGeoms(geoms),
-          geomFactory(nullptr)
-    {}
-
-    /**
-     * Computes the union of the input geometries.
-     *
-     * @return the union of the input geometries
-     * @return null if no input geometries were provided
-     */
-    geom::Geometry* Union();
-
-private:
-    geom::Geometry* unionTree(index::strtree::ItemsList* geomTree);
-
-    /**
-     * Unions a list of geometries
-     * by treating the list as a flattened binary tree,
-     * and performing a cascaded union on the tree.
-     */
-    geom::Geometry* binaryUnion(GeometryListHolder* geoms);
-
-    /**
-     * Unions a section of a list using a recursive binary union on each half
-     * of the section.
-     *
-     * @param geoms
-     * @param start
-     * @param end
-     * @return the union of the list section
-     */
-    geom::Geometry* binaryUnion(GeometryListHolder* geoms, std::size_t start,
-                                std::size_t end);
-
-    /**
-     * Reduces a tree of geometries to a list of geometries
-     * by recursively unioning the subtrees in the list.
-     *
-     * @param geomTree a tree-structured list of geometries
-     * @return a list of Geometrys
-     */
-    GeometryListHolder* reduceToGeometries(index::strtree::ItemsList* geomTree);
-
-    /**
-     * Computes the union of two geometries,
-     * either of both of which may be null.
-     *
-     * @param g0 a Geometry
-     * @param g1 a Geometry
-     * @return the union of the input(s)
-     * @return null if both inputs are null
-     */
-    geom::Geometry* unionSafe(geom::Geometry* g0, geom::Geometry* g1);
-
-    geom::Geometry* unionOptimized(geom::Geometry* g0, geom::Geometry* g1);
-
-    /**
-     * Unions two geometries.
-     * The case of multi geometries is optimized to union only
-     * the components which lie in the intersection of the two geometry's
-     * envelopes.
-     * Geometrys outside this region can simply be combined with the union
-     * result, which is potentially much faster.
-     * This case is likely to occur often during cascaded union, and may also
-     * occur in real world data (such as unioning data for parcels on
-     * different street blocks).
-     *
-     * @param g0 a geometry
-     * @param g1 a geometry
-     * @param common the intersection of the envelopes of the inputs
-     * @return the union of the inputs
-     */
-    geom::Geometry* unionUsingEnvelopeIntersection(geom::Geometry* g0,
-            geom::Geometry* g1, geom::Envelope const& common);
-
-    geom::Geometry* extractByEnvelope(geom::Envelope const& env,
-                                      geom::Geometry* geom, std::vector<const geom::Geometry*>& disjointGeoms);
-
-    /**
-     * Encapsulates the actual unioning of two polygonal geometries.
-     *
-     * @param g0
-     * @param g1
-     * @return
-     */
-    static geom::Geometry* unionActual(geom::Geometry* g0, geom::Geometry* g1);
-};
-
-} // namespace geos::operation::union
-} // namespace geos::operation
-} // namespace geos
-
-#endif
diff --git a/src/operation/union/CascadedUnion.cpp b/src/operation/union/CascadedUnion.cpp
deleted file mode 100644
index f320df1..0000000
--- a/src/operation/union/CascadedUnion.cpp
+++ /dev/null
@@ -1,209 +0,0 @@
-/**********************************************************************
- *
- * GEOS - Geometry Engine Open Source
- * http://trac.osgeo.org/geos
- *
- * Copyright (C) 2011 Sandro Santilli <strk at kbt.io>
- *
- * This is free software; you can redistribute and/or modify it under
- * the terms of the GNU Lesser General Public Licence as published
- * by the Free Software Foundation.
- * See the COPYING file for more information.
- *
- **********************************************************************
- *
- * Last port: ORIGINAL WORK, generalization of CascadedPolygonUnion
- *
- **********************************************************************/
-
-#include <geos/operation/union/CascadedUnion.h>
-#include <geos/geom/Geometry.h>
-#include <geos/geom/GeometryFactory.h>
-#include <geos/geom/util/GeometryCombiner.h>
-#include <geos/index/strtree/STRtree.h>
-// std
-#include <cassert>
-#include <cstddef>
-#include <memory>
-#include <vector>
-
-namespace geos {
-namespace operation { // geos.operation
-namespace geounion {  // geos.operation.geounion
-
-geom::Geometry*
-CascadedUnion::Union(std::vector<geom::Geometry*>* polys)
-{
-    CascadedUnion op(polys);
-    return op.Union();
-}
-
-geom::Geometry*
-CascadedUnion::Union()
-{
-    if(inputGeoms->empty()) {
-        return nullptr;
-    }
-
-    geomFactory = inputGeoms->front()->getFactory();
-
-    /*
-     * A spatial index to organize the collection
-     * into groups of close geometries.
-     * This makes unioning more efficient, since vertices are more likely
-     * to be eliminated on each round.
-     */
-    index::strtree::STRtree index(STRTREE_NODE_CAPACITY);
-
-    typedef std::vector<geom::Geometry*>::const_iterator iterator_type;
-    iterator_type end = inputGeoms->end();
-    for(iterator_type i = inputGeoms->begin(); i != end; ++i) {
-        geom::Geometry* g = *i;
-        index.insert(g->getEnvelopeInternal(), g);
-    }
-
-    std::unique_ptr<index::strtree::ItemsList> itemTree(index.itemsTree());
-
-    return unionTree(itemTree.get());
-}
-
-geom::Geometry*
-CascadedUnion::unionTree(
-    index::strtree::ItemsList* geomTree)
-{
-    /*
-     * Recursively unions all subtrees in the list into single geometries.
-     * The result is a list of Geometry's only
-     */
-    std::unique_ptr<GeometryListHolder> geoms(reduceToGeometries(geomTree));
-    return binaryUnion(geoms.get());
-}
-
-geom::Geometry*
-CascadedUnion::binaryUnion(GeometryListHolder* geoms)
-{
-    return binaryUnion(geoms, 0, geoms->size());
-}
-
-geom::Geometry*
-CascadedUnion::binaryUnion(GeometryListHolder* geoms,
-                           std::size_t start, std::size_t end)
-{
-    if(end - start <= 1) {
-        return unionSafe(geoms->getGeometry(start), nullptr);
-    }
-    else if(end - start == 2) {
-        return unionSafe(geoms->getGeometry(start), geoms->getGeometry(start + 1));
-    }
-    else {
-        // recurse on both halves of the list
-        std::size_t mid = (end + start) / 2;
-        std::unique_ptr<geom::Geometry> g0(binaryUnion(geoms, start, mid));
-        std::unique_ptr<geom::Geometry> g1(binaryUnion(geoms, mid, end));
-        return unionSafe(g0.get(), g1.get());
-    }
-}
-
-GeometryListHolder*
-CascadedUnion::reduceToGeometries(index::strtree::ItemsList* geomTree)
-{
-    std::unique_ptr<GeometryListHolder> geoms(new GeometryListHolder());
-
-    typedef index::strtree::ItemsList::iterator iterator_type;
-    iterator_type end = geomTree->end();
-    for(iterator_type i = geomTree->begin(); i != end; ++i) {
-        if((*i).get_type() == index::strtree::ItemsListItem::item_is_list) {
-            std::unique_ptr<geom::Geometry> geom(unionTree((*i).get_itemslist()));
-            geoms->push_back_owned(geom.get());
-            geom.release();
-        }
-        else if((*i).get_type() == index::strtree::ItemsListItem::item_is_geometry) {
-            geoms->push_back(reinterpret_cast<geom::Geometry*>((*i).get_geometry()));
-        }
-        else {
-            assert(!static_cast<bool>("should never be reached"));
-        }
-    }
-
-    return geoms.release();
-}
-
-geom::Geometry*
-CascadedUnion::unionSafe(geom::Geometry* g0, geom::Geometry* g1)
-{
-    if(g0 == nullptr && g1 == nullptr) {
-        return nullptr;
-    }
-
-    if(g0 == nullptr) {
-        return g1->clone().release();
-    }
-    if(g1 == nullptr) {
-        return g0->clone().release();
-    }
-
-    return unionOptimized(g0, g1);
-}
-
-geom::Geometry*
-CascadedUnion::unionOptimized(geom::Geometry* g0, geom::Geometry* g1)
-{
-    geom::Envelope const* g0Env = g0->getEnvelopeInternal();
-    geom::Envelope const* g1Env = g1->getEnvelopeInternal();
-
-    if(!g0Env->intersects(g1Env)) {
-        return geom::util::GeometryCombiner::combine(g0, g1).release();
-    }
-
-    if(g0->getNumGeometries() <= 1 && g1->getNumGeometries() <= 1) {
-        return unionActual(g0, g1);
-    }
-
-    geom::Envelope commonEnv;
-    g0Env->intersection(*g1Env, commonEnv);
-    return unionUsingEnvelopeIntersection(g0, g1, commonEnv);
-}
-
-geom::Geometry*
-CascadedUnion::unionUsingEnvelopeIntersection(geom::Geometry* g0,
-        geom::Geometry* g1, geom::Envelope const& common)
-{
-    std::vector<const geom::Geometry*> disjointPolys;
-
-    std::unique_ptr<geom::Geometry> g0Int(extractByEnvelope(common, g0, disjointPolys));
-    std::unique_ptr<geom::Geometry> g1Int(extractByEnvelope(common, g1, disjointPolys));
-
-    std::unique_ptr<geom::Geometry> u(unionActual(g0Int.get(), g1Int.get()));
-    disjointPolys.push_back(u.get());
-
-    return geom::util::GeometryCombiner::combine(disjointPolys).release();
-}
-
-geom::Geometry*
-CascadedUnion::extractByEnvelope(geom::Envelope const& env,
-                                 geom::Geometry* geom, std::vector<const geom::Geometry*>& disjointGeoms)
-{
-    std::vector<const geom::Geometry*> intersectingGeoms;
-
-    for(std::size_t i = 0; i < geom->getNumGeometries(); i++) {
-        const geom::Geometry* elem = geom->getGeometryN(i);
-        if(elem->getEnvelopeInternal()->intersects(env)) {
-            intersectingGeoms.push_back(elem);
-        }
-        else {
-            disjointGeoms.push_back(elem);
-        }
-    }
-
-    return geomFactory->buildGeometry(intersectingGeoms);
-}
-
-geom::Geometry*
-CascadedUnion::unionActual(geom::Geometry* g0, geom::Geometry* g1)
-{
-    return g0->Union(g1).release();
-}
-
-} // namespace geos.operation.union
-} // namespace geos.operation
-} // namespace geos
diff --git a/src/operation/union/UnaryUnionOp.cpp b/src/operation/union/UnaryUnionOp.cpp
index ba2f4d0..ae18770 100644
--- a/src/operation/union/UnaryUnionOp.cpp
+++ b/src/operation/union/UnaryUnionOp.cpp
@@ -21,7 +21,6 @@
 #include <algorithm> // for copy
 
 #include <geos/operation/union/UnaryUnionOp.h>
-#include <geos/operation/union/CascadedUnion.h>
 #include <geos/operation/union/CascadedPolygonUnion.h>
 #include <geos/operation/union/PointGeometryUnion.h>
 #include <geos/geom/Coordinate.h>
@@ -88,25 +87,8 @@ UnaryUnionOp::Union()
 
     GeomPtr unionLines;
     if(!lines.empty()) {
-        /* JTS compatibility NOTE:
-         * we use cascaded here for robustness [1]
-         * but also add a final unionNoOpt step to deal with
-         * self-intersecting lines [2]
-         *
-         * [1](http://trac.osgeo.org/geos/ticket/392
-         * [2](http://trac.osgeo.org/geos/ticket/482
-         *
-         */
-        try {
-            auto combinedLines = geomFact->buildGeometry(lines.begin(), lines.end());
-            unionLines = unionNoOpt(*combinedLines);
-        } catch (geos::util::TopologyException &) {
-            unionLines.reset(CascadedUnion::Union(lines.begin(),
-                                                  lines.end()));
-            if(unionLines.get()) {
-                unionLines = unionNoOpt(*unionLines);
-            }
-        }
+        auto combinedLines = geomFact->buildGeometry(lines.begin(), lines.end());
+        unionLines = unionNoOpt(*combinedLines);
     }
 
     GeomPtr unionPolygons;

-----------------------------------------------------------------------

Summary of changes:
 include/geos/operation/union/CascadedUnion.h | 199 -------------------------
 src/operation/union/CascadedUnion.cpp        | 209 ---------------------------
 src/operation/union/UnaryUnionOp.cpp         |  22 +--
 3 files changed, 2 insertions(+), 428 deletions(-)
 delete mode 100644 include/geos/operation/union/CascadedUnion.h
 delete mode 100644 src/operation/union/CascadedUnion.cpp


hooks/post-receive
-- 
GEOS


More information about the geos-commits mailing list