[geos-commits] r2064 - in trunk/source/index: . intervalrtree

svn_geos at osgeo.org svn_geos at osgeo.org
Fri Dec 21 15:41:14 EST 2007


Author: benjubb
Date: 2007-12-21 15:41:14 -0500 (Fri, 21 Dec 2007)
New Revision: 2064

Added:
   trunk/source/index/intervalrtree/
   trunk/source/index/intervalrtree/IntervalRTreeBranchNode.cpp
   trunk/source/index/intervalrtree/IntervalRTreeLeafNode.cpp
   trunk/source/index/intervalrtree/IntervalRTreeNode.cpp
   trunk/source/index/intervalrtree/SortedPackedIntervalRTree.cpp
Log:
Added from JTS 1.9 to support prepared geometry 

Added: trunk/source/index/intervalrtree/IntervalRTreeBranchNode.cpp
===================================================================
--- trunk/source/index/intervalrtree/IntervalRTreeBranchNode.cpp	                        (rev 0)
+++ trunk/source/index/intervalrtree/IntervalRTreeBranchNode.cpp	2007-12-21 20:41:14 UTC (rev 2064)
@@ -0,0 +1,57 @@
+/**********************************************************************
+ * $Id:
+ *
+ * GEOS - Geometry Engine Open Source
+ * http://geos.refractions.net
+ *
+ * Copyright (C) 2001-2002 Vivid Solutions 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.
+ *
+ **********************************************************************/
+
+#include <geos/index/intervalrtree/IntervalRTreeBranchNode.h>
+#include <geos/index/ItemVisitor.h>
+
+
+namespace geos {
+namespace index {
+namespace intervalrtree {
+//
+// private:
+//
+
+//
+// protected:
+//
+
+//
+// public:
+//
+	
+
+void 
+IntervalRTreeBranchNode::query( double queryMin, double queryMax, index::ItemVisitor * visitor) const
+{
+	if (! intersects(queryMin, queryMax)) 
+		return;
+
+	if (node1) 
+		node1->query( queryMin, queryMax, visitor);
+
+	if (node2) 
+		node2->query( queryMin, queryMax, visitor);
+}
+
+
+} // geos::intervalrtree
+} // geos::index
+} // geos
+
+/**********************************************************************
+ * $Log$
+ *
+ **********************************************************************/


Property changes on: trunk/source/index/intervalrtree/IntervalRTreeBranchNode.cpp
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: trunk/source/index/intervalrtree/IntervalRTreeLeafNode.cpp
===================================================================
--- trunk/source/index/intervalrtree/IntervalRTreeLeafNode.cpp	                        (rev 0)
+++ trunk/source/index/intervalrtree/IntervalRTreeLeafNode.cpp	2007-12-21 20:41:14 UTC (rev 2064)
@@ -0,0 +1,50 @@
+/**********************************************************************
+ * $Id:
+ *
+ * GEOS - Geometry Engine Open Source
+ * http://geos.refractions.net
+ *
+ * Copyright (C) 2001-2002 Vivid Solutions 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.
+ *
+ **********************************************************************/
+
+#include <geos/index/intervalrtree/IntervalRTreeLeafNode.h>
+#include <geos/index/ItemVisitor.h>
+
+
+namespace geos {
+namespace index {
+namespace intervalrtree {
+//
+// private:
+//
+
+//
+// protected:
+//
+
+//
+// public:
+//
+void 
+IntervalRTreeLeafNode::query( double queryMin, double queryMax, index::ItemVisitor * visitor) const
+{
+	if (! intersects( queryMin, queryMax)) 
+		return;
+	
+	visitor->visitItem( item);
+}
+
+} // geos::intervalrtree
+} // geos::index
+} // geos
+
+/**********************************************************************
+ * $Log$
+ *
+ **********************************************************************/


Property changes on: trunk/source/index/intervalrtree/IntervalRTreeLeafNode.cpp
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: trunk/source/index/intervalrtree/IntervalRTreeNode.cpp
===================================================================
--- trunk/source/index/intervalrtree/IntervalRTreeNode.cpp	                        (rev 0)
+++ trunk/source/index/intervalrtree/IntervalRTreeNode.cpp	2007-12-21 20:41:14 UTC (rev 2064)
@@ -0,0 +1,41 @@
+/**********************************************************************
+ * $Id:
+ *
+ * GEOS - Geometry Engine Open Source
+ * http://geos.refractions.net
+ *
+ * Copyright (C) 2001-2002 Vivid Solutions 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.
+ *
+ **********************************************************************/
+
+#include <geos/index/intervalrtree/IntervalRTreeNode.h>
+
+
+namespace geos {
+namespace index {
+namespace intervalrtree {
+//
+// private:
+//
+
+//
+// protected:
+//
+
+//
+// public:
+//
+
+} // geos::intervalrtree
+} // geos::index
+} // geos
+
+/**********************************************************************
+ * $Log$
+ *
+ **********************************************************************/


