首页 > 代码库 > liblas学习笔记二——构建格网索引
liblas学习笔记二——构建格网索引
主要代码文件为index.hpp index.cpp
index.hpp中定义了几个宏
//最大内存限制,默认为10M
#define LIBLAS_INDEX_MAXMEMDEFAULT 10000000 // 10 megs default
//最小内存,默认为1M
#define LIBLAS_INDEX_MINMEMDEFAULT 1000000 // 1 meg at least has to be allowed
//最大格网数量,不超过25万个
#define LIBLAS_INDEX_MAXCELLS 250000
//平均每个格网中的点个数,默认值100
#define LIBLAS_INDEX_OPTPTSPERCELL 100
//平均每个格网中最大点数,整个cpp中未找到它的引用,没用过,没啥意义
#define LIBLAS_INDEX_MAXPTSPERCELL 1000
索引部分主要有两个类,IndexData、Index。IndexData为Index提供索引的相关参数,构建索引前必须构建IndexData对象。IndexData对象参数值的设定直接关系到Index对象索引的构建情况。
(1)构建IndexData 对象
IndexData类提供了三个构造函数,无参、拷贝构造函数、Index对象初始化函数。由于Index和IndexData对象中有相同属性:m_reader等,所以可以相互初始化这些属性。
(2)设置索引构建参数
liblas提供了多个参数设置函数。SetInitialValues可以设置所有参数,函数原型
bool SetInitialValues(std::istream *ifs = 0, Reader*reader = 0, std::ostream *ofs = 0, Reader *idxreader = 0,
const char *tmpfilenme = 0, constchar *indexauthor = 0,
const char *indexcomment = 0, constchar *indexdate = 0,doublezbinht = 0.0,
boost::uint32_t maxmem =LIBLAS_INDEX_MAXMEMDEFAULT, intdebugoutputlevel = 0, bool readonly = 0,
boolwritestandaloneindex = 0,bool forcenewindex =0, FILE *debugger = 0);
ifs:输入的las文件;reader:输入文件对应的Reader对象;ofs:输出文件,如果设置索引为单独文件则此为输出的索引文件,如果设置索引包含在源las文件中,则会创建一个新文件,该文件包含索引+源las文件。tmpfilenme:新文件的名字;indexauthor、indexcomment、indexdate:索引文件的一些基本信息;
zbinht:Z方向的格网大小;maxmen:内存限制;debugoutputlevel:调试信息输出级别;writestandaloneindex:为1,则会将索引文件单独作为一个文件,为0则索引文件跟源las文件为一个文件;forcenewindex:如果为1,则不管是否存在索引文件,均会新建索引,若为0,则已存在索引时不会重建;
(3)构建Index对象
liblas::IndexindexPt(indexData);
(4)设置查询器
indexData.SetFilterValues(dftXMin,dftXMax,dftYMin,dftYMax,dftZMin,dftZMax,indexPt);
(5)执行查询
constvector<boost::uint32_t> resultPtsIDVec = indexPt.Filter(indexData);
代码
const char *pSrcFileName = "D:\\pipeline_5G.las"; const char *pIndexTempFilePath = "D:\\temp_index"; const char *pTempFileName = "IndexTemp"; //const char *pDesFileName = "D:\\dem.tif"; std::ifstream ifs; ifs.open(pSrcFileName, std::ios::in | std::ios::binary); if (ifs == NULL) { cout<<"null"<<endl; } std::ofstream ofs; ofs.open(pIndexTempFilePath, std::ios::out | std ::ios ::binary); //std::ifstream ifsIndex; //ifsIndex.open(pIndexFilePath, std::ios::in | std::ios::binary); liblas::ReaderFactory f ; liblas::Reader reader = f.CreateWithStream(ifs); //liblas::Reader readerID = f.CreateWithStream(ifsIndex); liblas::Header const& header = reader.GetHeader(); printf("Points count: %d\n",header.GetPointRecordsCount()); //计算最大最小值 double dXMin = header.GetMinX(); double dXMax = header.GetMaxX(); double dYMin = header.GetMinY(); double dYMax = header.GetMaxY(); double dZMin = header.GetMinZ(); double dZMax = header.GetMaxZ(); const char *pIndexAut = "ryb"; const char *pIndexComm = "test1"; const char *pIndexDate = "20140923"; liblas::IndexData indexData; indexData.SetInitialValues(&ifs,&reader,&ofs,NULL,pTempFileName,pIndexAut,pIndexComm,pIndexDate,0,1000000000U,2,false,false,false,0); indexData.SetBuildEmbedValues(&reader,&ofs,pTempFileName,pIndexAut,pIndexComm,pIndexDate,0,100000000U,2,0);//设置索引文件包含于las文件中 liblas::Index indexPt(indexData); cout<<"Cell size is X:"<<indexPt.GetCellsX()<<" Y "<<indexPt.GetCellsY()<<" Z "<<indexPt.GetCellsZ()<<endl; double dftXMin = dXMin; double dftXMax = dXMax; double dftYMin = dYMin + 500; double dftYMax = dYMax - 220; double dftZMax = dZMax - 100; double dftZMin = dZMin + 20; indexData.SetFilterValues(dftXMin,dftXMax,dftYMin,dftYMax,dftZMin,dftZMax,indexPt); const vector<boost::uint32_t> resultPtsIDVec = indexPt.Filter(indexData); double tt21 = MPI_Wtime(); cout<<resultPtsIDVec.size()<<endl;
liblas学习笔记二——构建格网索引