diff --git a/CCDFDataModel/CCDFHDF5IO_ODIM.cpp b/CCDFDataModel/CCDFHDF5IO_ODIM.cpp index f2c5af3c6..e3e416c6b 100644 --- a/CCDFDataModel/CCDFHDF5IO_ODIM.cpp +++ b/CCDFDataModel/CCDFHDF5IO_ODIM.cpp @@ -98,6 +98,11 @@ int CDFHDF5Reader::convertODIMHDF5toCF() { if (whereVar == nullptr) { return 2; } + CDF::Attribute *whereHeightAttr = whereVar->getAttributeNE("height"); + if (whereHeightAttr != nullptr) { + CDBDebug("Is an ODIM volume file, skipping parsing as projected dataset"); + return 2; + } std::map quantityToUnits = {{"TH", "dBZ"}, {"TV", "dBZ"}, {"DBZH", "dBZ"}, {"DBZV", "dBZ"}, {"ZDR", "dB"}, {"UZDR", "dB"}, {"RHOHV", "-"}, {"URHOHV", "-"}, {"ACRR", "mm"}}; const size_t MAX_ODIM_DATASETS = 100; diff --git a/adagucserverEC/CConvertKNMIH5VolScan.cpp b/adagucserverEC/CConvertKNMIH5VolScan.cpp index 2bba03205..8d7638a70 100644 --- a/adagucserverEC/CConvertKNMIH5VolScan.cpp +++ b/adagucserverEC/CConvertKNMIH5VolScan.cpp @@ -44,15 +44,90 @@ int CConvertKNMIH5VolScan::checkIfIsKNMIH5VolScan(CDFObject *cdfObject, CServerP return 0; } +bool sortFunction(CT::string one, CT::string other) { + if (one.endsWith("l")) { + one = one.substring(0, one.lastIndexOf("l")); + if (one.equals(other)) return true; + } + if (other.endsWith("l")) { + other = other.substring(0, other.lastIndexOf("l")); + if (one.equals(other)) return false; + } + return (std::atof(one) < std::atof(other)); +} + int CConvertKNMIH5VolScan::convertKNMIH5VolScanHeader(CDFObject *cdfObject, CServerParams *srvParams) { if (checkIfIsKNMIH5VolScan(cdfObject, srvParams) != 0) return 1; CDBDebug("convertKNMIH5VolScanHeader()"); - int scans[] = {15, 16, 6, 14, 5, 13, 4, 12, 3}; - int nrscans = sizeof(scans) / sizeof(int); - CT::string elevation_names[] = {"0.3", "0.3l", "0.8", "1.2", "2", "2.8", "4", "6", "8"}; - CT::string scan_params[] = {"KDP", "PhiDP", "RhoHV", "V", "W", "Z", "Zv", "ZDR"}; - CT::string units[] = {"deg/km", "deg", "-", "-", "-", "dbZ", "dbZ", "dbZ"}; + /* Read all scans from file and give them a name based on their elevation */ + int nrscans = 0; + std::vector scan_ranges; + std::vector scans; + std::vector elevation_names; + /* Assume no scan with number higher than 99 */ + for (int scan = 1; scan < 100; scan++) { + CT::string scanVarName; + scanVarName.print("scan%1d", scan); + CDF::Variable *scanVar = cdfObject->getVariableNE(scanVarName.c_str()); + if (scanVar == NULL) continue; + float scanElevation; + scanVar->getAttribute("scan_elevation")->getData(&scanElevation, 1); + int scan_nrang; + scanVar->getAttribute("scan_number_range")->getData(&scan_nrang, 1); + float scan_rscale; + scanVar->getAttribute("scan_range_bin")->getData(&scan_rscale, 1); + int scan_range = lround(scan_nrang * scan_rscale); + int scanElevationInt = lround(scanElevation * 10.0); + /* Skip 90 degree scan */ + if (scanElevationInt == 900) continue; + CT::string elevation_name; + elevation_name.print("%d.%d", scanElevationInt / 10, scanElevationInt % 10); + /* Dutch radars contain 3 0.3 degree scans. 1st is long range, second is short range, third is long range again. */ + /* Keep the first 2 and skip the last. */ + bool longRangePresent = false; + int scanElevationIndex = -1; + for (int i = 0; i < nrscans; i++) { + if (elevation_names[i].equals(elevation_name)) { + scanElevationIndex = i; + } + if (elevation_names[i].equals(elevation_name + "l")) { + longRangePresent = true; + } + } + if (scanElevationIndex >= 0) { + if (!longRangePresent || scan_ranges[scanElevationIndex] == scan_range) { + if (scan_ranges[scanElevationIndex] < scan_range) { + elevation_name += "l"; + } else { + elevation_names[scanElevationIndex] = elevation_name + "l"; + } + } else { + continue; + } + } + scan_ranges.push_back(scan_range); + scans.push_back(scan); + elevation_names.push_back(elevation_name); + nrscans++; + } + /* Sort by elevation_name */ + std::vector elevation_names_original(elevation_names); + std::sort(elevation_names.begin(), elevation_names.end(), sortFunction); + std::vector sorted_scans; + for (int i = 0; i < nrscans; i++) { + int sort_index = -1; + for (int j = 0; j < nrscans; j++) { + if (elevation_names[i].equals(elevation_names_original[j])) { + sort_index = j; + } + } + if (sort_index == -1) return 1; + sorted_scans.push_back(scans[sort_index]); + } + + CT::string scan_params[] = {"CCOR", "CCORv", "CPA", "CPAv", "KDP", "PhiDP", "RhoHV", "SQI", "V", "Vv", "W", "Wv", "Z", "Zv", "uPhiDP", "uZ", "uZv", "ZDR", "Height"}; + CT::string units[] = {"dB", "dB", "-", "-", "deg/km", "deg", "-", "-", "m/s", "m/s", "m/s", "m/s", "dBZ", "dBZ", "deg", "dBZ", "dBZ", "dB", "km"}; for (size_t v = 0; v < cdfObject->variables.size(); v++) { CDF::Variable *var = cdfObject->variables[v]; @@ -65,6 +140,19 @@ int CConvertKNMIH5VolScan::convertKNMIH5VolScanHeader(CDFObject *cdfObject, CSer if (var->name.startsWith("visualisation")) { var->setAttributeText("ADAGUC_SKIP", "TRUE"); } + /* Allow hybrid format used in IRC */ + if (var->name.startsWith("dataset")) { + var->setAttributeText("ADAGUC_SKIP", "TRUE"); + } + if (var->name.startsWith("how")) { + var->setAttributeText("ADAGUC_SKIP", "TRUE"); + } + if (var->name.startsWith("what")) { + var->setAttributeText("ADAGUC_SKIP", "TRUE"); + } + if (var->name.startsWith("where")) { + var->setAttributeText("ADAGUC_SKIP", "TRUE"); + } } // double *dfBBOX = new double[4]; @@ -207,18 +295,33 @@ int CConvertKNMIH5VolScan::convertKNMIH5VolScanHeader(CDFObject *cdfObject, CSer for (int i = 0; i < nrscans; i++) { CT::string scanVarName; - scanVarName.print("scan%1d", scans[i]); + scanVarName.print("scan%1d", sorted_scans[i]); CDF::Variable *scanVar = cdfObject->getVariable(scanVarName.c_str()); float scanElevation; scanVar->getAttribute("scan_elevation")->getData(&scanElevation, 1); ((char **)varElevation->data)[i] = strdup(elevation_names[i].c_str()); - ((unsigned int *)varScan->data)[i] = scans[i]; + ((unsigned int *)varScan->data)[i] = sorted_scans[i]; } } // CDFHDF5Reader::CustomVolScanReader *volScanReader = new CDFHDF5Reader::CustomVolScanReader(); // CDF::Variable::CustomMemoryReader *memoryReader = CDF::Variable::CustomMemoryReaderInstance; - int cnt = 0; + int cnt = -1; for (CT::string s : scan_params) { + cnt++; + + CT::string dataVarName; + dataVarName.print("scan%1d.scan_%s_data", sorted_scans[0], s.c_str()); + CDF::Variable *dataVar = cdfObject->getVariableNE(dataVarName.c_str()); + if (dataVar == NULL && !s.equals("Height")) { + if (!s.equals("ZDR")) continue; + CT::string dataZvName; + dataZvName.print("scan%1d.scan_Zv_data", sorted_scans[0]); + CDF::Variable *dataZv = cdfObject->getVariableNE(dataZvName.c_str()); + CT::string dataZName; + dataZName.print("scan%1d.scan_Z_data", sorted_scans[0]); + CDF::Variable *dataZ = cdfObject->getVariableNE(dataZName.c_str()); + if (dataZv == NULL || dataZ == NULL) continue; + } CDF::Variable *var = new CDF::Variable(); var->setType(CDF_FLOAT); var->name.copy(s); @@ -237,8 +340,6 @@ int CConvertKNMIH5VolScan::convertKNMIH5VolScanHeader(CDFObject *cdfObject, CSer var->dimensionlinks.push_back(dimElevation); var->dimensionlinks.push_back(dimY); var->dimensionlinks.push_back(dimX); - - cnt++; } return 0; @@ -272,6 +373,7 @@ int CConvertKNMIH5VolScan::convertKNMIH5VolScanData(CDataSource *dataSource, int new2DVar = dataObjects[0]->cdfVariable; bool doZdr = (new2DVar->name.equals("ZDR")); + bool doHeight = (new2DVar->name.equals("Height")); // Make the width and height of the new 2D adaguc field the same as the viewing window dataSource->dWidth = dataSource->srvParams->Geo->dWidth; @@ -362,6 +464,15 @@ int CConvertKNMIH5VolScan::convertKNMIH5VolScanData(CDataSource *dataSource, int CDF::Variable *scanNumberVar = cdfObject->getVariable("scan_number"); int scan = scanNumberVar->getDataAt(scan_index); + if (doZdr) { + CT::string dataZdrName; + dataZdrName.print("scan%1d.scan_ZDR_data", scan); + CDF::Variable *dataZdr = cdfObject->getVariableNE(dataZdrName.c_str()); + if (dataZdr != NULL) { + doZdr = false; + } + } + size_t fieldSize = dataSource->dWidth * dataSource->dHeight; new2DVar->setSize(fieldSize); @@ -400,39 +511,42 @@ int CConvertKNMIH5VolScan::convertKNMIH5VolScanData(CDataSource *dataSource, int float factor = 1, offset = 0; float zv_factor, zv_offset; + CT::string scanDataVarName; + CDF::Variable *scanDataVar; + CDF::Variable *scanDataVar_Zv; CT::string scanCalibrationVarName; scanCalibrationVarName.print("scan%1d.calibration", scan); CDF::Variable *scanCalibrationVar = cdfObject->getVariable(scanCalibrationVarName); - CT::string componentCalibrationStringName; - if (!doZdr) { - componentCalibrationStringName.print("calibration_%s_formulas", new2DVar->name.c_str()); - CT::string calibrationFormula = scanCalibrationVar->getAttribute(componentCalibrationStringName.c_str())->getDataAsString(); - getCalibrationParameters(calibrationFormula, factor, offset); - } else { - componentCalibrationStringName.print("calibration_%s_formulas", "Z"); - CT::string calibrationFormula = scanCalibrationVar->getAttribute(componentCalibrationStringName.c_str())->getDataAsString(); - getCalibrationParameters(calibrationFormula, factor, offset); - componentCalibrationStringName.print("calibration_%s_formulas", "Zv"); - calibrationFormula = scanCalibrationVar->getAttribute(componentCalibrationStringName.c_str())->getDataAsString(); - getCalibrationParameters(calibrationFormula, zv_factor, zv_offset); - } + if (!doHeight) { + CT::string componentCalibrationStringName; + if (!doZdr) { + componentCalibrationStringName.print("calibration_%s_formulas", new2DVar->name.c_str()); + CT::string calibrationFormula = scanCalibrationVar->getAttribute(componentCalibrationStringName.c_str())->getDataAsString(); + getCalibrationParameters(calibrationFormula, factor, offset); + } else { + componentCalibrationStringName.print("calibration_%s_formulas", "Z"); + CT::string calibrationFormula = scanCalibrationVar->getAttribute(componentCalibrationStringName.c_str())->getDataAsString(); + getCalibrationParameters(calibrationFormula, factor, offset); + + componentCalibrationStringName.print("calibration_%s_formulas", "Zv"); + calibrationFormula = scanCalibrationVar->getAttribute(componentCalibrationStringName.c_str())->getDataAsString(); + getCalibrationParameters(calibrationFormula, zv_factor, zv_offset); + } - CT::string scanDataVarName; - CDF::Variable *scanDataVar; - CDF::Variable *scanDataVar_Zv; - if (doZdr) { - scanDataVarName.print("scan%d.scan_%s_data", scan, "Z"); - scanDataVar = cdfObject->getVariable(scanDataVarName); - scanDataVar->readData(scanDataVar->getType()); - scanDataVarName.print("scan%d.scan_%s_data", scan, "Zv"); - scanDataVar_Zv = cdfObject->getVariable(scanDataVarName); - scanDataVar_Zv->readData(scanDataVar_Zv->getType()); - } else { - scanDataVarName.print("scan%d.scan_%s_data", scan, new2DVar->name.c_str()); - scanDataVar = cdfObject->getVariable(scanDataVarName); - scanDataVar->readData(scanDataVar->getType()); + if (doZdr) { + scanDataVarName.print("scan%d.scan_%s_data", scan, "Z"); + scanDataVar = cdfObject->getVariable(scanDataVarName); + scanDataVar->readData(scanDataVar->getType()); + scanDataVarName.print("scan%d.scan_%s_data", scan, "Zv"); + scanDataVar_Zv = cdfObject->getVariable(scanDataVarName); + scanDataVar_Zv->readData(scanDataVar_Zv->getType()); + } else { + scanDataVarName.print("scan%d.scan_%s_data", scan, new2DVar->name.c_str()); + scanDataVar = cdfObject->getVariable(scanDataVarName); + scanDataVar->readData(scanDataVar->getType()); + } } /*Setting geographical projection parameters of input Cartesian grid.*/ @@ -445,17 +559,38 @@ int CConvertKNMIH5VolScan::convertKNMIH5VolScanData(CDataSource *dataSource, int CImageWarper radarProj; radarProj.initreproj(scanProj4.c_str(), dataSource->srvParams->Geo, &dataSource->srvParams->cfg->Projection); - double x, y; - float rang, azim; + double x, y, ground_range; + float range, azim, ground_height; int ir, ia; + double scan_elevation_rad = scan_elevation * M_PI / 180.0; + double four_thirds_radius = 6371.0 * 4.0 / 3.0; + double radar_height = 0.0; // Radar height is not present in KNMI HDF5 format, but it is in ODIM format so it could be used there. float *p = (float *)new2DVar->data; // ptr to store data - std::vector pScans = {(unsigned short *)scanDataVar->data}; + int missingDataInt; + scanCalibrationVar->getAttribute("calibration_missing_data")->getData(&missingDataInt, 1); + + std::vector pScansChar; + unsigned char missingDataChar = (unsigned char)missingDataInt; + std::vector pScans; + unsigned short missingData = (unsigned short)missingDataInt; std::vector factors = {factor}; std::vector offsets = {offset}; - if (doZdr) { - pScans.push_back((unsigned short *)scanDataVar_Zv->data); - factors.push_back(zv_factor); - offsets.push_back(zv_offset); + + if (!doHeight) { + if (scanDataVar->getType() == CDF_UBYTE) { + pScansChar = {(unsigned char *)scanDataVar->data}; + } else { + pScans = {(unsigned short *)scanDataVar->data}; + } + if (doZdr) { + if (scanDataVar->getType() == CDF_UBYTE) { + pScansChar.push_back((unsigned char *)scanDataVar_Zv->data); + } else { + pScans.push_back((unsigned short *)scanDataVar_Zv->data); + } + factors.push_back(zv_factor); + offsets.push_back(zv_offset); + } } for (int row = 0; row < height; row++) { @@ -463,20 +598,60 @@ int CConvertKNMIH5VolScan::convertKNMIH5VolScanData(CDataSource *dataSource, int x = ((double *)varX->data)[col]; y = ((double *)varY->data)[row]; radarProj.reprojpoint(x, y); - rang = sqrt(x * x + y * y); + ground_range = sqrt(x * x + y * y); + /* Formulas below are only valid when (scan_elevation_rad + ground_range / four_thirds_radius) < (M_PI / 2). */ + /* Longest range for DE/BE/NL radars is ~400 km, which is an equivalent ground range, so we cap the ground range. */ + if (ground_range > 1000.0) { + *p++ = FLT_MAX; + continue; + } + ground_height = ((cos(scan_elevation_rad) * (four_thirds_radius + radar_height)) / cos(scan_elevation_rad + (ground_range / four_thirds_radius))) - four_thirds_radius; + range = ((ground_height + four_thirds_radius) * sin(ground_range / four_thirds_radius)) / cos(scan_elevation_rad); azim = atan2(x, y) * 180.0 / M_PI; - ir = (int)(rang / scan_rscale); + ir = (int)(range / scan_rscale); if (ir < scan_nrang) { + if (doHeight) { + *p++ = ground_height; + continue; + } ia = (int)(azim / scan_ascale); ia = (ia + scan_nazim) % scan_nazim; - std::vector vs; - for (auto pScan : pScans) { - vs.push_back(pScan[ir + ia * scan_nrang]); - } - if (doZdr) { - *p++ = vs[0] * factors[0] + offsets[0] - (vs[1] * factors[1] + offsets[1]); + if (scanDataVar->getType() == CDF_UBYTE) { + std::vector vs; + for (auto pScanChar : pScansChar) { + vs.push_back(pScanChar[ir + ia * scan_nrang]); + } + if (vs[0] == missingDataChar) { + *p++ = FLT_MAX; + continue; + } + if (doZdr) { + if (vs[1] == missingDataChar) { + *p++ = FLT_MAX; + continue; + } + *p++ = vs[0] * factors[0] + offsets[0] - (vs[1] * factors[1] + offsets[1]); + } else { + *p++ = vs[0] * factors[0] + offsets[0]; + } } else { - *p++ = vs[0] * factors[0] + offsets[0]; + std::vector vs; + for (auto pScan : pScans) { + vs.push_back(pScan[ir + ia * scan_nrang]); + } + if (vs[0] == missingData) { + *p++ = FLT_MAX; + continue; + } + if (doZdr) { + if (vs[1] == missingData) { + *p++ = FLT_MAX; + continue; + } + *p++ = vs[0] * factors[0] + offsets[0] - (vs[1] * factors[1] + offsets[1]); + } else { + *p++ = vs[0] * factors[0] + offsets[0]; + } } } else { *p++ = FLT_MAX; diff --git a/tests/AdagucTests/TestWMSVolScan.py b/tests/AdagucTests/TestWMSVolScan.py index 9cbcd887a..36dc5a20b 100644 --- a/tests/AdagucTests/TestWMSVolScan.py +++ b/tests/AdagucTests/TestWMSVolScan.py @@ -49,7 +49,7 @@ def test_WMSGetCapabilities_VolScan(self): def test_WMSGetMap_VolScan(self): AdagucTestTools().cleanTempDir() for layer in ["ZDR", "KDP", "RhoHV"]: - for elev in ["0.3l", "0.3", "8"]: + for elev in ["0.3l", "0.3", "8.0"]: filename = f"test_WMSGetMap_VolScan_{layer}_{elev}.png" wms_arg = f"source=test/volscan/RAD_NL62_VOL_NA_202106181850.h5&SERVICE=WMS&request=getmap&LAYERS={layer}&format=image/png&STYLES=&WMS=1.3.0&CRS=EPSG:4326&BBOX=46,0,58,12&WIDTH=400&HEIGHT=400&SHOWDIMS=true&DIM_scan_elevation={elev}" status, data, headers = AdagucTestTools().runADAGUCServer( diff --git a/tests/expectedoutputs/TestWMSVolScan/test_WMSGetCapabilities_VolScan.xml b/tests/expectedoutputs/TestWMSVolScan/test_WMSGetCapabilities_VolScan.xml index a9becf451..904113b48 100644 --- a/tests/expectedoutputs/TestWMSVolScan/test_WMSGetCapabilities_VolScan.xml +++ b/tests/expectedoutputs/TestWMSVolScan/test_WMSGetCapabilities_VolScan.xml @@ -15,7 +15,7 @@ view infoMapAccessService - ADAGUCServer version 2.27.0, of Sep 6 2024 09:44:02 + ADAGUCServer version 2.29.0, of Dec 19 2024 09:44:43 @@ -120,7 +120,7 @@ 2021-06-18T18:50:00Z -0.3,0.3l,0.8,1.2,2,2.8,4,6,8 +0.3l,0.3,0.8,1.2,2,2.8,4.5,6,8 PhiDP @@ -148,7 +148,7 @@ 2021-06-18T18:50:00Z -0.3,0.3l,0.8,1.2,2,2.8,4,6,8 +0.3l,0.3,0.8,1.2,2,2.8,4.5,6,8 RhoHV @@ -176,7 +176,7 @@ 2021-06-18T18:50:00Z -0.3,0.3l,0.8,1.2,2,2.8,4,6,8 +0.3l,0.3,0.8,1.2,2,2.8,4.5,6,8 V @@ -204,7 +204,7 @@ 2021-06-18T18:50:00Z -0.3,0.3l,0.8,1.2,2,2.8,4,6,8 +0.3l,0.3,0.8,1.2,2,2.8,4.5,6,8 W @@ -232,7 +232,7 @@ 2021-06-18T18:50:00Z -0.3,0.3l,0.8,1.2,2,2.8,4,6,8 +0.3l,0.3,0.8,1.2,2,2.8,4.5,6,8 Z @@ -260,7 +260,7 @@ 2021-06-18T18:50:00Z -0.3,0.3l,0.8,1.2,2,2.8,4,6,8 +0.3l,0.3,0.8,1.2,2,2.8,4.5,6,8 Zv @@ -288,7 +288,7 @@ 2021-06-18T18:50:00Z -0.3,0.3l,0.8,1.2,2,2.8,4,6,8 +0.3l,0.3,0.8,1.2,2,2.8,4.5,6,8 ZDR @@ -316,8 +316,36 @@ 2021-06-18T18:50:00Z -0.3,0.3l,0.8,1.2,2,2.8,4,6,8 +0.3l,0.3,0.8,1.2,2,2.8,4.5,6,8 + +Height +Height (Height) + + 0.000000 + 10.000000 + 48.000000 + 58.000000 + + + + + + + + + + + + + + + + + +2021-06-18T18:50:00Z +0.3l,0.3,0.8,1.2,2,2.8,4.5,6,8 + diff --git a/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_KDP_0.3.png b/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_KDP_0.3.png index 2fdec6e47..9ba04b87d 100644 Binary files a/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_KDP_0.3.png and b/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_KDP_0.3.png differ diff --git a/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_KDP_0.3l.png b/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_KDP_0.3l.png index 406b027cb..c4cfde3ed 100644 Binary files a/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_KDP_0.3l.png and b/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_KDP_0.3l.png differ diff --git a/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_KDP_8.0.png b/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_KDP_8.0.png new file mode 100644 index 000000000..4df9425bb Binary files /dev/null and b/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_KDP_8.0.png differ diff --git a/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_KDP_8.png b/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_KDP_8.png deleted file mode 100644 index 42178661d..000000000 Binary files a/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_KDP_8.png and /dev/null differ diff --git a/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_RhoHV_0.3.png b/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_RhoHV_0.3.png index 182c6fa0d..4bed17f69 100644 Binary files a/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_RhoHV_0.3.png and b/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_RhoHV_0.3.png differ diff --git a/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_RhoHV_0.3l.png b/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_RhoHV_0.3l.png index b54ee6f09..87dedc742 100644 Binary files a/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_RhoHV_0.3l.png and b/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_RhoHV_0.3l.png differ diff --git a/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_RhoHV_8.0.png b/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_RhoHV_8.0.png new file mode 100644 index 000000000..578dfac54 Binary files /dev/null and b/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_RhoHV_8.0.png differ diff --git a/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_RhoHV_8.png b/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_RhoHV_8.png deleted file mode 100644 index 51bc7efc3..000000000 Binary files a/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_RhoHV_8.png and /dev/null differ diff --git a/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_ZDR_0.3.png b/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_ZDR_0.3.png index 40a5bfc5b..cbc1f73c7 100644 Binary files a/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_ZDR_0.3.png and b/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_ZDR_0.3.png differ diff --git a/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_ZDR_0.3l.png b/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_ZDR_0.3l.png index e2ec9aa78..4dca82511 100644 Binary files a/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_ZDR_0.3l.png and b/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_ZDR_0.3l.png differ diff --git a/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_ZDR_8.0.png b/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_ZDR_8.0.png new file mode 100644 index 000000000..cd3ac4cc2 Binary files /dev/null and b/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_ZDR_8.0.png differ diff --git a/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_ZDR_8.png b/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_ZDR_8.png deleted file mode 100644 index 24942f696..000000000 Binary files a/tests/expectedoutputs/TestWMSVolScan/test_WMSGetMap_VolScan_ZDR_8.png and /dev/null differ