geotiff 3.0.2 → 3.0.4-beta.0

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.
Files changed (279) hide show
  1. package/dist-browser/geotiff.js +3 -3
  2. package/dist-browser/geotiff.js.map +1 -1
  3. package/dist-module/compression/basedecoder.d.ts +30 -4
  4. package/dist-module/compression/basedecoder.d.ts.map +1 -1
  5. package/dist-module/compression/basedecoder.js +22 -1
  6. package/dist-module/compression/basedecoder.js.map +1 -0
  7. package/dist-module/compression/deflate.d.ts +2 -1
  8. package/dist-module/compression/deflate.d.ts.map +1 -1
  9. package/dist-module/compression/deflate.js +2 -0
  10. package/dist-module/compression/deflate.js.map +1 -0
  11. package/dist-module/compression/index.d.ts +14 -22
  12. package/dist-module/compression/index.d.ts.map +1 -1
  13. package/dist-module/compression/index.js +36 -25
  14. package/dist-module/compression/index.js.map +1 -0
  15. package/dist-module/compression/jpeg.d.ts +55 -15
  16. package/dist-module/compression/jpeg.d.ts.map +1 -1
  17. package/dist-module/compression/jpeg.js +187 -16
  18. package/dist-module/compression/jpeg.js.map +1 -0
  19. package/dist-module/compression/lerc.d.ts +11 -1
  20. package/dist-module/compression/lerc.d.ts.map +1 -1
  21. package/dist-module/compression/lerc.js +16 -4
  22. package/dist-module/compression/lerc.js.map +1 -0
  23. package/dist-module/compression/lzw.d.ts +2 -1
  24. package/dist-module/compression/lzw.d.ts.map +1 -1
  25. package/dist-module/compression/lzw.js +29 -1
  26. package/dist-module/compression/lzw.js.map +1 -0
  27. package/dist-module/compression/packbits.d.ts +2 -1
  28. package/dist-module/compression/packbits.d.ts.map +1 -1
  29. package/dist-module/compression/packbits.js +2 -0
  30. package/dist-module/compression/packbits.js.map +1 -0
  31. package/dist-module/compression/raw.d.ts +2 -1
  32. package/dist-module/compression/raw.d.ts.map +1 -1
  33. package/dist-module/compression/raw.js +2 -0
  34. package/dist-module/compression/raw.js.map +1 -0
  35. package/dist-module/compression/webimage.d.ts +2 -1
  36. package/dist-module/compression/webimage.d.ts.map +1 -1
  37. package/dist-module/compression/webimage.js +5 -0
  38. package/dist-module/compression/webimage.js.map +1 -0
  39. package/dist-module/compression/zstd.d.ts +4 -2
  40. package/dist-module/compression/zstd.d.ts.map +1 -1
  41. package/dist-module/compression/zstd.js +3 -1
  42. package/dist-module/compression/zstd.js.map +1 -0
  43. package/dist-module/dataslice.d.ts +78 -22
  44. package/dist-module/dataslice.d.ts.map +1 -1
  45. package/dist-module/dataslice.js +57 -1
  46. package/dist-module/dataslice.js.map +1 -0
  47. package/dist-module/dataview64.d.ts +71 -14
  48. package/dist-module/dataview64.d.ts.map +1 -1
  49. package/dist-module/dataview64.js +58 -1
  50. package/dist-module/dataview64.js.map +1 -0
  51. package/dist-module/geotiff.d.ts +61 -12
  52. package/dist-module/geotiff.d.ts.map +1 -1
  53. package/dist-module/geotiff.js +73 -14
  54. package/dist-module/geotiff.js.map +1 -0
  55. package/dist-module/geotiffimage.d.ts +41 -15
  56. package/dist-module/geotiffimage.d.ts.map +1 -1
  57. package/dist-module/geotiffimage.js +132 -52
  58. package/dist-module/geotiffimage.js.map +1 -0
  59. package/dist-module/geotiffwriter.d.ts +28 -1
  60. package/dist-module/geotiffwriter.d.ts.map +1 -1
  61. package/dist-module/geotiffwriter.js +206 -84
  62. package/dist-module/geotiffwriter.js.map +1 -0
  63. package/dist-module/globals.d.ts +912 -92
  64. package/dist-module/globals.d.ts.map +1 -1
  65. package/dist-module/globals.js +201 -227
  66. package/dist-module/globals.js.map +1 -0
  67. package/dist-module/imagefiledirectory.d.ts +72 -19
  68. package/dist-module/imagefiledirectory.d.ts.map +1 -1
  69. package/dist-module/imagefiledirectory.js +51 -26
  70. package/dist-module/imagefiledirectory.js.map +1 -0
  71. package/dist-module/logging.d.ts +36 -10
  72. package/dist-module/logging.d.ts.map +1 -1
  73. package/dist-module/logging.js +16 -2
  74. package/dist-module/logging.js.map +1 -0
  75. package/dist-module/pool.d.ts +15 -8
  76. package/dist-module/pool.d.ts.map +1 -1
  77. package/dist-module/pool.js +11 -3
  78. package/dist-module/pool.js.map +1 -0
  79. package/dist-module/predictor.d.ts +10 -1
  80. package/dist-module/predictor.d.ts.map +1 -1
  81. package/dist-module/predictor.js +19 -0
  82. package/dist-module/predictor.js.map +1 -0
  83. package/dist-module/resample.d.ts.map +1 -1
  84. package/dist-module/resample.js +12 -0
  85. package/dist-module/resample.js.map +1 -0
  86. package/dist-module/rgb.js +1 -0
  87. package/dist-module/rgb.js.map +1 -0
  88. package/dist-module/source/arraybuffer.d.ts +7 -4
  89. package/dist-module/source/arraybuffer.d.ts.map +1 -1
  90. package/dist-module/source/arraybuffer.js +15 -1
  91. package/dist-module/source/arraybuffer.js.map +1 -0
  92. package/dist-module/source/basesource.d.ts +11 -6
  93. package/dist-module/source/basesource.d.ts.map +1 -1
  94. package/dist-module/source/basesource.js +7 -4
  95. package/dist-module/source/basesource.js.map +1 -0
  96. package/dist-module/source/blockedsource.d.ts +2 -2
  97. package/dist-module/source/blockedsource.d.ts.map +1 -1
  98. package/dist-module/source/blockedsource.js +8 -5
  99. package/dist-module/source/blockedsource.js.map +1 -0
  100. package/dist-module/source/client/base.d.ts +8 -7
  101. package/dist-module/source/client/base.d.ts.map +1 -1
  102. package/dist-module/source/client/base.js +7 -5
  103. package/dist-module/source/client/base.js.map +1 -0
  104. package/dist-module/source/client/fetch.d.ts +6 -2
  105. package/dist-module/source/client/fetch.d.ts.map +1 -1
  106. package/dist-module/source/client/fetch.js +7 -2
  107. package/dist-module/source/client/fetch.js.map +1 -0
  108. package/dist-module/source/client/http.d.ts +27 -5
  109. package/dist-module/source/client/http.d.ts.map +1 -1
  110. package/dist-module/source/client/http.js +16 -2
  111. package/dist-module/source/client/http.js.map +1 -0
  112. package/dist-module/source/client/xhr.d.ts +22 -3
  113. package/dist-module/source/client/xhr.d.ts.map +1 -1
  114. package/dist-module/source/client/xhr.js +12 -2
  115. package/dist-module/source/client/xhr.js.map +1 -0
  116. package/dist-module/source/file.d.ts +8 -5
  117. package/dist-module/source/file.d.ts.map +1 -1
  118. package/dist-module/source/file.js +40 -8
  119. package/dist-module/source/file.js.map +1 -0
  120. package/dist-module/source/filereader.d.ts +12 -4
  121. package/dist-module/source/filereader.d.ts.map +1 -1
  122. package/dist-module/source/filereader.js +15 -2
  123. package/dist-module/source/filereader.js.map +1 -0
  124. package/dist-module/source/httputils.d.ts +16 -9
  125. package/dist-module/source/httputils.d.ts.map +1 -1
  126. package/dist-module/source/httputils.js +19 -12
  127. package/dist-module/source/httputils.js.map +1 -0
  128. package/dist-module/source/remote.d.ts.map +1 -1
  129. package/dist-module/source/remote.js +19 -7
  130. package/dist-module/source/remote.js.map +1 -0
  131. package/dist-module/utils.d.ts +36 -41
  132. package/dist-module/utils.d.ts.map +1 -1
  133. package/dist-module/utils.js +17 -12
  134. package/dist-module/utils.js.map +1 -0
  135. package/dist-module/worker/create.js +1 -1
  136. package/dist-module/worker/create.js.map +1 -0
  137. package/dist-module/worker/decoder.d.ts +2 -0
  138. package/dist-module/worker/decoder.d.ts.map +1 -0
  139. package/dist-module/worker/decoder.js +21 -0
  140. package/dist-module/worker/decoder.js.map +1 -0
  141. package/dist-node/compression/basedecoder.d.ts +30 -4
  142. package/dist-node/compression/basedecoder.d.ts.map +1 -1
  143. package/dist-node/compression/basedecoder.js +22 -1
  144. package/dist-node/compression/basedecoder.js.map +1 -1
  145. package/dist-node/compression/deflate.d.ts +2 -1
  146. package/dist-node/compression/deflate.d.ts.map +1 -1
  147. package/dist-node/compression/deflate.js +2 -0
  148. package/dist-node/compression/deflate.js.map +1 -1
  149. package/dist-node/compression/index.d.ts +14 -22
  150. package/dist-node/compression/index.d.ts.map +1 -1
  151. package/dist-node/compression/index.js +36 -25
  152. package/dist-node/compression/index.js.map +1 -1
  153. package/dist-node/compression/jpeg.d.ts +55 -16
  154. package/dist-node/compression/jpeg.d.ts.map +1 -1
  155. package/dist-node/compression/jpeg.js +187 -16
  156. package/dist-node/compression/jpeg.js.map +1 -1
  157. package/dist-node/compression/lerc.d.ts +11 -1
  158. package/dist-node/compression/lerc.d.ts.map +1 -1
  159. package/dist-node/compression/lerc.js +16 -4
  160. package/dist-node/compression/lerc.js.map +1 -1
  161. package/dist-node/compression/lzw.d.ts +2 -1
  162. package/dist-node/compression/lzw.d.ts.map +1 -1
  163. package/dist-node/compression/lzw.js +29 -1
  164. package/dist-node/compression/lzw.js.map +1 -1
  165. package/dist-node/compression/packbits.d.ts +2 -1
  166. package/dist-node/compression/packbits.d.ts.map +1 -1
  167. package/dist-node/compression/packbits.js +2 -0
  168. package/dist-node/compression/packbits.js.map +1 -1
  169. package/dist-node/compression/raw.d.ts +2 -1
  170. package/dist-node/compression/raw.d.ts.map +1 -1
  171. package/dist-node/compression/raw.js +2 -0
  172. package/dist-node/compression/raw.js.map +1 -1
  173. package/dist-node/compression/webimage.d.ts +2 -2
  174. package/dist-node/compression/webimage.d.ts.map +1 -1
  175. package/dist-node/compression/webimage.js +5 -0
  176. package/dist-node/compression/webimage.js.map +1 -1
  177. package/dist-node/compression/zstd.d.ts +2 -1
  178. package/dist-node/compression/zstd.d.ts.map +1 -1
  179. package/dist-node/compression/zstd.js +3 -1
  180. package/dist-node/compression/zstd.js.map +1 -1
  181. package/dist-node/dataslice.d.ts +78 -22
  182. package/dist-node/dataslice.d.ts.map +1 -1
  183. package/dist-node/dataslice.js +57 -1
  184. package/dist-node/dataslice.js.map +1 -1
  185. package/dist-node/dataview64.d.ts +71 -14
  186. package/dist-node/dataview64.d.ts.map +1 -1
  187. package/dist-node/dataview64.js +58 -1
  188. package/dist-node/dataview64.js.map +1 -1
  189. package/dist-node/geotiff.d.ts +61 -12
  190. package/dist-node/geotiff.d.ts.map +1 -1
  191. package/dist-node/geotiff.js +75 -15
  192. package/dist-node/geotiff.js.map +1 -1
  193. package/dist-node/geotiffimage.d.ts +41 -15
  194. package/dist-node/geotiffimage.d.ts.map +1 -1
  195. package/dist-node/geotiffimage.js +132 -52
  196. package/dist-node/geotiffimage.js.map +1 -1
  197. package/dist-node/geotiffwriter.d.ts +28 -1
  198. package/dist-node/geotiffwriter.d.ts.map +1 -1
  199. package/dist-node/geotiffwriter.js +206 -84
  200. package/dist-node/geotiffwriter.js.map +1 -1
  201. package/dist-node/globals.d.ts +910 -90
  202. package/dist-node/globals.d.ts.map +1 -1
  203. package/dist-node/globals.js +202 -228
  204. package/dist-node/globals.js.map +1 -1
  205. package/dist-node/imagefiledirectory.d.ts +72 -19
  206. package/dist-node/imagefiledirectory.d.ts.map +1 -1
  207. package/dist-node/imagefiledirectory.js +51 -26
  208. package/dist-node/imagefiledirectory.js.map +1 -1
  209. package/dist-node/logging.d.ts +36 -10
  210. package/dist-node/logging.d.ts.map +1 -1
  211. package/dist-node/logging.js +16 -2
  212. package/dist-node/logging.js.map +1 -1
  213. package/dist-node/pool.d.ts +15 -8
  214. package/dist-node/pool.d.ts.map +1 -1
  215. package/dist-node/pool.js +11 -3
  216. package/dist-node/pool.js.map +1 -1
  217. package/dist-node/predictor.d.ts +10 -1
  218. package/dist-node/predictor.d.ts.map +1 -1
  219. package/dist-node/predictor.js +19 -0
  220. package/dist-node/predictor.js.map +1 -1
  221. package/dist-node/resample.d.ts.map +1 -1
  222. package/dist-node/resample.js +12 -0
  223. package/dist-node/resample.js.map +1 -1
  224. package/dist-node/rgb.js +1 -0
  225. package/dist-node/rgb.js.map +1 -1
  226. package/dist-node/source/arraybuffer.d.ts +7 -4
  227. package/dist-node/source/arraybuffer.d.ts.map +1 -1
  228. package/dist-node/source/arraybuffer.js +15 -1
  229. package/dist-node/source/arraybuffer.js.map +1 -1
  230. package/dist-node/source/basesource.d.ts +11 -6
  231. package/dist-node/source/basesource.d.ts.map +1 -1
  232. package/dist-node/source/basesource.js +7 -4
  233. package/dist-node/source/basesource.js.map +1 -1
  234. package/dist-node/source/blockedsource.d.ts +2 -2
  235. package/dist-node/source/blockedsource.d.ts.map +1 -1
  236. package/dist-node/source/blockedsource.js +8 -5
  237. package/dist-node/source/blockedsource.js.map +1 -1
  238. package/dist-node/source/client/base.d.ts +8 -7
  239. package/dist-node/source/client/base.d.ts.map +1 -1
  240. package/dist-node/source/client/base.js +7 -5
  241. package/dist-node/source/client/base.js.map +1 -1
  242. package/dist-node/source/client/fetch.d.ts +5 -2
  243. package/dist-node/source/client/fetch.d.ts.map +1 -1
  244. package/dist-node/source/client/fetch.js +7 -2
  245. package/dist-node/source/client/fetch.js.map +1 -1
  246. package/dist-node/source/client/http.d.ts +22 -4
  247. package/dist-node/source/client/http.d.ts.map +1 -1
  248. package/dist-node/source/client/http.js +16 -2
  249. package/dist-node/source/client/http.js.map +1 -1
  250. package/dist-node/source/client/xhr.d.ts +23 -3
  251. package/dist-node/source/client/xhr.d.ts.map +1 -1
  252. package/dist-node/source/client/xhr.js +12 -2
  253. package/dist-node/source/client/xhr.js.map +1 -1
  254. package/dist-node/source/file.d.ts +8 -5
  255. package/dist-node/source/file.d.ts.map +1 -1
  256. package/dist-node/source/file.js +40 -8
  257. package/dist-node/source/file.js.map +1 -1
  258. package/dist-node/source/filereader.d.ts +12 -4
  259. package/dist-node/source/filereader.d.ts.map +1 -1
  260. package/dist-node/source/filereader.js +15 -2
  261. package/dist-node/source/filereader.js.map +1 -1
  262. package/dist-node/source/httputils.d.ts +16 -9
  263. package/dist-node/source/httputils.d.ts.map +1 -1
  264. package/dist-node/source/httputils.js +19 -12
  265. package/dist-node/source/httputils.js.map +1 -1
  266. package/dist-node/source/remote.d.ts.map +1 -1
  267. package/dist-node/source/remote.js +19 -7
  268. package/dist-node/source/remote.js.map +1 -1
  269. package/dist-node/utils.d.ts +9 -8
  270. package/dist-node/utils.d.ts.map +1 -1
  271. package/dist-node/utils.js +17 -12
  272. package/dist-node/utils.js.map +1 -1
  273. package/dist-node/worker/create.js +1 -1
  274. package/dist-node/worker/create.js.map +1 -1
  275. package/dist-node/worker/decoder.d.ts +2 -0
  276. package/dist-node/worker/decoder.d.ts.map +1 -0
  277. package/dist-node/worker/decoder.js +24 -0
  278. package/dist-node/worker/decoder.js.map +1 -0
  279. package/package.json +5 -3
