1 // This is brl/bpro/core/brad_pro/processes/brad_get_image_footprint_process.cxx 2 //: 3 // \file 4 // get the footprint (array of 4 corners) of the satellite image 5 // 6 #include <bprb/bprb_func_process.h> 7 #include <brad/brad_image_metadata.h> 8 9 #include "vgl/vgl_polygon.h" 10 #include <bpro/core/bbas_pro/bbas_1d_array_unsigned.h> 11 #include <bpro/core/bbas_pro/bbas_1d_array_double.h> 12 13 namespace brad_get_image_footprint_process_globals 14 { 15 const unsigned n_inputs_ = 1; 16 const unsigned n_outputs_ = 3; 17 } 18 brad_get_image_footprint_process_cons(bprb_func_process & pro)19bool brad_get_image_footprint_process_cons(bprb_func_process& pro) 20 { 21 using namespace brad_get_image_footprint_process_globals; 22 23 std::vector<std::string> input_types_(n_inputs_); 24 input_types_[0] = "brad_image_metadata_sptr"; // image metadata 25 26 std::vector<std::string> output_types_(n_outputs_); 27 output_types_[0] = "unsigned"; // number of sheets in polygon 28 output_types_[1] = "bbas_1d_array_unsigned_sptr"; // number of vertices in each polygon sheet 29 output_types_[2] = "bbas_1d_array_double_sptr"; // polygon vertices 30 31 return pro.set_input_types(input_types_) && pro.set_output_types(output_types_); 32 } 33 brad_get_image_footprint_process(bprb_func_process & pro)34bool brad_get_image_footprint_process(bprb_func_process& pro) 35 { 36 using namespace brad_get_image_footprint_process_globals; 37 38 if (!pro.verify_inputs()) { 39 std::cout << pro.name() << ": WRONG inputs!!!" << std::endl; 40 return false; 41 } 42 43 //get the input(s) 44 brad_image_metadata_sptr meta = pro.get_input<brad_image_metadata_sptr>(0); 45 46 // vectorize footprint for output 47 vgl_polygon<double> footprint = meta->footprint_; 48 unsigned int nsheets = footprint.num_sheets(); 49 std::vector<unsigned> nverts; 50 std::vector<double> verts; 51 52 for (unsigned int s = 0; s < nsheets; ++s) { 53 nverts.push_back(footprint[s].size()); 54 for (unsigned int p = 0; p < footprint[s].size(); ++p) { 55 verts.push_back(footprint[s][p].x()); 56 verts.push_back(footprint[s][p].y()); 57 } 58 } 59 60 // fill out bbas_1d arrays 61 bbas_1d_array_unsigned_sptr poly_nverts = new bbas_1d_array_unsigned(nverts.size()); 62 unsigned nv = 0; 63 for(std::vector<unsigned>::iterator nit = nverts.begin(); nit != nverts.end(); ++nit, ++nv) 64 poly_nverts->data_array[nv]=*nit; 65 66 bbas_1d_array_double_sptr poly_verts = new bbas_1d_array_double(verts.size()); 67 unsigned iv = 0; 68 for(std::vector<double>::iterator vit = verts.begin(); vit != verts.end(); ++vit, ++iv) 69 poly_verts->data_array[iv]=*vit; 70 71 // generate output 72 unsigned i = 0; 73 pro.set_output_val<unsigned int>(i++, nsheets); 74 pro.set_output_val<bbas_1d_array_unsigned_sptr>(i++, poly_nverts); 75 pro.set_output_val<bbas_1d_array_double_sptr>(i++, poly_verts); 76 77 return true; 78 } 79 80