Exemple #1
0
        public override string ToString()
        {
            string ret = "Attribute:[\"" + name + "\"|" + type.ToString() + "|";

            // if it's
            if (type == NC_TYPE.NC_CHAR)
            {
                ret += "\"" + NetCDFTools.byteToString(values) + "\"";
            }
            else
            {
                ret += values.Length;
            }

            ret += "]";
            return(ret);
        }
        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]);
            }
        }