All NEXRAD Products and their properties should be listed on this page that we have available through the parsers or are planning to add support for.
| Code | Name |
|---|---|
| 100 | Refl |
| Code | Name | Type | Go Impl |
|---|---|---|---|
| 30 | Classic Spectrum Width | Radial with levels | GenericDataLevelRadialPacket |
| 38 | Composite Reflectivity | Raster Image | RasterImageProduct |
| 41 | Echo Tops | Raster Image | RasterImageProduct |
| 48 | VAD Wind Profile | Image | VADProduct |
| 56 | Storm Relative Velocity | Radial with levels | GenericDataLevelRadialProduct |
| 57 | Vertical Integrated Liquid | Raster Image | RasterImageProduct |
| 58 | Storm Tracks | GeoJSON | StormTracksProduct |
| 78 | One-Hour Rainfall Accumulation | Radial with levels | GenericDataLevelRadialProduct |
| 79 | Three-Hour Rainfall Accumulation | Radial with levels | GenericDataLevelRadialProduct |
| 80 | Daily Accumulation | Radial with levels | GenericDataLevelRadialProduct |
| 94 | Digital Base Reflectivity | Radial | P94Product |
| 99 | Velocity | Radial | P94Product |
| 134 | High Resolution Vertical Integrated Liquid | Radial | P134Product |
| 135 | Enhanced Echo Tops | Radial | P135Product |
| 153 | Reflectivity | Radial | P94Product |
| 154 | Velocity | Radial | P94Product |
| 159 | Digital Differential Reflectivity | Radial | P159Product |
| 161 | Digital Correlation Coefficient | Radial | P159Product |
| 163 | Digital Specific Differential Phase | Radial | P159Product |
| 165 | Digital Hydrometer Classification | Radial | HydrometerClassificationProduct |
| 169 | Digital One-Hour Accumulation | Radial | P170Product |
| 170 | Digital Accumulation Array | Radial | P170Product |
| 172 | Storm Total Accumulation | Radial | P170Product |
| 173 | Digital Three-Hour Accumulation | Radial | P170Product |
| 174 | Digital One-Hour Difference Accumulation | Radial | P170Product |
| 175 | Digital Storm Total Difference Accumulation | Radial | P170Product |
| 177 | Hybrid Hydrometer Classification | Radial | HydrometerClassificationProduct |
Radial products have their raw gate data put into the protobuf object. Clients need to scale this to the proper values. We can put the algorithms to do that here with code samples in any languages.
This is a low res product with a max of 16 data values. The ThresholdData contains the scaled value array. Each gates raw value should be the index of the scaled value from the array built with ThresholdData.
ThresholdData should be a 32 byte length array of raw byte values.
Reading the threshold data into a map:
scale := float32(1.0)
if threshData.ThresholdData[0]&(1<<5) == 1 {
scale = 1.0 / 20.0
} else if threshData.ThresholdData[0]&(1<<4) == 1 {
scale = 1.0 / 10.0
}
var thresholdDataLevels [16]float32
upperDataLevel := float32(-999.0)
lowerDataLevel := float32(999.0)
for i := 0; i < 16; i++ {
flag := threshData.ThresholdData[i*2]
value := threshData.ThresholdData[i*2+1]
sign := -1
if flag&0x01 == 0 {
sign = 1
}
bad := flag&0x80 == 0x80
if bad {
thresholdDataLevels[i] = -999.0
continue
}
thresholdDataLevels[i] = float32(value) * scale * float32(sign)
if thresholdDataLevels[i] > upperDataLevel {
upperDataLevel = thresholdDataLevels[i]
}
if thresholdDataLevels[i] < lowerDataLevel {
lowerDataLevel = thresholdDataLevels[i]
}
}
Use raw values as index to that array:
func (p *GenericDataLevelRadialProduct) ParseBin(val byte) interface{} {
// This is thresholdDataLevels from the last step
return p.description.ThresholdDataLevels[val]
}
This product is the NEXRAD 3 reflectivity and velocity outputs.
If the raw value is less than two (val < 2), it is either no data or bad data and can be ignored or mapped out of the colormap range. For velocity, a 1 value is range folded and could be mapped as such.
if val < 2 {
return p.description.MinDataValue - (p.description.DataIncrement * (float32(val) + 1))
} else {
return p.description.MinDataValue + (float32(val)-2)*p.description.DataIncrement
}
MinDataValue and DataIncrement are in the protobuf's ExtraData
This product is high-res vertical integrated liquid.
If the value is less thn two (val < 2), it is either no data or bad data and can be ignored.
We need to add scaling inputs to the protobuf for this product before we can client side scale it.
This product is enhanced echo tops.
If a value is topped then it should be a grey scale colormap.
The following is pulled from legacy libmeso code where the gate values were floats and we needed to cast it back to an int. That step shouldn't be required anymore. The rest should remain.
ToppedMask, DataMask, DataScale and DataOffset fields from ExtraData are used as inputs.
float v = req.gates[i * req.gate_count + j];
std::string mask = "";
if (req.product_code == 135) {
int nv = (int)v;
v = (float)(((nv & req.data_mask) / req.data_scale) - req.data_offset);
bool t = (nv & req.topped_mask) != 0;
mask = t ? "TOPPED" : "";
}