libe57 прочитал файл 65536 баллов

Я составил libe57 для того, чтобы использовать его в моем проекте. Я сделал это, и теперь я пытаюсь использовать это. (Я на windows 10 x64)
Основываясь на этом руководство, я сделал это

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 столбец, что означает, что мое pointcloud всегда содержит 65536 точек. Я пробовал с несколькими файлами, которые имеют более 200 тыс. Точек каждый, но результат всегда одинаков, в моем файле 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

Решение

Задача ещё не решена.

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

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

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