⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtree.h

📁 一个非常好的GIS开源新版本
💻 H
字号:
// Spatial Index Library//// Copyright (C) 2002 Navel Ltd.//// This library is free software; you can redistribute it and/or// modify it under the terms of the GNU Lesser General Public// License as published by the Free Software Foundation; either// version 2.1 of the License, or (at your option) any later version.//// This library is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU// Lesser General Public License for more details.//// You should have received a copy of the GNU Lesser General Public// License along with this library; if not, write to the Free Software// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA////  Email://    mhadji@gmail.com#ifndef __spatialindex_rtree_rtree_h#define __spatialindex_rtree_rtree_h#include "Statistics.h"#include "Node.h"#include "PointerPoolNode.h"namespace SpatialIndex{	namespace RTree	{		class RTree : public ISpatialIndex		{			class NNEntry;		public:			RTree(IStorageManager&, Tools::PropertySet&);				// String                   Value     Description				// ----------------------------------------------				// IndexIndentifier         VT_LONG   If specified an existing index will be openened from the supplied				//                          storage manager with the given index id. Behaviour is unspecified				//                          if the index id or the storage manager are incorrect.				// Dimension                VT_ULONG  Dimensionality of the data that will be inserted.				// IndexCapacity            VT_ULONG  The index node capacity. Default is 100.				// LeafCapactiy             VT_ULONG  The leaf node capacity. Default is 100.				// FillFactor               VT_DOUBLE The fill factor. Default is 70%				// TreeVariant              VT_LONG   Can be one of Linear, Quadratic or Rstar. Default is Rstar				// NearMinimumOverlapFactor VT_ULONG  Default is 32.				// SplitDistributionFactor  VT_DOUBLE Default is 0.4				// ReinsertFactor           VT_DOUBLE Default is 0.3				// EnsureTightMBRs          VT_BOOL   Default is true				// IndexPoolCapacity        VT_LONG   Default is 100				// LeafPoolCapacity         VT_LONG   Default is 100				// RegionPoolCapacity       VT_LONG   Default is 1000				// PointPoolCapacity        VT_LONG   Default is 500			virtual ~RTree();			//			// ISpatialIndex interface			//			virtual void insertData(unsigned long len, const byte* pData, const IShape& shape, long shapeIdentifier);			virtual bool deleteData(const IShape& shape, long id);			virtual void containsWhatQuery(const IShape& query, IVisitor& v);			virtual void intersectsWithQuery(const IShape& query, IVisitor& v);			virtual void pointLocationQuery(const Point& query, IVisitor& v);			virtual void nearestNeighborQuery(long k, const IShape& query, IVisitor& v, INearestNeighborComparator&);			virtual void nearestNeighborQuery(long k, const IShape& query, IVisitor& v);			virtual void selfJoinQuery(const IShape& s, IVisitor& v);			virtual void queryStrategy(IQueryStrategy& qs);			virtual void getIndexProperties(Tools::PropertySet& out) const;			virtual void addCommand(ICommand* pCommand, CommandType ct);			virtual bool isIndexValid();			virtual void getStatistics(IStatistics** out) const;		private:			void initNew(Tools::PropertySet&);			void initOld(Tools::PropertySet& ps);			void storeHeader();			void loadHeader();			void insertData_impl(unsigned long dataLength, byte* pData, Region& mbr, long id);			void insertData_impl(unsigned long dataLength, byte* pData, Region& mbr, long id, unsigned long level, byte* overflowTable);			bool deleteData_impl(const Region& mbr, long id);			long writeNode(Node*);			NodePtr readNode(unsigned long);			void deleteNode(Node*);			void rangeQuery(RangeQueryType type, const IShape& query, IVisitor& v);			void selfJoinQuery(long id1, long id2, const Region& r, IVisitor& vis);			IStorageManager* m_pStorageManager;			long m_rootID;			long m_headerID;			RTreeVariant m_treeVariant;			double m_fillFactor;			unsigned long m_indexCapacity;			unsigned long m_leafCapacity;			unsigned long m_nearMinimumOverlapFactor;				// The R*-Tree 'p' constant, for calculating nearly minimum overlap cost.				// [Beckmann, Kriegel, Schneider, Seeger 'The R*-tree: An efficient and Robust Access Method				// for Points and Rectangles', Section 4.1]			double m_splitDistributionFactor;				// The R*-Tree 'm' constant, for calculating spliting distributions.				// [Beckmann, Kriegel, Schneider, Seeger 'The R*-tree: An efficient and Robust Access Method				// for Points and Rectangles', Section 4.2]			double m_reinsertFactor;				// The R*-Tree 'p' constant, for removing entries at reinserts.				// [Beckmann, Kriegel, Schneider, Seeger 'The R*-tree: An efficient and Robust Access Method				//  for Points and Rectangles', Section 4.3]			unsigned long m_dimension;			Region m_infiniteRegion;			Statistics m_stats;			bool m_bTightMBRs;			Tools::PointerPool<Point> m_pointPool;			Tools::PointerPool<Region> m_regionPool;			Tools::PointerPool<Node> m_indexPool;			Tools::PointerPool<Node> m_leafPool;			std::vector<Tools::SmartPointer<ICommand> > m_writeNodeCommands;			std::vector<Tools::SmartPointer<ICommand> > m_readNodeCommands;			std::vector<Tools::SmartPointer<ICommand> > m_deleteNodeCommands;#ifdef PTHREADS			pthread_rwlock_t m_rwLock;#else			bool m_rwLock;#endif			class NNEntry			{			public:				long m_id;				IEntry* m_pEntry;				double m_minDist;				NNEntry(long id, IEntry* e, double f) : m_id(id), m_pEntry(e), m_minDist(f) {}				~NNEntry() {}				struct ascending : public std::binary_function<NNEntry*, NNEntry*, bool>				{					bool operator()(const NNEntry* __x, const NNEntry* __y) const { return __x->m_minDist > __y->m_minDist; }				};			}; // NNEntry			class NNComparator : public INearestNeighborComparator			{			public:				double getMinimumDistance(const IShape& query, const IShape& entry)				{					return query.getMinimumDistance(entry);				}				double getMinimumDistance(const IShape& query, const IData& data)				{					IShape* pS;					data.getShape(&pS);					double ret = query.getMinimumDistance(*pS);					delete pS;					return ret;				}			}; // NNComparator			class ValidateEntry			{			public:				ValidateEntry(Region& r, NodePtr& pNode) : m_parentMBR(r), m_pNode(pNode) {}				Region m_parentMBR;				NodePtr m_pNode;			}; // ValidateEntry			friend class Node;			friend class Leaf;			friend class Index;			friend class BulkLoader;			friend std::ostream& operator<<(std::ostream& os, const RTree& t);		}; // RTree		std::ostream& operator<<(std::ostream& os, const RTree& t);	}}#endif /*__spatialindex_rtree_rtree_h*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -