@loaders.gl/netcdf 3.4.0-alpha.1 → 3.4.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/iobuffer/iobuffer.js +43 -130
- package/dist/es5/iobuffer/iobuffer.js.map +1 -1
- package/dist/es5/netcdf-loader.js +9 -15
- package/dist/es5/netcdf-loader.js.map +1 -1
- package/dist/es5/netcdfjs/netcdf-reader.js +11 -36
- package/dist/es5/netcdfjs/netcdf-reader.js.map +1 -1
- package/dist/es5/netcdfjs/read-data.js +0 -6
- package/dist/es5/netcdfjs/read-data.js.map +1 -1
- package/dist/es5/netcdfjs/read-header.js +0 -23
- package/dist/es5/netcdfjs/read-header.js.map +1 -1
- package/dist/es5/netcdfjs/read-type.js +0 -6
- package/dist/es5/netcdfjs/read-type.js.map +1 -1
- package/dist/esm/iobuffer/iobuffer.js +0 -44
- package/dist/esm/iobuffer/iobuffer.js.map +1 -1
- package/dist/esm/netcdf-loader.js +2 -7
- package/dist/esm/netcdf-loader.js.map +1 -1
- package/dist/esm/netcdfjs/netcdf-reader.js +0 -16
- package/dist/esm/netcdfjs/netcdf-reader.js.map +1 -1
- package/dist/esm/netcdfjs/read-data.js +0 -6
- package/dist/esm/netcdfjs/read-data.js.map +1 -1
- package/dist/esm/netcdfjs/read-header.js +0 -24
- package/dist/esm/netcdfjs/read-header.js.map +1 -1
- package/dist/esm/netcdfjs/read-type.js +0 -6
- package/dist/esm/netcdfjs/read-type.js.map +1 -1
- package/package.json +3 -3
|
@@ -13,7 +13,7 @@ var _readHeader = require("./read-header");
|
|
|
13
13
|
var _readData = require("./read-data");
|
|
14
14
|
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
15
15
|
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
16
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++)
|
|
16
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
17
17
|
var NetCDFReader = function () {
|
|
18
18
|
function NetCDFReader(data) {
|
|
19
19
|
(0, _classCallCheck2.default)(this, NetCDFReader);
|
|
@@ -21,103 +21,80 @@ var NetCDFReader = function () {
|
|
|
21
21
|
(0, _defineProperty2.default)(this, "buffer", void 0);
|
|
22
22
|
var buffer = new _iobuffer.IOBuffer(data);
|
|
23
23
|
buffer.setBigEndian();
|
|
24
|
-
|
|
25
24
|
var magic = buffer.readChars(3);
|
|
26
25
|
if (magic !== 'CDF') {
|
|
27
26
|
throw new Error("NetCDF: file should start with 'CDF', found ".concat(magic));
|
|
28
27
|
}
|
|
29
|
-
|
|
30
28
|
var version = buffer.readByte();
|
|
31
29
|
if (version > 2) {
|
|
32
30
|
throw new Error("NetCDF: unsupported version ".concat(version));
|
|
33
31
|
}
|
|
34
|
-
|
|
35
32
|
this.header = (0, _readHeader.readNetCDFHeader)(buffer, version);
|
|
36
33
|
this.buffer = buffer;
|
|
37
34
|
}
|
|
38
|
-
|
|
39
35
|
(0, _createClass2.default)(NetCDFReader, [{
|
|
40
36
|
key: "version",
|
|
41
|
-
get:
|
|
42
|
-
function get() {
|
|
37
|
+
get: function get() {
|
|
43
38
|
if (this.header.version === 1) {
|
|
44
39
|
return 'classic format';
|
|
45
40
|
}
|
|
46
41
|
return '64-bit offset format';
|
|
47
42
|
}
|
|
48
|
-
|
|
49
43
|
}, {
|
|
50
44
|
key: "recordDimension",
|
|
51
|
-
get:
|
|
52
|
-
function get() {
|
|
45
|
+
get: function get() {
|
|
53
46
|
return this.header.recordDimension;
|
|
54
47
|
}
|
|
55
|
-
|
|
56
48
|
}, {
|
|
57
49
|
key: "dimensions",
|
|
58
|
-
get:
|
|
59
|
-
function get() {
|
|
50
|
+
get: function get() {
|
|
60
51
|
return this.header.dimensions;
|
|
61
52
|
}
|
|
62
|
-
|
|
63
53
|
}, {
|
|
64
54
|
key: "attributes",
|
|
65
|
-
get:
|
|
66
|
-
function get() {
|
|
55
|
+
get: function get() {
|
|
67
56
|
return this.header.attributes;
|
|
68
57
|
}
|
|
69
|
-
|
|
70
58
|
}, {
|
|
71
59
|
key: "variables",
|
|
72
|
-
get:
|
|
73
|
-
function get() {
|
|
60
|
+
get: function get() {
|
|
74
61
|
return this.header.variables;
|
|
75
62
|
}
|
|
76
|
-
|
|
77
63
|
}, {
|
|
78
64
|
key: "attributeExists",
|
|
79
|
-
value:
|
|
80
|
-
function attributeExists(attributeName) {
|
|
65
|
+
value: function attributeExists(attributeName) {
|
|
81
66
|
var attribute = this.attributes.find(function (val) {
|
|
82
67
|
return val.name === attributeName;
|
|
83
68
|
});
|
|
84
69
|
return attribute !== undefined;
|
|
85
70
|
}
|
|
86
|
-
|
|
87
71
|
}, {
|
|
88
72
|
key: "getAttribute",
|
|
89
|
-
value:
|
|
90
|
-
function getAttribute(attributeName) {
|
|
73
|
+
value: function getAttribute(attributeName) {
|
|
91
74
|
var attribute = this.attributes.find(function (val) {
|
|
92
75
|
return val.name === attributeName;
|
|
93
76
|
});
|
|
94
77
|
if (attribute) return attribute.value;
|
|
95
78
|
return null;
|
|
96
79
|
}
|
|
97
|
-
|
|
98
80
|
}, {
|
|
99
81
|
key: "dataVariableExists",
|
|
100
|
-
value:
|
|
101
|
-
function dataVariableExists(variableName) {
|
|
82
|
+
value: function dataVariableExists(variableName) {
|
|
102
83
|
var variable = this.header.variables.find(function (val) {
|
|
103
84
|
return val.name === variableName;
|
|
104
85
|
});
|
|
105
86
|
return variable !== undefined;
|
|
106
87
|
}
|
|
107
|
-
|
|
108
88
|
}, {
|
|
109
89
|
key: "getDataVariableAsString",
|
|
110
|
-
value:
|
|
111
|
-
function getDataVariableAsString(variableName) {
|
|
90
|
+
value: function getDataVariableAsString(variableName) {
|
|
112
91
|
var variable = this.getDataVariable(variableName);
|
|
113
92
|
if (variable) return variable.join('');
|
|
114
93
|
return null;
|
|
115
94
|
}
|
|
116
|
-
|
|
117
95
|
}, {
|
|
118
96
|
key: "getDataVariable",
|
|
119
|
-
value:
|
|
120
|
-
function getDataVariable(variableName) {
|
|
97
|
+
value: function getDataVariable(variableName) {
|
|
121
98
|
var variable;
|
|
122
99
|
if (typeof variableName === 'string') {
|
|
123
100
|
variable = this.header.variables.find(function (val) {
|
|
@@ -126,11 +103,9 @@ var NetCDFReader = function () {
|
|
|
126
103
|
} else {
|
|
127
104
|
variable = variableName;
|
|
128
105
|
}
|
|
129
|
-
|
|
130
106
|
if (variable === undefined) {
|
|
131
107
|
throw new Error("NetCDF: variable not found: ".concat(variableName));
|
|
132
108
|
}
|
|
133
|
-
|
|
134
109
|
this.buffer.seek(variable.offset);
|
|
135
110
|
if (variable.record) {
|
|
136
111
|
return (0, _readData.readRecord)(this.buffer, variable, this.header.recordDimension);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"netcdf-reader.js","names":["NetCDFReader","data","buffer","IOBuffer","setBigEndian","magic","readChars","Error","version","readByte","header","readNetCDFHeader","recordDimension","dimensions","attributes","variables","attributeName","attribute","find","val","name","undefined","value","variableName","variable","getDataVariable","join","seek","offset","record","readRecord","readNonRecord","result","push","dimension","padEnd","size","JSON","parse","stringify","length","substring","isNaN"],"sources":["../../../src/netcdfjs/netcdf-reader.ts"],"sourcesContent":["import {IOBuffer} from '../iobuffer/iobuffer';\nimport type {\n NetCDFHeader,\n NetCDFDimension,\n NetCDFRecordDimension,\n NetCDFAttribute,\n NetCDFVariable\n} from './netcdf-types';\nimport {readNetCDFHeader} from './read-header';\nimport {readRecord, readNonRecord} from './read-data';\n\n/**\n * Reads a NetCDF v3.x file\n * https://www.unidata.ucar.edu/software/netcdf/docs/file_format_specifications.html\n * @param {ArrayBuffer} data - ArrayBuffer or any Typed Array (including Node.js' Buffer from v4) with the data\n * @constructor\n */\nexport class NetCDFReader {\n public header: NetCDFHeader;\n public buffer: IOBuffer;\n\n constructor(data) {\n const buffer = new IOBuffer(data);\n buffer.setBigEndian();\n\n // Validate that it's a NetCDF file\n const magic = buffer.readChars(3);\n if (magic !== 'CDF') {\n throw new Error(`NetCDF: file should start with 'CDF', found ${magic}`);\n }\n\n // Check the NetCDF format\n const version = buffer.readByte();\n if (version > 2) {\n throw new Error(`NetCDF: unsupported version ${version}`);\n }\n\n // Read the header\n this.header = readNetCDFHeader(buffer, version);\n this.buffer = buffer;\n }\n\n /**\n * @return {string} - Version for the NetCDF format\n */\n get version() {\n if (this.header.version === 1) {\n return 'classic format';\n }\n return '64-bit offset format';\n }\n\n /**\n * Get metadata for the record dimension\n */\n get recordDimension(): NetCDFRecordDimension {\n return this.header.recordDimension;\n }\n\n /**\n * Get list of dimensions (each with `name` and `size`)\n */\n get dimensions(): NetCDFDimension[] {\n return this.header.dimensions;\n }\n\n /**\n * Get list of global attributes with:\n * * `name`: String with the name of the attribute\n * * `type`: String with the type of the attribute\n * * `value`: A number or string with the value of the attribute\n */\n get attributes(): NetCDFAttribute[] {\n return this.header.attributes;\n }\n\n /**\n * Get list of variables\n */\n get variables(): NetCDFVariable[] {\n return this.header.variables;\n }\n\n /**\n * Check if an attribute exists\n * @param attributeName - Name of the attribute to find\n * @return\n */\n attributeExists(attributeName: string): boolean {\n const attribute = this.attributes.find((val) => val.name === attributeName);\n return attribute !== undefined;\n }\n\n /**\n * Returns the value of an attribute\n * @param attributeName\n * @return Value of the attributeName or null\n */\n getAttribute(attributeName: string): string | null {\n const attribute = this.attributes.find((val) => val.name === attributeName);\n if (attribute) return attribute.value;\n return null;\n }\n\n /**\n * Check if a dataVariable exists\n * @param variableName - Name of the variable to find\n * @return\n */\n dataVariableExists(variableName: string): boolean {\n const variable = this.header.variables.find(function (val) {\n return val.name === variableName;\n });\n return variable !== undefined;\n }\n\n /**\n * Returns the value of a variable as a string\n * @param variableName\n * @return Value of the variable as a string or null\n */\n getDataVariableAsString(variableName: string): string | null {\n const variable = this.getDataVariable(variableName);\n if (variable) return variable.join('');\n return null;\n }\n\n /**\n * Retrieves the data for a given variable\n * @param variableName - Name of the variable to search or variable object\n * @return List with the variable values\n */\n getDataVariable(variableName: string | object): any[] {\n let variable;\n if (typeof variableName === 'string') {\n // search the variable\n variable = this.header.variables.find(function (val) {\n return val.name === variableName;\n });\n } else {\n variable = variableName;\n }\n\n // throws if variable not found\n if (variable === undefined) {\n throw new Error(`NetCDF: variable not found: ${variableName}`);\n }\n\n // go to the offset position\n this.buffer.seek(variable.offset);\n\n if (variable.record) {\n // record variable case\n return readRecord(this.buffer, variable, this.header.recordDimension);\n }\n // non-record variable case\n return readNonRecord(this.buffer, variable);\n }\n\n toString(): string {\n const result: string[] = [];\n\n result.push('DIMENSIONS');\n for (const dimension of this.dimensions) {\n result.push(` ${dimension.name.padEnd(30)} = size: ${dimension.size}`);\n }\n\n result.push('');\n result.push('GLOBAL ATTRIBUTES');\n for (const attribute of this.attributes) {\n result.push(` ${attribute.name.padEnd(30)} = ${attribute.value}`);\n }\n\n const variables = JSON.parse(JSON.stringify(this.variables));\n result.push('');\n result.push('VARIABLES:');\n for (const variable of variables) {\n variable.value = this.getDataVariable(variable);\n let stringify = JSON.stringify(variable.value);\n if (stringify.length > 50) stringify = stringify.substring(0, 50);\n if (!isNaN(variable.value.length)) {\n stringify += ` (length: ${variable.value.length})`;\n }\n result.push(` ${variable.name.padEnd(30)} = ${stringify}`);\n }\n return result.join('\\n');\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"netcdf-reader.js","names":["_iobuffer","require","_readHeader","_readData","_createForOfIteratorHelper","o","allowArrayLike","it","Symbol","iterator","Array","isArray","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","return","minLen","_arrayLikeToArray","Object","prototype","toString","slice","constructor","name","from","test","arr","len","arr2","NetCDFReader","data","_classCallCheck2","default","_defineProperty2","buffer","IOBuffer","setBigEndian","magic","readChars","Error","concat","version","readByte","header","readNetCDFHeader","_createClass2","key","get","recordDimension","dimensions","attributes","variables","attributeExists","attributeName","attribute","find","val","undefined","getAttribute","dataVariableExists","variableName","variable","getDataVariableAsString","getDataVariable","join","seek","offset","record","readRecord","readNonRecord","result","push","_iterator","_step","dimension","padEnd","size","_iterator2","_step2","JSON","parse","stringify","_iterator3","_step3","substring","isNaN","exports"],"sources":["../../../src/netcdfjs/netcdf-reader.ts"],"sourcesContent":["import {IOBuffer} from '../iobuffer/iobuffer';\nimport type {\n NetCDFHeader,\n NetCDFDimension,\n NetCDFRecordDimension,\n NetCDFAttribute,\n NetCDFVariable\n} from './netcdf-types';\nimport {readNetCDFHeader} from './read-header';\nimport {readRecord, readNonRecord} from './read-data';\n\n/**\n * Reads a NetCDF v3.x file\n * https://www.unidata.ucar.edu/software/netcdf/docs/file_format_specifications.html\n * @param {ArrayBuffer} data - ArrayBuffer or any Typed Array (including Node.js' Buffer from v4) with the data\n * @constructor\n */\nexport class NetCDFReader {\n public header: NetCDFHeader;\n public buffer: IOBuffer;\n\n constructor(data) {\n const buffer = new IOBuffer(data);\n buffer.setBigEndian();\n\n // Validate that it's a NetCDF file\n const magic = buffer.readChars(3);\n if (magic !== 'CDF') {\n throw new Error(`NetCDF: file should start with 'CDF', found ${magic}`);\n }\n\n // Check the NetCDF format\n const version = buffer.readByte();\n if (version > 2) {\n throw new Error(`NetCDF: unsupported version ${version}`);\n }\n\n // Read the header\n this.header = readNetCDFHeader(buffer, version);\n this.buffer = buffer;\n }\n\n /**\n * @return {string} - Version for the NetCDF format\n */\n get version() {\n if (this.header.version === 1) {\n return 'classic format';\n }\n return '64-bit offset format';\n }\n\n /**\n * Get metadata for the record dimension\n */\n get recordDimension(): NetCDFRecordDimension {\n return this.header.recordDimension;\n }\n\n /**\n * Get list of dimensions (each with `name` and `size`)\n */\n get dimensions(): NetCDFDimension[] {\n return this.header.dimensions;\n }\n\n /**\n * Get list of global attributes with:\n * * `name`: String with the name of the attribute\n * * `type`: String with the type of the attribute\n * * `value`: A number or string with the value of the attribute\n */\n get attributes(): NetCDFAttribute[] {\n return this.header.attributes;\n }\n\n /**\n * Get list of variables\n */\n get variables(): NetCDFVariable[] {\n return this.header.variables;\n }\n\n /**\n * Check if an attribute exists\n * @param attributeName - Name of the attribute to find\n * @return\n */\n attributeExists(attributeName: string): boolean {\n const attribute = this.attributes.find((val) => val.name === attributeName);\n return attribute !== undefined;\n }\n\n /**\n * Returns the value of an attribute\n * @param attributeName\n * @return Value of the attributeName or null\n */\n getAttribute(attributeName: string): string | null {\n const attribute = this.attributes.find((val) => val.name === attributeName);\n if (attribute) return attribute.value;\n return null;\n }\n\n /**\n * Check if a dataVariable exists\n * @param variableName - Name of the variable to find\n * @return\n */\n dataVariableExists(variableName: string): boolean {\n const variable = this.header.variables.find(function (val) {\n return val.name === variableName;\n });\n return variable !== undefined;\n }\n\n /**\n * Returns the value of a variable as a string\n * @param variableName\n * @return Value of the variable as a string or null\n */\n getDataVariableAsString(variableName: string): string | null {\n const variable = this.getDataVariable(variableName);\n if (variable) return variable.join('');\n return null;\n }\n\n /**\n * Retrieves the data for a given variable\n * @param variableName - Name of the variable to search or variable object\n * @return List with the variable values\n */\n getDataVariable(variableName: string | object): any[] {\n let variable;\n if (typeof variableName === 'string') {\n // search the variable\n variable = this.header.variables.find(function (val) {\n return val.name === variableName;\n });\n } else {\n variable = variableName;\n }\n\n // throws if variable not found\n if (variable === undefined) {\n throw new Error(`NetCDF: variable not found: ${variableName}`);\n }\n\n // go to the offset position\n this.buffer.seek(variable.offset);\n\n if (variable.record) {\n // record variable case\n return readRecord(this.buffer, variable, this.header.recordDimension);\n }\n // non-record variable case\n return readNonRecord(this.buffer, variable);\n }\n\n toString(): string {\n const result: string[] = [];\n\n result.push('DIMENSIONS');\n for (const dimension of this.dimensions) {\n result.push(` ${dimension.name.padEnd(30)} = size: ${dimension.size}`);\n }\n\n result.push('');\n result.push('GLOBAL ATTRIBUTES');\n for (const attribute of this.attributes) {\n result.push(` ${attribute.name.padEnd(30)} = ${attribute.value}`);\n }\n\n const variables = JSON.parse(JSON.stringify(this.variables));\n result.push('');\n result.push('VARIABLES:');\n for (const variable of variables) {\n variable.value = this.getDataVariable(variable);\n let stringify = JSON.stringify(variable.value);\n if (stringify.length > 50) stringify = stringify.substring(0, 50);\n if (!isNaN(variable.value.length)) {\n stringify += ` (length: ${variable.value.length})`;\n }\n result.push(` ${variable.name.padEnd(30)} = ${stringify}`);\n }\n return result.join('\\n');\n }\n}\n"],"mappings":"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"}
|
|
@@ -6,25 +6,19 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.readNonRecord = readNonRecord;
|
|
7
7
|
exports.readRecord = readRecord;
|
|
8
8
|
var _readType = require("./read-type");
|
|
9
|
-
|
|
10
9
|
function readNonRecord(buffer, variable) {
|
|
11
10
|
var type = (0, _readType.str2num)(variable.type);
|
|
12
|
-
|
|
13
11
|
var size = variable.size / (0, _readType.num2bytes)(type);
|
|
14
|
-
|
|
15
12
|
var data = new Array(size);
|
|
16
13
|
for (var i = 0; i < size; i++) {
|
|
17
14
|
data[i] = (0, _readType.readType)(buffer, type, 1);
|
|
18
15
|
}
|
|
19
16
|
return data;
|
|
20
17
|
}
|
|
21
|
-
|
|
22
18
|
function readRecord(buffer, variable, recordDimension) {
|
|
23
19
|
var type = (0, _readType.str2num)(variable.type);
|
|
24
20
|
var width = variable.size ? variable.size / (0, _readType.num2bytes)(type) : 1;
|
|
25
|
-
|
|
26
21
|
var size = recordDimension.length;
|
|
27
|
-
|
|
28
22
|
var data = new Array(size);
|
|
29
23
|
var step = recordDimension.recordStep;
|
|
30
24
|
for (var i = 0; i < size; i++) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-data.js","names":["readNonRecord","buffer","variable","type","str2num","size","num2bytes","data","Array","i","readType","readRecord","recordDimension","width","length","step","recordStep","currentOffset","offset","seek"],"sources":["../../../src/netcdfjs/read-data.ts"],"sourcesContent":["import type {IOBuffer} from '../iobuffer/iobuffer';\nimport type {NetCDFRecordDimension, NetCDFVariable} from './netcdf-types';\nimport {readType, str2num, num2bytes} from './read-type';\n\n// const STREAMING = 4294967295;\n\n/**\n * Read data for the given non-record variable\n * @param buffer - Buffer for the file data\n * @param variable - Variable metadata\n * @return Data of the element\n */\nexport function readNonRecord(\n buffer: IOBuffer,\n variable: NetCDFVariable\n): (string | number | number[] | Uint8Array)[] {\n // variable type\n const type = str2num(variable.type);\n\n // size of the data\n const size = variable.size / num2bytes(type);\n\n // iterates over the data\n const data = new Array(size);\n for (let i = 0; i < size; i++) {\n data[i] = readType(buffer, type, 1);\n }\n\n return data;\n}\n\n/**\n * Read data for the given record variable\n * @param buffer - Buffer for the file data\n * @param variable - Variable metadata\n * @param recordDimension - Record dimension metadata\n * @return - Data of the element\n */\nexport function readRecord(\n buffer: IOBuffer,\n variable: NetCDFVariable,\n recordDimension: NetCDFRecordDimension\n): (string | number | number[] | Uint8Array)[] {\n // variable type\n const type = str2num(variable.type);\n const width = variable.size ? variable.size / num2bytes(type) : 1;\n\n // size of the data\n // TODO streaming data\n const size = recordDimension.length;\n\n // iterates over the data\n const data = new Array(size);\n const step = recordDimension.recordStep;\n\n for (let i = 0; i < size; i++) {\n const currentOffset = buffer.offset;\n data[i] = readType(buffer, type, width);\n buffer.seek(currentOffset + step);\n }\n\n return data;\n}\n"],"mappings":";;;;;;;AAEA
|
|
1
|
+
{"version":3,"file":"read-data.js","names":["_readType","require","readNonRecord","buffer","variable","type","str2num","size","num2bytes","data","Array","i","readType","readRecord","recordDimension","width","length","step","recordStep","currentOffset","offset","seek"],"sources":["../../../src/netcdfjs/read-data.ts"],"sourcesContent":["import type {IOBuffer} from '../iobuffer/iobuffer';\nimport type {NetCDFRecordDimension, NetCDFVariable} from './netcdf-types';\nimport {readType, str2num, num2bytes} from './read-type';\n\n// const STREAMING = 4294967295;\n\n/**\n * Read data for the given non-record variable\n * @param buffer - Buffer for the file data\n * @param variable - Variable metadata\n * @return Data of the element\n */\nexport function readNonRecord(\n buffer: IOBuffer,\n variable: NetCDFVariable\n): (string | number | number[] | Uint8Array)[] {\n // variable type\n const type = str2num(variable.type);\n\n // size of the data\n const size = variable.size / num2bytes(type);\n\n // iterates over the data\n const data = new Array(size);\n for (let i = 0; i < size; i++) {\n data[i] = readType(buffer, type, 1);\n }\n\n return data;\n}\n\n/**\n * Read data for the given record variable\n * @param buffer - Buffer for the file data\n * @param variable - Variable metadata\n * @param recordDimension - Record dimension metadata\n * @return - Data of the element\n */\nexport function readRecord(\n buffer: IOBuffer,\n variable: NetCDFVariable,\n recordDimension: NetCDFRecordDimension\n): (string | number | number[] | Uint8Array)[] {\n // variable type\n const type = str2num(variable.type);\n const width = variable.size ? variable.size / num2bytes(type) : 1;\n\n // size of the data\n // TODO streaming data\n const size = recordDimension.length;\n\n // iterates over the data\n const data = new Array(size);\n const step = recordDimension.recordStep;\n\n for (let i = 0; i < size; i++) {\n const currentOffset = buffer.offset;\n data[i] = readType(buffer, type, width);\n buffer.seek(currentOffset + step);\n }\n\n return data;\n}\n"],"mappings":";;;;;;;AAEA,IAAAA,SAAA,GAAAC,OAAA;AAUO,SAASC,aAAaA,CAC3BC,MAAgB,EAChBC,QAAwB,EACqB;EAE7C,IAAMC,IAAI,GAAG,IAAAC,iBAAO,EAACF,QAAQ,CAACC,IAAI,CAAC;EAGnC,IAAME,IAAI,GAAGH,QAAQ,CAACG,IAAI,GAAG,IAAAC,mBAAS,EAACH,IAAI,CAAC;EAG5C,IAAMI,IAAI,GAAG,IAAIC,KAAK,CAACH,IAAI,CAAC;EAC5B,KAAK,IAAII,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,IAAI,EAAEI,CAAC,EAAE,EAAE;IAC7BF,IAAI,CAACE,CAAC,CAAC,GAAG,IAAAC,kBAAQ,EAACT,MAAM,EAAEE,IAAI,EAAE,CAAC,CAAC;EACrC;EAEA,OAAOI,IAAI;AACb;AASO,SAASI,UAAUA,CACxBV,MAAgB,EAChBC,QAAwB,EACxBU,eAAsC,EACO;EAE7C,IAAMT,IAAI,GAAG,IAAAC,iBAAO,EAACF,QAAQ,CAACC,IAAI,CAAC;EACnC,IAAMU,KAAK,GAAGX,QAAQ,CAACG,IAAI,GAAGH,QAAQ,CAACG,IAAI,GAAG,IAAAC,mBAAS,EAACH,IAAI,CAAC,GAAG,CAAC;EAIjE,IAAME,IAAI,GAAGO,eAAe,CAACE,MAAM;EAGnC,IAAMP,IAAI,GAAG,IAAIC,KAAK,CAACH,IAAI,CAAC;EAC5B,IAAMU,IAAI,GAAGH,eAAe,CAACI,UAAU;EAEvC,KAAK,IAAIP,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,IAAI,EAAEI,CAAC,EAAE,EAAE;IAC7B,IAAMQ,aAAa,GAAGhB,MAAM,CAACiB,MAAM;IACnCX,IAAI,CAACE,CAAC,CAAC,GAAG,IAAAC,kBAAQ,EAACT,MAAM,EAAEE,IAAI,EAAEU,KAAK,CAAC;IACvCZ,MAAM,CAACkB,IAAI,CAACF,aAAa,GAAGF,IAAI,CAAC;EACnC;EAEA,OAAOR,IAAI;AACb"}
|
|
@@ -11,14 +11,10 @@ var NC_DIMENSION = 10;
|
|
|
11
11
|
var NC_VARIABLE = 11;
|
|
12
12
|
var NC_ATTRIBUTE = 12;
|
|
13
13
|
var NC_UNLIMITED = 0;
|
|
14
|
-
|
|
15
14
|
function readNetCDFHeader(buffer, version) {
|
|
16
15
|
var recordDimensionLength = buffer.readUint32();
|
|
17
|
-
|
|
18
16
|
var dimList = readDimensionsList(buffer);
|
|
19
|
-
|
|
20
17
|
var attributes = readAttributesList(buffer);
|
|
21
|
-
|
|
22
18
|
var variableList = readVariablesList(buffer, dimList.recordId, version);
|
|
23
19
|
var header = {
|
|
24
20
|
version: version,
|
|
@@ -34,7 +30,6 @@ function readNetCDFHeader(buffer, version) {
|
|
|
34
30
|
};
|
|
35
31
|
return header;
|
|
36
32
|
}
|
|
37
|
-
|
|
38
33
|
function readDimensionsList(buffer) {
|
|
39
34
|
var dimList = buffer.readUint32();
|
|
40
35
|
if (dimList === ZERO) {
|
|
@@ -50,14 +45,12 @@ function readDimensionsList(buffer) {
|
|
|
50
45
|
if (dimList !== NC_DIMENSION) {
|
|
51
46
|
throw new Error('NetCDF: wrong tag for list of dimensions');
|
|
52
47
|
}
|
|
53
|
-
|
|
54
48
|
var dimensionSize = buffer.readUint32();
|
|
55
49
|
var dimensions = new Array(dimensionSize);
|
|
56
50
|
var recordId;
|
|
57
51
|
var recordName;
|
|
58
52
|
for (var dim = 0; dim < dimensionSize; dim++) {
|
|
59
53
|
var name = readName(buffer);
|
|
60
|
-
|
|
61
54
|
var size = buffer.readUint32();
|
|
62
55
|
if (size === NC_UNLIMITED) {
|
|
63
56
|
recordId = dim;
|
|
@@ -74,7 +67,6 @@ function readDimensionsList(buffer) {
|
|
|
74
67
|
recordName: recordName
|
|
75
68
|
};
|
|
76
69
|
}
|
|
77
|
-
|
|
78
70
|
function readAttributesList(buffer) {
|
|
79
71
|
var gAttList = buffer.readUint32();
|
|
80
72
|
if (gAttList === ZERO) {
|
|
@@ -86,20 +78,16 @@ function readAttributesList(buffer) {
|
|
|
86
78
|
if (gAttList !== NC_ATTRIBUTE) {
|
|
87
79
|
throw new Error('NetCDF: wrong tag for list of attributes');
|
|
88
80
|
}
|
|
89
|
-
|
|
90
81
|
var attributeSize = buffer.readUint32();
|
|
91
82
|
var attributes = new Array(attributeSize);
|
|
92
83
|
for (var gAtt = 0; gAtt < attributeSize; gAtt++) {
|
|
93
84
|
var name = readName(buffer);
|
|
94
|
-
|
|
95
85
|
var type = buffer.readUint32();
|
|
96
86
|
if (type < 1 || type > 6) {
|
|
97
87
|
throw new Error("NetCDF: non valid type ".concat(type));
|
|
98
88
|
}
|
|
99
|
-
|
|
100
89
|
var size = buffer.readUint32();
|
|
101
90
|
var value = (0, _readType.readType)(buffer, type, size);
|
|
102
|
-
|
|
103
91
|
padding(buffer);
|
|
104
92
|
attributes[gAtt] = {
|
|
105
93
|
name: name,
|
|
@@ -109,7 +97,6 @@ function readAttributesList(buffer) {
|
|
|
109
97
|
}
|
|
110
98
|
return attributes;
|
|
111
99
|
}
|
|
112
|
-
|
|
113
100
|
function readVariablesList(buffer, recordId, version) {
|
|
114
101
|
var varList = buffer.readUint32();
|
|
115
102
|
var recordStep = 0;
|
|
@@ -125,28 +112,21 @@ function readVariablesList(buffer, recordId, version) {
|
|
|
125
112
|
if (varList !== NC_VARIABLE) {
|
|
126
113
|
throw new Error('NetCDF: wrong tag for list of variables');
|
|
127
114
|
}
|
|
128
|
-
|
|
129
115
|
var variableSize = buffer.readUint32();
|
|
130
116
|
var variables = new Array(variableSize);
|
|
131
117
|
for (var v = 0; v < variableSize; v++) {
|
|
132
118
|
var name = readName(buffer);
|
|
133
|
-
|
|
134
119
|
var dimensionality = buffer.readUint32();
|
|
135
|
-
|
|
136
120
|
var dimensionsIds = new Array(dimensionality);
|
|
137
121
|
for (var dim = 0; dim < dimensionality; dim++) {
|
|
138
122
|
dimensionsIds[dim] = buffer.readUint32();
|
|
139
123
|
}
|
|
140
|
-
|
|
141
124
|
var attributes = readAttributesList(buffer);
|
|
142
|
-
|
|
143
125
|
var type = buffer.readUint32();
|
|
144
126
|
if (type < 1 && type > 6) {
|
|
145
127
|
throw new Error("NetCDF: non valid type ".concat(type));
|
|
146
128
|
}
|
|
147
|
-
|
|
148
129
|
var varSize = buffer.readUint32();
|
|
149
|
-
|
|
150
130
|
var offset = buffer.readUint32();
|
|
151
131
|
if (version === 2) {
|
|
152
132
|
if (offset > 0) {
|
|
@@ -174,15 +154,12 @@ function readVariablesList(buffer, recordId, version) {
|
|
|
174
154
|
recordStep: recordStep
|
|
175
155
|
};
|
|
176
156
|
}
|
|
177
|
-
|
|
178
157
|
function readName(buffer) {
|
|
179
158
|
var nameLength = buffer.readUint32();
|
|
180
159
|
var name = buffer.readChars(nameLength);
|
|
181
|
-
|
|
182
160
|
padding(buffer);
|
|
183
161
|
return name;
|
|
184
162
|
}
|
|
185
|
-
|
|
186
163
|
function padding(buffer) {
|
|
187
164
|
if (buffer.offset % 4 !== 0) {
|
|
188
165
|
buffer.skip(4 - buffer.offset % 4);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-header.js","names":["ZERO","NC_DIMENSION","NC_VARIABLE","NC_ATTRIBUTE","NC_UNLIMITED","readNetCDFHeader","buffer","version","recordDimensionLength","readUint32","dimList","readDimensionsList","attributes","readAttributesList","variableList","readVariablesList","recordId","header","recordDimension","length","id","name","recordName","recordStep","dimensions","variables","Error","dimensionSize","Array","dim","readName","size","gAttList","attributeSize","gAtt","type","value","readType","padding","num2str","varList","variableSize","v","dimensionality","dimensionsIds","varSize","offset","record","nameLength","readChars","skip"],"sources":["../../../src/netcdfjs/read-header.ts"],"sourcesContent":["import type {IOBuffer} from '../iobuffer/iobuffer';\nimport type {NetCDFHeader, NetCDFDimension, NetCDFVariable, NetCDFAttribute} from './netcdf-types';\nimport {readType, num2str} from './read-type';\n\n// Grammar constants\nconst ZERO = 0;\nconst NC_DIMENSION = 10;\nconst NC_VARIABLE = 11;\nconst NC_ATTRIBUTE = 12;\n\nconst NC_UNLIMITED = 0;\n\n/**\n * Read the header of the file\n * @param buffer - Buffer for the file data\n * @param version - Version of the file\n * @return - Header\n */\nexport function readNetCDFHeader(buffer: IOBuffer, version: number): NetCDFHeader {\n // Length of record dimension\n // sum of the varSize's of all the record variables.\n const recordDimensionLength = buffer.readUint32();\n\n // List of dimensions\n const dimList = readDimensionsList(buffer);\n\n // List of global attributes\n const attributes = readAttributesList(buffer);\n\n // List of variables\n const variableList = readVariablesList(buffer, dimList.recordId, version);\n\n const header: NetCDFHeader = {\n version,\n recordDimension: {\n length: recordDimensionLength,\n id: dimList.recordId, // id of the unlimited dimension\n name: dimList.recordName, // name of the unlimited dimension\n recordStep: variableList.recordStep\n },\n dimensions: dimList.dimensions,\n variables: variableList.variables,\n attributes\n };\n\n return header;\n}\n\n/**\n * Read list of dimensions\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n */\nfunction readDimensionsList(buffer: IOBuffer): {\n recordId: number;\n recordName: string;\n dimensions: NetCDFDimension[];\n} {\n const dimList = buffer.readUint32();\n if (dimList === ZERO) {\n if (buffer.readUint32() !== ZERO) {\n throw new Error('NetCDF: wrong empty tag for list of dimensions');\n }\n // TODO - is this empty dimension list supported / recoverable?\n return {\n recordId: 0,\n recordName: '',\n dimensions: []\n };\n }\n\n if (dimList !== NC_DIMENSION) {\n throw new Error('NetCDF: wrong tag for list of dimensions');\n }\n\n // Length of dimensions\n const dimensionSize = buffer.readUint32();\n const dimensions = new Array(dimensionSize);\n let recordId;\n let recordName;\n for (let dim = 0; dim < dimensionSize; dim++) {\n // Read name\n const name = readName(buffer);\n\n // Read dimension size\n const size = buffer.readUint32();\n if (size === NC_UNLIMITED) {\n // in netcdf 3 one field can be of size unlimmited\n recordId = dim;\n recordName = name;\n }\n\n dimensions[dim] = {\n name,\n size\n };\n }\n\n return {\n dimensions,\n recordId,\n recordName\n };\n}\n\n/**\n * List of attributes\n * @ignore\n * @param buffer - Buffer for the file data\n * @return List of attributes with:\n */\nfunction readAttributesList(buffer: IOBuffer): NetCDFAttribute[] {\n const gAttList = buffer.readUint32();\n if (gAttList === ZERO) {\n if (buffer.readUint32() !== ZERO) {\n throw new Error('NetCDF: wrong empty tag for list of attributes');\n }\n return [];\n }\n\n if (gAttList !== NC_ATTRIBUTE) {\n throw new Error('NetCDF: wrong tag for list of attributes');\n }\n\n // Length of attributes\n const attributeSize = buffer.readUint32();\n const attributes = new Array(attributeSize);\n for (let gAtt = 0; gAtt < attributeSize; gAtt++) {\n // Read name\n const name = readName(buffer);\n\n // Read type\n const type = buffer.readUint32();\n if (type < 1 || type > 6) {\n throw new Error(`NetCDF: non valid type ${type}`);\n }\n\n // Read attribute\n const size = buffer.readUint32();\n const value = readType(buffer, type, size);\n\n // Apply padding\n padding(buffer);\n\n attributes[gAtt] = {\n name,\n type: num2str(type),\n value\n };\n }\n return attributes;\n}\n\n/**\n * List of variables\n * @param buffer - Buffer for the file data\n * @param recordId - Id of the unlimited dimension (also called record dimension)\n * This value may be undefined if there is no unlimited dimension\n * @param {number} version - Version of the file\n */\n// eslint-disable-next-line max-statements, complexity\nfunction readVariablesList(\n buffer: IOBuffer,\n recordId: number,\n version: number\n): {\n recordStep: number;\n variables: NetCDFVariable[];\n} {\n const varList = buffer.readUint32();\n let recordStep = 0;\n if (varList === ZERO) {\n if (buffer.readUint32() !== ZERO) {\n throw new Error('NetCDF: wrong empty tag for list of variables');\n }\n return {\n recordStep,\n variables: []\n };\n }\n\n if (varList !== NC_VARIABLE) {\n throw new Error('NetCDF: wrong tag for list of variables');\n }\n\n // Length of variables\n const variableSize = buffer.readUint32();\n const variables = new Array(variableSize);\n for (let v = 0; v < variableSize; v++) {\n // Read name\n const name = readName(buffer);\n\n // Read dimensionality of the variable\n const dimensionality = buffer.readUint32();\n\n // Index into the list of dimensions\n const dimensionsIds = new Array(dimensionality);\n for (let dim = 0; dim < dimensionality; dim++) {\n dimensionsIds[dim] = buffer.readUint32();\n }\n\n // Read variables size\n const attributes = readAttributesList(buffer);\n\n // Read type\n const type = buffer.readUint32();\n if (type < 1 && type > 6) {\n throw new Error(`NetCDF: non valid type ${type}`);\n }\n\n // Read variable size\n // The 32-bit varSize field is not large enough to contain the size of variables that require\n // more than 2^32 - 4 bytes, so 2^32 - 1 is used in the varSize field for such variables.\n const varSize = buffer.readUint32();\n\n // Read offset\n let offset = buffer.readUint32();\n if (version === 2) {\n if (offset > 0) {\n throw new Error('NetCDF: offsets larger than 4GB not supported');\n }\n offset = buffer.readUint32();\n }\n\n let record = false;\n // Count amount of record variables\n if (typeof recordId !== 'undefined' && dimensionsIds[0] === recordId) {\n recordStep += varSize;\n record = true;\n }\n variables[v] = {\n name,\n dimensions: dimensionsIds,\n attributes,\n type: num2str(type),\n size: varSize,\n offset,\n record\n };\n }\n\n return {\n variables,\n recordStep\n };\n}\n\n// HELPERS\n\n/**\n * Reads the name\n * @param buffer - Buffer for the file data\n * @return Name\n */\nexport function readName(buffer: IOBuffer): string {\n // Read name\n const nameLength = buffer.readUint32();\n const name = buffer.readChars(nameLength);\n\n // validate name\n // TODO\n\n // Apply padding\n padding(buffer);\n return name;\n}\n\n/**\n * Moves 1, 2, or 3 bytes to next 4-byte boundary\n */\nfunction padding(buffer: IOBuffer) {\n if (buffer.offset % 4 !== 0) {\n buffer.skip(4 - (buffer.offset % 4));\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"read-header.js","names":["_readType","require","ZERO","NC_DIMENSION","NC_VARIABLE","NC_ATTRIBUTE","NC_UNLIMITED","readNetCDFHeader","buffer","version","recordDimensionLength","readUint32","dimList","readDimensionsList","attributes","readAttributesList","variableList","readVariablesList","recordId","header","recordDimension","length","id","name","recordName","recordStep","dimensions","variables","Error","dimensionSize","Array","dim","readName","size","gAttList","attributeSize","gAtt","type","concat","value","readType","padding","num2str","varList","variableSize","v","dimensionality","dimensionsIds","varSize","offset","record","nameLength","readChars","skip"],"sources":["../../../src/netcdfjs/read-header.ts"],"sourcesContent":["import type {IOBuffer} from '../iobuffer/iobuffer';\nimport type {NetCDFHeader, NetCDFDimension, NetCDFVariable, NetCDFAttribute} from './netcdf-types';\nimport {readType, num2str} from './read-type';\n\n// Grammar constants\nconst ZERO = 0;\nconst NC_DIMENSION = 10;\nconst NC_VARIABLE = 11;\nconst NC_ATTRIBUTE = 12;\n\nconst NC_UNLIMITED = 0;\n\n/**\n * Read the header of the file\n * @param buffer - Buffer for the file data\n * @param version - Version of the file\n * @return - Header\n */\nexport function readNetCDFHeader(buffer: IOBuffer, version: number): NetCDFHeader {\n // Length of record dimension\n // sum of the varSize's of all the record variables.\n const recordDimensionLength = buffer.readUint32();\n\n // List of dimensions\n const dimList = readDimensionsList(buffer);\n\n // List of global attributes\n const attributes = readAttributesList(buffer);\n\n // List of variables\n const variableList = readVariablesList(buffer, dimList.recordId, version);\n\n const header: NetCDFHeader = {\n version,\n recordDimension: {\n length: recordDimensionLength,\n id: dimList.recordId, // id of the unlimited dimension\n name: dimList.recordName, // name of the unlimited dimension\n recordStep: variableList.recordStep\n },\n dimensions: dimList.dimensions,\n variables: variableList.variables,\n attributes\n };\n\n return header;\n}\n\n/**\n * Read list of dimensions\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n */\nfunction readDimensionsList(buffer: IOBuffer): {\n recordId: number;\n recordName: string;\n dimensions: NetCDFDimension[];\n} {\n const dimList = buffer.readUint32();\n if (dimList === ZERO) {\n if (buffer.readUint32() !== ZERO) {\n throw new Error('NetCDF: wrong empty tag for list of dimensions');\n }\n // TODO - is this empty dimension list supported / recoverable?\n return {\n recordId: 0,\n recordName: '',\n dimensions: []\n };\n }\n\n if (dimList !== NC_DIMENSION) {\n throw new Error('NetCDF: wrong tag for list of dimensions');\n }\n\n // Length of dimensions\n const dimensionSize = buffer.readUint32();\n const dimensions = new Array(dimensionSize);\n let recordId;\n let recordName;\n for (let dim = 0; dim < dimensionSize; dim++) {\n // Read name\n const name = readName(buffer);\n\n // Read dimension size\n const size = buffer.readUint32();\n if (size === NC_UNLIMITED) {\n // in netcdf 3 one field can be of size unlimmited\n recordId = dim;\n recordName = name;\n }\n\n dimensions[dim] = {\n name,\n size\n };\n }\n\n return {\n dimensions,\n recordId,\n recordName\n };\n}\n\n/**\n * List of attributes\n * @ignore\n * @param buffer - Buffer for the file data\n * @return List of attributes with:\n */\nfunction readAttributesList(buffer: IOBuffer): NetCDFAttribute[] {\n const gAttList = buffer.readUint32();\n if (gAttList === ZERO) {\n if (buffer.readUint32() !== ZERO) {\n throw new Error('NetCDF: wrong empty tag for list of attributes');\n }\n return [];\n }\n\n if (gAttList !== NC_ATTRIBUTE) {\n throw new Error('NetCDF: wrong tag for list of attributes');\n }\n\n // Length of attributes\n const attributeSize = buffer.readUint32();\n const attributes = new Array(attributeSize);\n for (let gAtt = 0; gAtt < attributeSize; gAtt++) {\n // Read name\n const name = readName(buffer);\n\n // Read type\n const type = buffer.readUint32();\n if (type < 1 || type > 6) {\n throw new Error(`NetCDF: non valid type ${type}`);\n }\n\n // Read attribute\n const size = buffer.readUint32();\n const value = readType(buffer, type, size);\n\n // Apply padding\n padding(buffer);\n\n attributes[gAtt] = {\n name,\n type: num2str(type),\n value\n };\n }\n return attributes;\n}\n\n/**\n * List of variables\n * @param buffer - Buffer for the file data\n * @param recordId - Id of the unlimited dimension (also called record dimension)\n * This value may be undefined if there is no unlimited dimension\n * @param {number} version - Version of the file\n */\n// eslint-disable-next-line max-statements, complexity\nfunction readVariablesList(\n buffer: IOBuffer,\n recordId: number,\n version: number\n): {\n recordStep: number;\n variables: NetCDFVariable[];\n} {\n const varList = buffer.readUint32();\n let recordStep = 0;\n if (varList === ZERO) {\n if (buffer.readUint32() !== ZERO) {\n throw new Error('NetCDF: wrong empty tag for list of variables');\n }\n return {\n recordStep,\n variables: []\n };\n }\n\n if (varList !== NC_VARIABLE) {\n throw new Error('NetCDF: wrong tag for list of variables');\n }\n\n // Length of variables\n const variableSize = buffer.readUint32();\n const variables = new Array(variableSize);\n for (let v = 0; v < variableSize; v++) {\n // Read name\n const name = readName(buffer);\n\n // Read dimensionality of the variable\n const dimensionality = buffer.readUint32();\n\n // Index into the list of dimensions\n const dimensionsIds = new Array(dimensionality);\n for (let dim = 0; dim < dimensionality; dim++) {\n dimensionsIds[dim] = buffer.readUint32();\n }\n\n // Read variables size\n const attributes = readAttributesList(buffer);\n\n // Read type\n const type = buffer.readUint32();\n if (type < 1 && type > 6) {\n throw new Error(`NetCDF: non valid type ${type}`);\n }\n\n // Read variable size\n // The 32-bit varSize field is not large enough to contain the size of variables that require\n // more than 2^32 - 4 bytes, so 2^32 - 1 is used in the varSize field for such variables.\n const varSize = buffer.readUint32();\n\n // Read offset\n let offset = buffer.readUint32();\n if (version === 2) {\n if (offset > 0) {\n throw new Error('NetCDF: offsets larger than 4GB not supported');\n }\n offset = buffer.readUint32();\n }\n\n let record = false;\n // Count amount of record variables\n if (typeof recordId !== 'undefined' && dimensionsIds[0] === recordId) {\n recordStep += varSize;\n record = true;\n }\n variables[v] = {\n name,\n dimensions: dimensionsIds,\n attributes,\n type: num2str(type),\n size: varSize,\n offset,\n record\n };\n }\n\n return {\n variables,\n recordStep\n };\n}\n\n// HELPERS\n\n/**\n * Reads the name\n * @param buffer - Buffer for the file data\n * @return Name\n */\nexport function readName(buffer: IOBuffer): string {\n // Read name\n const nameLength = buffer.readUint32();\n const name = buffer.readChars(nameLength);\n\n // validate name\n // TODO\n\n // Apply padding\n padding(buffer);\n return name;\n}\n\n/**\n * Moves 1, 2, or 3 bytes to next 4-byte boundary\n */\nfunction padding(buffer: IOBuffer) {\n if (buffer.offset % 4 !== 0) {\n buffer.skip(4 - (buffer.offset % 4));\n }\n}\n"],"mappings":"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"}
|
|
@@ -16,7 +16,6 @@ var TYPES = {
|
|
|
16
16
|
FLOAT: 5,
|
|
17
17
|
DOUBLE: 6
|
|
18
18
|
};
|
|
19
|
-
|
|
20
19
|
exports.TYPES = TYPES;
|
|
21
20
|
function readType(buffer, type, size) {
|
|
22
21
|
switch (type) {
|
|
@@ -36,7 +35,6 @@ function readType(buffer, type, size) {
|
|
|
36
35
|
throw new Error("NetCDF: non valid type ".concat(type));
|
|
37
36
|
}
|
|
38
37
|
}
|
|
39
|
-
|
|
40
38
|
function num2str(type) {
|
|
41
39
|
switch (Number(type)) {
|
|
42
40
|
case TYPES.BYTE:
|
|
@@ -55,7 +53,6 @@ function num2str(type) {
|
|
|
55
53
|
return 'undefined';
|
|
56
54
|
}
|
|
57
55
|
}
|
|
58
|
-
|
|
59
56
|
function num2bytes(type) {
|
|
60
57
|
switch (Number(type)) {
|
|
61
58
|
case TYPES.BYTE:
|
|
@@ -74,7 +71,6 @@ function num2bytes(type) {
|
|
|
74
71
|
return -1;
|
|
75
72
|
}
|
|
76
73
|
}
|
|
77
|
-
|
|
78
74
|
function str2num(type) {
|
|
79
75
|
switch (String(type)) {
|
|
80
76
|
case 'byte':
|
|
@@ -93,7 +89,6 @@ function str2num(type) {
|
|
|
93
89
|
return -1;
|
|
94
90
|
}
|
|
95
91
|
}
|
|
96
|
-
|
|
97
92
|
function readNumber(size, bufferReader) {
|
|
98
93
|
if (size !== 1) {
|
|
99
94
|
var numbers = new Array(size);
|
|
@@ -104,7 +99,6 @@ function readNumber(size, bufferReader) {
|
|
|
104
99
|
}
|
|
105
100
|
return bufferReader();
|
|
106
101
|
}
|
|
107
|
-
|
|
108
102
|
function trimNull(value) {
|
|
109
103
|
if (value.charCodeAt(value.length - 1) === 0) {
|
|
110
104
|
return value.substring(0, value.length - 1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-type.js","names":["TYPES","BYTE","CHAR","SHORT","INT","FLOAT","DOUBLE","readType","buffer","type","size","readBytes","trimNull","readChars","readNumber","readInt16","bind","readInt32","readFloat32","readFloat64","Error","num2str","Number","num2bytes","str2num","String","bufferReader","numbers","Array","i","value","charCodeAt","length","substring"],"sources":["../../../src/netcdfjs/read-type.ts"],"sourcesContent":["import {IOBuffer} from '../iobuffer/iobuffer';\n\nexport const TYPES = {\n BYTE: 1,\n CHAR: 2,\n SHORT: 3,\n INT: 4,\n FLOAT: 5,\n DOUBLE: 6\n};\n\n/**\n * Given a type and a size reads the next element\n * @param buffer - Buffer for the file data\n * @param type - Type of the data to read\n * @param size - Size of the element to read\n * @return\n */\nexport function readType(\n buffer: IOBuffer,\n type: number,\n size: number\n): string | number | number[] | Uint8Array {\n switch (type) {\n case TYPES.BYTE:\n return buffer.readBytes(size);\n case TYPES.CHAR:\n return trimNull(buffer.readChars(size));\n case TYPES.SHORT:\n return readNumber(size, buffer.readInt16.bind(buffer));\n case TYPES.INT:\n return readNumber(size, buffer.readInt32.bind(buffer));\n case TYPES.FLOAT:\n return readNumber(size, buffer.readFloat32.bind(buffer));\n case TYPES.DOUBLE:\n return readNumber(size, buffer.readFloat64.bind(buffer));\n /* istanbul ignore next */\n default:\n throw new Error(`NetCDF: non valid type ${type}`);\n }\n}\n\n/**\n * Parse a number into their respective type\n * @param type - integer that represents the type\n * @return parsed value of the type\n */\nexport function num2str(type: number): string {\n switch (Number(type)) {\n case TYPES.BYTE:\n return 'byte';\n case TYPES.CHAR:\n return 'char';\n case TYPES.SHORT:\n return 'short';\n case TYPES.INT:\n return 'int';\n case TYPES.FLOAT:\n return 'float';\n case TYPES.DOUBLE:\n return 'double';\n /* istanbul ignore next */\n default:\n return 'undefined';\n }\n}\n\n/**\n * Parse a number type identifier to his size in bytes\n * @param type - integer that represents the type\n * @return size of the type\n */\nexport function num2bytes(type: number): number {\n switch (Number(type)) {\n case TYPES.BYTE:\n return 1;\n case TYPES.CHAR:\n return 1;\n case TYPES.SHORT:\n return 2;\n case TYPES.INT:\n return 4;\n case TYPES.FLOAT:\n return 4;\n case TYPES.DOUBLE:\n return 8;\n /* istanbul ignore next */\n default:\n return -1;\n }\n}\n\n/**\n * Reverse search of num2str\n * @param type string that represents the type\n * @return parsed value of the type\n */\nexport function str2num(type: string): number {\n switch (String(type)) {\n case 'byte':\n return TYPES.BYTE;\n case 'char':\n return TYPES.CHAR;\n case 'short':\n return TYPES.SHORT;\n case 'int':\n return TYPES.INT;\n case 'float':\n return TYPES.FLOAT;\n case 'double':\n return TYPES.DOUBLE;\n /* istanbul ignore next */\n default:\n return -1;\n }\n}\n\n/**\n * Auxiliary function to read numeric data\n * @param size - Size of the element to read\n * @param bufferReader - Function to read next value\n * @return\n */\nfunction readNumber(size: number, bufferReader: () => number): number | number[] {\n if (size !== 1) {\n const numbers = new Array(size);\n for (let i = 0; i < size; i++) {\n numbers[i] = bufferReader();\n }\n return numbers;\n }\n return bufferReader();\n}\n\n/**\n * Removes null terminate value\n * @param value - String to trim\n * @return - Trimmed string\n */\nfunction trimNull(value: string): string {\n if (value.charCodeAt(value.length - 1) === 0) {\n return value.substring(0, value.length - 1);\n }\n return value;\n}\n"],"mappings":";;;;;;;;;;AAEO,IAAMA,KAAK,GAAG;EACnBC,IAAI,EAAE,CAAC;EACPC,IAAI,EAAE,CAAC;EACPC,KAAK,EAAE,CAAC;EACRC,GAAG,EAAE,CAAC;EACNC,KAAK,EAAE,CAAC;EACRC,MAAM,EAAE;AACV,CAAC
|
|
1
|
+
{"version":3,"file":"read-type.js","names":["TYPES","BYTE","CHAR","SHORT","INT","FLOAT","DOUBLE","exports","readType","buffer","type","size","readBytes","trimNull","readChars","readNumber","readInt16","bind","readInt32","readFloat32","readFloat64","Error","concat","num2str","Number","num2bytes","str2num","String","bufferReader","numbers","Array","i","value","charCodeAt","length","substring"],"sources":["../../../src/netcdfjs/read-type.ts"],"sourcesContent":["import {IOBuffer} from '../iobuffer/iobuffer';\n\nexport const TYPES = {\n BYTE: 1,\n CHAR: 2,\n SHORT: 3,\n INT: 4,\n FLOAT: 5,\n DOUBLE: 6\n};\n\n/**\n * Given a type and a size reads the next element\n * @param buffer - Buffer for the file data\n * @param type - Type of the data to read\n * @param size - Size of the element to read\n * @return\n */\nexport function readType(\n buffer: IOBuffer,\n type: number,\n size: number\n): string | number | number[] | Uint8Array {\n switch (type) {\n case TYPES.BYTE:\n return buffer.readBytes(size);\n case TYPES.CHAR:\n return trimNull(buffer.readChars(size));\n case TYPES.SHORT:\n return readNumber(size, buffer.readInt16.bind(buffer));\n case TYPES.INT:\n return readNumber(size, buffer.readInt32.bind(buffer));\n case TYPES.FLOAT:\n return readNumber(size, buffer.readFloat32.bind(buffer));\n case TYPES.DOUBLE:\n return readNumber(size, buffer.readFloat64.bind(buffer));\n /* istanbul ignore next */\n default:\n throw new Error(`NetCDF: non valid type ${type}`);\n }\n}\n\n/**\n * Parse a number into their respective type\n * @param type - integer that represents the type\n * @return parsed value of the type\n */\nexport function num2str(type: number): string {\n switch (Number(type)) {\n case TYPES.BYTE:\n return 'byte';\n case TYPES.CHAR:\n return 'char';\n case TYPES.SHORT:\n return 'short';\n case TYPES.INT:\n return 'int';\n case TYPES.FLOAT:\n return 'float';\n case TYPES.DOUBLE:\n return 'double';\n /* istanbul ignore next */\n default:\n return 'undefined';\n }\n}\n\n/**\n * Parse a number type identifier to his size in bytes\n * @param type - integer that represents the type\n * @return size of the type\n */\nexport function num2bytes(type: number): number {\n switch (Number(type)) {\n case TYPES.BYTE:\n return 1;\n case TYPES.CHAR:\n return 1;\n case TYPES.SHORT:\n return 2;\n case TYPES.INT:\n return 4;\n case TYPES.FLOAT:\n return 4;\n case TYPES.DOUBLE:\n return 8;\n /* istanbul ignore next */\n default:\n return -1;\n }\n}\n\n/**\n * Reverse search of num2str\n * @param type string that represents the type\n * @return parsed value of the type\n */\nexport function str2num(type: string): number {\n switch (String(type)) {\n case 'byte':\n return TYPES.BYTE;\n case 'char':\n return TYPES.CHAR;\n case 'short':\n return TYPES.SHORT;\n case 'int':\n return TYPES.INT;\n case 'float':\n return TYPES.FLOAT;\n case 'double':\n return TYPES.DOUBLE;\n /* istanbul ignore next */\n default:\n return -1;\n }\n}\n\n/**\n * Auxiliary function to read numeric data\n * @param size - Size of the element to read\n * @param bufferReader - Function to read next value\n * @return\n */\nfunction readNumber(size: number, bufferReader: () => number): number | number[] {\n if (size !== 1) {\n const numbers = new Array(size);\n for (let i = 0; i < size; i++) {\n numbers[i] = bufferReader();\n }\n return numbers;\n }\n return bufferReader();\n}\n\n/**\n * Removes null terminate value\n * @param value - String to trim\n * @return - Trimmed string\n */\nfunction trimNull(value: string): string {\n if (value.charCodeAt(value.length - 1) === 0) {\n return value.substring(0, value.length - 1);\n }\n return value;\n}\n"],"mappings":"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"}
|