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