Property changes on: trunk/source/index/intervalrtree/IntervalRTreeNode.cpp
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Added: trunk/source/index/intervalrtree/SortedPackedIntervalRTree.cpp
===================================================================
--- trunk/source/index/intervalrtree/SortedPackedIntervalRTree.cpp	                        (rev 0)
+++ trunk/source/index/intervalrtree/SortedPackedIntervalRTree.cpp	2007-12-21 20:41:14 UTC (rev 2064)
@@ -0,0 +1,148 @@
+/**********************************************************************
+ * $Id:
+ *
+ * GEOS - Geometry Engine Open Source
+ * http://geos.refractions.net
+ *
+ * Copyright (C) 2001-2002 Vivid Solutions 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.
+ *
+ **********************************************************************/
+
+#include <geos/index/intervalrtree/SortedPackedIntervalRTree.h>
+#include <geos/index/intervalrtree/IntervalRTreeNode.h>
+#include <geos/index/intervalrtree/IntervalRTreeLeafNode.h>
+#include <geos/index/intervalrtree/IntervalRTreeBranchNode.h>
+#include <geos/index/ItemVisitor.h>
+#include <geos/util/UnsupportedOperationException.h>
+
+#include <algorithm>
+
+namespace geos {
+namespace index {
+namespace intervalrtree {
+//
+// private:
+//
+void 
+SortedPackedIntervalRTree::init()
+{
+	if (root != NULL) return;
+
+	root = buildTree();
+}
+
+const IntervalRTreeNode * 
+SortedPackedIntervalRTree::buildTree()
+{
+	// sort the leaf nodes
+	std::sort( leaves->begin(), leaves->end(), IntervalRTreeNode::compare );
+
+	// now group nodes into blocks of two and build tree up recursively
+	IntervalRTreeNode::ConstVect * src = leaves;
+	IntervalRTreeNode::ConstVect * dest = new IntervalRTreeNode::ConstVect();
+
+	while (true) 
+	{
+		buildLevel( src, dest);
+	
+		if (dest->size() == 1)
+		{
+			const IntervalRTreeNode * r = (*dest)[ 0 ];
+			delete src;
+			delete dest;
+			//delete leaves; // don't need anymore
+			return r;
+		}
+
+		IntervalRTreeNode::ConstVect * temp = src;
+		src = dest;
+		dest = temp;
+	}
+}
+
+void 
+SortedPackedIntervalRTree::buildLevel( IntervalRTreeNode::ConstVect * src, IntervalRTreeNode::ConstVect * dest) 
+{
+	level++;
+
+	dest->clear();
+	
+	for (size_t i = 0, ni = src->size(); i < ni; i += 2) 
+	{
+		const IntervalRTreeNode * n1 = (*src)[ i ];
+
+		if ( i + 1 < ni )
+		{
+			const IntervalRTreeNode * n2 = (*src)[ i + 1 ];
+
+			const IntervalRTreeNode * node = new IntervalRTreeBranchNode( n1, n2 );
+
+			dest->push_back( node);
+		}
+		else
+		{
+			dest->push_back( n1);
+		}
+	}
+}
+
+//
+// protected:
+//
+
+//
+// public:
+//
+SortedPackedIntervalRTree::SortedPackedIntervalRTree()
+:	root( NULL),
+	leaves( new IntervalRTreeNode::ConstVect()),
+	level( 0)
+{ }
+
+SortedPackedIntervalRTree::~SortedPackedIntervalRTree()
+{
+	if ( root != NULL )
+	{
+		// deleting root cascades to all IntervalRTreeNode's
+		delete root;
+	}
+	else // possibly IntervalRTreeNode's in leaves to delete
+	{
+		for ( size_t i = 0, ni = leaves->size(); i < ni; i++ )
+			delete (*leaves)[i];
+
+		delete leaves;
+	}
+}
+
+
+void 
+SortedPackedIntervalRTree::insert( double min, double max, void * item)
+{
+	if (root != NULL)
+		throw new util::UnsupportedOperationException( "Index cannot be added to once it has been queried");
+
+	leaves->push_back( new IntervalRTreeLeafNode( min, max, item));
+}
+
+void 
+SortedPackedIntervalRTree::query( double min, double max, index::ItemVisitor * visitor)
+{
+	init();
+
+	root->query( min, max, visitor);
+}
+
+} // geos::intervalrtree
+} // geos::index
+} // geos
+
+/**********************************************************************
+ * $Log$
+ *
+ **********************************************************************/


Property changes on: trunk/source/index/intervalrtree/SortedPackedIntervalRTree.cpp
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native



More information about the geos-commits mailing list