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,8 МБ и «indexTest.idx» 0 КБ, но если я выполню запрос или проверю количество элементов в индексе сразу после инициализации, произойдет сбой, и на нем будет только один узел дерево.

Я уже посмотрел на вопросы:
(Пере) загрузка R Tree библиотекой spatialindex

Библиотека C ++ spatialindex: загрузка / хранение основной памяти RTree с / на диск

Но я не добился успеха, так как я использую Index и когда я использую RTree напрямую, вставка данных происходит примерно в 1000 раз медленнее.

2

Решение

Я нашел решение. Индекс создает идентификатор для Дерева, и его необходимо использовать при создании индекса для правильной загрузки файла.

код:

//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);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]