@@ -6,15 +6,42 @@
6
6
  */
7
7
  import { tags, fieldTagTypes, fieldTypes, geoKeyNames } from './globals.js';
8
8
  import { assign, endsWith, forEach, invert, times, typeMap, isTypedUintArray, isTypedIntArray, isTypedFloatArray } from './utils.js';
9
+ /** @import {GeotiffWriterMetadata} from './geotiff.js' */
10
+ /** @typedef {(buff: Uint8Array, p: number) => number} Read */
9
11
  const tagName2Code = tags;
10
12
  const geoKeyName2Code = invert(geoKeyNames);
13
+ /** @type {Record<number|string, keyof fieldTagTypes>} */
11
14
  const name2code = {};
12
15
  assign(name2code, tagName2Code);
13
16
  assign(name2code, geoKeyName2Code);
14
17
  const typeName2byte = fieldTypes;
15
18
  // config variables
16
19
  const numBytesInIfd = 1000;
20
+ /**
21
+ * @typedef {Object} BinBE
22
+ * @property {(data: Uint8Array, o: number) => number} nextZero
23
+ * @property {Read} readUshort
24
+ * @property {Read} readShort
25
+ * @property {Read} readInt
26
+ * @property {Read} readUint
27
+ * @property {(buff: Uint8Array, p: number, l: Array<number>) => string} readASCII
28
+ * @property {Read} readFloat
29
+ * @property {Read} readDouble
30
+ * @property {(buff: Uint8Array, p: number, n: number) => void} writeUshort
31
+ * @property {(buff: Uint8Array, p: number, n: number) => void} writeUint
32
+ * @property {(buff: Uint8Array, p: number, s: string) => void} writeASCII
33
+ * @property {Uint8Array} ui8
34
+ * @property {Float64Array} fl64
35
+ * @property {Float32Array} fl32
36
+ * @property {Uint32Array} ui32
37
+ * @property {Int32Array} i32
38
+ * @property {Int16Array} i16
39
+ * @property {(buff: Uint8Array, p: number, n: number) => void} writeDouble
40
+ */
41
+ const ui8 = new Uint8Array(8);
42
+ /** @type {BinBE} */
17
43
  const _binBE = {
44
+ /** @type {Read} */
18
45
  nextZero: (data, o) => {
19
46
  let oincr = o;
20
47
  while (data[oincr] !== 0) {
@@ -22,15 +49,18 @@ const _binBE = {
22
49
  }
23
50
  return oincr;
24
51
  },
52
+ /** @type {Read} */
25
53
  readUshort: (buff, p) => {
26
54
  return (buff[p] << 8) | buff[p + 1];
27
55
  },
56
+ /** @type {Read} */
28
57
  readShort: (buff, p) => {
29
58
  const a = _binBE.ui8;
30
59
  a[0] = buff[p + 1];
31
60
  a[1] = buff[p + 0];
32
61
  return _binBE.i16[0];
33
62
  },
63
+ /** @type {Read} */
34
64
  readInt: (buff, p) => {
35
65
  const a = _binBE.ui8;
36
66
  a[0] = buff[p + 3];
@@ -39,6 +69,7 @@ const _binBE = {
39
69
  a[3] = buff[p + 0];
40
70
  return _binBE.i32[0];
41
71
  },
72
+ /** @type {Read} */
42
73
  readUint: (buff, p) => {
43
74
  const a = _binBE.ui8;
44
75
  a[0] = buff[p + 3];
@@ -47,9 +78,16 @@ const _binBE = {
47
78
  a[3] = buff[p + 0];
48
79
  return _binBE.ui32[0];
49
80
  },
81
+ /**
82
+ * @param {Uint8Array} buff
83
+ * @param {number} p
84
+ * @param {Array<number>} l
85
+ * @returns {string}
86
+ */
50
87
  readASCII: (buff, p, l) => {
51
88
  return l.map((i) => String.fromCharCode(buff[p + i])).join('');
52
89
  },
90
+ /** @type {Read} */
53
91
  readFloat: (buff, p) => {
54
92
  const a = _binBE.ui8;
55
93
  times(4, (i) => {
@@ -57,6 +95,7 @@ const _binBE = {
57
95
  });
58
96
  return _binBE.fl32[0];
59
97
  },
98
+ /** @type {Read} */
60
99
  readDouble: (buff, p) => {
61
100
  const a = _binBE.ui8;
62
101
  times(8, (i) => {
@@ -64,50 +103,74 @@ const _binBE = {
64
103
  });
65
104
  return _binBE.fl64[0];
66
105
  },
106
+ /**
107
+ * @param {Uint8Array} buff
108
+ * @param {number} p
109
+ * @param {number} n
110
+ */
67
111
  writeUshort: (buff, p, n) => {
68
112
  buff[p] = (n >> 8) & 255;
69
113
  buff[p + 1] = n & 255;
70
114
  },
115
+ /**
116
+ * @param {Uint8Array} buff
117
+ * @param {number} p
118
+ * @param {number} n
119
+ */
71
120
  writeUint: (buff, p, n) => {
72
121
  buff[p] = (n >> 24) & 255;
73
122
  buff[p + 1] = (n >> 16) & 255;
74
123
  buff[p + 2] = (n >> 8) & 255;
75
124
  buff[p + 3] = (n >> 0) & 255;
76
125
  },
126
+ /**
127
+ * @param {Uint8Array} buff
128
+ * @param {number} p
129
+ * @param {string} s
130
+ */
77
131
  writeASCII: (buff, p, s) => {
78
132
  times(s.length, (i) => {
79
133
  buff[p + i] = s.charCodeAt(i);
80
134
  });
81
135
  },
82
- ui8: new Uint8Array(8),
83
- };
84
- _binBE.fl64 = new Float64Array(_binBE.ui8.buffer);
85
- _binBE.writeDouble = (buff, p, n) => {
86
- _binBE.fl64[0] = n;
87
- times(8, (i) => {
88
- buff[p + i] = _binBE.ui8[7 - i];
89
- });
136
+ ui8,
137
+ fl64: new Float64Array(ui8.buffer),
138
+ fl32: new Float32Array(ui8.buffer),
139
+ ui32: new Uint32Array(ui8.buffer),
140
+ i32: new Int32Array(ui8.buffer),
141
+ i16: new Int16Array(ui8.buffer),
142
+ /**
143
+ * @param {Uint8Array} buff
144
+ * @param {number} p
145
+ * @param {number} n
146
+ */
147
+ writeDouble: (buff, p, n) => {
148
+ _binBE.fl64[0] = n;
149
+ times(8, (i) => {
150
+ buff[p + i] = _binBE.ui8[7 - i];
151
+ });
152
+ },
90
153
  };
154
+ /**
155
+ * @param {BinBE} bin
156
+ * @param {Uint8Array} data
157
+ * @param {number} _offset
158
+ * @param {Record<keyof fieldTagTypes, any>} ifd
159
+ * @returns {[number, number]}
160
+ */
91
161
  const _writeIFD = (bin, data, _offset, ifd) => {
92
162
  let offset = _offset;
93
- const keys = Object.keys(ifd).filter((key) => {
163
+ const keys = /** @type {Array<keyof fieldTagTypes>} */ (Object.keys(ifd).filter((key) => {
94
164
  return key !== undefined && key !== null && key !== 'undefined';
95
- });
165
+ }).map(Number));
96
166
  bin.writeUshort(data, offset, keys.length);
97
167
  offset += 2;
98
168
  let eoff = offset + (12 * keys.length) + 4;
99
169
  for (const key of keys) {
100
- let tag = null;
101
- if (typeof key === 'number') {
102
- tag = key;
103
- }
104
- else if (typeof key === 'string') {
105
- tag = parseInt(key, 10);
106
- }
107
- const typeName = fieldTagTypes[tag];
170
+ const typeName = /** @type {keyof typeName2byte} */ (fieldTagTypes[key]);
108
171
  const typeNum = typeName2byte[typeName];
109
172
  if (typeName == null || typeName === undefined || typeof typeName === 'undefined') {
110
- throw new Error(`unknown type of tag: ${tag}`);
173
+ throw new Error(`unknown type of tag: ${key}`);
111
174
  }
112
175
  let val = ifd[key];
113
176
  if (val === undefined) {
@@ -120,7 +183,7 @@ const _writeIFD = (bin, data, _offset, ifd) => {
120
183
  val += '\u0000';
121
184
  }
122
185
  const num = val.length;
123
- bin.writeUshort(data, offset, tag);
186
+ bin.writeUshort(data, offset, key);
124
187
  offset += 2;
125
188
  bin.writeUshort(data, offset, typeNum);
126
189
  offset += 2;
@@ -164,6 +227,10 @@ const _writeIFD = (bin, data, _offset, ifd) => {
164
227
  }
165
228
  return [offset, eoff];
166
229
  };
230
+ /**
231
+ * @param {Array<Record<keyof fieldTagTypes, unknown>>} ifds
232
+ * @returns {ArrayBuffer}
233
+ */
167
234
  const encodeIfds = (ifds) => {
168
235
  const data = new Uint8Array(numBytesInIfd);
169
236
  let offset = 4;
@@ -195,6 +262,13 @@ const encodeIfds = (ifds) => {
195
262
  }
196
263
  return result.buffer;
197
264
  };
265
+ /**
266
+ * @param {Array<number>|import('./geotiff.js').TypedArray} values
267
+ * @param {number} width
268
+ * @param {number} height
269
+ * @param {GeotiffWriterMetadata} metadata
270
+ * @returns {ArrayBuffer}
271
+ */
198
272
  const encodeImage = (values, width, height, metadata) => {
199
273
  if (height === undefined || height === null) {
200
274
  throw new Error(`you passed into encodeImage a width of type ${height}`);
@@ -202,6 +276,7 @@ const encodeImage = (values, width, height, metadata) => {
202
276
  if (width === undefined || width === null) {
203
277
  throw new Error(`you passed into encodeImage a width of type ${width}`);
204
278
  }
279
+ /** @type {Record<number|string, Array<number|string>|number|string|undefined>} */
205
280
  const ifd = {
206
281
  256: [width], // ImageWidth
207
282
  257: [height], // ImageLength
@@ -212,20 +287,19 @@ const encodeImage = (values, width, height, metadata) => {
212
287
  if (metadata) {
213
288
  for (const i in metadata) {
214
289
  if (metadata.hasOwnProperty(i)) {
215
- ifd[i] = metadata[i];
290
+ ifd[i] = metadata[ /** @type {keyof GeotiffWriterMetadata} */(i)];
216
291
  }
217
292
  }
218
293
  }
219
294
  const prfx = new Uint8Array(encodeIfds([ifd]));
220
- const samplesPerPixel = ifd[tags.SamplesPerPixel];
221
- const dataType = values.constructor.name;
295
+ const dataType = /** @type {keyof typeMap} */ (values.constructor.name);
222
296
  const TypedArray = typeMap[dataType];
223
297
  // default for Float64
224
298
  let elementSize = 8;
225
299
  if (TypedArray) {
226
300
  elementSize = TypedArray.BYTES_PER_ELEMENT;
227
301
  }
228
- const data = new Uint8Array(numBytesInIfd + (values.length * elementSize * samplesPerPixel));
302
+ const data = new Uint8Array(numBytesInIfd + (values.length * elementSize));
229
303
  times(prfx.length, (i) => {
230
304
  data[i] = prfx[i];
231
305
  });
@@ -259,7 +333,13 @@ const encodeImage = (values, width, height, metadata) => {
259
333
  });
260
334
  return data.buffer;
261
335
  };
336
+ /**
337
+ * @template T
338
+ * @param {Record<number|string, T>} input
339
+ * @returns {Record<number|string, T>}
340
+ */
262
341
  const convertToTids = (input) => {
342
+ /** @type {Record<number|string, T>} */
263
343
  const result = {};
264
344
  for (const key in input) {
265
345
  if (key !== 'StripOffsets') {
@@ -271,38 +351,63 @@ const convertToTids = (input) => {
271
351
  }
272
352
  return result;
273
353
  };
354
+ /**
355
+ * @template T
356
+ * @param {T} input
357
+ * @returns {T extends any[] ? T : T[]}
358
+ */
274
359
  const toArray = (input) => {
275
360
  if (Array.isArray(input)) {
276
- return input;
361
+ return /** @type {T extends any[] ? T : T[]} */ (input);
277
362
  }
278
- return [input];
363
+ return /** @type {T extends any[] ? T : T[]} */ ([input]);
364
+ };
365
+ /** @type {Partial<GeotiffWriterMetadata>} */
366
+ const metadataDefaults = {
367
+ Compression: 1, // no compression
368
+ PlanarConfiguration: 1,
369
+ ExtraSamples: 0,
279
370
  };
280
- const metadataDefaults = [
281
- ['Compression', 1], // no compression
282
- ['PlanarConfiguration', 1],
283
- ['ExtraSamples', 0],
284
- ];
371
+ /**
372
+ * @param {Array<number>|Array<Array<Array<number>>>|import('./geotiff.js').TypedArray} data
373
+ * @param {GeotiffWriterMetadata} metadata
374
+ * @returns {ArrayBuffer}
375
+ */
285
376
  export function writeGeotiff(data, metadata) {
286
377
  const isFlattened = typeof data[0] === 'number';
378
+ /** @type {number} */
287
379
  let height;
380
+ /** @type {number} */
288
381
  let numBands;
382
+ /** @type {number} */
289
383
  let width;
384
+ /** @type {Array<number>} */
290
385
  let flattenedValues;
291
386
  if (isFlattened) {
292
- height = metadata.height || metadata.ImageLength;
293
- width = metadata.width || metadata.ImageWidth;
294
- numBands = data.length / (height * width);
295
- flattenedValues = data;
387
+ const arrayFlat = /** @type {Array<number>} */ (data);
388
+ const metaHeight = metadata.height || metadata.ImageLength;
389
+ if (metaHeight === undefined || typeof metaHeight !== 'number') {
390
+ throw new Error('height is required to be a number in metadata if data is a flat array');
391
+ }
392
+ height = metaHeight;
393
+ const metaWidth = metadata.width || metadata.ImageWidth;
394
+ if (metaWidth === undefined || typeof metaWidth !== 'number') {
395
+ throw new Error('width is required to be a number in metadata if data is a flat array');
396
+ }
397
+ width = metaWidth;
398
+ numBands = arrayFlat.length / (height * width);
399
+ flattenedValues = arrayFlat;
296
400
  }
297
401
  else {
298
- numBands = data.length;
299
- height = data[0].length;
300
- width = data[0][0].length;
402
+ const array3d = /** @type {Array<Array<Array<number>>>} */ (data);
403
+ numBands = array3d.length;
404
+ height = array3d[0].length;
405
+ width = array3d[0][0].length;
301
406
  flattenedValues = [];
302
407
  times(height, (rowIndex) => {
303
408
  times(width, (columnIndex) => {
304
409
  times(numBands, (bandIndex) => {
305
- flattenedValues.push(data[bandIndex][rowIndex][columnIndex]);
410
+ flattenedValues.push(array3d[bandIndex][rowIndex][columnIndex]);
306
411
  });
307
412
  });
308
413
  });
@@ -319,36 +424,42 @@ export function writeGeotiff(data, metadata) {
319
424
  }
320
425
  metadata.BitsPerSample = times(numBands, () => bitsPerSample);
321
426
  }
322
- metadataDefaults.forEach((tag) => {
323
- const key = tag[0];
324
- if (!metadata[key]) {
325
- const value = tag[1];
326
- metadata[key] = value;
327
- }
328
- });
427
+ const finalMetadata = metadata;
428
+ if (!('Compression' in finalMetadata)) {
429
+ finalMetadata.Compression = metadataDefaults.Compression;
430
+ }
431
+ if (!('PlanarConfiguration' in finalMetadata)) {
432
+ finalMetadata.PlanarConfiguration = metadataDefaults.PlanarConfiguration;
433
+ }
434
+ if (!('ExtraSamples' in finalMetadata)) {
435
+ finalMetadata.ExtraSamples = metadataDefaults.ExtraSamples;
436
+ }
329
437
  // The color space of the image data.
330
438
  // 1=black is zero and 2=RGB.
331
- if (!metadata.PhotometricInterpretation) {
332
- metadata.PhotometricInterpretation = metadata.BitsPerSample.length === 3 ? 2 : 1;
439
+ if (!finalMetadata.PhotometricInterpretation) {
440
+ if (!Array.isArray(finalMetadata.BitsPerSample)) {
441
+ throw new Error('BitsPerSample must be an array when PhotometricInterpretation is not provided');
442
+ }
443
+ finalMetadata.PhotometricInterpretation = finalMetadata.BitsPerSample.length === 3 ? 2 : 1;
333
444
  }
334
445
  // The number of components per pixel.
335
- if (!metadata.SamplesPerPixel) {
336
- metadata.SamplesPerPixel = [numBands];
446
+ if (!finalMetadata.SamplesPerPixel) {
447
+ finalMetadata.SamplesPerPixel = [numBands];
337
448
  }
338
- if (!metadata.StripByteCounts) {
449
+ if (!finalMetadata.StripByteCounts) {
339
450
  // we are only writing one strip
340
451
  // default for Float64
341
452
  let elementSize = 8;
342
453
  if (ArrayBuffer.isView(flattenedValues)) {
343
454
  elementSize = Object.getPrototypeOf(flattenedValues).BYTES_PER_ELEMENT;
344
455
  }
345
- metadata.StripByteCounts = [numBands * elementSize * height * width];
456
+ finalMetadata.StripByteCounts = [numBands * elementSize * height * width];
346
457
  }
347
- if (!metadata.ModelPixelScale && !metadata.ModelTransformation) {
458
+ if (!finalMetadata.ModelPixelScale && !finalMetadata.ModelTransformation) {
348
459
  // assumes raster takes up exactly the whole globe
349
- metadata.ModelPixelScale = [360 / width, 180 / height, 0];
460
+ finalMetadata.ModelPixelScale = [360 / width, 180 / height, 0];
350
461
  }
351
- if (!metadata.SampleFormat) {
462
+ if (!finalMetadata.SampleFormat) {
352
463
  let sampleFormat = 1;
353
464
  if (isTypedFloatArray(flattenedValues)) {
354
465
  sampleFormat = 3;
@@ -359,49 +470,59 @@ export function writeGeotiff(data, metadata) {
359
470
  if (isTypedUintArray(flattenedValues)) {
360
471
  sampleFormat = 1;
361
472
  }
362
- metadata.SampleFormat = times(numBands, () => sampleFormat);
473
+ finalMetadata.SampleFormat = times(numBands, () => sampleFormat);
363
474
  }
364
475
  // if didn't pass in projection information, assume the popular 4326 "geographic projection"
365
- if (!metadata.hasOwnProperty('GeographicTypeGeoKey') && !metadata.hasOwnProperty('ProjectedCSTypeGeoKey')) {
366
- metadata.GeographicTypeGeoKey = 4326;
367
- if (!metadata.ModelTransformation) {
368
- metadata.ModelTiepoint = [0, 0, 0, -180, 90, 0]; // raster fits whole globe
476
+ if (!finalMetadata.hasOwnProperty('GeographicTypeGeoKey') && !finalMetadata.hasOwnProperty('ProjectedCSTypeGeoKey')) {
477
+ finalMetadata.GeographicTypeGeoKey = 4326;
478
+ if (!finalMetadata.ModelTransformation) {
479
+ finalMetadata.ModelTiepoint = [0, 0, 0, -180, 90, 0]; // raster fits whole globe
369
480
  }
370
- metadata.GeogCitationGeoKey = 'WGS 84';
371
- metadata.GTModelTypeGeoKey = 2;
481
+ finalMetadata.GeogCitationGeoKey = 'WGS 84';
482
+ finalMetadata.GTModelTypeGeoKey = 2;
372
483
  }
373
- const geoKeys = Object.keys(metadata)
484
+ const geoKeys = Object.keys(finalMetadata)
374
485
  .filter((key) => endsWith(key, 'GeoKey'))
375
486
  .sort((a, b) => name2code[a] - name2code[b]);
376
487
  // If not provided, build GeoKeyDirectory as well as GeoAsciiParamsTag and GeoDoubleParamsTag
377
488
  // if GeoAsciiParams/GeoDoubleParams were passed in, we assume offsets are already correct
378
489
  // Spec http://geotiff.maptools.org/spec/geotiff2.4.html
379
- if (!metadata.GeoKeyDirectory) {
490
+ if (!finalMetadata.GeoKeyDirectory) {
380
491
  // Only build ASCII / DOUBLE params if not provided
381
- let geoAsciiParams = metadata.GeoAsciiParams || '';
492
+ let geoAsciiParams = finalMetadata.GeoAsciiParams || '';
493
+ if (typeof geoAsciiParams !== 'string') {
494
+ throw new Error('GeoAsciiParams must be a string if provided');
495
+ }
382
496
  let currentAsciiOffset = geoAsciiParams.length;
383
- const geoDoubleParams = metadata.GeoDoubleParams || [];
497
+ const geoDoubleParams = finalMetadata.GeoDoubleParams || [];
498
+ if (!Array.isArray(geoDoubleParams)) {
499
+ throw new Error('GeoDoubleParams must be an array if provided');
500
+ }
384
501
  let currentDoubleIndex = geoDoubleParams.length;
385
502
  // Since geoKeys already sorted and filtered, do a single pass to append to corresponding directory for SHORT/ASCII/DOUBLE
386
503
  const GeoKeyDirectory = [1, 1, 0, 0];
387
504
  let validKeys = 0;
388
505
  geoKeys.forEach((geoKey) => {
389
- const KeyID = Number(name2code[geoKey]);
506
+ const KeyID = name2code[geoKey];
390
507
  const tagType = fieldTagTypes[KeyID];
391
- const val = metadata[geoKey];
508
+ const val = finalMetadata[ /** @type {keyof import('./geotiff.js').GeotiffWriterMetadata} */(geoKey)];
392
509
  if (val === undefined) {
393
510
  return;
394
511
  }
395
512
  let Count;
396
513
  let TIFFTagLocation;
514
+ /** @type {number} */
397
515
  let valueOffset;
398
516
  if (tagType === 'SHORT') {
399
517
  Count = 1;
400
518
  TIFFTagLocation = 0;
519
+ if (typeof val !== 'number') {
520
+ throw new Error(`GeoKey ${geoKey} with type SHORT must have a number value`);
521
+ }
401
522
  valueOffset = val;
402
523
  }
403
524
  else if (tagType === 'ASCII') {
404
- if (!metadata.GeoAsciiParams) {
525
+ if (!finalMetadata.GeoAsciiParams) {
405
526
  const valStr = `${val.toString()}\u0000`;
406
527
  TIFFTagLocation = Number(name2code.GeoAsciiParams); // 34737
407
528
  valueOffset = currentAsciiOffset;
@@ -414,15 +535,15 @@ export function writeGeotiff(data, metadata) {
414
535
  }
415
536
  }
416
537
  else if (tagType === 'DOUBLE') {
417
- if (!metadata.GeoDoubleParams) {
538
+ if (!finalMetadata.GeoDoubleParams) {
418
539
  const arr = toArray(val);
419
540
  TIFFTagLocation = Number(name2code.GeoDoubleParams); // 34736
420
541
  valueOffset = currentDoubleIndex;
421
542
  Count = arr.length;
422
- arr.forEach((v) => {
543
+ for (const v of arr) {
423
544
  geoDoubleParams.push(Number(v));
424
545
  currentDoubleIndex++;
425
- });
546
+ }
426
547
  }
427
548
  else {
428
549
  return;
@@ -437,21 +558,21 @@ export function writeGeotiff(data, metadata) {
437
558
  });
438
559
  // Write GeoKeyDirectory, GeoAsciiParams, GeoDoubleParams
439
560
  GeoKeyDirectory[3] = validKeys;
440
- metadata.GeoKeyDirectory = GeoKeyDirectory;
441
- if (!metadata.GeoAsciiParams && geoAsciiParams.length > 0) {
442
- metadata.GeoAsciiParams = geoAsciiParams;
561
+ finalMetadata.GeoKeyDirectory = GeoKeyDirectory;
562
+ if (!finalMetadata.GeoAsciiParams && geoAsciiParams.length > 0) {
563
+ finalMetadata.GeoAsciiParams = geoAsciiParams;
443
564
  }
444
- if (!metadata.GeoDoubleParams && geoDoubleParams.length > 0) {
445
- metadata.GeoDoubleParams = geoDoubleParams;
565
+ if (!finalMetadata.GeoDoubleParams && geoDoubleParams.length > 0) {
566
+ finalMetadata.GeoDoubleParams = geoDoubleParams;
446
567
  }
447
568
  }
448
569
  // cleanup original GeoKeys metadata, because stored in GeoKeyDirectory tag
449
570
  for (const geoKey of geoKeys) {
450
- if (metadata.hasOwnProperty(geoKey)) {
451
- delete metadata[geoKey];
571
+ if (finalMetadata.hasOwnProperty(geoKey)) {
572
+ delete finalMetadata[ /** @type {keyof import('./geotiff.js').GeotiffWriterMetadata} */(geoKey)];
452
573
  }
453
574
  }
454
- [
575
+ /** @type {const} */ ([
455
576
  'Compression',
456
577
  'ExtraSamples',
457
578
  'GeographicTypeGeoKey',
@@ -468,12 +589,13 @@ export function writeGeotiff(data, metadata) {
468
589
  'XPosition',
469
590
  'YPosition',
470
591
  'RowsPerStrip',
471
- ].forEach((name) => {
472
- if (metadata[name]) {
473
- metadata[name] = toArray(metadata[name]);
592
+ ]).forEach((name) => {
593
+ if (finalMetadata[name]) {
594
+ finalMetadata[name] = toArray(finalMetadata[name]);
474
595
  }
475
596
  });
476
- const encodedMetadata = convertToTids(metadata);
597
+ const encodedMetadata = convertToTids(finalMetadata);
477
598
  const outputImage = encodeImage(flattenedValues, width, height, encodedMetadata);
478
599
  return outputImage;
479
600
  }
601
+ //# sourceMappingURL=geotiffwriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geotiffwriter.js","sourceRoot":"","sources":["../src/geotiffwriter.js"],"names":[],"mappings":"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"}