Source: osh/ui/styler/osh-UI-StylerNexrad.js

/**
 * @classdesc
 * @class OSH.UI.Styler.Nexrad
 * @type {OSH.UI.Styler}
 * @augments OSH.UI.Styler
 */
OSH.UI.Styler.Nexrad = Class.create(OSH.UI.Styler, {
	initialize : function($super, properties) {
		$super(properties);
		this.properties = properties;
		this.location = null;
		this.radialData = null;
		
		this.options = {};
		
		if (typeof(properties.location) != "undefined"){
			this.location = properties.location;
		}  
		
		if (typeof(properties.radialData) != "undefined"){
			this.radialData = properties.radialData;
		} 
		
		if (typeof(properties.locationFunc) != "undefined") {
			var fn = function(rec,timeStamp,options) {
				this.location = properties.locationFunc.handler(rec,timeStamp,options);
			}.bind(this);
			this.addFn(properties.locationFunc.dataSourceIds,fn);
		}
		
		if (typeof(properties.radialDataFunc) != "undefined") {
			var fn = function(rec,timeStamp,options) {
				this.radialData = properties.radialDataFunc.handler(rec,timeStamp,options);
			}.bind(this);
			this.addFn(properties.radialDataFunc.dataSourceIds,fn);
		}
		
		this.reflectivityColorMap = [
			Cesium.Color.fromBytes(100, 100, 100),
			Cesium.Color.fromBytes(204, 255, 255),
			Cesium.Color.fromBytes(204, 153, 204),
			Cesium.Color.fromBytes(153, 102, 153),
			Cesium.Color.fromBytes(102,  51, 102),
			Cesium.Color.fromBytes(204, 204, 153),
			Cesium.Color.fromBytes(153, 153, 102),
			Cesium.Color.fromBytes(100, 100, 100),
			Cesium.Color.fromBytes(  4, 233, 231),
			Cesium.Color.fromBytes(  1, 159, 244),
			Cesium.Color.fromBytes(  3,   0, 244),
			Cesium.Color.fromBytes(  2, 253,   2),
			Cesium.Color.fromBytes(  1, 197,   1),
			Cesium.Color.fromBytes(  0, 142,   0),
			Cesium.Color.fromBytes(253, 248,   2),
			Cesium.Color.fromBytes(229, 188,   0),
			Cesium.Color.fromBytes(253, 149,   0),
			Cesium.Color.fromBytes(253,   0,   0),
			Cesium.Color.fromBytes(212,   0,   0),
			Cesium.Color.fromBytes(188,   0,   0),
			Cesium.Color.fromBytes(248,   0, 253),
			Cesium.Color.fromBytes(152,  84, 198),
			Cesium.Color.fromBytes(253, 253, 253)
		];
		
		this.pointCollection = new Cesium.PointPrimitiveCollection();
		this.radialCount = 0;
	},

	/**
	 *
	 * @param $super
	 * @param view
	 * @instance
	 * @memberof OSH.UI.Styler.Nexrad
	 */
	init: function($super,view) {
		$super(view);
	},

	/**
	 *
	 * @param $super
	 * @param dataSourceId
	 * @param rec
	 * @param view
	 * @param options
	 * @instance
	 * @memberof OSH.UI.Styler.Nexrad
	 */
	setData: function($super,dataSourceId,rec,view,options) {
		if ($super(dataSourceId,rec,view,options)) {
			if (typeof(view) != "undefined") {
				
				var DTR = Math.PI/180;
				
				// keep only first elevation
				if (rec.data.elevation > 0.7)
					return;
				
				// draw directly in Cesium view
				var radarLoc = Cesium.Cartesian3.fromDegrees(this.location.x, this.location.y, this.location.z);
				var quat = Cesium.Transforms.headingPitchRollQuaternion(radarLoc, (rec.data.azimuth-90)*DTR, rec.data.elevation*DTR, 0.0);
				var rotM = Cesium.Matrix3.fromQuaternion(quat);
				
				var points = new Cesium.PointPrimitiveCollection();
				var dist0 = rec.data.rangeToCenterOfFirstRefGate;
				var step = rec.data.refGateSize;
				for (var i=0; i<rec.data.reflectivity.length; i++) {
					
				   var val = rec.data.reflectivity[i];
				   
				   // skip points that are out of range
				   if (val < -32 || val > 94.5)
					  continue;
				   
				   var gatePos = new Cesium.Cartesian3(dist0 + i*step, 0, 0);
				   Cesium.Matrix3.multiplyByVector(rotM, gatePos, gatePos);
				   
				   // apply color map and add point to collection
				   this.pointCollection.add({
					  position : Cesium.Cartesian3.add(radarLoc, gatePos, gatePos),
					  color : this.getReflectivityColor(val),
					  pixelSize : 3
				   });
				}
				
				this.radialCount++;
				if (this.radialCount == 100)
			    {
					view.viewer.scene.primitives.add(this.pointCollection);
					this.pointCollection = new Cesium.PointPrimitiveCollection();
					this.radialCount = 0;
			    }
			}
		}
	},

	/**
	 *
	 * @param val
	 * @returns {*}
	 * @instance
	 * @memberof OSH.UI.Styler.Nexrad
	 */
	getReflectivityColor: function(val)
	{
		var index = Math.floor((val + 30) / 5) + 1;
	    return this.reflectivityColorMap[index];
	}

});