@loaders.gl/arrow 4.0.1 → 4.0.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.
Files changed (57) hide show
  1. package/dist/arrow-worker.js +33 -25
  2. package/dist/arrow-writer.d.ts +2 -2
  3. package/dist/arrow-writer.d.ts.map +1 -1
  4. package/dist/arrow-writer.js +6 -3
  5. package/dist/arrow-writer.js.map +1 -1
  6. package/dist/dist.dev.js +60 -29
  7. package/dist/geoarrow/convert-geoarrow-to-binary-geometry.d.ts +18 -2
  8. package/dist/geoarrow/convert-geoarrow-to-binary-geometry.d.ts.map +1 -1
  9. package/dist/geoarrow/convert-geoarrow-to-binary-geometry.js +18 -19
  10. package/dist/geoarrow/convert-geoarrow-to-binary-geometry.js.map +1 -1
  11. package/dist/geoarrow/convert-geoarrow-to-geojson.js.map +1 -1
  12. package/dist/geoarrow/get-arrow-bounds.d.ts.map +1 -1
  13. package/dist/geoarrow/get-arrow-bounds.js +1 -1
  14. package/dist/geoarrow/get-arrow-bounds.js.map +1 -1
  15. package/dist/index.cjs +177 -137
  16. package/dist/index.d.ts +2 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +2 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/lib/arrow-table-batch.d.ts +2 -2
  21. package/dist/lib/arrow-table-batch.d.ts.map +1 -1
  22. package/dist/lib/arrow-table-batch.js +7 -7
  23. package/dist/lib/arrow-table-batch.js.map +1 -1
  24. package/dist/lib/arrow-table.d.ts +3 -3
  25. package/dist/lib/arrow-table.d.ts.map +1 -1
  26. package/dist/lib/arrow-table.js.map +1 -1
  27. package/dist/lib/encode-arrow.js +5 -5
  28. package/dist/lib/encode-arrow.js.map +1 -1
  29. package/dist/lib/parse-arrow-in-batches.js +3 -3
  30. package/dist/lib/parse-arrow-in-batches.js.map +1 -1
  31. package/dist/lib/parse-arrow-sync.js +2 -2
  32. package/dist/lib/parse-arrow-sync.js.map +1 -1
  33. package/dist/schema/arrow-type-utils.d.ts +2 -2
  34. package/dist/schema/arrow-type-utils.d.ts.map +1 -1
  35. package/dist/schema/arrow-type-utils.js +9 -9
  36. package/dist/schema/arrow-type-utils.js.map +1 -1
  37. package/dist/schema/convert-arrow-schema.d.ts +7 -7
  38. package/dist/schema/convert-arrow-schema.d.ts.map +1 -1
  39. package/dist/schema/convert-arrow-schema.js +113 -86
  40. package/dist/schema/convert-arrow-schema.js.map +1 -1
  41. package/dist/tables/convert-arrow-to-table.d.ts +2 -2
  42. package/dist/tables/convert-arrow-to-table.d.ts.map +1 -1
  43. package/dist/tables/convert-arrow-to-table.js.map +1 -1
  44. package/package.json +5 -5
  45. package/src/arrow-writer.ts +8 -5
  46. package/src/geoarrow/convert-geoarrow-to-binary-geometry.ts +26 -26
  47. package/src/geoarrow/convert-geoarrow-to-geojson.ts +7 -7
  48. package/src/geoarrow/get-arrow-bounds.ts +1 -2
  49. package/src/index.ts +6 -1
  50. package/src/lib/arrow-table-batch.ts +13 -23
  51. package/src/lib/arrow-table.ts +3 -3
  52. package/src/lib/encode-arrow.ts +8 -8
  53. package/src/lib/parse-arrow-in-batches.ts +4 -4
  54. package/src/lib/parse-arrow-sync.ts +2 -2
  55. package/src/schema/arrow-type-utils.ts +10 -29
  56. package/src/schema/convert-arrow-schema.ts +126 -145
  57. package/src/tables/convert-arrow-to-table.ts +2 -2
@@ -42,61 +42,69 @@
42
42
  }
43
43
 
44
44
  // ../worker-utils/src/lib/worker-farm/worker-body.ts
