libe57读取文件65536点

时间:2018-11-02 11:28:54

标签: c++ e57

我编译了libe57以便在项目中使用它。我做到了,现在我正在尝试使用它。 (我在Windows 10 x64上) 基于此tutorial,我做到了

int
main(int argc, char** argv)
{
    char sFile[] = "PTX/file.e57";
    _bstr_t bsFile = sFile;                 //converts Unicode to UTF-8
    e57::Reader     eReader((char*)bsFile);

    e57::E57Root rootHeader;
    eReader.GetE57Root(rootHeader);

    const char* fileGuid = rootHeader.guid.c_str();
    e57::DateTime fileGPSTime = rootHeader.creationDateTime;
    int data3DCount = eReader.GetData3DCount();
    int scanIndex = 0;
    e57::Data3D             scanHeader;
    eReader.ReadData3D(scanIndex, scanHeader);



    _bstr_t bstrName = scanHeader.name.c_str();
    _bstr_t bstrGuid = scanHeader.guid.c_str();
    _bstr_t bstrDesc = scanHeader.description.c_str();

    int64_t nColumn = 0;
    int64_t nRow = 0;

    int64_t nPointsSize = 0;        //Number of points

    int64_t nGroupsSize = 0;        //Number of groups
    int64_t nCountSize = 0;         //Number of points per group
    bool    bColumnIndex = false; //indicates that idElementName is "columnIndex"

    eReader.GetData3DSizes(scanIndex, nRow, nColumn, nPointsSize, nGroupsSize, nCountSize, bColumnIndex);

    int64_t nSize = nRow;
    if (nSize == 0) nSize = 1024;    // choose a chunk size

        int8_t * isInvalidData = NULL;
    if (scanHeader.pointFields.cartesianInvalidStateField)
        isInvalidData = new int8_t[nSize];


        double * xData = NULL;
    if (scanHeader.pointFields.cartesianXField)
        xData = new double[nSize];

    double * yData = NULL;
    if (scanHeader.pointFields.cartesianYField)
        yData = new double[nSize];

    double * zData = NULL;
    if (scanHeader.pointFields.cartesianZField)
        zData = new double[nSize];


        double *        intData = NULL;
    bool            bIntensity = false;
    double          intRange = 0;
    double          intOffset = 0;

    if (scanHeader.pointFields.intensityField)
    {
        bIntensity = true;
        intData = new double[nSize];
        intRange = scanHeader.intensityLimits.intensityMaximum - scanHeader.intensityLimits.intensityMinimum;
        intOffset = scanHeader.intensityLimits.intensityMinimum;
    }


    uint16_t *      redData = NULL;
    uint16_t *      greenData = NULL;
    uint16_t *      blueData = NULL;
    bool            bColor = false;
    int32_t         colorRedRange = 1;
    int32_t         colorRedOffset = 0;
    int32_t         colorGreenRange = 1;
    int32_t         colorGreenOffset = 0;
    int32_t         colorBlueRange = 1;
    int32_t         colorBlueOffset = 0;

    if (scanHeader.pointFields.colorRedField)
    {
        bColor = true;
        redData = new uint16_t[nSize];
        greenData = new uint16_t[nSize];
        blueData = new uint16_t[nSize];
        colorRedRange = scanHeader.colorLimits.colorRedMaximum - scanHeader.colorLimits.colorRedMinimum;
        colorRedOffset = scanHeader.colorLimits.colorRedMinimum;
        colorGreenRange = scanHeader.colorLimits.colorGreenMaximum - scanHeader.colorLimits.colorGreenMinimum;
        colorGreenOffset = scanHeader.colorLimits.colorGreenMinimum;
        colorBlueRange = scanHeader.colorLimits.colorBlueMaximum - scanHeader.colorLimits.colorBlueMinimum;
        colorBlueOffset = scanHeader.colorLimits.colorBlueMinimum;
    }


        int64_t * idElementValue = NULL;
    int64_t * startPointIndex = NULL;
    int64_t * pointCount = NULL;
    if (nGroupsSize > 0)
    {
        idElementValue = new int64_t[nGroupsSize];
        startPointIndex = new int64_t[nGroupsSize];
        pointCount = new int64_t[nGroupsSize];

        if (!eReader.ReadData3DGroupsData(scanIndex, nGroupsSize, idElementValue,
            startPointIndex, pointCount))
            nGroupsSize = 0;
    }


    int32_t * rowIndex = NULL;
    int32_t * columnIndex = NULL;
    if (scanHeader.pointFields.rowIndexField)
        rowIndex = new int32_t[nSize];
    if (scanHeader.pointFields.columnIndexField)
        columnIndex = new int32_t[nRow];
    e57::CompressedVectorReader dataReader = eReader.SetUpData3DPointsData(
        scanIndex,                      //!< data block index given by the NewData3D
        nRow,                           //!< size of each of the buffers given
        xData,                          //!< pointer to a buffer with the x data
        yData,                          //!< pointer to a buffer with the y data
        zData,                          //!< pointer to a buffer with the z data
        isInvalidData,          //!< pointer to a buffer with the valid indication
        intData,                        //!< pointer to a buffer with the lidar return intesity
        NULL,
        redData,                        //!< pointer to a buffer with the color red data
        greenData,                      //!< pointer to a buffer with the color green data
        blueData,                       //!< pointer to a buffer with the color blue data
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        rowIndex,                       //!< pointer to a buffer with the rowIndex
        columnIndex                     //!< pointer to a buffer with the columnIndex
    );


    int64_t         count = 0;
    unsigned        size = 0;
    int                     col = 0;
    int                     row = 0;


    int cpt = 0;
    while (size = dataReader.read())
    {
        cpt++;
    }

    std::cout << cpt << std::endl;

        dataReader.close();

        if (isInvalidData) delete isInvalidData;
        if (xData) delete xData;
        if (yData) delete yData;
        if (zData) delete zData;
        if (intData) delete intData;
        if (redData) delete redData;
        if (greenData) delete greenData;
        if (blueData) delete blueData;
   }

