C++ 使用spatialindex库加载R*树

C++ 使用spatialindex库加载R*树,c++,spatial,bulk-load,r-tree,libspatialindex,C++,Spatial,Bulk Load,R Tree,Libspatialindex,在成功地构建了R*树并使用空间库一个接一个地插入记录250万次之后,我尝试使用bulkloading创建R*树。我实现了DBStream类,以迭代方式将数据提供给BulkLoader。本质上,它调用以下方法并为Bulkloader准备数据(代码中的d变量)对象: void DBStream::retrieveTuple() { if (query.next()) { hasNextBool = true; int gid = query.value(0).toInt();

在成功地构建了R*树并使用空间库一个接一个地插入记录250万次之后,我尝试使用bulkloading创建R*树。我实现了DBStream类,以迭代方式将数据提供给BulkLoader。本质上,它调用以下方法并为Bulkloader准备数据(代码中的d变量)对象:

void DBStream::retrieveTuple() {
if (query.next()) {
    hasNextBool = true;

    int gid = query.value(0).toInt();

            // allocate memory for bounding box
            // this streets[gid].first returns bbox[4]
    double* bbox = streets[gid].first;

            // filling the bounding box values
    bbox[0] = query.value(1).toDouble();
    bbox[1] = query.value(2).toDouble();
    bbox[2] = query.value(3).toDouble();
    bbox[3] = query.value(4).toDouble();

    rowId++;

    r = new SpatialIndex::Region();
    d = new SpatialIndex::RTree::Data((size_t) 0, (byte*) 0, *r, gid);
    r->m_dimension = 2;
    d->m_pData = 0;
    d->m_dataLength = 0;

    r->m_pLow = bbox;
    r->m_pHigh = bbox + 2;
    d->m_id = gid;
} else {
    d = 0;
    hasNextBool = false;
    cout << "stream is finished d:" << d << endl;
}
}

问题可能在于内存分配和代码中的一些错误(也与内存分配有关)。首先,需要正确分配数据变量的属性:

memcpy(data->m_region.m_pLow, bbox, 2 * sizeof(double));
memcpy(data->m_region.m_pHigh, bbox + 2, 2 * sizeof(double));
data->m_id = gid;
第二(也是最重要的)getNext必须返回一个包含所有值的新对象:

RTree::Data *p = new RTree::Data(returnData->m_dataLength, returnData->m_pData,
returnData->m_region, returnData->m_id);
return returnData;
内存的去分配是由RTree完成的,所以这里不需要特别注意

memcpy(data->m_region.m_pLow, bbox, 2 * sizeof(double));
memcpy(data->m_region.m_pHigh, bbox + 2, 2 * sizeof(double));
data->m_id = gid;
RTree::Data *p = new RTree::Data(returnData->m_dataLength, returnData->m_pData,
returnData->m_region, returnData->m_id);
return returnData;