[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