问题是每次读者都说有65536行和1列,这意味着我的点云始终包含65536个点。我尝试了几个文件,每个文件都超过200k点,但是结果始终是相同的,它在我的XYZ文件中写入了65536点,仅此而已。

编辑2:简短的示例:问题仍然相同

#include "E57Foundation.h"
#include "E57Simple.h"
#include "comutil.h"

#include <iostream>
#include <vector>
 int
main(int argc, char** argv)
{

   e57::Reader  eReader("PTX/file.e57");
    int         scanIndex = 0;  //picking the first scan

    e57::Data3D scanHeader;     //read scan's header information
    eReader.ReadData3D(scanIndex, scanHeader);


    _bstr_t scanGuid = scanHeader.guid.c_str();     //get guid
    int64_t nColumn = 0;        //Number of Columns in a structure scan (from "indexBounds" if structure data)
    int64_t nRow = 0;           //Number of Rows in a structure scan    
    int64_t nPointsSize = 0;    //Number of points 
    int64_t nGroupsSize = 0;    //Number of groups (from "groupingByLine" if present)
    int64_t nCountsSize = 0;    //Number of points per group
    bool bColumnIndex = false;
    eReader.GetData3DSizes(scanIndex, nRow, nColumn, nPointsSize, nGroupsSize, nCountsSize, bColumnIndex);

    int64_t nSize = (nRow > 0) ? nRow : 1024;   //Pick a size for buffers
    double *xData = new double[nSize];
    double *yData = new double[nSize];
    double *zData = new double[nSize];

    e57::CompressedVectorReader dataReader = eReader.SetUpData3DPointsData(
        scanIndex,  //!< scan data index 
        nSize,      //!< size of each of the buffers given
        xData,      //!< pointer to a buffer with the x data
        yData,      //!< pointer to a buffer with the y data
        zData);     //!< pointer to a buffer with the z data 
//still a size of 65536

    dataReader.close();
    delete xData;
    delete yData;
    delete zData;   
}

0 个答案:

没有答案