/** * Set the output cube to specified file name and specified input images * and output attributes and lat,lons */ Isis::Cube *ProcessMapMosaic::SetOutputCube(const QString &inputFile, double xmin, double xmax, double ymin, double ymax, double slat, double elat, double slon, double elon, int nbands, CubeAttributeOutput &oAtt, const QString &mosaicFile) { Pvl fileLab(inputFile); PvlGroup &mapping = fileLab.findGroup("Mapping", Pvl::Traverse); mapping["UpperLeftCornerX"] = toString(xmin); mapping["UpperLeftCornerY"] = toString(ymax); mapping.addKeyword(PvlKeyword("MinimumLatitude", toString(slat)), Pvl::Replace); mapping.addKeyword(PvlKeyword("MaximumLatitude", toString(elat)), Pvl::Replace); mapping.addKeyword(PvlKeyword("MinimumLongitude", toString(slon)), Pvl::Replace); mapping.addKeyword(PvlKeyword("MaximumLongitude", toString(elon)), Pvl::Replace); Projection *firstProj = ProjectionFactory::CreateFromCube(fileLab); int samps = (int)(ceil(firstProj->ToWorldX(xmax) - firstProj->ToWorldX(xmin)) + 0.5); int lines = (int)(ceil(firstProj->ToWorldY(ymin) - firstProj->ToWorldY(ymax)) + 0.5); delete firstProj; if (p_createMosaic) { Pvl newMap; newMap.addGroup(mapping); // Initialize the mosaic CubeAttributeInput inAtt; ProcessByLine p; p.SetInputCube(inputFile, inAtt); p.PropagateHistory(false); p.PropagateLabels(false); p.PropagateTables(false); p.PropagatePolygons(false); p.PropagateOriginalLabel(false); // If track set, create the origin band if (GetTrackFlag()) { nbands += 1; } // For average priority, get the new band count else if (GetImageOverlay() == AverageImageWithMosaic) { nbands *= 2; } Cube *ocube = p.SetOutputCube(mosaicFile, oAtt, samps, lines, nbands); p.Progress()->SetText("Initializing mosaic"); p.ClearInputCubes(); p.StartProcess(ProcessMapMosaic::FillNull); // CreateForCube created some keywords in the mapping group that needs to be added ocube->putGroup(newMap.findGroup("Mapping", Pvl::Traverse)); p.EndProcess(); } Cube *mosaicCube = new Cube(); mosaicCube->open(mosaicFile, "rw"); mosaicCube->addCachingAlgorithm(new UniqueIOCachingAlgorithm(2)); AddOutputCube(mosaicCube); return mosaicCube; }
/** * Set the output cube to specified file name and specified input images * and output attributes and lat,lons */ Isis::Cube *ProcessMapMosaic::SetOutputCube(const QString &inputFile, PvlGroup mapping, CubeAttributeOutput &oAtt, const QString &mosaicFile) { if (OutputCubes.size() != 0) { QString msg = "You can only specify one output cube and projection"; throw IException(IException::Programmer, msg, _FILEINFO_); } if (mapping.hasKeyword("UpperLeftCornerX")) mapping.deleteKeyword("UpperLeftCornerX"); if (mapping.hasKeyword("UpperLeftCornerY")) mapping.deleteKeyword("UpperLeftCornerY"); if (p_createMosaic) { Pvl newMap; newMap.addGroup(mapping); int samps, lines, bands; delete ProjectionFactory::CreateForCube(newMap, samps, lines, false); // Initialize the mosaic ProcessByLine p; CubeAttributeInput inAtt(inputFile); Cube *propCube = p.SetInputCube(inputFile, inAtt); bands = propCube->bandCount(); // If track set, create the origin band if (GetTrackFlag()) { bands += 1; } // For average priority, get the new band count else if (GetImageOverlay() == AverageImageWithMosaic) { bands *= 2; } p.PropagateHistory(false); p.PropagateLabels(false); Cube *ocube = p.SetOutputCube(mosaicFile, oAtt, samps, lines, bands); p.Progress()->SetText("Initializing mosaic"); p.ClearInputCubes(); p.StartProcess(ProcessMapMosaic::FillNull); // CreateForCube created some keywords in the mapping group that needs to be added ocube->putGroup(newMap.findGroup("Mapping", Pvl::Traverse)); p.EndProcess(); } Cube *mosaicCube = new Cube(); AddOutputCube(mosaicCube); mosaicCube->open(mosaicFile, "rw"); mosaicCube->addCachingAlgorithm(new UniqueIOCachingAlgorithm(2)); return mosaicCube; }
void IsisMain() { // Setup the input and output cubes along with histograms ProcessByLine p; Cube *mcube = p.SetInputCube("MATCH", Isis::OneBand); Histogram *match = mcube->histogram(); p.ClearInputCubes(); Cube *icube = p.SetInputCube("FROM", Isis::OneBand); Histogram *from = icube->histogram(); p.SetOutputCube("TO"); // Histogram specifications UserInterface &ui = Application::GetUserInterface(); double minimum = ui.GetDouble("MINPER"); double maximum = ui.GetDouble("MAXPER"); stretch.ClearPairs(); // CDF mode selected if(ui.GetString("STRETCH") == "CDF") { int increment = ui.GetInteger("INCREMENT"); double lastPer = from->Percent(minimum); stretch.AddPair(lastPer, match->Percent(minimum)); for(double i = increment + minimum; i < maximum; i += increment) { double curPer = from->Percent(i); if(lastPer < curPer && abs(lastPer - curPer) > DBL_EPSILON) { stretch.AddPair(curPer, match->Percent(i)); lastPer = curPer; } } double curPer = from->Percent(maximum); if(lastPer < curPer && abs(lastPer - curPer) > DBL_EPSILON) { stretch.AddPair(curPer, match->Percent(maximum)); } } // Modal mode is selected else { stretch.AddPair(from->Percent(minimum), match->Percent(minimum)); stretch.AddPair(from->Mode(), match->Mode()); stretch.AddPair(from->Percent(maximum), match->Percent(maximum)); } // Start the processing p.StartProcess(remap); p.EndProcess(); }
void IsisMain() { try { // We will be processing by line ProcessByLine p; double sscale, lscale; int ins, inl, inb; int ons, onl; vector<QString> bands; Cube inCube; // To propogate labels, set input cube, // this cube will be cleared after output cube is set. p.SetInputCube("FROM"); // Setup the input and output cubes UserInterface &ui = Application::GetUserInterface(); QString replaceMode = ui.GetAsString("VPER_REPLACE"); CubeAttributeInput cai(ui.GetAsString("FROM")); bands = cai.bands(); inCube.setVirtualBands(bands); QString from = ui.GetFileName("FROM"); inCube.open(from); ins = inCube.sampleCount(); inl = inCube.lineCount(); inb = inCube.bandCount(); QString alg = ui.GetString("ALGORITHM"); double vper = ui.GetDouble("VALIDPER") / 100.; if(ui.GetString("MODE") == "TOTAL") { ons = ui.GetInteger("ONS"); onl = ui.GetInteger("ONL"); sscale = (double)ins / (double)ons; lscale = (double)inl / (double)onl; } else { sscale = ui.GetDouble("SSCALE"); lscale = ui.GetDouble("LSCALE"); ons = (int)((double)ins / sscale + 0.5); onl = (int)((double)inl / lscale + 0.5); } if(ons > ins || onl > inl) { QString msg = "Number of output samples/lines must be less than or equal"; msg = msg + " to the input samples/lines."; throw IException(IException::User, msg, _FILEINFO_); } // Allocate output file Cube *ocube = p.SetOutputCube("TO", ons, onl, inb); // Our processing routine only needs 1 // the original set was for info about the cube only p.ClearInputCubes(); // Start the processing PvlGroup results; if(alg == "AVERAGE"){ Average average(&inCube, sscale, lscale, vper, replaceMode); p.ProcessCubeInPlace(average, false); results = average.UpdateOutputLabel(ocube); } else if(alg == "NEAREST") { Nearest near(&inCube, sscale, lscale); p.ProcessCubeInPlace(near, false); results = near.UpdateOutputLabel(ocube); } // Cleanup inCube.close(); p.EndProcess(); // Write the results to the log Application::Log(results); } // REFORMAT THESE ERRORS INTO ISIS TYPES AND RETHROW catch (IException &) { throw; } catch (std::exception const &se) { QString message = "std::exception: " + (QString)se.what(); throw IException(IException::User, message, _FILEINFO_); } catch (...) { QString message = "Other Error"; throw IException(IException::User, message, _FILEINFO_); } }