/** * Removes control points not in the lat/lon range provided in the unput * parameters. * * @param outNet The output control net being removed from * @param noLanLonPoint The keyword recording all of the control points removed * due to the provided lat/lon range * @param noLanLonPoint The keyword recording all of the control points removed * due to the inability to calculate the lat/lon for that * point */ void ExtractLatLonRange( ControlNet & outNet, PvlKeyword & nonLatLonPoints, PvlKeyword & cannotGenerateLatLonPoints, map<iString,iString> sn2filename ) { if( outNet.Size() == 0 ) { return; } UserInterface &ui = Application::GetUserInterface(); // Get the lat/lon and fix the range for the internal 0/360 double minlat = ui.GetDouble("MINLAT"); double maxlat = ui.GetDouble("MAXLAT"); double minlon = ui.GetDouble("MINLON"); if( minlon < 0.0 ) { minlon += 360; } double maxlon = ui.GetDouble("MAXLON"); if( maxlon < 0.0 ) { minlon += 360; } bool useNetwork = ui.GetBoolean("USENETWORK"); Progress progress; progress.SetText("Calculating lat/lon"); progress.SetMaximumSteps(outNet.Size()); progress.CheckStatus(); CubeManager manager; manager.SetNumOpenCubes( 50 ); //Should keep memory usage to around 1GB for( int cp = outNet.Size()-1; cp >= 0; cp --) { progress.CheckStatus(); // If the Contorl Network takes priority, use it double pointLat = outNet[cp].UniversalLatitude(); double pointLon = outNet[cp].UniversalLongitude(); bool useControlNet = useNetwork && pointLat > -1000 && pointLon > -1000; if( outNet[cp].Type() == Isis::ControlPoint::Ground || useControlNet ) { if( NotInLatLonRange( outNet[cp].UniversalLatitude(), outNet[cp].UniversalLongitude(), minlat, maxlat, minlon, maxlon ) ) { nonLatLonPoints += outNet[cp].Id(); outNet.Delete( cp ); } } /** * If the lat/lon cannot be determined from the point, then we need to calculate * lat/lon on our own */ else if( ui.WasEntered("FROMLIST") ) { // Find a cube in the Control Point to get the lat/lon from int cm = 0; iString sn = ""; double lat = 0.0; double lon = 0.0; double radius = 0.0; // First check the reference Measure if( outNet[cp].HasReference() ) { cm = outNet[cp].ReferenceIndex(); if( !sn2filename[outNet[cp][cm].CubeSerialNumber()].empty() ) { sn = outNet[cp][cm].CubeSerialNumber(); } } // Search for other Control Measures if needed if( sn.empty() ) { // Find the Serial Number if it exists for( int cm = 0; (cm < outNet[cp].Size()) && sn.empty(); cm ++ ) { if( !sn2filename[outNet[cp][cm].CubeSerialNumber()].empty() ) { sn = outNet[cp][cm].CubeSerialNumber(); } } } // Connot fine a cube to get the lat/lon from if( sn.empty() ) { cannotGenerateLatLonPoints += outNet[cp].Id(); outNet.Delete( cp ); } // Calculate the lat/lon and check for validity else { bool remove = false; Cube *cube = manager.OpenCube( sn2filename[sn] ); Camera *camera = cube->Camera(); if (camera == NULL) { try { Projection *projection = ProjectionFactory::Create( (*(cube->Label())) ); if(!projection->SetCoordinate(outNet[cp][cm].Sample(),outNet[cp][cm].Line())) { nonLatLonPoints += outNet[cp].Id(); remove = true; } lat = projection->Latitude(); lon = projection->Longitude(); radius = projection->LocalRadius(); delete projection; projection = NULL; } catch ( iException &e ) { remove = true; e.Clear(); } } else { if(!camera->SetImage(outNet[cp][cm].Sample(),outNet[cp][cm].Line())) { nonLatLonPoints += outNet[cp].Id(); remove = true; } lat = camera->UniversalLatitude(); lon = camera->UniversalLongitude(); radius = camera->LocalRadius(); camera = NULL; } cube = NULL; if( remove || NotInLatLonRange( lat, lon, minlat, maxlat, minlon, maxlon ) ) { nonLatLonPoints += outNet[cp].Id(); outNet.Delete( cp ); } else { // Add the reference lat/lon/radius to the Control Point outNet[cp].SetUniversalGround( lat, lon, radius ); } } } else { cannotGenerateLatLonPoints += outNet[cp].Id(); outNet.Delete( cp ); } } manager.CleanCubes(); }
int main(int argc, char *argv[]) { Preference::Preferences(true); void doit(Pvl & lab); void doit2(Pvl & lab); try { cout << "Unit test for ProjectionFactory" << endl; Pvl lab; lab.addGroup(PvlGroup("Mapping")); PvlGroup &mapGroup = lab.findGroup("Mapping"); mapGroup += PvlKeyword("EquatorialRadius", toString(3396190.0)); mapGroup += PvlKeyword("PolarRadius", toString(3376200.0)); mapGroup += PvlKeyword("LatitudeType", "Planetographic"); mapGroup += PvlKeyword("LongitudeDirection", "PositiveEast"); mapGroup += PvlKeyword("LongitudeDomain", toString(360)); mapGroup += PvlKeyword("ProjectionName", "SimpleCylindrical"); mapGroup += PvlKeyword("CenterLongitude", toString(220.0)); cout << "Test for missing pixel resolution ... " << endl; doit(lab); doit2(lab); mapGroup += PvlKeyword("PixelResolution", toString(2000.0)); cout << "Test for missing upper left X ... " << endl; doit(lab); mapGroup += PvlKeyword("UpperLeftCornerX", toString(-18000.0)); cout << "Test for missing upper left Y ... " << endl; doit(lab); mapGroup += PvlKeyword("UpperLeftCornerY", toString(2062000.0)); cout << "Testing conversion from image to ground ... " << endl; Projection *proj = ProjectionFactory::CreateFromCube(lab); proj->SetWorld(245.0, 355.0); cout << setprecision(14); cout << "Latitude: " << proj->Latitude() << endl; cout << "Longitude: " << proj->Longitude() << endl; cout << endl; cout << "Testing conversion from ground to image ... " << endl; proj->SetGround(22.84279897788801, 227.9291842833142); cout << "Sample: " << proj->WorldX() << endl; cout << "Line: " << proj->WorldY() << endl; cout << endl; cout << "Testing missing ground range on create method ... " << endl; doit2(lab); mapGroup += PvlKeyword("MinimumLatitude", toString(10.8920539924144)); mapGroup += PvlKeyword("MaximumLatitude", toString(34.7603960060206)); mapGroup += PvlKeyword("MinimumLongitude", toString(219.72432466275)); mapGroup += PvlKeyword("MaximumLongitude", toString(236.186050244411)); mapGroup.deleteKeyword("UpperLeftCornerX"); mapGroup.deleteKeyword("UpperLeftCornerY"); cout << "Testing create method ... " << endl; int lines, samples; proj = ProjectionFactory::CreateForCube(lab, samples, lines); cout << "Lines: " << lines << endl; cout << "Samples: " << samples << endl; cout << "UpperLeftX: " << (double) mapGroup["UpperLeftCornerX"] << endl; cout << "UpperLeftY: " << (double) mapGroup["UpperLeftCornerY"] << endl; cout << endl; cout << "Testing create method with existing cube labels" << endl; mapGroup.addKeyword(PvlKeyword("UpperLeftCornerX", toString(-16000.0)), Pvl::Replace); mapGroup.addKeyword(PvlKeyword("UpperLeftCornerY", toString(2060000.0)), Pvl::Replace); Pvl lab2; PvlObject icube("IsisCube"); PvlObject core("Core"); PvlGroup dims("Dimensions"); dims += PvlKeyword("Lines", toString(400)); dims += PvlKeyword("Samples", toString(600)); core.addGroup(dims); icube.addObject(core); icube.addGroup(mapGroup); lab2.addObject(icube); proj = ProjectionFactory::CreateForCube(lab2, samples, lines); cout << "Lines: " << lines << endl; cout << "Samples: " << samples << endl; mapGroup = lab2.findGroup("Mapping", Pvl::Traverse); cout << "UpperLeftX: " << (double) mapGroup["UpperLeftCornerX"] << endl; cout << "UpperLeftY: " << (double) mapGroup["UpperLeftCornerY"] << endl; cout << endl; cout << "Label results" << endl; cout << lab2 << endl; } catch(IException &e) { e.print(); } }