5 #include <google/protobuf/io/zero_copy_stream_impl.h>
6 #include <google/protobuf/io/coded_stream.h>
8 #include "ControlNetFileV0001.pb.h"
18 using namespace google::protobuf;
19 using namespace google::protobuf::io;
23 ControlNetFileV0001::ControlNetFileV0001() {
24 p_network =
new ControlNetFileProtoV0001;
25 p_logData =
new ControlNetLogDataProtoV0001;
29 ControlNetFileV0001::~ControlNetFileV0001() {
35 void ControlNetFileV0001::Read(
const Pvl &head,
const FileName &file) {
39 BigInt coreStartPos = protoBufferCore[
"StartByte"];
40 BigInt coreLength = protoBufferCore[
"Bytes"];
42 fstream input(file.expanded().toAscii().data(), ios::in | ios::binary);
43 if (!input.is_open()) {
44 IString msg =
"Failed to open PB file" + file.name();
48 input.seekg(coreStartPos, ios::beg);
49 IstreamInputStream inStream(&input);
50 CodedInputStream codedInStream(&inStream);
51 codedInStream.PushLimit(coreLength);
53 codedInStream.SetTotalBytesLimit(1024 * 1024 * 512, 1024 * 1024 * 400);
57 if (!p_network->ParseFromCodedStream(&codedInStream)) {
58 IString msg =
"Failed to read input PB file " + file.name();
63 string msg =
"Cannot parse binary PB file";
67 string msg =
"Cannot parse binary PB file";
72 BigInt logStartPos = logDataInfo[
"StartByte"];
73 BigInt logLength = logDataInfo[
"Bytes"];
76 input.seekg(logStartPos, ios::beg);
77 IstreamInputStream logInStream(&input);
78 CodedInputStream codedLogInStream(&logInStream);
79 codedLogInStream.PushLimit(logLength);
81 codedLogInStream.SetTotalBytesLimit(1024 * 1024 * 512, 1024 * 1024 * 400);
85 if (!p_logData->ParseFromCodedStream(&codedLogInStream)) {
86 IString msg =
"Failed to read log data in PB file [" + file.name() +
"]";
91 string msg =
"Cannot parse binary PB file's log data";
97 Pvl ControlNetFileV0001::toPvl()
const {
102 network +=
PvlKeyword(
"NetworkId", p_network->networkid().c_str());
103 network +=
PvlKeyword(
"TargetName", p_network->targetname().c_str());
104 network +=
PvlKeyword(
"UserName", p_network->username().c_str());
105 network +=
PvlKeyword(
"Created", p_network->created().c_str());
106 network +=
PvlKeyword(
"LastModified", p_network->lastmodified().c_str());
107 network +=
PvlKeyword(
"Description", p_network->description().c_str());
112 for (
int i = 0; i < p_network->points_size(); i++) {
114 p_network->points(i);
117 if(binaryPoint.type() == ControlNetFileProtoV0001_PBControlPoint::Ground)
118 pvlPoint +=
PvlKeyword(
"PointType",
"Ground");
122 pvlPoint +=
PvlKeyword(
"PointId", binaryPoint.id().c_str());
123 pvlPoint +=
PvlKeyword(
"ChooserName", binaryPoint.choosername().c_str());
124 pvlPoint +=
PvlKeyword(
"DateTime", binaryPoint.datetime().c_str());
126 if (binaryPoint.editlock()) {
130 if (binaryPoint.ignore()) {
134 switch (binaryPoint.apriorisurfpointsource()) {
135 case ControlNetFileProtoV0001_PBControlPoint::None:
137 case ControlNetFileProtoV0001_PBControlPoint::User:
138 pvlPoint +=
PvlKeyword(
"AprioriXYZSource",
"User");
140 case ControlNetFileProtoV0001_PBControlPoint::AverageOfMeasures:
141 pvlPoint +=
PvlKeyword(
"AprioriXYZSource",
"AverageOfMeasures");
143 case ControlNetFileProtoV0001_PBControlPoint::Reference:
144 pvlPoint +=
PvlKeyword(
"AprioriXYZSource",
"Reference");
146 case ControlNetFileProtoV0001_PBControlPoint::Basemap:
147 pvlPoint +=
PvlKeyword(
"AprioriXYZSource",
"Basemap");
149 case ControlNetFileProtoV0001_PBControlPoint::BundleSolution:
150 pvlPoint +=
PvlKeyword(
"AprioriXYZSource",
"BundleSolution");
152 case ControlNetFileProtoV0001_PBControlPoint::Ellipsoid:
153 case ControlNetFileProtoV0001_PBControlPoint::DEM:
157 if (binaryPoint.has_apriorisurfpointsourcefile())
158 pvlPoint +=
PvlKeyword(
"AprioriXYZSourceFile",
159 binaryPoint.apriorisurfpointsourcefile().c_str());
161 switch (binaryPoint.aprioriradiussource()) {
162 case ControlNetFileProtoV0001_PBControlPoint::None:
164 case ControlNetFileProtoV0001_PBControlPoint::User:
165 pvlPoint +=
PvlKeyword(
"AprioriRadiusSource",
"User");
167 case ControlNetFileProtoV0001_PBControlPoint::AverageOfMeasures:
168 pvlPoint +=
PvlKeyword(
"AprioriRadiusSource",
"AverageOfMeasures");
170 case ControlNetFileProtoV0001_PBControlPoint::Reference:
171 pvlPoint +=
PvlKeyword(
"AprioriRadiusSource",
"Reference");
173 case ControlNetFileProtoV0001_PBControlPoint::Basemap:
174 pvlPoint +=
PvlKeyword(
"AprioriRadiusSource",
"Basemap");
176 case ControlNetFileProtoV0001_PBControlPoint::BundleSolution:
177 pvlPoint +=
PvlKeyword(
"AprioriRadiusSource",
"BundleSolution");
179 case ControlNetFileProtoV0001_PBControlPoint::Ellipsoid:
180 pvlPoint +=
PvlKeyword(
"AprioriRadiusSource",
"Ellipsoid");
182 case ControlNetFileProtoV0001_PBControlPoint::DEM:
183 pvlPoint +=
PvlKeyword(
"AprioriRadiusSource",
"DEM");
187 if (binaryPoint.has_aprioriradiussourcefile())
188 pvlPoint +=
PvlKeyword(
"AprioriRadiusSourceFile",
189 binaryPoint.aprioriradiussourcefile().c_str());
191 if(binaryPoint.has_apriorix()) {
196 if(binaryPoint.aprioricovar_size()) {
198 matrix +=
toString(binaryPoint.aprioricovar(0));
199 matrix +=
toString(binaryPoint.aprioricovar(1));
200 matrix +=
toString(binaryPoint.aprioricovar(2));
201 matrix +=
toString(binaryPoint.aprioricovar(3));
202 matrix +=
toString(binaryPoint.aprioricovar(4));
203 matrix +=
toString(binaryPoint.aprioricovar(5));
208 if(binaryPoint.latitudeconstrained() &&
209 (binaryPoint.aprioricovar_size() || binaryPoint.adjustedcovar_size()))
210 pvlPoint +=
PvlKeyword(
"LatitudeConstrained",
"True");
212 if(binaryPoint.longitudeconstrained() &&
213 (binaryPoint.aprioricovar_size() || binaryPoint.adjustedcovar_size()))
214 pvlPoint +=
PvlKeyword(
"LongitudeConstrained",
"True");
216 if(binaryPoint.radiusconstrained() &&
217 (binaryPoint.aprioricovar_size() || binaryPoint.adjustedcovar_size()))
218 pvlPoint +=
PvlKeyword(
"RadiusConstrained",
"True");
220 if(binaryPoint.has_adjustedx()) {
225 if(binaryPoint.adjustedcovar_size()) {
226 PvlKeyword matrix(
"AdjustedCovarianceMatrix");
227 matrix +=
toString(binaryPoint.adjustedcovar(0));
228 matrix +=
toString(binaryPoint.adjustedcovar(1));
229 matrix +=
toString(binaryPoint.adjustedcovar(2));
230 matrix +=
toString(binaryPoint.adjustedcovar(3));
231 matrix +=
toString(binaryPoint.adjustedcovar(4));
232 matrix +=
toString(binaryPoint.adjustedcovar(5));
237 for (
int j = 0; j < binaryPoint.measures_size(); j++) {
238 PvlGroup pvlMeasure(
"ControlMeasure");
240 binaryMeasure = binaryPoint.measures(j);
241 pvlMeasure +=
PvlKeyword(
"SerialNumber", binaryMeasure.serialnumber().c_str());
243 switch(binaryMeasure.type()) {
244 case ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure_MeasureType_Candidate:
245 pvlMeasure +=
PvlKeyword(
"MeasureType",
"Candidate");
247 case ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure_MeasureType_Manual:
248 pvlMeasure +=
PvlKeyword(
"MeasureType",
"Manual");
250 case ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure_MeasureType_RegisteredPixel:
251 pvlMeasure +=
PvlKeyword(
"MeasureType",
"RegisteredPixel");
253 case ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure_MeasureType_RegisteredSubPixel:
254 pvlMeasure +=
PvlKeyword(
"MeasureType",
"RegisteredSubPixel");
258 pvlMeasure +=
PvlKeyword(
"ChooserName", binaryMeasure.choosername().c_str());
259 pvlMeasure +=
PvlKeyword(
"DateTime", binaryMeasure.datetime().c_str());
261 if(binaryMeasure.editlock())
264 if(binaryMeasure.ignore())
267 if(binaryMeasure.has_measurement()) {
271 if (binaryMeasure.measurement().has_sampleresidual())
273 toString(binaryMeasure.measurement().sampleresidual()),
"pixels");
275 if (binaryMeasure.measurement().has_lineresidual())
277 toString(binaryMeasure.measurement().lineresidual()),
"pixels");
280 if (binaryMeasure.has_diameter())
283 if (binaryMeasure.has_apriorisample())
286 if (binaryMeasure.has_aprioriline())
289 if (binaryMeasure.has_samplesigma())
292 if (binaryMeasure.has_samplesigma())
295 for (
int logEntry = 0;
297 p_logData->points(i).measures(j).loggedmeasuredata_size();
300 p_logData->points(i).measures(j).loggedmeasuredata(logEntry);
310 if(binaryPoint.has_referenceindex() &&
311 binaryPoint.referenceindex() == j)
312 pvlMeasure +=
PvlKeyword(
"Reference",
"True");
314 pvlPoint.addGroup(pvlMeasure);
317 network.addObject(pvlPoint);