Преглед изворни кода

Created separate rtree ctypes interface, so that the rtree
library can be accessed directly without the vector library.
This should also fix the dll rtree issue on windows systems.


git-svn-id: https://svn.osgeo.org/grass/grass/trunk@57958 15284696-431f-4ddb-bdfa-cd5b030d7da7

Soeren Gebbert пре 11 година
родитељ
комит
f88a2b1ba0

+ 4 - 2
lib/python/ctypes/Makefile

@@ -9,7 +9,7 @@ include $(MODULE_TOPDIR)/include/Make/Doxygen.make
 DOXNAME=
 DOXINPUT=grasspython.dox
 
-MODULES = date gis raster gmath proj imagery vector display stats \
+MODULES = date gis raster gmath proj imagery vector rtree display stats \
 	dbmi raster3d arraystats cluster vedit ogsf nviz segment rowio
 
 date_LIBS       = $(DATETIMELIB)
@@ -19,6 +19,7 @@ gmath_LIBS      = $(GMATHLIB)
 proj_LIBS       = $(GPROJLIB)
 imagery_LIBS    = $(IMAGERYLIB)
 vector_LIBS     = $(VECTORLIB)
+rtree_LIBS      = $(RTREELIB)
 display_LIBS    = $(DISPLAYLIB)
 stats_LIBS      = $(STATSLIB)
 dbmi_LIBS       = $(DBMILIB)
@@ -37,7 +38,8 @@ raster_HDRS     = raster.h defs/raster.h
 gmath_HDRS      = gmath.h defs/gmath.h
 proj_HDRS       = gprojects.h defs/gprojects.h
 imagery_HDRS    = imagery.h defs/imagery.h
-vector_HDRS     = vector.h defs/vector.h vect/dig_structs.h vect/dig_defines.h vect/dig_externs.h rtree.h
+vector_HDRS     = vector.h defs/vector.h vect/dig_structs.h vect/dig_defines.h vect/dig_externs.h 
+rtree_HDRS	= rtree.h
 display_HDRS    = display.h defs/display.h
 stats_HDRS      = stats.h defs/stats.h
 dbmi_HDRS       = dbmi.h defs/dbmi.h

+ 1 - 0
lib/python/ctypes/__init__.py

