Pickling Rtree看起来并不简单,因为它是一个ctypes包装器。在假设的SO秒上This comment。
但是,在(很多)年长的@sgillies post(本文的作者)中,在评论部分,他认为它确实可行。
然而,当我在本地重新创建这些步骤时,结果表明不然:
>>> idx = rtree.index.Index()
>>> idx.insert(10, (1,2,3,4))
>>> list(idx.intersection((0,0,5,5)))
# [10]
>>> f = open('foo.p', 'wb')
>>> pickle.dump(idx, f)
>>> a = pickle.load( open( "foo.p", "rb" ) )
>>> a.get_bounds()
# [1.7976931348623157e+308, 1.7976931348623157e+308, -1.7976931348623157e+308, -1.7976931348623157e+308]]
>>> list(a.intersection((0,0,5,5)))
# []
问题: 是否存在我无法正确执行操作以启用空间索引的酸洗操作?如果可以进行空间索引,那么正确的方法是什么呢?
有趣的是,我能够通过酸洗过程成功传递GeoPandas.GeoDataFrame.sindex(由Dask.distributed执行酸洗)。我知道它使用cloudpickle或pickle(dep。on situation)但是从GeoPandas方面来说,sindex
's SpatialIndex
class似乎只是rtree.index.Index
的包装器。我还没有更深入地了解为什么会出现这种情况,但是想先看一下,看看其他人是否有洞察力。
答案 0 :(得分:0)
看起来您可以为文件编写索引,因此应该可以将其存储为字符串:https://gis.stackexchange.com/questions/254781/saving-python-rtree-spatial-index-to-file/254785
你也可以试试Dill,我相信它能够腌制'更多种类的对象,或者至少保存解释器的状态:https://pypi.python.org/pypi/dill