Elaboradar  0.1
 Tutto Classi Namespace File Funzioni Variabili Tipi enumerati (enum) Gruppi
cartproducts.cpp
1 #include "cartproducts.h"
2 #include "assets.h"
3 #include <radarlib/radar.hpp>
4 #define ACCEPT_USE_OF_DEPRECATED_PROJ_API_H
5 #include <proj_api.h>
6 
7 using namespace radarelab;
8 using namespace OdimH5v21;
9 namespace elaboradar {
10 
11 CartProducts::CartProducts(const Volume<double>& volume, unsigned image_side, unsigned sample_square_size)
12  : mapping(volume[0].beam_size),
13  fullres(volume[0].beam_size),
14  scaled(mapping, image_side, sample_square_size),
15  z_out(image_side), z_fr(image_side*sample_square_size), top_1x1(image_side), qual_Z_1x1(image_side),
16  quota_1x1(image_side), dato_corr_1x1(image_side),
17  elev_fin_1x1(image_side), beam_blocking_1x1(image_side),
18  neve_1x1(image_side), corr_1x1(image_side), conv_1x1(image_side)
19 {
20  logging_category = log4c_category_get("radar.cart");
21 
22  quota_1x1.fill(128);
23 
24  LOG_INFO("Creazione Matrice Cartesiana");
25  fullres.map_max_sample(volume[0], mapping);
26  //assets.write_gdal_image(fullres.map_azimuth, "DIR_DEBUG", "map_azimuth", "PNG");
27  //assets.write_gdal_image(fullres.map_range, "DIR_DEBUG", "map_range", "PNG");
28 
29  LOG_INFO("Creazione Matrice Cartesiana ridimensionata");
30  scaled.map_max_sample(volume[0], fullres);
31 
32  FullsizeRes = volume.at(0).cell_size;
33  ScaledRes = FullsizeRes*sample_square_size;
34 
35 }
36 
37 void CartProducts::write_out(Assets& assets)
38 {
39  assets.write_image(z_out, "OUTPUT_Z_LOWRIS_DIR", ".ZLR", "file output 1X1");
40  assets.write_image(top_1x1, "DIR_QUALITY", ".top20_ZLR", "file top20");
41  assets.write_image(qual_Z_1x1, "OUTPUT_Z_LOWRIS_DIR", ".qual_ZLR", "file qualita' Z");
42  assets.write_image(quota_1x1, "DIR_QUALITY", ".quota_ZLR", "file qel1uota");
43  assets.write_image(dato_corr_1x1, "DIR_QUALITY", ".anap_ZLR", "file anap");
44  assets.write_image(elev_fin_1x1, "DIR_QUALITY", ".elev_ZLR", "file elev");
45  assets.write_image(beam_blocking_1x1, "DIR_QUALITY", ".bloc_ZLR", "file bloc");
46  assets.write_image(neve_1x1, "DIR_QUALITY", ".corr_ZLR", "file correzione VPR");
47  assets.write_image(corr_1x1, "DIR_QUALITY", ".corr_ZLR", "file correzione VPR");
48  assets.write_image(conv_1x1, "DIR_QUALITY", ".conv_ZLR", "punti convettivi");
49 }
50 
51 void CartProducts::write_out(Assets& assets, unsigned image_side)
52 {
53  assets.write_subimage(z_out, image_side, "OUTPUT_Z_LOWRIS_DIR", ".ZLR", "file output 1X1");
54  assets.write_subimage(top_1x1, image_side, "DIR_QUALITY", ".top20_ZLR", "file top20");
55  assets.write_subimage(qual_Z_1x1, image_side, "OUTPUT_Z_LOWRIS_DIR", ".qual_ZLR", "file qualita' Z");
56  assets.write_subimage(quota_1x1, image_side, "DIR_QUALITY", ".quota_ZLR", "file qel1uota");
57  assets.write_subimage(dato_corr_1x1, image_side, "DIR_QUALITY", ".anap_ZLR", "file anap");
58  assets.write_subimage(elev_fin_1x1, image_side, "DIR_QUALITY", ".elev_ZLR", "file elev");
59  assets.write_subimage(beam_blocking_1x1, image_side, "DIR_QUALITY", ".bloc_ZLR", "file bloc");
60  assets.write_subimage(neve_1x1, image_side, "DIR_QUALITY", ".corr_ZLR", "file correzione VPR");
61  assets.write_subimage(corr_1x1, image_side, "DIR_QUALITY", ".corr_ZLR", "file correzione VPR");
62  assets.write_subimage(conv_1x1, image_side, "DIR_QUALITY", ".conv_ZLR", "punti convettivi");
63 }
64 
65 void CartProducts::write_out(Assets& assets, unsigned image_side,std::string algos)
66 {
67  assets.write_subimage(z_out, image_side, algos, "OUTPUT_Z_LOWRIS_DIR", ".ZLR", "file output 1X1");
68  assets.write_subimage(top_1x1, image_side, algos, "DIR_QUALITY", ".top20_ZLR", "file top20");
69  assets.write_subimage(qual_Z_1x1, image_side, algos, "OUTPUT_Z_LOWRIS_DIR", ".qual_ZLR", "file qualita' Z");
70  assets.write_subimage(quota_1x1, image_side, algos, "DIR_QUALITY", ".quota_ZLR", "file qel1uota");
71  assets.write_subimage(dato_corr_1x1, image_side, algos, "DIR_QUALITY", ".anap_ZLR", "file anap");
72  assets.write_subimage(elev_fin_1x1, image_side, algos, "DIR_QUALITY", ".elev_ZLR", "file elev");
73  assets.write_subimage(beam_blocking_1x1, image_side, algos, "DIR_QUALITY", ".bloc_ZLR", "file bloc");
74  assets.write_subimage(neve_1x1, image_side, algos, "DIR_QUALITY", ".corr_ZLR", "file correzione VPR");
75  assets.write_subimage(corr_1x1, image_side, algos, "DIR_QUALITY", ".corr_ZLR", "file correzione VPR");
76  assets.write_subimage(conv_1x1, image_side, algos, "DIR_QUALITY", ".conv_ZLR", "punti convettivi");
77 }
78 
79 
80 
81  void CartProducts::write_odim(Assets& assets, unsigned image_side, std::string algos, OdimProdDefs &odimProd)
82 {
83  const char* dir = getenv("OUTPUT_Z_LOWRIS_DIR");
84  if (!dir)
85  {
86  LOG_INFO("$%s not set", "OUTPUT_Z_LOWRIS_DIR");
87  throw runtime_error("required env var is not set");
88  }
89  SourceInfo OdimSource(assets.getRadarSite().source);
90 
91  string fname = string(dir) + "/" + OdimSource.OperaRadarNode + "_" + assets.fname_from_acq_time() + "_" + std::to_string(image_side) + "_"+algos+".h5";
92 
93  OdimH5v21::OdimFactory* factory = NULL;
94  OdimH5v21::ImageObject* image = NULL;
95 
96  factory = new OdimFactory(); /* creazione di una factory */
97  image = factory->createImageObject(fname); /* creazione di un oggetto generico */
98 
99  /* what (valori obbligatori e comuni a tutti gli oggetti) */
100  image->setDateTime(assets.getAcqTime());
101  image->setSource(OdimSource);
102 
103  /* where */
104  std::string proj ="+proj=aeqd +lat_0=";
105  proj = proj+std::to_string(assets.getRadarSite().lat_r)+"N +lon_0="+std::to_string(assets.getRadarSite().lon_r)+"E +units=m +datum=WGS84";
106  projPJ pj_aeqd, pj_latlong;
107  std::string LatLon_def ("+proj=latlong +datum=WGS84");
108  if (!(pj_aeqd = pj_init_plus(proj.c_str())) )
109  exit(1);
110  if (!(pj_latlong = pj_init_plus(LatLon_def.c_str())) )
111  exit(1);
112  double coord_min = -(image_side * odimProd.prodRes *0.5) ;
113  double coord_max = image_side * odimProd.prodRes *0.5 ;
114  double x[]={coord_min, coord_max, coord_min, coord_max}; // { LL , LR, UL, UR }
115  double y[]={coord_min, coord_min, coord_max, coord_max}; // { LL , LR, UL, UR }
116  if (pj_transform(pj_aeqd, pj_latlong, 4, 1, x, y, NULL ) != 0 ) exit(1000);
117  image->setLL_Latitude (y[0]*RAD_TO_DEG);
118  image->setLL_Longitude(x[0]*RAD_TO_DEG);
119  image->setLR_Latitude (y[1]*RAD_TO_DEG);
120  image->setLR_Longitude(x[1]*RAD_TO_DEG);
121  image->setUL_Latitude (y[2]*RAD_TO_DEG);
122  image->setUL_Longitude(x[2]*RAD_TO_DEG);
123  image->setUR_Latitude (y[3]*RAD_TO_DEG);
124  image->setUR_Longitude(x[3]*RAD_TO_DEG);
125 
126  image->setXSize(image_side);
127  image->setYSize(image_side);
128  image->setXScale(odimProd.prodRes);
129  image->setYScale(odimProd.prodRes);
130  image->setProjectionArguments(proj);
131 
132  /* how */
133  image->setTaskOrProdGen(algos);
134  image->setStartEpochs((unsigned int)assets.getAcqTime());
135  image->setEndEpochs( (unsigned int)assets.getAcqTime());
136  image->setSystem(odimProd.System);
137  image->setSoftware(odimProd.System);
138  image->setSoftwareVer(odimProd.System);
139 
140 /* ------------------------
141  * QUI BISOGNA METTERE QUALCOSA CHE CREI IL PRODOTTO GIUSTO MA NON SO COME SI FA
142  *
143  * AL MOEMNTO CREO SOLO QUELLO CHE MI SERVE
144  switch (odimProd.ProductType) {
145  extern RADAR_API const char* PRODUCT_SCAN;
146  extern RADAR_API const char* PRODUCT_PPI;
147  extern RADAR_API const char* PRODUCT_CAPPI;
148  extern RADAR_API const char* PRODUCT_PCAPPI;
149  extern RADAR_API const char* PRODUCT_ETOP;
150  extern RADAR_API const char* PRODUCT_MAX;
151  extern RADAR_API const char* PRODUCT_RR;
152  extern RADAR_API const char* PRODUCT_VIL;
153  extern RADAR_API const char* PRODUCT_COMP;
154  extern RADAR_API const char* PRODUCT_VP;
155  extern RADAR_API const char* PRODUCT_RHI;
156  extern RADAR_API const char* PRODUCT_XSEC;
157  extern RADAR_API const char* PRODUCT_VSP;
158  extern RADAR_API const char* PRODUCT_HSP;
159  extern RADAR_API const char* PRODUCT_RAY;
160  extern RADAR_API const char* PRODUCT_AZIM;
161  extern RADAR_API const char* PRODUCT_QUAL;
162  extern RADAR_API const char* PRODUCT_LBM_ARPA;
163  extern RADAR_API const char* PRODUCT_POH_ARPA;
164 
165  *
166  */
167  Product_LBM * dataset = image->createProductLBM();
168  dataset->setProduct("SURF");// Dato che ODIMh5 v2.2 codifica per i dati riferiti alla superfice il prodotto generico SURF sovrascrivo quindi il tipo di prodotto definito LBM
169  dataset->setStartDateTime(assets.getAcqTime());
170  dataset->setEndDateTime (assets.getAcqTime());
171  Product_2D_Data* data = dataset->createQuantityData(odimProd.Quantity);
172  data->setNodata(odimProd.Nodata);
173  data->setUndetect(odimProd.Undetect);
174  data->setOffset(odimProd.Offset);
175  data->setGain(odimProd.QuantityDynamics/255.);
176 
177  unsigned xofs = (odimProd.prodField.cols() - image_side) / 2;
178  unsigned yofs = (odimProd.prodField.rows() - image_side) / 2;
179  OdimH5v21::DataMatrix <unsigned char> field (image_side,image_side,255);
180  for (unsigned y = 0; y < image_side; ++y)
181  for (unsigned x = 0; x < image_side; ++x)
182  if (odimProd.prodField(y + yofs, x + xofs) == 0 ) field.elem(y,x) = 255 ;
183  else if (odimProd.prodField(y + yofs, x + xofs) == 255) field.elem(y,x) = 254 ;
184  else if (odimProd.prodField(y + yofs, x + xofs) == 1) field.elem(y,x) = 0 ;
185  else field.elem(y,x) = odimProd.prodField(y + yofs, x + xofs);
186  data->writeData(field);
187  if (odimProd.SaveQuality) {
188  OdimQuality * quality =data->createQualityData();
189  quality->getWhat()->set(ATTRIBUTE_WHAT_OFFSET, 0.);
190  quality->getWhat()->set(ATTRIBUTE_WHAT_GAIN, 0.01);
191  quality->getHow() ->set(ATTRIBUTE_HOW_TASK, "Anna Fornasiero");
192  OdimH5v21::DataMatrix <unsigned char> Qfield (image_side,image_side,255);
193  for (unsigned y = 0; y < image_side; ++y)
194  for (unsigned x = 0; x < image_side; ++x)
195  Qfield.elem(y,x) = odimProd.QualityField(y + yofs, x + xofs);
196  quality->writeQuality(Qfield);
197  delete quality;
198  }
199  delete data;
200  delete dataset;
201  delete image;
202  delete factory;
203 
204 }
205 
206 OdimProdDefs::OdimProdDefs(radarelab::Image<unsigned char> & prodField, double prodRes)
207  : prodField (prodField), System("ARPA-SIMC"), ProductType("SURF"),
208  Quantity(PRODUCT_QUANTITY_DBZH), Nodata(255), Undetect (0), Offset(-20.),
209  QuantityDynamics (80), SaveQuality(false), prodRes(prodRes)
210 {
211  // Nothing to do
212 }
213 
214 OdimProdDefs::OdimProdDefs(radarelab::Image<unsigned char> & prodField, radarelab::Image<unsigned char> & QualityField, double prodRes)
215  : prodField (prodField), System("ARPA-SIMC"), ProductType("SURF"),
216  Quantity(PRODUCT_QUANTITY_DBZH), Nodata(255), Undetect (0), Offset(-20.),
217  QuantityDynamics (80), SaveQuality(true), QualityField(QualityField), prodRes(prodRes)
218 
219 {
220  // Nothing to do
221 }
222 
223 
224 
225 } // namespace elaboradar
226 
Gestisce risorse usate dal programma.