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)19 bool 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)34 bool 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