@@ -12,6 +12,7 @@ __all__ = [
     'proj',
     'raster3d',
     'raster',
+    'rtree',
     'stats',
     'vector',
     'vedit'

+ 9 - 8
lib/python/temporal/spatio_temporal_relationships.py

@@ -23,6 +23,7 @@ for details.
 from abstract_dataset import *
 from datetime_math import *
 import grass.lib.vector as vector
+import grass.lib.rtree as rtree
 import grass.lib.gis as gis
 from ctypes import *
 
@@ -450,7 +451,7 @@ class SpatioTemporalTopologyBuilder(object):
                           spatial can be None (no spatial topology), "2D" using west, east,
                           #south, north or "3D" using west, east, south, north, bottom, top
         """
-        rect = vector.RTreeAllocRect(tree)
+        rect = rtree.RTreeAllocRect(tree)
 
         start, end = map_.get_temporal_extent_as_tuple()
 
@@ -462,14 +463,14 @@ class SpatioTemporalTopologyBuilder(object):
             end = time_delta_to_relative_time_seconds(end - self._timeref)
 
         if spatial is None:
-            vector.RTreeSetRect1D(rect, tree, float(start), float(end))
+            rtree.RTreeSetRect1D(rect, tree, float(start), float(end))
         elif spatial == "2D":
             north, south, east, west, top, bottom = map_.get_spatial_extent_as_tuple()
-            vector.RTreeSetRect3D(rect, tree, west, east, south, north,
+            rtree.RTreeSetRect3D(rect, tree, west, east, south, north,
                                   float(start), float(end))
         elif spatial == "3D":
             north, south, east, west, top, bottom = map_.get_spatial_extent_as_tuple()
-            vector.RTreeSetRect4D(rect, tree, west, east, south, north,
+            rtree.RTreeSetRect4D(rect, tree, west, east, south, north,
                                   bottom, top, float(start), float(end))
 
         return rect
@@ -488,12 +489,12 @@ class SpatioTemporalTopologyBuilder(object):
         if spatial == "3D":
             dim = 4
 
-        tree = vector.RTreeCreateTree(-1, 0, dim)
+        tree = rtree.RTreeCreateTree(-1, 0, dim)
 
         for i in xrange(len(maps)):
 
             rect = self._map_to_rect(tree, maps[i], spatial)
-            vector.RTreeInsertRect(rect, i + 1, tree)
+            rtree.RTreeInsertRect(rect, i + 1, tree)
 
         return tree
 
@@ -543,7 +544,7 @@ class SpatioTemporalTopologyBuilder(object):
 
             rect = self._map_to_rect(tree, mapsB[j], spatial)
             vector.RTreeSearch2(tree, rect, list_)
-            vector.RTreeFreeRect(rect)
+            rtree.RTreeFreeRect(rect)
 
             for k in xrange(list_.contents.n_values):
                 i = list_.contents.value[k] - 1
@@ -565,7 +566,7 @@ class SpatioTemporalTopologyBuilder(object):
 
         gis.G_free_ilist(list_)
 
-        vector.RTreeDestroyTree(tree)
+        rtree.RTreeDestroyTree(tree)
 
     def __iter__(self):
         start_ = self._first

+ 35 - 34
lib/python/temporal/unit_tests.py

@@ -28,6 +28,7 @@ from datetime_math import *
 from space_time_datasets import *
 
 import grass.lib.vector as vector
+import grass.lib.rtree as rtree
 import grass.lib.gis as gis
 from ctypes import *
 
@@ -1525,131 +1526,131 @@ def test_map_list_sorting():
 def test_1d_rtree():
     """Testing the rtree ctypes wrapper"""
 
-    tree = vector.RTreeCreateTree(-1, 0, 1)
+    tree = rtree.RTreeCreateTree(-1, 0, 1)
 
     for i in xrange(10):
         
-        rect = vector.RTreeAllocRect(tree)
-        vector.RTreeSetRect1D(rect, tree, float(i - 2), float(i + 2))
-        vector.RTreeInsertRect(rect, i + 1, tree)
+        rect = rtree.RTreeAllocRect(tree)
+        rtree.RTreeSetRect1D(rect, tree, float(i - 2), float(i + 2))
+        rtree.RTreeInsertRect(rect, i + 1, tree)
 
-    rect = vector.RTreeAllocRect(tree)
-    vector.RTreeSetRect1D(rect, tree, 2.0, 7.0)
+    rect = rtree.RTreeAllocRect(tree)
+    rtree.RTreeSetRect1D(rect, tree, 2.0, 7.0)
 
     list_ = gis.ilist()
 
     num = vector.RTreeSearch2(tree, rect, byref(list_))
     
-    vector.RTreeFreeRect(rect)
+    rtree.RTreeFreeRect(rect)
 
     # print rectangle ids
     print "Number of overlapping rectangles", num
     for i in xrange(list_.n_values):
         print "id", list_.value[i]
 
-    vector.RTreeDestroyTree(tree)
+    rtree.RTreeDestroyTree(tree)
     
 ###############################################################################
 
 def test_2d_rtree():
     """Testing the rtree ctypes wrapper"""
 
-    tree = vector.RTreeCreateTree(-1, 0, 2)
+    tree = rtree.RTreeCreateTree(-1, 0, 2)
 
     for i in xrange(10):
         
         
-        rect = vector.RTreeAllocRect(tree)
+        rect = rtree.RTreeAllocRect(tree)
 
-        vector.RTreeSetRect2D(rect, tree, 
+        rtree.RTreeSetRect2D(rect, tree, 
                               float(i - 2), float(i + 2), 
                               float(i - 2), float(i + 2))
-        vector.RTreeInsertRect(rect, i + 1, tree)
+        rtree.RTreeInsertRect(rect, i + 1, tree)
     
-    rect = vector.RTreeAllocRect(tree)
-    vector.RTreeSetRect2D(rect, tree, 2.0, 7.0, 2.0, 7.0)
+    rect = rtree.RTreeAllocRect(tree)
+    rtree.RTreeSetRect2D(rect, tree, 2.0, 7.0, 2.0, 7.0)
 
     list_ = gis.ilist()
 
     num = vector.RTreeSearch2(tree, rect, byref(list_))
-    vector.RTreeFreeRect(rect)
+    rtree.RTreeFreeRect(rect)
 
     # print rectangle ids
     print "Number of overlapping rectangles", num
     for i in xrange(list_.n_values):
         print "id", list_.value[i]
 
-    vector.RTreeDestroyTree(tree)
+    rtree.RTreeDestroyTree(tree)
     
 ###############################################################################
 
 def test_3d_rtree():
     """Testing the rtree ctypes wrapper"""
 
-    tree = vector.RTreeCreateTree(-1, 0, 3)
+    tree = rtree.RTreeCreateTree(-1, 0, 3)
 
     for i in xrange(10):
         
-        rect = vector.RTreeAllocRect(tree)
-        vector.RTreeSetRect3D(rect, tree, 
+        rect = rtree.RTreeAllocRect(tree)
+        rtree.RTreeSetRect3D(rect, tree, 
                               float(i - 2), float(i + 2), 
                               float(i - 2), float(i + 2), 
                               float(i - 2), float(i + 2))
-        vector.RTreeInsertRect(rect, i + 1, tree)
+        rtree.RTreeInsertRect(rect, i + 1, tree)
         print i + 1
-        vector.RTreePrintRect(rect, 1, tree)
+        rtree.RTreePrintRect(rect, 1, tree)
 
-    rect = vector.RTreeAllocRect(tree)
-    vector.RTreeSetRect3D(rect, tree, 2.0, 7.0, 2.0, 7.0, 2.0, 7.0)
+    rect = rtree.RTreeAllocRect(tree)
+    rtree.RTreeSetRect3D(rect, tree, 2.0, 7.0, 2.0, 7.0, 2.0, 7.0)
     print "Select"
-    vector.RTreePrintRect(rect, 1, tree)
+    rtree.RTreePrintRect(rect, 1, tree)
         
     list_ = gis.ilist()
 
     num = vector.RTreeSearch2(tree, rect, byref(list_))
-    vector.RTreeFreeRect(rect)
+    rtree.RTreeFreeRect(rect)
 
     # print rectangle ids
     print "Number of overlapping rectangles", num
     for i in xrange(list_.n_values):
         print "id", list_.value[i]
         
-    vector.RTreeDestroyTree(tree)
+    rtree.RTreeDestroyTree(tree)
 
 ###############################################################################
 
 def test_4d_rtree():
     """Testing the rtree ctypes wrapper"""
 
-    tree = vector.RTreeCreateTree(-1, 0, 4)
+    tree = rtree.RTreeCreateTree(-1, 0, 4)
 
     for i in xrange(10):
         
         # Allocate the boundary
-        rect = vector.RTreeAllocRect(tree)
-        vector.RTreeSetRect4D(rect, tree, 
+        rect = rtree.RTreeAllocRect(tree)
+        rtree.RTreeSetRect4D(rect, tree, 
                               float(i - 2), float(i + 2), 
                               float(i - 2), float(i + 2), 
                               float(i - 2), float(i + 2), 
                               float(i - 2), float(i + 2))
-        vector.RTreeInsertRect(rect, i + 1, tree)
+        rtree.RTreeInsertRect(rect, i + 1, tree)
 
-    rect = vector.RTreeAllocRect(tree)
-    vector.RTreeSetRect4D(rect, tree, 2.0, 7.0, 2.0, 
+    rect = rtree.RTreeAllocRect(tree)
+    rtree.RTreeSetRect4D(rect, tree, 2.0, 7.0, 2.0, 
                           7.0, 2.0, 7.0, 2.0, 7.0)
     
     list_ = gis.ilist()
 
     num = vector.RTreeSearch2(tree, rect, byref(list_))
 
-    vector.RTreeFreeRect(rect)
+    rtree.RTreeFreeRect(rect)
 
     # print rectangle ids
     print "Number of overlapping rectangles", num
     for i in xrange(list_.n_values):
         print "id", list_.value[i]
         
-    vector.RTreeDestroyTree(tree)
+    rtree.RTreeDestroyTree(tree)
 
 ###############################################################################