1 #include "cartproducts.h"
3 #include <radarlib/radar.hpp>
4 #define ACCEPT_USE_OF_DEPRECATED_PROJ_API_H
7 using namespace radarelab;
8 using namespace OdimH5v21;
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)
20 logging_category = log4c_category_get(
"radar.cart");
24 LOG_INFO(
"Creazione Matrice Cartesiana");
25 fullres.map_max_sample(volume[0], mapping);
29 LOG_INFO(
"Creazione Matrice Cartesiana ridimensionata");
30 scaled.map_max_sample(volume[0], fullres);
32 FullsizeRes = volume.at(0).cell_size;
33 ScaledRes = FullsizeRes*sample_square_size;
37 void CartProducts::write_out(Assets& assets)
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");
51 void CartProducts::write_out(Assets& assets,
unsigned image_side)
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");
65 void CartProducts::write_out(Assets& assets,
unsigned image_side,std::string algos)
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");
81 void CartProducts::write_odim(Assets& assets,
unsigned image_side, std::string algos, OdimProdDefs &odimProd)
83 const char* dir = getenv(
"OUTPUT_Z_LOWRIS_DIR");
86 LOG_INFO(
"$%s not set",
"OUTPUT_Z_LOWRIS_DIR");
87 throw runtime_error(
"required env var is not set");
89 SourceInfo OdimSource(assets.getRadarSite().source);
91 string fname = string(dir) +
"/" + OdimSource.OperaRadarNode +
"_" + assets.fname_from_acq_time() +
"_" + std::to_string(image_side) +
"_"+algos+
".h5";
93 OdimH5v21::OdimFactory* factory = NULL;
94 OdimH5v21::ImageObject* image = NULL;
96 factory =
new OdimFactory();
97 image = factory->createImageObject(fname);
100 image->setDateTime(assets.getAcqTime());
101 image->setSource(OdimSource);
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())) )
110 if (!(pj_latlong = pj_init_plus(LatLon_def.c_str())) )
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};
115 double y[]={coord_min, coord_min, coord_max, coord_max};
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);
126 image->setXSize(image_side);
127 image->setYSize(image_side);
128 image->setXScale(odimProd.prodRes);
129 image->setYScale(odimProd.prodRes);
130 image->setProjectionArguments(proj);
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);
167 Product_LBM * dataset = image->createProductLBM();
168 dataset->setProduct(
"SURF");
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.);
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);
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)
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)
Gestisce risorse usate dal programma.