DYT/Tool/OpenSceneGraph-3.6.5/include/geos/index/quadtree/Node.h

142 lines
3.3 KiB
C
Raw Normal View History

2024-12-24 23:49:36 +00:00
/**********************************************************************
*
* GEOS - Geometry Engine Open Source
* http://geos.osgeo.org
*
* Copyright (C) 2006 Refractions Research Inc.
*
* 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: index/quadtree/Node.java rev 1.8 (JTS-1.10)
*
**********************************************************************/
#pragma once
#include <geos/export.h>
#include <geos/index/quadtree/NodeBase.h> // for inheritance
#include <geos/geom/Coordinate.h> // for composition
#include <geos/geom/Envelope.h> // for inline
#include <string>
#include <memory>
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
#endif
// Forward declarations
namespace geos {
namespace geom {
//class Coordinate;
class Envelope;
}
}
namespace geos {
namespace index { // geos::index
namespace quadtree { // geos::index::quadtree
/**
* \brief
* Represents a node of a Quadtree.
*
* Nodes contain items which have a spatial extent corresponding to
* the node's position in the quadtree.
*
*/
class GEOS_DLL Node: public NodeBase {
private:
/// Owned by this class
std::unique_ptr<geom::Envelope> env;
geom::Coordinate centre;
int level;
/**
* Get the subquad for the index.
* If it doesn't exist, create it.
*
* Ownership of the returned object belongs to this class.
*/
Node* getSubnode(int index);
std::unique_ptr<Node> createSubnode(int index);
protected:
bool
isSearchMatch(const geom::Envelope& searchEnv) const override
{
return env->intersects(searchEnv);
}
public:
// Create a node computing level from given envelope
static std::unique_ptr<Node> createNode(const geom::Envelope& env);
/// Create a node containing the given node and envelope
//
/// @param node if not null, will be inserted to the returned node
/// @param addEnv minimum envelope to use for the node
///
static std::unique_ptr<Node> createExpanded(std::unique_ptr<Node> node,
const geom::Envelope& addEnv);
Node(std::unique_ptr<geom::Envelope> nenv, int nlevel)
:
env(std::move(nenv)),
centre((env->getMinX() + env->getMaxX()) / 2,
(env->getMinY() + env->getMaxY()) / 2),
level(nlevel)
{
}
~Node() override {}
/// Return Envelope associated with this node
/// ownership retained by this object
geom::Envelope*
getEnvelope()
{
return env.get();
}
/** \brief
* Returns the subquad containing the envelope.
* Creates the subquad if
* it does not already exist.
*/
Node* getNode(const geom::Envelope* searchEnv);
/** \brief
* Returns the smallest <i>existing</i>
* node containing the envelope.
*/
NodeBase* find(const geom::Envelope* searchEnv);
void insertNode(std::unique_ptr<Node> node);
std::string toString() const override;
};
} // namespace geos::index::quadtree
} // namespace geos::index
} // namespace geos
#ifdef _MSC_VER
#pragma warning(pop)
#endif