c++ - libSpatialIndex:在磁盘上加载/存储索引

标签 c++ indexing r-tree libspatialindex

我有很多点,我需要对它们进行最近邻搜索,所以我使用了 libSpatialIndex。代码非常简单,库为我提供了将数据存储在磁盘上的选项,但我无法加载它。

代码:

int main(){

Tools::PropertySet* ps = GetDefaults();
Tools::Variant var;

// set index type to R*-Tree
var.m_varType = Tools::VT_ULONG;
var.m_val.ulVal = RT_RTree;
ps->setProperty("IndexType", var);

// Set index to store in disk
var.m_varType = Tools::VT_ULONG;
var.m_val.ulVal = RT_Disk;

ps->setProperty("IndexStorageType", var);

char filename[] = "indexTeste";
var.m_varType = Tools::VT_PCHAR;
var.m_val.pcVal = filename;

ps->setProperty("FileName", var);

var.m_varType = Tools::VT_BOOL;
var.m_val.blVal = false;

ps->setProperty("Overwrite", var);

cout << (*ps) << endl;
// initalise index
idx = new Index(*ps);
delete ps;

// Now there's specific code for point loading so I've shortened it - this part is working
for (...) { // all points
double pt[] = {point.getX(), point.getY()};
SpatialIndex::IShape* shape = 0;
shape = new SpatialIndex::Point(pt, 2);

// insert into index along with the an object and an ID
idx->index().insertData(nDataLength,(unsigned char*)&lineID,*shape,id);
}

// Now the search - working as well
ObjVisitor* visitor = new ObjVisitor;

SpatialIndex::Point* r = new SpatialIndex::Point(inter, 2);

idx->index().nearestNeighborQuery(1,*r,*visitor);

int64_t nResultCount;
nResultCount = visitor->GetResultCount();

// get actual results
vector<SpatialIndex::IData*>& results = visitor->GetResults();

SpatialIndex::IShape* shape;
results[0]->getShape(&shape);

unsigned char * dataAddr;
unsigned int length = sizeof(int);

results[0]->getData(length,&dataAddr);
int lineId = ((int*)dataAddr)[0];

SpatialIndex::Point center;
shape->getCenter(center);
}

程序紧接着结束。确实在内存中创建了两个文件,“indexTest.dat”8.8MB 和“indexTest.idx”0kB 但是如果我在初始化后立即查询或检查索引中的元素数量,它会失败并且只有一个节点树。

我已经看过问题了: (Re)loading the R Tree with spatialindex library

C++ spatialindex library: loading/storing main memory RTree from/to disk

但是我没有成功,因为我使用的是 Index,当我直接使用 RTree 时,数据插入速度大约慢了 1000 倍。

最佳答案

我找到了解决方案。索引实例化树的 ID,必须在创建索引时使用它才能正确加载文件。

代码:

//Example 
// When storing
Tools::PropertySet* ps = GetDefaults();
Index* idx;
idx = new Index(*ps);
Tools::PropertySet properties = idx->GetProperties();
Tools::Variant vari = properties.getProperty("IndexIdentifier");
cout << "ID: " << vari.m_val.llVal << endl;

// when loading
Tools::PropertySet* ps = GetDefaults();
Tools::Variant var;

// Important
var.m_varType = Tools::VT_BOOL;
var.m_val.blVal = false;
ps->setProperty("Overwrite", var);

var.m_varType = Tools::VT_LONGLONG;
var.m_val.llVal = ID; // The number "couted" before 
ps->setProperty("IndexIdentifier", var);

Index* idx;
idx = new Index(*ps);

关于c++ - libSpatialIndex:在磁盘上加载/存储索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33395445/

相关文章:

MySQL 索引自动禁用 - 为什么?

r - 访问嵌套在 R 列表中的向量的倒数第二个元素

c# - F#(或 C#)中的任何 R-Tree 实现?

c++ - 如何在数字上处理 log(0)?

c++ - swig 使用变量扩展模板类

C++ 从文本文件创建对象

java 到 scala 的转换 - r 树的通用类型丢失了?

c++ - 为什么包括 guard ?

f# - 在 F# 中从具有 N 个不同索引的序列中取出 N 个元素

c++ - rtree 是可索引断言