45
- function getParentPort() {
45
+ async function getParentPort() {
46
46
  let parentPort;
47
47
  try {
48
48
  eval("globalThis.parentPort = require('worker_threads').parentPort");
49
49
  parentPort = globalThis.parentPort;
50
50
  } catch {
51
+ try {
52
+ eval("globalThis.workerThreadsPromise = import('worker_threads')");
53
+ const workerThreads = await globalThis.workerThreadsPromise;
54
+ parentPort = workerThreads.parentPort;
55
+ } catch (error) {
56
+ console.error(error.message);
57
+ }
51
58
  }
52
59
  return parentPort;
53
60
  }
54
61
  var onMessageWrapperMap = /* @__PURE__ */ new Map();
55
62
  var WorkerBody = class {
56
63
  /** Check that we are actually in a worker thread */
57
- static inWorkerThread() {
58
- return typeof self !== "undefined" || Boolean(getParentPort());
64
+ static async inWorkerThread() {
65
+ return typeof self !== "undefined" || Boolean(await getParentPort());
59
66
  }
60
67
  /*
61
68
  * (type: WorkerMessageType, payload: WorkerMessagePayload) => any
62
69
  */
63
70
  static set onmessage(onMessage) {
64
- function handleMessage(message) {
65
- const parentPort3 = getParentPort();
66
- const { type, payload } = parentPort3 ? message : message.data;
71
+ async function handleMessage(message) {
72
+ const parentPort2 = await getParentPort();
73
+ const { type, payload } = parentPort2 ? message : message.data;
67
74
  onMessage(type, payload);
68
75
  }
69
- const parentPort2 = getParentPort();
70
- if (parentPort2) {
71
- parentPort2.on("message", handleMessage);
72
- parentPort2.on("exit", () => console.debug("Node worker closing"));
73
- } else {
74
- globalThis.onmessage = handleMessage;
75
- }
76
+ getParentPort().then((parentPort2) => {
77
+ if (parentPort2) {
78
+ parentPort2.on("message", handleMessage);
79
+ parentPort2.on("exit", () => console.debug("Node worker closing"));
80
+ } else {
81
+ globalThis.onmessage = handleMessage;
82
+ }
83
+ });
76
84
  }
77
- static addEventListener(onMessage) {
85
+ static async addEventListener(onMessage) {
78
86
  let onMessageWrapper = onMessageWrapperMap.get(onMessage);
79
87
  if (!onMessageWrapper) {
80
- onMessageWrapper = (message) => {
88
+ onMessageWrapper = async (message) => {
81
89
  if (!isKnownMessage(message)) {
82
90
  return;
83
91
  }
84
- const parentPort3 = getParentPort();
92
+ const parentPort3 = await getParentPort();
85
93
  const { type, payload } = parentPort3 ? message : message.data;
86
94
  onMessage(type, payload);
87
95
  };
88
96
  }
89
- const parentPort2 = getParentPort();
97
+ const parentPort2 = await getParentPort();
90
98
  if (parentPort2) {
91
99
  console.error("not implemented");
92
100
  } else {
93
101
  globalThis.addEventListener("message", onMessageWrapper);
94
102
  }
95
103
  }
96
- static removeEventListener(onMessage) {
104
+ static async removeEventListener(onMessage) {
97
105
  const onMessageWrapper = onMessageWrapperMap.get(onMessage);
98
106
  onMessageWrapperMap.delete(onMessage);
99
- const parentPort2 = getParentPort();
107
+ const parentPort2 = await getParentPort();
100
108
  if (parentPort2) {
101
109
  console.error("not implemented");
102
110
  } else {
@@ -108,10 +116,10 @@
108
116
  * @param type
109
117
  * @param payload
110
118
  */
111
- static postMessage(type, payload) {
119
+ static async postMessage(type, payload) {
112
120
  const data = { source: "loaders.gl", type, payload };
113
121
  const transferList = getTransferList(payload);
114
- const parentPort2 = getParentPort();
122
+ const parentPort2 = await getParentPort();
115
123
  if (parentPort2) {
116
124
  parentPort2.postMessage(data, transferList);
117
125
  } else {
@@ -126,8 +134,8 @@
126
134
 
127
135
  // ../loader-utils/src/lib/worker-loader-utils/create-loader-worker.ts
128
136
  var requestId = 0;
129
- function createLoaderWorker(loader) {
130
- if (!WorkerBody.inWorkerThread()) {
137
+ async function createLoaderWorker(loader) {
138
+ if (!await WorkerBody.inWorkerThread()) {
131
139
  return;
132
140
  }
133
141
  WorkerBody.onmessage = async (type, payload) => {
@@ -886,7 +894,7 @@
886
894
  }
887
895
  }
888
896
  function makeArrowTable(table) {
889
- const _makeArrowTable = globalThis.__luma?._makeArrowTable;
897
+ const _makeArrowTable = globalThis.__loaders?._makeArrowTable;
890
898
  if (!_makeArrowTable) {
891
899
  throw new Error("");
892
900
  }
@@ -945,7 +953,7 @@
945
953
  }
946
954
 
947
955
  // src/arrow-loader.ts
948
- var VERSION = true ? "4.0.1" : "latest";
956
+ var VERSION = true ? "4.0.3" : "latest";
949
957
  var ArrowLoader = {
950
958
  name: "Apache Arrow",
951
959
  id: "arrow",
@@ -1,9 +1,9 @@
1
- import type { Writer, WriterOptions } from '@loaders.gl/loader-utils';
1
+ import type { WriterWithEncoder, WriterOptions } from '@loaders.gl/loader-utils';
2
2
  import { ColumnarTable } from './lib/encode-arrow';
3
3
  type ArrowWriterOptions = WriterOptions & {
4
4
  arrow?: {};
5
5
  };
6
6
  /** Apache Arrow writer */
7
- export declare const ArrowWriter: Writer<ColumnarTable, never, ArrowWriterOptions>;
7
+ export declare const ArrowWriter: WriterWithEncoder<ColumnarTable, never, ArrowWriterOptions>;
8
8
  export {};
9
9
  //# sourceMappingURL=arrow-writer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"arrow-writer.d.ts","sourceRoot":"","sources":["../src/arrow-writer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,MAAM,EAAE,aAAa,EAAC,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAC;AAOjD,KAAK,kBAAkB,GAAG,aAAa,GAAG;IACxC,KAAK,CAAC,EAAE,EAAE,CAAC;CACZ,CAAC;AAEF,0BAA0B;AAC1B,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE,kBAAkB,CAgBxE,CAAC"}
1
+ {"version":3,"file":"arrow-writer.d.ts","sourceRoot":"","sources":["../src/arrow-writer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,iBAAiB,EAAE,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAC;AAOjD,KAAK,kBAAkB,GAAG,aAAa,GAAG;IACxC,KAAK,CAAC,EAAE,EAAE,CAAC;CACZ,CAAC;AAEF,0BAA0B;AAC1B,eAAO,MAAM,WAAW,EAAE,iBAAiB,CAAC,aAAa,EAAE,KAAK,EAAE,kBAAkB,CAmBnF,CAAC"}
@@ -7,10 +7,13 @@ export const ArrowWriter = {
7
7
  version: VERSION,
8
8
  extensions: ['arrow', 'feather'],
9
9
  mimeTypes: ['application/vnd.apache.arrow.file', 'application/vnd.apache.arrow.stream', 'application/octet-stream'],
10
- encodeSync(data, options) {
10
+ binary: true,
11
+ options: {},
12
+ encode: async function encodeArrow(data, options) {
11
13
  return encodeArrowSync(data);
12
14
  },
13
- binary: true,
14
- options: {}
15
+ encodeSync(data, options) {
16
+ return encodeArrowSync(data);
17
+ }
15
18
  };
16
19
  //# sourceMappingURL=arrow-writer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"arrow-writer.js","names":["encodeArrowSync","VERSION","__VERSION__","ArrowWriter","name","id","module","version","extensions","mimeTypes","encodeSync","data","options","binary"],"sources":["../src/arrow-writer.ts"],"sourcesContent":["// import type {} from '@loaders.gl/loader-utils';\n\nimport type {Writer, WriterOptions} from '@loaders.gl/loader-utils';\nimport {ColumnarTable} from './lib/encode-arrow';\nimport {encodeArrowSync} from './lib/encode-arrow';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\ntype ArrowWriterOptions = WriterOptions & {\n arrow?: {};\n};\n\n/** Apache Arrow writer */\nexport const ArrowWriter: Writer<ColumnarTable, never, ArrowWriterOptions> = {\n name: 'Apache Arrow',\n id: 'arrow',\n module: 'arrow',\n version: VERSION,\n extensions: ['arrow', 'feather'],\n mimeTypes: [\n 'application/vnd.apache.arrow.file',\n 'application/vnd.apache.arrow.stream',\n 'application/octet-stream'\n ],\n encodeSync(data, options?) {\n return encodeArrowSync(data);\n },\n binary: true,\n options: {}\n};\n"],"mappings":"SAIQA,eAAe;AAIvB,MAAMC,OAAO,GAAG,OAAOC,WAAW,KAAK,WAAW,GAAGA,WAAW,GAAG,QAAQ;AAO3E,OAAO,MAAMC,WAA6D,GAAG;EAC3EC,IAAI,EAAE,cAAc;EACpBC,EAAE,EAAE,OAAO;EACXC,MAAM,EAAE,OAAO;EACfC,OAAO,EAAEN,OAAO;EAChBO,UAAU,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;EAChCC,SAAS,EAAE,CACT,mCAAmC,EACnC,qCAAqC,EACrC,0BAA0B,CAC3B;EACDC,UAAUA,CAACC,IAAI,EAAEC,OAAQ,EAAE;IACzB,OAAOZ,eAAe,CAACW,IAAI,CAAC;EAC9B,CAAC;EACDE,MAAM,EAAE,IAAI;EACZD,OAAO,EAAE,CAAC;AACZ,CAAC"}
1
+ {"version":3,"file":"arrow-writer.js","names":["encodeArrowSync","VERSION","__VERSION__","ArrowWriter","name","id","module","version","extensions","mimeTypes","binary","options","encode","encodeArrow","data","encodeSync"],"sources":["../src/arrow-writer.ts"],"sourcesContent":["// import type {} from '@loaders.gl/loader-utils';\n\nimport type {WriterWithEncoder, WriterOptions} from '@loaders.gl/loader-utils';\nimport {ColumnarTable} from './lib/encode-arrow';\nimport {encodeArrowSync} from './lib/encode-arrow';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\ntype ArrowWriterOptions = WriterOptions & {\n arrow?: {};\n};\n\n/** Apache Arrow writer */\nexport const ArrowWriter: WriterWithEncoder<ColumnarTable, never, ArrowWriterOptions> = {\n name: 'Apache Arrow',\n id: 'arrow',\n module: 'arrow',\n version: VERSION,\n extensions: ['arrow', 'feather'],\n mimeTypes: [\n 'application/vnd.apache.arrow.file',\n 'application/vnd.apache.arrow.stream',\n 'application/octet-stream'\n ],\n binary: true,\n options: {},\n encode: async function encodeArrow(data, options?): Promise<ArrayBuffer> {\n return encodeArrowSync(data);\n },\n encodeSync(data, options?) {\n return encodeArrowSync(data);\n }\n};\n"],"mappings":"SAIQA,eAAe;AAIvB,MAAMC,OAAO,GAAG,OAAOC,WAAW,KAAK,WAAW,GAAGA,WAAW,GAAG,QAAQ;AAO3E,OAAO,MAAMC,WAAwE,GAAG;EACtFC,IAAI,EAAE,cAAc;EACpBC,EAAE,EAAE,OAAO;EACXC,MAAM,EAAE,OAAO;EACfC,OAAO,EAAEN,OAAO;EAChBO,UAAU,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;EAChCC,SAAS,EAAE,CACT,mCAAmC,EACnC,qCAAqC,EACrC,0BAA0B,CAC3B;EACDC,MAAM,EAAE,IAAI;EACZC,OAAO,EAAE,CAAC,CAAC;EACXC,MAAM,EAAE,eAAeC,WAAWA,CAACC,IAAI,EAAEH,OAAQ,EAAwB;IACvE,OAAOX,eAAe,CAACc,IAAI,CAAC;EAC9B,CAAC;EACDC,UAAUA,CAACD,IAAI,EAAEH,OAAQ,EAAE;IACzB,OAAOX,eAAe,CAACc,IAAI,CAAC;EAC9B;AACF,CAAC"}
package/dist/dist.dev.js CHANGED
@@ -30,6 +30,7 @@ var __exports__ = (() => {
30
30
  ArrowLoader: () => ArrowLoader2,
31
31
  ArrowWorkerLoader: () => ArrowLoader,
32
32
  ArrowWriter: () => ArrowWriter,
33
+ BINARY_GEOMETRY_TEMPLATE: () => BINARY_GEOMETRY_TEMPLATE,
33
34
  VECTOR_TYPES: () => VECTOR_TYPES,
34
35
  deserializeArrowField: () => deserializeArrowField,
35
36
  deserializeArrowMetadata: () => deserializeArrowMetadata,
@@ -41,7 +42,8 @@ var __exports__ = (() => {
41
42
  serializeArrowField: () => serializeArrowField,
42
43
  serializeArrowMetadata: () => serializeArrowMetadata,
43
44
  serializeArrowSchema: () => serializeArrowSchema,
44
- serializeArrowType: () => serializeArrowType
45
+ serializeArrowType: () => serializeArrowType,
46
+ updateBoundsFromGeoArrowSamples: () => updateBoundsFromGeoArrowSamples
45
47
  });
46
48
 
47
49
  // ../schema/src/lib/table/batches/base-table-batch-aggregator.ts
@@ -729,7 +731,7 @@ var __exports__ = (() => {
729
731
  }
730
732
  }
731
733
  function makeArrowTable(table) {
732
- const _makeArrowTable = globalThis.__luma?._makeArrowTable;
734
+ const _makeArrowTable = globalThis.__loaders?._makeArrowTable;
733
735
  if (!_makeArrowTable) {
734
736
  throw new Error("");
735
737
  }
@@ -12552,7 +12554,15 @@ return true;`);
12552
12554
  return "float64";
12553
12555
  case Utf8:
12554
12556
  return "utf8";
12555
- case Date:
12557
+ case Decimal:
12558
+ const decimal = arrowType;
12559
+ return {
12560
+ type: "decimal",
12561
+ bitWidth: decimal.bitWidth,
12562
+ precision: decimal.precision,
12563
+ scale: decimal.scale
12564
+ };
12565
+ case Date_:
12556
12566
  const dateUnit = arrowType.unit;
12557
12567
  return dateUnit === DateUnit.DAY ? "date-day" : "date-millisecond";
12558
12568
  case DateDay:
@@ -12617,6 +12627,13 @@ return true;`);
12617
12627
  return "interval-daytime";
12618
12628
  case IntervalYearMonth:
12619
12629
  return "interval-yearmonth";
12630
+ case Map_:
12631
+ const mapType = arrowType;
12632
+ return {
12633
+ type: "map",
12634
+ keysSorted: mapType.keysSorted,
12635
+ children: mapType.children.map((arrowField) => serializeArrowField(arrowField))
12636
+ };
12620
12637
  case List:
12621
12638
  const listType = arrowType;
12622
12639
  const listField = listType.valueField;
@@ -12625,18 +12642,30 @@ return true;`);
12625
12642
  children: [serializeArrowField(listField)]
12626
12643
  };
12627
12644
  case FixedSizeList:
12645
+ const fixedSizeList = arrowType;
12628
12646
  return {
12629
12647
  type: "fixed-size-list",
12630
- listSize: arrowType.listSize,
12631
- children: [serializeArrowField(arrowType.children[0])]
12648
+ listSize: fixedSizeList.listSize,
12649
+ children: [serializeArrowField(fixedSizeList.children[0])]
12650
+ };
12651
+ case Struct:
12652
+ const structType = arrowType;
12653
+ return {
12654
+ type: "struct",
12655
+ children: structType.children.map((arrowField) => serializeArrowField(arrowField))
12632
12656
  };
12633
12657
  default:
12634
- throw new Error("array type not supported");
12658
+ throw new Error(`arrow type not supported: ${arrowType.constructor.name}`);
12635
12659
  }
12636
12660
  }
12637
12661
  function deserializeArrowType(dataType) {
12638
12662
  if (typeof dataType === "object") {
12639
12663
  switch (dataType.type) {
12664
+ case "decimal":
12665
+ return new Decimal(dataType.precision, dataType.scale, dataType.bitWidth);
12666
+ case "map":
12667
+ let children = dataType.children.map((arrowField) => deserializeArrowField(arrowField));
12668
+ return new Map_(children, dataType.keysSorted);
12640
12669
  case "list":
12641
12670
  const field = deserializeArrowField(dataType.children[0]);
12642
12671
  return new List(field);
@@ -12644,7 +12673,7 @@ return true;`);
12644
12673
  const child = deserializeArrowField(dataType.children[0]);
12645
12674
  return new FixedSizeList(dataType.listSize, child);
12646
12675
  case "struct":
12647
- const children = dataType.children.map((arrowField) => deserializeArrowField(arrowField));
12676
+ children = dataType.children.map((arrowField) => deserializeArrowField(arrowField));
12648
12677
  return new Struct(children);
12649
12678
  default:
12650
12679
  throw new Error("array type not supported");
@@ -12747,11 +12776,14 @@ return true;`);
12747
12776
  version: VERSION2,
12748
12777
  extensions: ["arrow", "feather"],
12749
12778
  mimeTypes: ["application/vnd.apache.arrow.file", "application/vnd.apache.arrow.stream", "application/octet-stream"],
12750
- encodeSync(data, options) {
12779
+ binary: true,
12780
+ options: {},
12781
+ encode: async function encodeArrow(data, options) {
12751
12782
  return encodeArrowSync(data);
12752
12783
  },
12753
- binary: true,
12754
- options: {}
12784
+ encodeSync(data, options) {
12785
+ return encodeArrowSync(data);
12786
+ }
12755
12787
  };
12756
12788
 
12757
12789
  // src/geoarrow/get-arrow-bounds.ts
@@ -12762,7 +12794,7 @@ return true;`);
12762
12794
  for (let i = 0; i < numberOfFeatures; i += sampleStep) {
12763
12795
  const lng = flatCoords[i * nDim];
12764
12796
  const lat = flatCoords[i * nDim + 1];
12765
- if (lng < bounds[0]) {
12797
+ if (lng < newBounds[0]) {
12766
12798
  newBounds[0] = lng;
12767
12799
  }
12768
12800
  if (lat < newBounds[1]) {
@@ -12802,20 +12834,18 @@ return true;`);
12802
12834
  line: geoEncoding === "geoarrow.multilinestring" || geoEncoding === "geoarrow.linestring"
12803
12835
  };
12804
12836
  const chunks = geoColumn.data;
12805
- const bounds = [Infinity, Infinity, -Infinity, -Infinity];
12837
+ let bounds = [Infinity, Infinity, -Infinity, -Infinity];
12806
12838
  let globalFeatureIdOffset = 0;
12807
12839
  const binaryGeometries = [];
12808
- for (let c = 0; c < chunks.length; c++) {
12809
- const geometries = chunks[c];
12840
+ chunks.forEach((chunk) => {
12810
12841
  const {
12811
12842
  featureIds,
12812
12843
  flatCoordinateArray,
12813
12844
  nDim,
12814
12845
  geomOffset
12815
- } = getBinaryGeometriesFromChunk(geometries, geoEncoding);
12816
- const numOfVertices = flatCoordinateArray.length / nDim;
12817
- const globalFeatureIds = new Uint32Array(numOfVertices);
12818
- for (let i = 0; i < numOfVertices; i++) {
12846
+ } = getBinaryGeometriesFromChunk(chunk, geoEncoding);
12847
+ const globalFeatureIds = new Uint32Array(featureIds.length);
12848
+ for (let i = 0; i < featureIds.length; i++) {
12819
12849
  globalFeatureIds[i] = featureIds[i] + globalFeatureIdOffset;
12820
12850
  }
12821
12851
  const binaryContent = {
@@ -12831,11 +12861,11 @@ return true;`);
12831
12861
  value: featureIds,
12832
12862
  size: 1
12833
12863
  },
12834
- properties: [...Array(geometries.length).keys()].map((i) => ({
12864
+ properties: [...Array(chunk.length).keys()].map((i) => ({
12835
12865
  index: i + globalFeatureIdOffset
12836
12866
  }))
12837
12867
  };
12838
- globalFeatureIdOffset += geometries.length;
12868
+ globalFeatureIdOffset += chunk.length;
12839
12869
  binaryGeometries.push({
12840
12870
  shape: "binary-feature-collection",
12841
12871
  points: {
@@ -12866,8 +12896,8 @@ return true;`);
12866
12896
  }
12867
12897
  }
12868
12898
  });
12869
- updateBoundsFromGeoArrowSamples(flatCoordinateArray, nDim, bounds);
12870
- }
12899
+ bounds = updateBoundsFromGeoArrowSamples(flatCoordinateArray, nDim, bounds);
12900
+ });
12871
12901
  return {
12872
12902
  binaryGeometries,
12873
12903
  bounds,
@@ -12892,22 +12922,23 @@ return true;`);
12892
12922
  function getBinaryPolygonsFromChunk(chunk, geoEncoding) {
12893
12923
  const isMultiPolygon = geoEncoding === "geoarrow.multipolygon";
12894
12924
  const polygonData = isMultiPolygon ? chunk.children[0] : chunk;
12925
+ const polygonOffset = polygonData.valueOffsets;
12926
+ const partData = isMultiPolygon ? chunk.valueOffsets.map((i) => polygonOffset.at(i) || i) : chunk.valueOffsets;
12895
12927
  const ringData = polygonData.children[0];
12896
12928
  const pointData = ringData.children[0];
12897
12929
  const coordData = pointData.children[0];
12898
12930
  const nDim = pointData.stride;
12899
12931
  const geomOffset = ringData.valueOffsets;
12900
12932
  const flatCoordinateArray = coordData.values;
12901
- const geometryIndicies = new Uint16Array(chunk.length + 1);
12902
- for (let i = 0; i < chunk.length; i++) {
12903
- geometryIndicies[i] = geomOffset[chunk.valueOffsets[i]];
12933
+ const geometryIndicies = new Uint16Array(polygonOffset.length);
12934
+ for (let i = 0; i < polygonOffset.length; i++) {
12935
+ geometryIndicies[i] = geomOffset[polygonOffset[i]];
12904
12936
  }
12905
- geometryIndicies[chunk.length] = flatCoordinateArray.length / nDim;
12906
12937
  const numOfVertices = flatCoordinateArray.length / nDim;
12907
12938
  const featureIds = new Uint32Array(numOfVertices);
12908
- for (let i = 0; i < chunk.length - 1; i++) {
12909
- const startIdx = geomOffset[chunk.valueOffsets[i]];
12910
- const endIdx = geomOffset[chunk.valueOffsets[i + 1]];
12939
+ for (let i = 0; i < partData.length - 1; i++) {
12940
+ const startIdx = geomOffset[partData[i]];
12941
+ const endIdx = geomOffset[partData[i + 1]];
12911
12942
  for (let j = startIdx; j < endIdx; j++) {
12912
12943
  featureIds[j] = i;
12913
12944
  }
@@ -1,4 +1,4 @@
1
- import { Vector } from 'apache-arrow';
1
+ import * as arrow from 'apache-arrow';
2
2
  import { BinaryFeatureCollection as BinaryFeatures } from '@loaders.gl/schema';
3
3
  import { GeoArrowEncoding } from '@loaders.gl/gis';
4
4
  /**
@@ -13,6 +13,22 @@ export type BinaryDataFromGeoArrow = {
13
13
  line: boolean;
14
14
  };
15
15
  };
16
+ export declare const BINARY_GEOMETRY_TEMPLATE: {
17
+ globalFeatureIds: {
18
+ value: Uint32Array;
19
+ size: number;
20
+ };
21
+ positions: {
22
+ value: Float32Array;
23
+ size: number;
24
+ };
25
+ properties: never[];
26
+ numericProps: {};
27
+ featureIds: {
28
+ value: Uint32Array;
29
+ size: number;
30
+ };
31
+ };
16
32
  /**
17
33
  * get binary geometries from geoarrow column
18
34
  *
@@ -20,5 +36,5 @@ export type BinaryDataFromGeoArrow = {
20
36
  * @param geoEncoding the geo encoding of the geoarrow column, e.g. getGeoArrowEncoding(arrowTable.schema, geoColumnName)
21
37
  * @returns BinaryDataFromGeoArrow
22
38
  */
23
- export declare function getBinaryGeometriesFromArrow(geoColumn: Vector, geoEncoding: GeoArrowEncoding): BinaryDataFromGeoArrow;
39
+ export declare function getBinaryGeometriesFromArrow(geoColumn: arrow.Vector, geoEncoding: GeoArrowEncoding): BinaryDataFromGeoArrow;
24
40
  //# sourceMappingURL=convert-geoarrow-to-binary-geometry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"convert-geoarrow-to-binary-geometry.d.ts","sourceRoot":"","sources":["../../src/geoarrow/convert-geoarrow-to-binary-geometry.ts"],"names":[],"mappings":"AAGA,OAAO,EAAO,MAAM,EAAC,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAC,uBAAuB,IAAI,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAC,gBAAgB,EAAC,MAAM,iBAAiB,CAAC;AAGjD;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,gBAAgB,EAAE,cAAc,EAAE,CAAC;IACnC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,YAAY,EAAE;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAC,CAAC;CACjE,CAAC;AAmBF;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,gBAAgB,GAC5B,sBAAsB,CA4ExB"}
1
+ {"version":3,"file":"convert-geoarrow-to-binary-geometry.d.ts","sourceRoot":"","sources":["../../src/geoarrow/convert-geoarrow-to-binary-geometry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAC,uBAAuB,IAAI,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAC,gBAAgB,EAAC,MAAM,iBAAiB,CAAC;AAGjD;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,gBAAgB,EAAE,cAAc,EAAE,CAAC;IACnC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,YAAY,EAAE;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAC,CAAC;CACjE,CAAC;AAWF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;CAMpC,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,KAAK,CAAC,MAAM,EACvB,WAAW,EAAE,gBAAgB,GAC5B,sBAAsB,CAyExB"}
@@ -1,5 +1,5 @@
1
1
  import { updateBoundsFromGeoArrowSamples } from "./get-arrow-bounds.js";
2
- const BINARY_GEOMETRY_TEMPLATE = {
2
+ export const BINARY_GEOMETRY_TEMPLATE = {
3
3
  globalFeatureIds: {
4
4
  value: new Uint32Array(0),
5
5
  size: 1
@@ -22,20 +22,18 @@ export function getBinaryGeometriesFromArrow(geoColumn, geoEncoding) {
22
22
  line: geoEncoding === 'geoarrow.multilinestring' || geoEncoding === 'geoarrow.linestring'
23
23
  };
24
24
  const chunks = geoColumn.data;
25
- const bounds = [Infinity, Infinity, -Infinity, -Infinity];
25
+ let bounds = [Infinity, Infinity, -Infinity, -Infinity];
26
26
  let globalFeatureIdOffset = 0;
27
27
  const binaryGeometries = [];
28
- for (let c = 0; c < chunks.length; c++) {
29
- const geometries = chunks[c];
28
+ chunks.forEach(chunk => {
30
29
  const {
31
30
  featureIds,
32
31
  flatCoordinateArray,
33
32
  nDim,
34
33
  geomOffset
35
- } = getBinaryGeometriesFromChunk(geometries, geoEncoding);
36
- const numOfVertices = flatCoordinateArray.length / nDim;
37
- const globalFeatureIds = new Uint32Array(numOfVertices);
38
- for (let i = 0; i < numOfVertices; i++) {
34
+ } = getBinaryGeometriesFromChunk(chunk, geoEncoding);
35
+ const globalFeatureIds = new Uint32Array(featureIds.length);
36
+ for (let i = 0; i < featureIds.length; i++) {
39
37
  globalFeatureIds[i] = featureIds[i] + globalFeatureIdOffset;
40
38
  }
41
39
  const binaryContent = {
@@ -51,11 +49,11 @@ export function getBinaryGeometriesFromArrow(geoColumn, geoEncoding) {
51
49
  value: featureIds,
52
50
  size: 1
53
51
  },
54
- properties: [...Array(geometries.length).keys()].map(i => ({
52
+ properties: [...Array(chunk.length).keys()].map(i => ({
55
53
  index: i + globalFeatureIdOffset
56
54
  }))
57
55
  };
58
- globalFeatureIdOffset += geometries.length;
56
+ globalFeatureIdOffset += chunk.length;
59
57
  binaryGeometries.push({
60
58
  shape: 'binary-feature-collection',
61
59
  points: {
@@ -86,8 +84,8 @@ export function getBinaryGeometriesFromArrow(geoColumn, geoEncoding) {
86
84
  }
87
85
  }
88
86
  });
89
- updateBoundsFromGeoArrowSamples(flatCoordinateArray, nDim, bounds);
90
- }
87
+ bounds = updateBoundsFromGeoArrowSamples(flatCoordinateArray, nDim, bounds);
88
+ });
91
89
  return {
92
90
  binaryGeometries,
93
91
  bounds,
@@ -112,22 +110,23 @@ function getBinaryGeometriesFromChunk(chunk, geoEncoding) {
112
110
  function getBinaryPolygonsFromChunk(chunk, geoEncoding) {
113
111
  const isMultiPolygon = geoEncoding === 'geoarrow.multipolygon';
114
112
  const polygonData = isMultiPolygon ? chunk.children[0] : chunk;
113
+ const polygonOffset = polygonData.valueOffsets;
114
+ const partData = isMultiPolygon ? chunk.valueOffsets.map(i => polygonOffset.at(i) || i) : chunk.valueOffsets;
115
115
  const ringData = polygonData.children[0];
116
116
  const pointData = ringData.children[0];
117
117
  const coordData = pointData.children[0];
118
118
  const nDim = pointData.stride;
119
119
  const geomOffset = ringData.valueOffsets;
120
120
  const flatCoordinateArray = coordData.values;
121
- const geometryIndicies = new Uint16Array(chunk.length + 1);
122
- for (let i = 0; i < chunk.length; i++) {
123
- geometryIndicies[i] = geomOffset[chunk.valueOffsets[i]];
121
+ const geometryIndicies = new Uint16Array(polygonOffset.length);
122
+ for (let i = 0; i < polygonOffset.length; i++) {
123
+ geometryIndicies[i] = geomOffset[polygonOffset[i]];
124
124
  }
125
- geometryIndicies[chunk.length] = flatCoordinateArray.length / nDim;
126
125
  const numOfVertices = flatCoordinateArray.length / nDim;
127
126
  const featureIds = new Uint32Array(numOfVertices);
128
- for (let i = 0; i < chunk.length - 1; i++) {
129
- const startIdx = geomOffset[chunk.valueOffsets[i]];
130
- const endIdx = geomOffset[chunk.valueOffsets[i + 1]];
127
+ for (let i = 0; i < partData.length - 1; i++) {
128
+ const startIdx = geomOffset[partData[i]];
129
+ const endIdx = geomOffset[partData[i + 1]];
131
130
  for (let j = startIdx; j < endIdx; j++) {
132
131
  featureIds[j] = i;
133
132
  }
@@ -1 +1 @@
1
- {"version":3,"file":"convert-geoarrow-to-binary-geometry.js","names":["updateBoundsFromGeoArrowSamples","BINARY_GEOMETRY_TEMPLATE","globalFeatureIds","value","Uint32Array","size","positions","Float32Array","properties","numericProps","featureIds","getBinaryGeometriesFromArrow","geoColumn","geoEncoding","featureTypes","polygon","point","line","chunks","data","bounds","Infinity","globalFeatureIdOffset","binaryGeometries","c","length","geometries","flatCoordinateArray","nDim","geomOffset","getBinaryGeometriesFromChunk","numOfVertices","i","binaryContent","Array","keys","map","index","push","shape","points","type","lines","pathIndices","Uint16Array","polygons","polygonIndices","primitivePolygonIndices","chunk","getBinaryPointsFromChunk","getBinaryLinesFromChunk","getBinaryPolygonsFromChunk","Error","isMultiPolygon","polygonData","children","ringData","pointData","coordData","stride","valueOffsets","values","geometryIndicies","startIdx","endIdx","j","isMultiLineString","lineData","isMultiPoint","Int32Array"],"sources":["../../src/geoarrow/convert-geoarrow-to-binary-geometry.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport {Data, Vector} from 'apache-arrow';\nimport {BinaryFeatureCollection as BinaryFeatures} from '@loaders.gl/schema';\nimport {GeoArrowEncoding} from '@loaders.gl/gis';\nimport {updateBoundsFromGeoArrowSamples} from './get-arrow-bounds';\n\n/**\n * Binary data from geoarrow column and can be used by e.g. deck.gl GeojsonLayer\n */\nexport type BinaryDataFromGeoArrow = {\n binaryGeometries: BinaryFeatures[];\n bounds: [number, number, number, number];\n featureTypes: {polygon: boolean; point: boolean; line: boolean};\n};\n\ntype BinaryGeometryContent = {\n featureIds: Uint32Array;\n flatCoordinateArray: Float64Array;\n nDim: number;\n geomOffset: Int32Array;\n geometryIndicies: Uint16Array;\n};\n\n// binary geometry template, see deck.gl BinaryGeometry\nconst BINARY_GEOMETRY_TEMPLATE = {\n globalFeatureIds: {value: new Uint32Array(0), size: 1},\n positions: {value: new Float32Array(0), size: 2},\n properties: [],\n numericProps: {},\n featureIds: {value: new Uint32Array(0), size: 1}\n};\n\n/**\n * get binary geometries from geoarrow column\n *\n * @param geoColumn the geoarrow column, e.g. arrowTable.getChildAt(geoColumnIndex)\n * @param geoEncoding the geo encoding of the geoarrow column, e.g. getGeoArrowEncoding(arrowTable.schema, geoColumnName)\n * @returns BinaryDataFromGeoArrow\n */\nexport function getBinaryGeometriesFromArrow(\n geoColumn: Vector,\n geoEncoding: GeoArrowEncoding\n): BinaryDataFromGeoArrow {\n const featureTypes = {\n polygon: geoEncoding === 'geoarrow.multipolygon' || geoEncoding === 'geoarrow.polygon',\n point: geoEncoding === 'geoarrow.multipoint' || geoEncoding === 'geoarrow.point',\n line: geoEncoding === 'geoarrow.multilinestring' || geoEncoding === 'geoarrow.linestring'\n };\n\n const chunks = geoColumn.data;\n const bounds: [number, number, number, number] = [Infinity, Infinity, -Infinity, -Infinity];\n let globalFeatureIdOffset = 0;\n const binaryGeometries: BinaryFeatures[] = [];\n\n for (let c = 0; c < chunks.length; c++) {\n const geometries = chunks[c];\n const {featureIds, flatCoordinateArray, nDim, geomOffset} = getBinaryGeometriesFromChunk(\n geometries,\n geoEncoding\n );\n\n const numOfVertices = flatCoordinateArray.length / nDim;\n const globalFeatureIds = new Uint32Array(numOfVertices);\n for (let i = 0; i < numOfVertices; i++) {\n globalFeatureIds[i] = featureIds[i] + globalFeatureIdOffset;\n }\n\n const binaryContent = {\n globalFeatureIds: {value: globalFeatureIds, size: 1},\n positions: {\n value: flatCoordinateArray,\n size: nDim\n },\n featureIds: {value: featureIds, size: 1},\n // eslint-disable-next-line no-loop-func\n properties: [...Array(geometries.length).keys()].map((i) => ({\n index: i + globalFeatureIdOffset\n }))\n };\n\n // TODO: check if chunks are sequentially accessed\n globalFeatureIdOffset += geometries.length;\n\n // NOTE: deck.gl defines the BinaryFeatures structure must have points, lines, polygons even if they are empty\n binaryGeometries.push({\n shape: 'binary-feature-collection',\n points: {\n type: 'Point',\n ...BINARY_GEOMETRY_TEMPLATE,\n ...(featureTypes.point ? binaryContent : {})\n },\n lines: {\n type: 'LineString',\n ...BINARY_GEOMETRY_TEMPLATE,\n ...(featureTypes.line ? binaryContent : {}),\n pathIndices: {value: featureTypes.line ? geomOffset : new Uint16Array(0), size: 1}\n },\n polygons: {\n type: 'Polygon',\n ...BINARY_GEOMETRY_TEMPLATE,\n ...(featureTypes.polygon ? binaryContent : {}),\n polygonIndices: {\n // TODO why deck.gl's tessellatePolygon performance is not good when using geometryIndicies\n // even when there is no hole in any polygon\n value: featureTypes.polygon ? geomOffset : new Uint16Array(0),\n size: 1\n },\n primitivePolygonIndices: {\n value: featureTypes.polygon ? geomOffset : new Uint16Array(0),\n size: 1\n }\n }\n });\n\n updateBoundsFromGeoArrowSamples(flatCoordinateArray, nDim, bounds);\n }\n\n return {binaryGeometries, bounds, featureTypes};\n}\n\n/**\n * get binary geometries from geoarrow column\n * @param chunk one chunk/batch of geoarrow column\n * @param geoEncoding geo encoding of the geoarrow column\n * @returns BinaryGeometryContent\n */\nfunction getBinaryGeometriesFromChunk(\n chunk: Data,\n geoEncoding: GeoArrowEncoding\n): BinaryGeometryContent {\n switch (geoEncoding) {\n case 'geoarrow.point':\n case 'geoarrow.multipoint':\n return getBinaryPointsFromChunk(chunk, geoEncoding);\n case 'geoarrow.linestring':\n case 'geoarrow.multilinestring':\n return getBinaryLinesFromChunk(chunk, geoEncoding);\n case 'geoarrow.polygon':\n case 'geoarrow.multipolygon':\n return getBinaryPolygonsFromChunk(chunk, geoEncoding);\n default:\n throw Error('invalid geoarrow encoding');\n }\n}\n\n/**\n * get binary polygons from geoarrow polygon column\n * @param chunk one chunk of geoarrow polygon column\n * @param geoEncoding the geo encoding of the geoarrow polygon column\n * @returns BinaryGeometryContent\n */\nfunction getBinaryPolygonsFromChunk(chunk: Data, geoEncoding: string): BinaryGeometryContent {\n const isMultiPolygon = geoEncoding === 'geoarrow.multipolygon';\n\n const polygonData = isMultiPolygon ? chunk.children[0] : chunk;\n const ringData = polygonData.children[0];\n const pointData = ringData.children[0];\n const coordData = pointData.children[0];\n const nDim = pointData.stride;\n const geomOffset = ringData.valueOffsets;\n const flatCoordinateArray = coordData.values;\n\n const geometryIndicies = new Uint16Array(chunk.length + 1);\n for (let i = 0; i < chunk.length; i++) {\n geometryIndicies[i] = geomOffset[chunk.valueOffsets[i]];\n }\n geometryIndicies[chunk.length] = flatCoordinateArray.length / nDim;\n\n const numOfVertices = flatCoordinateArray.length / nDim;\n const featureIds = new Uint32Array(numOfVertices);\n for (let i = 0; i < chunk.length - 1; i++) {\n const startIdx = geomOffset[chunk.valueOffsets[i]];\n const endIdx = geomOffset[chunk.valueOffsets[i + 1]];\n for (let j = startIdx; j < endIdx; j++) {\n featureIds[j] = i;\n }\n }\n\n return {\n featureIds,\n flatCoordinateArray,\n nDim,\n geomOffset,\n geometryIndicies\n };\n}\n\n/**\n * get binary lines from geoarrow line column\n * @param chunk one chunk/batch of geoarrow column\n * @param geoEncoding the geo encoding of the geoarrow column\n * @returns BinaryGeometryContent\n */\nfunction getBinaryLinesFromChunk(chunk: Data, geoEncoding: string): BinaryGeometryContent {\n const isMultiLineString = geoEncoding === 'geoarrow.multilinestring';\n\n const lineData = isMultiLineString ? chunk.children[0] : chunk;\n const pointData = lineData.children[0];\n const coordData = pointData.children[0];\n\n const nDim = pointData.stride;\n const geomOffset = lineData.valueOffsets;\n const flatCoordinateArray = coordData.values;\n\n // geometryIndicies is not needed for line string\n const geometryIndicies = new Uint16Array(0);\n\n const numOfVertices = flatCoordinateArray.length / nDim;\n const featureIds = new Uint32Array(numOfVertices);\n for (let i = 0; i < chunk.length; i++) {\n const startIdx = geomOffset[i];\n const endIdx = geomOffset[i + 1];\n for (let j = startIdx; j < endIdx; j++) {\n featureIds[j] = i;\n }\n }\n\n return {\n featureIds,\n flatCoordinateArray,\n nDim,\n geomOffset,\n geometryIndicies\n };\n}\n\n/**\n * get binary points from geoarrow point column\n * @param chunk one chunk/batch of geoarrow column\n * @param geoEncoding geo encoding of the geoarrow column\n * @returns BinaryGeometryContent\n */\nfunction getBinaryPointsFromChunk(chunk: Data, geoEncoding: string): BinaryGeometryContent {\n const isMultiPoint = geoEncoding === 'geoarrow.multipoint';\n\n const pointData = isMultiPoint ? chunk.children[0] : chunk;\n const coordData = pointData.children[0];\n\n const nDim = pointData.stride;\n const flatCoordinateArray = coordData.values;\n\n // geometryIndices is not needed for point\n const geometryIndicies = new Uint16Array(0);\n // geomOffset is not needed for point\n const geomOffset = new Int32Array(0);\n\n const numOfVertices = flatCoordinateArray.length / nDim;\n const featureIds = new Uint32Array(numOfVertices);\n for (let i = 0; i < chunk.length; i++) {\n featureIds[i] = i;\n }\n\n return {\n featureIds,\n flatCoordinateArray,\n nDim,\n geomOffset,\n geometryIndicies\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"convert-geoarrow-to-binary-geometry.js","names":["updateBoundsFromGeoArrowSamples","BINARY_GEOMETRY_TEMPLATE","globalFeatureIds","value","Uint32Array","size","positions","Float32Array","properties","numericProps","featureIds","getBinaryGeometriesFromArrow","geoColumn","geoEncoding","featureTypes","polygon","point","line","chunks","data","bounds","Infinity","globalFeatureIdOffset","binaryGeometries","forEach","chunk","flatCoordinateArray","nDim","geomOffset","getBinaryGeometriesFromChunk","length","i","binaryContent","Array","keys","map","index","push","shape","points","type","lines","pathIndices","Uint16Array","polygons","polygonIndices","primitivePolygonIndices","getBinaryPointsFromChunk","getBinaryLinesFromChunk","getBinaryPolygonsFromChunk","Error","isMultiPolygon","polygonData","children","polygonOffset","valueOffsets","partData","at","ringData","pointData","coordData","stride","values","geometryIndicies","numOfVertices","startIdx","endIdx","j","isMultiLineString","lineData","isMultiPoint","Int32Array"],"sources":["../../src/geoarrow/convert-geoarrow-to-binary-geometry.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport * as arrow from 'apache-arrow';\nimport {BinaryFeatureCollection as BinaryFeatures} from '@loaders.gl/schema';\nimport {GeoArrowEncoding} from '@loaders.gl/gis';\nimport {updateBoundsFromGeoArrowSamples} from './get-arrow-bounds';\n\n/**\n * Binary data from geoarrow column and can be used by e.g. deck.gl GeojsonLayer\n */\nexport type BinaryDataFromGeoArrow = {\n binaryGeometries: BinaryFeatures[];\n bounds: [number, number, number, number];\n featureTypes: {polygon: boolean; point: boolean; line: boolean};\n};\n\ntype BinaryGeometryContent = {\n featureIds: Uint32Array;\n flatCoordinateArray: Float64Array;\n nDim: number;\n geomOffset: Int32Array;\n geometryIndicies: Uint16Array;\n};\n\n// binary geometry template, see deck.gl BinaryGeometry\nexport const BINARY_GEOMETRY_TEMPLATE = {\n globalFeatureIds: {value: new Uint32Array(0), size: 1},\n positions: {value: new Float32Array(0), size: 2},\n properties: [],\n numericProps: {},\n featureIds: {value: new Uint32Array(0), size: 1}\n};\n\n/**\n * get binary geometries from geoarrow column\n *\n * @param geoColumn the geoarrow column, e.g. arrowTable.getChildAt(geoColumnIndex)\n * @param geoEncoding the geo encoding of the geoarrow column, e.g. getGeoArrowEncoding(arrowTable.schema, geoColumnName)\n * @returns BinaryDataFromGeoArrow\n */\nexport function getBinaryGeometriesFromArrow(\n geoColumn: arrow.Vector,\n geoEncoding: GeoArrowEncoding\n): BinaryDataFromGeoArrow {\n const featureTypes = {\n polygon: geoEncoding === 'geoarrow.multipolygon' || geoEncoding === 'geoarrow.polygon',\n point: geoEncoding === 'geoarrow.multipoint' || geoEncoding === 'geoarrow.point',\n line: geoEncoding === 'geoarrow.multilinestring' || geoEncoding === 'geoarrow.linestring'\n };\n\n const chunks = geoColumn.data;\n let bounds: [number, number, number, number] = [Infinity, Infinity, -Infinity, -Infinity];\n let globalFeatureIdOffset = 0;\n const binaryGeometries: BinaryFeatures[] = [];\n\n chunks.forEach((chunk) => {\n const {featureIds, flatCoordinateArray, nDim, geomOffset} = getBinaryGeometriesFromChunk(\n chunk,\n geoEncoding\n );\n\n const globalFeatureIds = new Uint32Array(featureIds.length);\n for (let i = 0; i < featureIds.length; i++) {\n globalFeatureIds[i] = featureIds[i] + globalFeatureIdOffset;\n }\n\n const binaryContent = {\n globalFeatureIds: {value: globalFeatureIds, size: 1},\n positions: {\n value: flatCoordinateArray,\n size: nDim\n },\n featureIds: {value: featureIds, size: 1},\n properties: [...Array(chunk.length).keys()].map((i) => ({\n index: i + globalFeatureIdOffset\n }))\n };\n\n // TODO: check if chunks are sequentially accessed\n globalFeatureIdOffset += chunk.length;\n\n // NOTE: deck.gl defines the BinaryFeatures structure must have points, lines, polygons even if they are empty\n binaryGeometries.push({\n shape: 'binary-feature-collection',\n points: {\n type: 'Point',\n ...BINARY_GEOMETRY_TEMPLATE,\n ...(featureTypes.point ? binaryContent : {})\n },\n lines: {\n type: 'LineString',\n ...BINARY_GEOMETRY_TEMPLATE,\n ...(featureTypes.line ? binaryContent : {}),\n pathIndices: {value: featureTypes.line ? geomOffset : new Uint16Array(0), size: 1}\n },\n polygons: {\n type: 'Polygon',\n ...BINARY_GEOMETRY_TEMPLATE,\n ...(featureTypes.polygon ? binaryContent : {}),\n polygonIndices: {\n // TODO why deck.gl's tessellatePolygon performance is not good when using geometryIndicies\n // even when there is no hole in any polygon\n value: featureTypes.polygon ? geomOffset : new Uint16Array(0),\n size: 1\n },\n primitivePolygonIndices: {\n value: featureTypes.polygon ? geomOffset : new Uint16Array(0),\n size: 1\n }\n }\n });\n\n bounds = updateBoundsFromGeoArrowSamples(flatCoordinateArray, nDim, bounds);\n });\n\n return {binaryGeometries, bounds, featureTypes};\n}\n\n/**\n * get binary geometries from geoarrow column\n * @param chunk one chunk/batch of geoarrow column\n * @param geoEncoding geo encoding of the geoarrow column\n * @returns BinaryGeometryContent\n */\nfunction getBinaryGeometriesFromChunk(\n chunk: arrow.Data,\n geoEncoding: GeoArrowEncoding\n): BinaryGeometryContent {\n switch (geoEncoding) {\n case 'geoarrow.point':\n case 'geoarrow.multipoint':\n return getBinaryPointsFromChunk(chunk, geoEncoding);\n case 'geoarrow.linestring':\n case 'geoarrow.multilinestring':\n return getBinaryLinesFromChunk(chunk, geoEncoding);\n case 'geoarrow.polygon':\n case 'geoarrow.multipolygon':\n return getBinaryPolygonsFromChunk(chunk, geoEncoding);\n default:\n throw Error('invalid geoarrow encoding');\n }\n}\n\n/**\n * get binary polygons from geoarrow polygon column\n * @param chunk one chunk of geoarrow polygon column\n * @param geoEncoding the geo encoding of the geoarrow polygon column\n * @returns BinaryGeometryContent\n */\nfunction getBinaryPolygonsFromChunk(chunk: arrow.Data, geoEncoding: string): BinaryGeometryContent {\n const isMultiPolygon = geoEncoding === 'geoarrow.multipolygon';\n\n const polygonData = isMultiPolygon ? chunk.children[0] : chunk;\n const polygonOffset = polygonData.valueOffsets;\n const partData = isMultiPolygon\n ? chunk.valueOffsets.map((i) => polygonOffset.at(i) || i)\n : chunk.valueOffsets;\n const ringData = polygonData.children[0];\n const pointData = ringData.children[0];\n const coordData = pointData.children[0];\n const nDim = pointData.stride;\n const geomOffset = ringData.valueOffsets;\n const flatCoordinateArray = coordData.values;\n\n const geometryIndicies = new Uint16Array(polygonOffset.length);\n for (let i = 0; i < polygonOffset.length; i++) {\n geometryIndicies[i] = geomOffset[polygonOffset[i]];\n }\n\n const numOfVertices = flatCoordinateArray.length / nDim;\n const featureIds = new Uint32Array(numOfVertices);\n for (let i = 0; i < partData.length - 1; i++) {\n const startIdx = geomOffset[partData[i]];\n const endIdx = geomOffset[partData[i + 1]];\n for (let j = startIdx; j < endIdx; j++) {\n featureIds[j] = i;\n }\n }\n\n return {\n featureIds,\n flatCoordinateArray,\n nDim,\n geomOffset,\n geometryIndicies\n };\n}\n\n/**\n * get binary lines from geoarrow line column\n * @param chunk one chunk/batch of geoarrow column\n * @param geoEncoding the geo encoding of the geoarrow column\n * @returns BinaryGeometryContent\n */\nfunction getBinaryLinesFromChunk(chunk: arrow.Data, geoEncoding: string): BinaryGeometryContent {\n const isMultiLineString = geoEncoding === 'geoarrow.multilinestring';\n\n const lineData = isMultiLineString ? chunk.children[0] : chunk;\n const pointData = lineData.children[0];\n const coordData = pointData.children[0];\n\n const nDim = pointData.stride;\n const geomOffset = lineData.valueOffsets;\n const flatCoordinateArray = coordData.values;\n\n // geometryIndicies is not needed for line string\n const geometryIndicies = new Uint16Array(0);\n\n const numOfVertices = flatCoordinateArray.length / nDim;\n const featureIds = new Uint32Array(numOfVertices);\n for (let i = 0; i < chunk.length; i++) {\n const startIdx = geomOffset[i];\n const endIdx = geomOffset[i + 1];\n for (let j = startIdx; j < endIdx; j++) {\n featureIds[j] = i;\n }\n }\n\n return {\n featureIds,\n flatCoordinateArray,\n nDim,\n geomOffset,\n geometryIndicies\n };\n}\n\n/**\n * get binary points from geoarrow point column\n * @param chunk one chunk/batch of geoarrow column\n * @param geoEncoding geo encoding of the geoarrow column\n * @returns BinaryGeometryContent\n */\nfunction getBinaryPointsFromChunk(chunk: arrow.Data, geoEncoding: string): BinaryGeometryContent {\n const isMultiPoint = geoEncoding === 'geoarrow.multipoint';\n\n const pointData = isMultiPoint ? chunk.children[0] : chunk;\n const coordData = pointData.children[0];\n\n const nDim = pointData.stride;\n const flatCoordinateArray = coordData.values;\n\n // geometryIndices is not needed for point\n const geometryIndicies = new Uint16Array(0);\n // geomOffset is not needed for point\n const geomOffset = new Int32Array(0);\n\n const numOfVertices = flatCoordinateArray.length / nDim;\n const featureIds = new Uint32Array(numOfVertices);\n for (let i = 0; i < chunk.length; i++) {\n featureIds[i] = i;\n }\n\n return {\n featureIds,\n flatCoordinateArray,\n nDim,\n geomOffset,\n geometryIndicies\n };\n}\n"],"mappings":"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"}