00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef GEOS_IDX_QUADTREE_NODE_H
00017 #define GEOS_IDX_QUADTREE_NODE_H
00018
00019 #include <geos/index/quadtree/NodeBase.h>
00020 #include <geos/geom/Coordinate.h>
00021 #include <geos/geom/Envelope.h>
00022
00023 #include <string>
00024
00025
00026 namespace geos {
00027 namespace geom {
00028
00029 class Envelope;
00030 }
00031 }
00032
00033 namespace geos {
00034 namespace index {
00035 namespace quadtree {
00036
00045 class Node: public NodeBase {
00046
00047 private:
00048
00049 geom::Envelope *env;
00050
00051 geom::Coordinate centre;
00052
00053 int level;
00054
00055 Node* getSubnode(int index);
00056
00057 Node* createSubnode(int index);
00058
00059 protected:
00060
00061 bool isSearchMatch(const geom::Envelope *searchEnv) {
00062 return env->intersects(searchEnv);
00063 }
00064
00065 public:
00066
00067 static Node* createNode(geom::Envelope *env);
00068
00069 static Node* createExpanded(Node *node,
00070 const geom::Envelope *addEnv);
00071
00072
00073 Node(geom::Envelope *nenv, int nlevel)
00074 :
00075 env(nenv),
00076 centre((nenv->getMinX()+nenv->getMaxX())/2,
00077 (nenv->getMinY()+nenv->getMaxY())/2),
00078 level(nlevel)
00079 {
00080 }
00081
00082 virtual ~Node() { delete env; }
00083
00084 geom::Envelope* getEnvelope() { return env; }
00085
00091 Node* getNode(const geom::Envelope *searchEnv);
00092
00097 NodeBase* find(const geom::Envelope *searchEnv);
00098
00099 void insertNode(Node *node);
00100
00101 std::string toString() const;
00102
00103 };
00104
00105 }
00106 }
00107 }
00108
00109 #endif // GEOS_IDX_QUADTREE_NODE_H
00110
00111
00112
00113
00114
00115
00116
00117