ポイントがたくさんあり、それらに対して最近傍検索を行う必要があるため、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の2つのファイルが実際にメモリ内に作成されますが、初期化直後にクエリを実行したり、インデックス内の要素数を確認したりすると、失敗し、ノードには1つしかありません木。
私はすでに質問を見ました: (Re)loading the R Tree with spatialindex library
C++ 空間インデックス ライブラリ: メイン メモリ RTree をディスクから、またはディスクにロード/保存する
しかし、Index を使用しているため成功しませんでした。RTree を直接使用すると、データの挿入が 1000 倍遅くなります。