Exemplo n.º 1
0
        /// <summary>
        /// Convers a byte string to a float array
        /// </summary>
        /// <param name="bytes"></param>
        /// <param name="isLittleEndian">true if the bytes are little endian</param>
        /// <returns></returns>
        public static float[] byteStringToFloatArray(byte[] bytes, bool isLittleEndian)
        {
            float[] ret = new float[bytes.Length / 4];

            int counter = 0;

            for (int i = 0; i < bytes.Length; i += 4)
            {
                byte[] f = { bytes[i], bytes[i + 1], bytes[i + 2], bytes[i + 3] };
                ret[counter++] = NetCDFTools.byteToFloat(f, isLittleEndian);
            }

            return(ret);
        }
Exemplo n.º 2
0
        // convert any numeric byte type to a float
        public static float byteToFloat(byte[] bytes, NC_TYPE type)
        {
            switch (type)
            {
            case NC_TYPE.NC_SHORT:
                return(Convert.ToSingle(NetCDFTools.byteToShort(bytes)));

            case NC_TYPE.NC_INT:
                return(Convert.ToSingle(NetCDFTools.byteToInt(bytes)));

            case NC_TYPE.NC_DOUBLE:
                return(Convert.ToSingle(NetCDFTools.byteToDouble(bytes)));
            }

            return(NetCDFTools.byteToFloat(bytes));
        }
Exemplo n.º 3
0
        public Variable(string name, int[] dimid, LinkedList <Attribute> vatt_list, NC_TYPE type, uint vsize, uint begin)
        {
            this.name      = name;
            this.dimid     = dimid;
            this.vatt_list = vatt_list;
            this.type      = type;
            this.vsize     = vsize;
            this.begin     = begin;

            this.length = this.vsize / NetCDFTools.getTypeLength(this.type);

            foreach (Attribute att in vatt_list)
            {
                if (att.name.Equals("units"))
                {
                    this.units = NetCDFTools.byteToString(att.values);
                }
                else if (att.name.Equals("missing_value"))
                {
                    this.missing_value = NetCDFTools.byteToFloat(att.values[0], att.type);
                }
                else if (att.name.Equals("valid_min"))
                {
                    this.valid_min = NetCDFTools.byteToFloat(att.values[0], att.type);
                }
                else if (att.name.Equals("valid_max"))
                {
                    this.valid_max = NetCDFTools.byteToFloat(att.values[0], att.type);
                }
                else if (att.name.Equals("valid_max"))
                {
                    this.valid_max = NetCDFTools.byteToFloat(att.values[0], att.type);
                }
                else if (att.name.Equals("scale_factor"))
                {
                    this.scale_factor = NetCDFTools.byteToFloat(att.values[0], att.type);
                }
                else if (att.name.Equals("add_offset"))
                {
                    this.add_offset = NetCDFTools.byteToFloat(att.values[0], att.type);
                }
            }
        }
        /// <summary>
        /// Constructor for interpreting from an NC file
        /// </summary>
        /// <param name="head">the raw NC data</param>
        public GeoSpatialData(Header head)
        {
            Variable latVar  = null;
            Variable lngVar  = null;
            Variable timeVar = null;
            Variable dataVar = null;

            Dimension[] dataDimensions = null;

            int       latDimID  = 0;
            Dimension latDim    = null;
            int       lngDimID  = 0;
            Dimension lngDim    = null;
            int       timeDimID = 0;
            Dimension timeDim   = null;

            dataDimensions = new Dimension[3];

            foreach (Variable v in head.var_list)
            {
                if (v.name.Equals("latitude") || v.name.Equals("lat"))
                {
                    latVar   = v;
                    latDimID = v.dimid[0];
                    latDim   = head.dim_list.ElementAt(latDimID);
                    dataDimensions[latDimID] = latDim;
                }
                else if (v.name.Equals("longitude") || v.name.Equals("lng") || v.name.Equals("long"))
                {
                    lngVar   = v;
                    lngDimID = v.dimid[0];
                    lngDim   = head.dim_list.ElementAt(lngDimID);
                    dataDimensions[lngDimID] = lngDim;
                }
                else if (v.name.Equals("time"))
                {
                    timeVar   = v;
                    timeDimID = v.dimid[0];
                    timeDim   = head.dim_list.ElementAt(timeDimID);
                    dataDimensions[timeDimID] = timeDim;
                }
                else
                {
                    dataVar = v;
                }
            }

            // pull out the relevant attributes from the dataVar
            foreach (Attribute a in dataVar.vatt_list)
            {
                if (a.name == "long_name")
                {
                    this.data_name = NetCDFTools.byteToString(a.values);
                }
                else if (a.name == "units")
                {
                    this.units = NetCDFTools.byteToString(a.values);
                }
            }
            this.data_type          = dataVar.name;
            this.data_missing_value = dataVar.missing_value;
            this.data_max           = dataVar.valid_max;
            this.data_min           = dataVar.valid_min;

            // convert each set of data into its real format
            this.data = new float[timeVar.length, latVar.length, lngVar.length];
            for (int i = 0; i < dataDimensions[0].length; i++)
            {
                for (int j = 0; j < dataDimensions[1].length; j++)
                {
                    for (int k = 0; k < dataDimensions[2].length; k++)
                    {
                        int index = i * dataDimensions[1].length * dataDimensions[2].length +
                                    j * dataDimensions[2].length +
                                    k;

                        data[i, j, k] = NetCDFTools.byteToFloat(dataVar.data[index], dataVar.type);
                    }
                }
            }

            this.lat = new decimal[latVar.length];
            for (int i = 0; i < this.lat.Length; i++)
            {
                this.lat[i] = (decimal)NetCDFTools.byteToFloat(latVar.data[i], latVar.type);
            }

            this.lng = new decimal[lngVar.length];
            for (int i = 0; i < this.lng.Length; i++)
            {
                this.lng[i] = (decimal)NetCDFTools.byteToFloat(lngVar.data[i], lngVar.type);
            }

            DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);

            this.time     = new int[timeVar.length];
            this.dateTime = new DateTime[timeVar.length];
            for (int i = 0; i < this.time.Length; i++)
            {
                this.time[i]     = NetCDFTools.byteToInt(timeVar.data[i]);
                this.dateTime[i] = epoch.AddSeconds(this.time[i]);
            }
        }