Loading isis/src/base/objs/LidarData/LidarData.cpp +95 −0 Original line number Diff line number Diff line Loading @@ -64,7 +64,102 @@ namespace Isis { * @param FileName lidarFile Name of the Lidar CSV file to read. */ void LidarData::read(FileName lidarFile) { // Set up the input file QFile loadFile(lidarFile.expanded()); if (!loadFile.open(QIODevice::ReadOnly)) { QString msg("Could not open " + loadFile.fileName()); throw IException(IException::User, msg, _FILEINFO_); } // Load file QByteArray saveData = loadFile.readAll(); QJsonDocument loadDoc(QJsonDocument::fromJson(saveData)); // Unserialize LidarData QJsonObject lidarDataObject = loadDoc.object(); if (lidarDataObject.contains("points") && lidarDataObject["points"].isArray()) { // Unserialize LidarControlPoints QJsonArray pointArray = lidarDataObject["points"].toArray(); for (int pointIndex = 0; pointIndex < pointArray.size(); pointIndex++) { // Unserialize LidarControlPoint QJsonObject pointObject = pointArray[pointIndex].toObject(); QString id; if (pointObject.contains("id") && pointObject["id"].isString()) { id = pointObject["id"].toString(); } double range = 0.0; if (pointObject.contains("range") && pointObject["range"].isDouble()) { range = pointObject["range"].toDouble(); } double sigmaRange = 0.0; if (pointObject.contains("sigmaRange") && pointObject["sigmaRange"].isDouble()) { sigmaRange = pointObject["sigmaRange"].toDouble(); } double time = 0.0; if (pointObject.contains("time") && pointObject["time"].isDouble()) { time = pointObject["time"].toDouble(); } double latitude = 0.0; if (pointObject.contains("latitude") && pointObject["latitude"].isDouble()) { latitude = pointObject["latitude"].toDouble(); } double longitude = 0.0; if (pointObject.contains("longitude") && pointObject["longitude"].isDouble()) { longitude = pointObject["longitude"].toDouble(); } double radius = 0.0; if (pointObject.contains("radius") && pointObject["radius"].isDouble()) { radius = pointObject["radius"].toDouble(); } QSharedPointer<LidarControlPoint> lcp = QSharedPointer<LidarControlPoint>(new LidarControlPoint(iTime(time), range, sigmaRange)); lcp->SetId(id); lcp->SetAprioriSurfacePoint(SurfacePoint(Latitude(latitude, Angle::Units::Degrees), Longitude(longitude, Angle::Units::Degrees), Distance(radius, Distance::Units::Kilometers))); // Unserialize ControlMeasures if (pointObject.contains("measures") && pointObject["measures"].isArray()) { QJsonArray measureArray = pointObject["measures"].toArray(); for (int measureIndex = 0; measureIndex < measureArray.size(); measureIndex++) { // Unserialize ControlMeasure QJsonObject measureObject = measureArray[measureIndex].toObject(); double line = 0.0; if (measureObject.contains("line") && measureObject["line"].toDouble()) { line = measureObject["line"].toDouble(); } double sample = 0.0; if (measureObject.contains("sample") && measureObject["sample"].toDouble()) { sample = measureObject["sample"].toDouble(); } QString serialNumber; if (measureObject.contains("serialNumber") && measureObject["serialNumber"].isString()) { serialNumber = measureObject["serialNumber"].toString(); } ControlMeasure *measure = new ControlMeasure(); measure->SetCoordinate(sample, line); measure->SetCubeSerialNumber(serialNumber); lcp->Add(measure); } } insert(lcp); } } } Loading isis/src/base/objs/LidarData/unitTest.cpp +43 −11 Original line number Diff line number Diff line #include "LidarData.h" #include <QDebug> #include <QString> #include "Angle.h" Loading @@ -16,6 +17,8 @@ using namespace std; using namespace Isis; void print(const LidarData &lidarData); /** * Unit test for the LIDARData class. * Loading Loading @@ -50,10 +53,6 @@ int main(int argc, char *argv[]) { cout << "\tname of point: " << defaultData.points().first()->GetId() << endl; cout << endl; // Test read() cout << "Testing read(FileName)... " << endl; cout << endl; // Test write() cout << "Testing write(FileName)... " << endl; LidarData mockData; Loading @@ -72,20 +71,53 @@ int main(int argc, char *argv[]) { Longitude(lon, Angle::Units::Degrees), Distance(rad, Distance::Units::Kilometers)); lcp->SetAprioriSurfacePoint(sp); double line, sample; line = 1.0; sample = 1.0; for (int j = 0; j < 2; j++) { ControlMeasure *measure = new ControlMeasure(); sample += 1.0; line += 1.0; measure->SetCoordinate(sample, line); measure->SetCoordinate((double) i, (double) j); measure->SetCubeSerialNumber("SN_" + QString::number(i) + "-" + QString::number(j)); lcp->Add(measure); } mockData.insert(lcp); } FileName outFile("./test.json"); FileName outFile("./test.dat"); mockData.write(outFile); cout << endl; // Test read() cout << "Testing read(FileName)... " << endl; LidarData readData; readData.read(outFile); print(readData); cout << endl; } void print(const LidarData &lidarData) { QList< QSharedPointer<LidarControlPoint> > points = lidarData.points(); std::cout << "LidarData:" << std::endl; foreach (QSharedPointer<LidarControlPoint> point, points) { std::cout << "\tLidarControlPoint:" << std::endl; std::cout << "\t\tid: " << point->GetId() << std::endl;; SurfacePoint sp = point->GetAprioriSurfacePoint(); double lat, lon, rad; lat = sp.GetLatitude().planetocentric(Angle::Units::Degrees); lon = sp.GetLongitude().positiveEast(Angle::Units::Degrees); rad = sp.GetLocalRadius().kilometers(); std::cout << "\t\tlatitude: " << lat << std::endl; std::cout << "\t\tlongitude: " << lon << std::endl; std::cout << "\t\tradius: " << rad << std::endl; std::cout << "\t\trange: " << point->range() << std::endl; std::cout << "\t\tsigmaRange:" << point->sigmaRange() << std::endl; std::cout << "\t\ttime: " << point->time().Et() << std::endl; QList<ControlMeasure *> measures = point->getMeasures(); foreach (ControlMeasure *measure, measures) { std::cout << "\t\tControlMeasure: " << std::endl; std::cout << "\t\t\tline: " << measure->GetLine() << std::endl; std::cout << "\t\t\tsample: " << measure->GetSample() << std::endl; std::cout << "\t\t\tSN: " << measure->GetCubeSerialNumber() << std::endl; std::cout << "\t\t#END_ControlMeasure." << std::endl; } std::cout << "\t#END_LidarControlPoint." << std::endl << std::endl; } std::cout << std::endl; } Loading
isis/src/base/objs/LidarData/LidarData.cpp +95 −0 Original line number Diff line number Diff line Loading @@ -64,7 +64,102 @@ namespace Isis { * @param FileName lidarFile Name of the Lidar CSV file to read. */ void LidarData::read(FileName lidarFile) { // Set up the input file QFile loadFile(lidarFile.expanded()); if (!loadFile.open(QIODevice::ReadOnly)) { QString msg("Could not open " + loadFile.fileName()); throw IException(IException::User, msg, _FILEINFO_); } // Load file QByteArray saveData = loadFile.readAll(); QJsonDocument loadDoc(QJsonDocument::fromJson(saveData)); // Unserialize LidarData QJsonObject lidarDataObject = loadDoc.object(); if (lidarDataObject.contains("points") && lidarDataObject["points"].isArray()) { // Unserialize LidarControlPoints QJsonArray pointArray = lidarDataObject["points"].toArray(); for (int pointIndex = 0; pointIndex < pointArray.size(); pointIndex++) { // Unserialize LidarControlPoint QJsonObject pointObject = pointArray[pointIndex].toObject(); QString id; if (pointObject.contains("id") && pointObject["id"].isString()) { id = pointObject["id"].toString(); } double range = 0.0; if (pointObject.contains("range") && pointObject["range"].isDouble()) { range = pointObject["range"].toDouble(); } double sigmaRange = 0.0; if (pointObject.contains("sigmaRange") && pointObject["sigmaRange"].isDouble()) { sigmaRange = pointObject["sigmaRange"].toDouble(); } double time = 0.0; if (pointObject.contains("time") && pointObject["time"].isDouble()) { time = pointObject["time"].toDouble(); } double latitude = 0.0; if (pointObject.contains("latitude") && pointObject["latitude"].isDouble()) { latitude = pointObject["latitude"].toDouble(); } double longitude = 0.0; if (pointObject.contains("longitude") && pointObject["longitude"].isDouble()) { longitude = pointObject["longitude"].toDouble(); } double radius = 0.0; if (pointObject.contains("radius") && pointObject["radius"].isDouble()) { radius = pointObject["radius"].toDouble(); } QSharedPointer<LidarControlPoint> lcp = QSharedPointer<LidarControlPoint>(new LidarControlPoint(iTime(time), range, sigmaRange)); lcp->SetId(id); lcp->SetAprioriSurfacePoint(SurfacePoint(Latitude(latitude, Angle::Units::Degrees), Longitude(longitude, Angle::Units::Degrees), Distance(radius, Distance::Units::Kilometers))); // Unserialize ControlMeasures if (pointObject.contains("measures") && pointObject["measures"].isArray()) { QJsonArray measureArray = pointObject["measures"].toArray(); for (int measureIndex = 0; measureIndex < measureArray.size(); measureIndex++) { // Unserialize ControlMeasure QJsonObject measureObject = measureArray[measureIndex].toObject(); double line = 0.0; if (measureObject.contains("line") && measureObject["line"].toDouble()) { line = measureObject["line"].toDouble(); } double sample = 0.0; if (measureObject.contains("sample") && measureObject["sample"].toDouble()) { sample = measureObject["sample"].toDouble(); } QString serialNumber; if (measureObject.contains("serialNumber") && measureObject["serialNumber"].isString()) { serialNumber = measureObject["serialNumber"].toString(); } ControlMeasure *measure = new ControlMeasure(); measure->SetCoordinate(sample, line); measure->SetCubeSerialNumber(serialNumber); lcp->Add(measure); } } insert(lcp); } } } Loading
isis/src/base/objs/LidarData/unitTest.cpp +43 −11 Original line number Diff line number Diff line #include "LidarData.h" #include <QDebug> #include <QString> #include "Angle.h" Loading @@ -16,6 +17,8 @@ using namespace std; using namespace Isis; void print(const LidarData &lidarData); /** * Unit test for the LIDARData class. * Loading Loading @@ -50,10 +53,6 @@ int main(int argc, char *argv[]) { cout << "\tname of point: " << defaultData.points().first()->GetId() << endl; cout << endl; // Test read() cout << "Testing read(FileName)... " << endl; cout << endl; // Test write() cout << "Testing write(FileName)... " << endl; LidarData mockData; Loading @@ -72,20 +71,53 @@ int main(int argc, char *argv[]) { Longitude(lon, Angle::Units::Degrees), Distance(rad, Distance::Units::Kilometers)); lcp->SetAprioriSurfacePoint(sp); double line, sample; line = 1.0; sample = 1.0; for (int j = 0; j < 2; j++) { ControlMeasure *measure = new ControlMeasure(); sample += 1.0; line += 1.0; measure->SetCoordinate(sample, line); measure->SetCoordinate((double) i, (double) j); measure->SetCubeSerialNumber("SN_" + QString::number(i) + "-" + QString::number(j)); lcp->Add(measure); } mockData.insert(lcp); } FileName outFile("./test.json"); FileName outFile("./test.dat"); mockData.write(outFile); cout << endl; // Test read() cout << "Testing read(FileName)... " << endl; LidarData readData; readData.read(outFile); print(readData); cout << endl; } void print(const LidarData &lidarData) { QList< QSharedPointer<LidarControlPoint> > points = lidarData.points(); std::cout << "LidarData:" << std::endl; foreach (QSharedPointer<LidarControlPoint> point, points) { std::cout << "\tLidarControlPoint:" << std::endl; std::cout << "\t\tid: " << point->GetId() << std::endl;; SurfacePoint sp = point->GetAprioriSurfacePoint(); double lat, lon, rad; lat = sp.GetLatitude().planetocentric(Angle::Units::Degrees); lon = sp.GetLongitude().positiveEast(Angle::Units::Degrees); rad = sp.GetLocalRadius().kilometers(); std::cout << "\t\tlatitude: " << lat << std::endl; std::cout << "\t\tlongitude: " << lon << std::endl; std::cout << "\t\tradius: " << rad << std::endl; std::cout << "\t\trange: " << point->range() << std::endl; std::cout << "\t\tsigmaRange:" << point->sigmaRange() << std::endl; std::cout << "\t\ttime: " << point->time().Et() << std::endl; QList<ControlMeasure *> measures = point->getMeasures(); foreach (ControlMeasure *measure, measures) { std::cout << "\t\tControlMeasure: " << std::endl; std::cout << "\t\t\tline: " << measure->GetLine() << std::endl; std::cout << "\t\t\tsample: " << measure->GetSample() << std::endl; std::cout << "\t\t\tSN: " << measure->GetCubeSerialNumber() << std::endl; std::cout << "\t\t#END_ControlMeasure." << std::endl; } std::cout << "\t#END_LidarControlPoint." << std::endl << std::endl; } std::cout << std::endl; }