@loaders.gl/gis 4.3.4 → 4.4.0-alpha.10

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 (209) hide show
  1. package/dist/index.cjs +2411 -469
  2. package/dist/index.cjs.map +4 -4
  3. package/dist/index.d.ts +31 -12
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +39 -15
  6. package/dist/index.js.map +1 -0
  7. package/dist/lib/binary-geometry-api/binary-geometry-info.d.ts +21 -0
  8. package/dist/lib/binary-geometry-api/binary-geometry-info.d.ts.map +1 -0
  9. package/dist/lib/binary-geometry-api/binary-geometry-info.js +49 -0
  10. package/dist/lib/binary-geometry-api/binary-geometry-info.js.map +1 -0
  11. package/dist/lib/binary-geometry-api/concat-binary-geometry.d.ts +5 -0
  12. package/dist/lib/binary-geometry-api/concat-binary-geometry.d.ts.map +1 -0
  13. package/dist/lib/binary-geometry-api/concat-binary-geometry.js +51 -0
  14. package/dist/lib/binary-geometry-api/concat-binary-geometry.js.map +1 -0
  15. package/dist/lib/{binary-features/transform.d.ts → binary-geometry-api/transform-coordinates.d.ts} +1 -2
  16. package/dist/lib/binary-geometry-api/transform-coordinates.d.ts.map +1 -0
  17. package/dist/lib/{binary-features/transform.js → binary-geometry-api/transform-coordinates.js} +1 -1
  18. package/dist/lib/binary-geometry-api/transform-coordinates.js.map +1 -0
  19. package/dist/lib/feature-collection-converters/convert-binary-features-to-geojson.d.ts +16 -0
  20. package/dist/lib/feature-collection-converters/convert-binary-features-to-geojson.d.ts.map +1 -0
  21. package/dist/lib/{binary-features/binary-to-geojson.js → feature-collection-converters/convert-binary-features-to-geojson.js} +4 -90
  22. package/dist/lib/feature-collection-converters/convert-binary-features-to-geojson.js.map +1 -0
  23. package/dist/lib/{binary-features/flat-geojson-to-binary.d.ts → feature-collection-converters/convert-flat-geojson-to-binary-features.d.ts} +6 -9
  24. package/dist/lib/feature-collection-converters/convert-flat-geojson-to-binary-features.d.ts.map +1 -0
  25. package/dist/lib/{binary-features/flat-geojson-to-binary.js → feature-collection-converters/convert-flat-geojson-to-binary-features.js} +6 -5
  26. package/dist/lib/feature-collection-converters/convert-flat-geojson-to-binary-features.js.map +1 -0
  27. package/dist/lib/feature-collection-converters/convert-geoarrow-to-binary-features.d.ts +74 -0
  28. package/dist/lib/feature-collection-converters/convert-geoarrow-to-binary-features.d.ts.map +1 -0
  29. package/dist/lib/feature-collection-converters/convert-geoarrow-to-binary-features.js +378 -0
  30. package/dist/lib/feature-collection-converters/convert-geoarrow-to-binary-features.js.map +1 -0
  31. package/dist/lib/{binary-features/geojson-to-binary.d.ts → feature-collection-converters/convert-geojson-to-binary-features.d.ts} +2 -2
  32. package/dist/lib/feature-collection-converters/convert-geojson-to-binary-features.d.ts.map +1 -0
  33. package/dist/lib/feature-collection-converters/convert-geojson-to-binary-features.js +25 -0
  34. package/dist/lib/feature-collection-converters/convert-geojson-to-binary-features.js.map +1 -0
  35. package/dist/lib/{binary-features/geojson-to-flat-geojson.d.ts → feature-collection-converters/convert-geojson-to-flat-geojson.d.ts} +2 -2
  36. package/dist/lib/feature-collection-converters/convert-geojson-to-flat-geojson.d.ts.map +1 -0
  37. package/dist/lib/{binary-features/geojson-to-flat-geojson.js → feature-collection-converters/convert-geojson-to-flat-geojson.js} +5 -1
  38. package/dist/lib/feature-collection-converters/convert-geojson-to-flat-geojson.js.map +1 -0
  39. package/dist/lib/feature-collection-converters/helpers/flat-geojson-to-binary-types.d.ts.map +1 -0
  40. package/dist/lib/feature-collection-converters/helpers/flat-geojson-to-binary-types.js +5 -0
  41. package/dist/lib/feature-collection-converters/helpers/flat-geojson-to-binary-types.js.map +1 -0
  42. package/dist/lib/geometry-api/geometry-info.d.ts +21 -0
  43. package/dist/lib/geometry-api/geometry-info.d.ts.map +1 -0
  44. package/dist/lib/{binary-features/extract-geometry-info.js → geometry-api/geometry-info.js} +5 -1
  45. package/dist/lib/geometry-api/geometry-info.js.map +1 -0
  46. package/dist/lib/geometry-converters/convert-binary-geometry-to-geojson.d.ts +4 -0
  47. package/dist/lib/geometry-converters/convert-binary-geometry-to-geojson.d.ts.map +1 -0
  48. package/dist/lib/geometry-converters/convert-binary-geometry-to-geojson.js +92 -0
  49. package/dist/lib/geometry-converters/convert-binary-geometry-to-geojson.js.map +1 -0
  50. package/dist/lib/geometry-converters/convert-geoarrow-to-geojson.d.ts +13 -0
  51. package/dist/lib/geometry-converters/convert-geoarrow-to-geojson.d.ts.map +1 -0
  52. package/dist/lib/geometry-converters/convert-geoarrow-to-geojson.js +165 -0
  53. package/dist/lib/geometry-converters/convert-geoarrow-to-geojson.js.map +1 -0
  54. package/dist/lib/geometry-converters/convert-to-geojson.d.ts +6 -0
  55. package/dist/lib/geometry-converters/convert-to-geojson.d.ts.map +1 -0
  56. package/dist/lib/geometry-converters/convert-to-geojson.js +40 -0
  57. package/dist/lib/geometry-converters/convert-to-geojson.js.map +1 -0
  58. package/dist/lib/geometry-converters/wkb/convert-geometry-to-twkb.d.ts +6 -0
  59. package/dist/lib/geometry-converters/wkb/convert-geometry-to-twkb.d.ts.map +1 -0
  60. package/dist/lib/geometry-converters/wkb/convert-geometry-to-twkb.js +196 -0
  61. package/dist/lib/geometry-converters/wkb/convert-geometry-to-twkb.js.map +1 -0
  62. package/dist/lib/geometry-converters/wkb/convert-geometry-to-wkb.d.ts +9 -0
  63. package/dist/lib/geometry-converters/wkb/convert-geometry-to-wkb.d.ts.map +1 -0
  64. package/dist/lib/geometry-converters/wkb/convert-geometry-to-wkb.js +274 -0
  65. package/dist/lib/geometry-converters/wkb/convert-geometry-to-wkb.js.map +1 -0
  66. package/dist/lib/geometry-converters/wkb/convert-geometry-to-wkt.d.ts +8 -0
  67. package/dist/lib/geometry-converters/wkb/convert-geometry-to-wkt.d.ts.map +1 -0
  68. package/dist/lib/geometry-converters/wkb/convert-geometry-to-wkt.js +45 -0
  69. package/dist/lib/geometry-converters/wkb/convert-geometry-to-wkt.js.map +1 -0
  70. package/dist/lib/geometry-converters/wkb/convert-twkb-to-geometry.d.ts +10 -0
  71. package/dist/lib/geometry-converters/wkb/convert-twkb-to-geometry.d.ts.map +1 -0
  72. package/dist/lib/geometry-converters/wkb/convert-twkb-to-geometry.js +255 -0
  73. package/dist/lib/geometry-converters/wkb/convert-twkb-to-geometry.js.map +1 -0
  74. package/dist/lib/geometry-converters/wkb/convert-wkb-to-binary-geometry.d.ts +3 -0
  75. package/dist/lib/geometry-converters/wkb/convert-wkb-to-binary-geometry.d.ts.map +1 -0
  76. package/dist/lib/geometry-converters/wkb/convert-wkb-to-binary-geometry.js +165 -0
  77. package/dist/lib/geometry-converters/wkb/convert-wkb-to-binary-geometry.js.map +1 -0
  78. package/dist/lib/geometry-converters/wkb/convert-wkb-to-geometry.d.ts +11 -0
  79. package/dist/lib/geometry-converters/wkb/convert-wkb-to-geometry.d.ts.map +1 -0
  80. package/dist/lib/geometry-converters/wkb/convert-wkb-to-geometry.js +10 -0
  81. package/dist/lib/geometry-converters/wkb/convert-wkb-to-geometry.js.map +1 -0
  82. package/dist/lib/geometry-converters/wkb/convert-wkt-to-geometry.d.ts +16 -0
  83. package/dist/lib/geometry-converters/wkb/convert-wkt-to-geometry.d.ts.map +1 -0
  84. package/dist/lib/geometry-converters/wkb/convert-wkt-to-geometry.js +259 -0
  85. package/dist/lib/geometry-converters/wkb/convert-wkt-to-geometry.js.map +1 -0
  86. package/dist/lib/geometry-converters/wkb/helpers/parse-wkb-header.d.ts +43 -0
  87. package/dist/lib/geometry-converters/wkb/helpers/parse-wkb-header.d.ts.map +1 -0
  88. package/dist/lib/geometry-converters/wkb/helpers/parse-wkb-header.js +175 -0
  89. package/dist/lib/geometry-converters/wkb/helpers/parse-wkb-header.js.map +1 -0
  90. package/dist/lib/geometry-converters/wkb/helpers/wkb-types.d.ts +64 -0
  91. package/dist/lib/geometry-converters/wkb/helpers/wkb-types.d.ts.map +1 -0
  92. package/dist/lib/geometry-converters/wkb/helpers/wkb-types.js +47 -0
  93. package/dist/lib/geometry-converters/wkb/helpers/wkb-types.js.map +1 -0
  94. package/dist/lib/geometry-converters/wkb/helpers/wkb-utils.d.ts +21 -0
  95. package/dist/lib/geometry-converters/wkb/helpers/wkb-utils.d.ts.map +1 -0
  96. package/dist/lib/geometry-converters/wkb/helpers/wkb-utils.js +65 -0
  97. package/dist/lib/geometry-converters/wkb/helpers/wkb-utils.js.map +1 -0
  98. package/dist/lib/geometry-converters/wkb/helpers/write-wkb-header.d.ts +8 -0
  99. package/dist/lib/geometry-converters/wkb/helpers/write-wkb-header.d.ts.map +1 -0
  100. package/dist/lib/geometry-converters/wkb/helpers/write-wkb-header.js +34 -0
  101. package/dist/lib/geometry-converters/wkb/helpers/write-wkb-header.js.map +1 -0
  102. package/dist/lib/table-converters/convert-geoarrow-table.d.ts +27 -0
  103. package/dist/lib/table-converters/convert-geoarrow-table.d.ts.map +1 -0
  104. package/dist/lib/table-converters/convert-geoarrow-table.js +155 -0
  105. package/dist/lib/table-converters/convert-geoarrow-table.js.map +1 -0
  106. package/dist/lib/table-converters/convert-wkb-table-to-geojson.d.ts +4 -0
  107. package/dist/lib/table-converters/convert-wkb-table-to-geojson.d.ts.map +1 -0
  108. package/dist/lib/{tables/convert-table-to-geojson.js → table-converters/convert-wkb-table-to-geojson.js} +11 -16
  109. package/dist/lib/table-converters/convert-wkb-table-to-geojson.js.map +1 -0
  110. package/dist/lib/table-converters/make-arrow-batch-iterator.d.ts +6 -0
  111. package/dist/lib/table-converters/make-arrow-batch-iterator.d.ts.map +1 -0
  112. package/dist/lib/table-converters/make-arrow-batch-iterator.js +36 -0
  113. package/dist/lib/table-converters/make-arrow-batch-iterator.js.map +1 -0
  114. package/dist/lib/utils/base64-encoder.d.ts +5 -0
  115. package/dist/lib/utils/base64-encoder.d.ts.map +1 -0
  116. package/dist/lib/utils/base64-encoder.js +154 -0
  117. package/dist/lib/utils/base64-encoder.js.map +1 -0
  118. package/dist/lib/utils/binary-reader.d.ts +18 -0
  119. package/dist/lib/utils/binary-reader.d.ts.map +1 -0
  120. package/dist/lib/utils/binary-reader.js +70 -0
  121. package/dist/lib/utils/binary-reader.js.map +1 -0
  122. package/dist/lib/utils/binary-writer.d.ts +30 -0
  123. package/dist/lib/utils/binary-writer.d.ts.map +1 -0
  124. package/dist/lib/utils/binary-writer.js +128 -0
  125. package/dist/lib/utils/binary-writer.js.map +1 -0
  126. package/dist/lib/utils/concat-typed-arrays.d.ts +3 -0
  127. package/dist/lib/utils/concat-typed-arrays.d.ts.map +1 -0
  128. package/dist/lib/utils/concat-typed-arrays.js +19 -0
  129. package/dist/lib/utils/concat-typed-arrays.js.map +1 -0
  130. package/dist/lib/utils/hex-encoder.d.ts +15 -0
  131. package/dist/lib/utils/hex-encoder.d.ts.map +1 -0
  132. package/dist/lib/utils/hex-encoder.js +55 -0
  133. package/dist/lib/utils/hex-encoder.js.map +1 -0
  134. package/dist/lib/utils/hex-transcoder.d.ts +15 -0
  135. package/dist/lib/utils/hex-transcoder.d.ts.map +1 -0
  136. package/dist/lib/utils/hex-transcoder.js +51 -0
  137. package/dist/lib/utils/hex-transcoder.js.map +1 -0
  138. package/dist/lib/wkt-crs/encode-wkt-crs.d.ts +10 -0
  139. package/dist/lib/wkt-crs/encode-wkt-crs.d.ts.map +1 -0
  140. package/dist/lib/wkt-crs/encode-wkt-crs.js +36 -0
  141. package/dist/lib/wkt-crs/encode-wkt-crs.js.map +1 -0
  142. package/dist/lib/wkt-crs/parse-wkt-crs.d.ts +15 -0
  143. package/dist/lib/wkt-crs/parse-wkt-crs.d.ts.map +1 -0
  144. package/dist/lib/wkt-crs/parse-wkt-crs.js +121 -0
  145. package/dist/lib/wkt-crs/parse-wkt-crs.js.map +1 -0
  146. package/package.json +7 -5
  147. package/src/index.ts +87 -14
  148. package/src/lib/binary-geometry-api/binary-geometry-info.ts +75 -0
  149. package/src/lib/binary-geometry-api/concat-binary-geometry.ts +78 -0
  150. package/src/lib/{binary-features/transform.ts → binary-geometry-api/transform-coordinates.ts} +0 -1
  151. package/src/lib/{binary-features/binary-to-geojson.ts → feature-collection-converters/convert-binary-features-to-geojson.ts} +5 -142
  152. package/src/lib/{binary-features/flat-geojson-to-binary.ts → feature-collection-converters/convert-flat-geojson-to-binary-features.ts} +14 -9
  153. package/src/lib/feature-collection-converters/convert-geoarrow-to-binary-features.ts +496 -0
  154. package/src/lib/{binary-features/geojson-to-binary.ts → feature-collection-converters/convert-geojson-to-binary-features.ts} +11 -7
  155. package/src/lib/{binary-features/geojson-to-flat-geojson.ts → feature-collection-converters/convert-geojson-to-flat-geojson.ts} +5 -1
  156. package/src/lib/{binary-features → feature-collection-converters/helpers}/flat-geojson-to-binary-types.ts +4 -0
  157. package/src/lib/{binary-features/extract-geometry-info.ts → geometry-api/geometry-info.ts} +20 -2
  158. package/src/lib/geometry-converters/convert-binary-geometry-to-geojson.ts +148 -0
  159. package/src/lib/geometry-converters/convert-geoarrow-to-geojson.ts +193 -0
  160. package/src/lib/geometry-converters/convert-to-geojson.ts +52 -0
  161. package/src/lib/geometry-converters/wkb/convert-geometry-to-twkb.ts +308 -0
  162. package/src/lib/geometry-converters/wkb/convert-geometry-to-wkb.ts +365 -0
  163. package/src/lib/geometry-converters/wkb/convert-geometry-to-wkt.ts +54 -0
  164. package/src/lib/geometry-converters/wkb/convert-twkb-to-geometry.ts +366 -0
  165. package/src/lib/geometry-converters/wkb/convert-wkb-to-binary-geometry.ts +238 -0
  166. package/src/lib/geometry-converters/wkb/convert-wkb-to-geometry.ts +23 -0
  167. package/src/lib/geometry-converters/wkb/convert-wkt-to-geometry.ts +294 -0
  168. package/src/lib/geometry-converters/wkb/helpers/parse-wkb-header.ts +213 -0
  169. package/src/lib/geometry-converters/wkb/helpers/wkb-types.ts +82 -0
  170. package/src/lib/geometry-converters/wkb/helpers/wkb-utils.ts +85 -0
  171. package/src/lib/geometry-converters/wkb/helpers/write-wkb-header.ts +41 -0
  172. package/src/lib/table-converters/convert-geoarrow-table.ts +218 -0
  173. package/src/lib/{tables/convert-table-to-geojson.ts → table-converters/convert-wkb-table-to-geojson.ts} +10 -23
  174. package/src/lib/table-converters/make-arrow-batch-iterator.ts +53 -0
  175. package/src/lib/utils/base64-encoder.ts +157 -0
  176. package/src/lib/utils/binary-reader.ts +76 -0
  177. package/src/lib/utils/binary-writer.ts +136 -0
  178. package/src/lib/utils/concat-typed-arrays.ts +24 -0
  179. package/src/lib/utils/hex-encoder.ts +60 -0
  180. package/src/lib/utils/hex-transcoder.ts +54 -0
  181. package/src/lib/wkt-crs/encode-wkt-crs.ts +41 -0
  182. package/src/lib/wkt-crs/parse-wkt-crs.ts +149 -0
  183. package/dist/lib/binary-features/binary-to-geojson.d.ts +0 -18
  184. package/dist/lib/binary-features/binary-to-geojson.d.ts.map +0 -1
  185. package/dist/lib/binary-features/extract-geometry-info.d.ts +0 -8
  186. package/dist/lib/binary-features/extract-geometry-info.d.ts.map +0 -1
  187. package/dist/lib/binary-features/flat-geojson-to-binary-types.d.ts.map +0 -1
  188. package/dist/lib/binary-features/flat-geojson-to-binary-types.js +0 -1
  189. package/dist/lib/binary-features/flat-geojson-to-binary.d.ts.map +0 -1
  190. package/dist/lib/binary-features/geojson-to-binary.d.ts.map +0 -1
  191. package/dist/lib/binary-features/geojson-to-binary.js +0 -21
  192. package/dist/lib/binary-features/geojson-to-flat-geojson.d.ts.map +0 -1
  193. package/dist/lib/binary-features/transform.d.ts.map +0 -1
  194. package/dist/lib/geo/geoarrow-metadata.d.ts +0 -27
  195. package/dist/lib/geo/geoarrow-metadata.d.ts.map +0 -1
  196. package/dist/lib/geo/geoarrow-metadata.js +0 -70
  197. package/dist/lib/geo/geoparquet-metadata-schema.d.ts +0 -79
  198. package/dist/lib/geo/geoparquet-metadata-schema.d.ts.map +0 -1
  199. package/dist/lib/geo/geoparquet-metadata-schema.js +0 -69
  200. package/dist/lib/geo/geoparquet-metadata.d.ts +0 -45
  201. package/dist/lib/geo/geoparquet-metadata.d.ts.map +0 -1
  202. package/dist/lib/geo/geoparquet-metadata.js +0 -117
  203. package/dist/lib/tables/convert-table-to-geojson.d.ts +0 -5
  204. package/dist/lib/tables/convert-table-to-geojson.d.ts.map +0 -1
  205. package/src/lib/geo/geoarrow-metadata.ts +0 -100
  206. package/src/lib/geo/geoparquet-metadata-schema.json +0 -60
  207. package/src/lib/geo/geoparquet-metadata-schema.ts +0 -71
  208. package/src/lib/geo/geoparquet-metadata.ts +0 -191
  209. /package/dist/lib/{binary-features → feature-collection-converters/helpers}/flat-geojson-to-binary-types.d.ts +0 -0
@@ -0,0 +1,496 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import * as arrow from 'apache-arrow';
6
+ import {earcut} from '@math.gl/polygon';
7
+ import type {BinaryFeatureCollection} from '@loaders.gl/schema';
8
+ import type {GeoArrowEncoding} from '@loaders.gl/geoarrow';
9
+ import {updateBoundsFromGeoArrowSamples} from '@loaders.gl/geoarrow';
10
+ import {TypedArray} from '@loaders.gl/loader-utils';
11
+
12
+ /**
13
+ * Binary geometry type
14
+ */
15
+ enum BinaryGeometryType {
16
+ points = 'points',
17
+ lines = 'lines',
18
+ polygons = 'polygons'
19
+ }
20
+
21
+ /**
22
+ * Binary data from geoarrow column and can be used by e.g. deck.gl GeojsonLayer
23
+ */
24
+ export type BinaryDataFromGeoArrow = {
25
+ /** Binary format geometries, an array of BinaryFeatureCollection */
26
+ binaryGeometries: BinaryFeatureCollection[];
27
+ /** Boundary of the binary geometries */
28
+ bounds: [number, number, number, number];
29
+ /** Feature types of the binary geometries */
30
+ featureTypes: {polygon: boolean; point: boolean; line: boolean};
31
+ /** (Optional) mean centers of the binary geometries for e.g. polygon filtering */
32
+ meanCenters?: number[][];
33
+ };
34
+
35
+ /**
36
+ * Binary geometry content returned from getBinaryGeometriesFromChunk
37
+ */
38
+ type BinaryGeometryContent = {
39
+ // Array of Point feature indexes by vertex
40
+ featureIds: Uint32Array;
41
+ /** Flat coordinate array of e.g. x, y or x,y,z */
42
+ flatCoordinateArray: Float64Array;
43
+ /** Dimention of each position */
44
+ nDim: number;
45
+ /** Array of geometry offsets: the start index of primitive geometry */
46
+ geomOffset: Int32Array;
47
+ /** Array of geometry indicies: the start index of each geometry */
48
+ geometryIndexes: Uint16Array;
49
+ /** (Optional) indices of triangels returned from polygon triangulation (Polygon only) */
50
+ triangles?: Uint32Array;
51
+ /** (Optional) array of mean center of each geometry */
52
+ meanCenters?: Float64Array;
53
+ };
54
+
55
+ export type BinaryGeometriesFromArrowOptions = {
56
+ /** option to specify which chunk to get binary geometries from, for progressive rendering */
57
+ chunkIndex?: number;
58
+ /** The offset (beginning index of rows) of input chunk. Used for reconstructing globalFeatureIds in web workers */
59
+ chunkOffset?: number;
60
+ /** option to get mean centers from geometries, for polygon filtering */
61
+ calculateMeanCenters?: boolean;
62
+ /** option to compute the triangle indices by tesselating polygons */
63
+ triangulate?: boolean;
64
+ };
65
+
66
+ /**
67
+ * get binary geometries from geoarrow column
68
+ *
69
+ * @param geoColumn the geoarrow column, e.g. arrowTable.getChildAt(geoColumnIndex)
70
+ * @param geoEncoding the geo encoding of the geoarrow column, e.g. getGeoArrowEncoding(arrowTable.schema, geoColumnName)
71
+ * @param options options for getting binary geometries {meanCenter: boolean}
72
+ * @returns BinaryDataFromGeoArrow
73
+ */
74
+ export function convertGeoArrowToBinaryFeatureCollection(
75
+ geoColumn: arrow.Vector,
76
+ geoEncoding: GeoArrowEncoding,
77
+ options?: BinaryGeometriesFromArrowOptions
78
+ ): BinaryDataFromGeoArrow {
79
+ const featureTypes = {
80
+ polygon: geoEncoding === 'geoarrow.multipolygon' || geoEncoding === 'geoarrow.polygon',
81
+ point: geoEncoding === 'geoarrow.multipoint' || geoEncoding === 'geoarrow.point',
82
+ line: geoEncoding === 'geoarrow.multilinestring' || geoEncoding === 'geoarrow.linestring'
83
+ };
84
+
85
+ const chunks =
86
+ options?.chunkIndex !== undefined && options?.chunkIndex >= 0
87
+ ? [geoColumn.data[options?.chunkIndex]]
88
+ : geoColumn.data;
89
+ let bounds: [number, number, number, number] = [Infinity, Infinity, -Infinity, -Infinity];
90
+ let globalFeatureIdOffset = options?.chunkOffset || 0;
91
+ const binaryGeometries: BinaryFeatureCollection[] = [];
92
+
93
+ chunks.forEach((chunk) => {
94
+ const {featureIds, flatCoordinateArray, nDim, geomOffset, triangles} =
95
+ getBinaryGeometriesFromChunk(chunk, geoEncoding, options);
96
+
97
+ const globalFeatureIds = new Uint32Array(featureIds.length);
98
+ for (let i = 0; i < featureIds.length; i++) {
99
+ globalFeatureIds[i] = featureIds[i] + globalFeatureIdOffset;
100
+ }
101
+
102
+ const binaryContent = {
103
+ globalFeatureIds: {value: globalFeatureIds, size: 1},
104
+ positions: {
105
+ value: flatCoordinateArray,
106
+ size: nDim
107
+ },
108
+ featureIds: {value: featureIds, size: 1},
109
+ // eslint-disable-next-line no-loop-func
110
+ properties: [...Array(chunk.length).keys()].map((i) => ({
111
+ index: i + globalFeatureIdOffset
112
+ }))
113
+ };
114
+
115
+ // TODO: check if chunks are sequentially accessed
116
+ globalFeatureIdOffset += chunk.length;
117
+ // NOTE: deck.gl defines the BinaryFeatureCollection structure must have points, lines, polygons even if they are empty
118
+ binaryGeometries.push({
119
+ shape: 'binary-feature-collection',
120
+ points: {
121
+ type: 'Point',
122
+ ...getBinaryGeometryTemplate(),
123
+ ...(featureTypes.point ? binaryContent : {})
124
+ },
125
+ lines: {
126
+ type: 'LineString',
127
+ ...getBinaryGeometryTemplate(),
128
+ ...(featureTypes.line ? binaryContent : {}),
129
+ pathIndices: {value: featureTypes.line ? geomOffset : new Uint16Array(0), size: 1}
130
+ },
131
+ polygons: {
132
+ type: 'Polygon',
133
+ ...getBinaryGeometryTemplate(),
134
+ ...(featureTypes.polygon ? binaryContent : {}),
135
+ polygonIndices: {
136
+ // use geomOffset as polygonIndices same as primitivePolygonIndices since we are using earcut to get triangule indices
137
+ value: featureTypes.polygon ? geomOffset : new Uint16Array(0),
138
+ size: 1
139
+ },
140
+ primitivePolygonIndices: {
141
+ value: featureTypes.polygon ? geomOffset : new Uint16Array(0),
142
+ size: 1
143
+ },
144
+ ...(triangles ? {triangles: {value: triangles, size: 1}} : {})
145
+ }
146
+ });
147
+
148
+ bounds = updateBoundsFromGeoArrowSamples(flatCoordinateArray, nDim, bounds);
149
+ });
150
+
151
+ return {
152
+ binaryGeometries,
153
+ bounds,
154
+ featureTypes,
155
+ ...(options?.calculateMeanCenters
156
+ ? {meanCenters: getMeanCentersFromBinaryGeometries(binaryGeometries)}
157
+ : {})
158
+ };
159
+ }
160
+
161
+ /**
162
+ * binary geometry template, see deck.gl BinaryGeometry
163
+ */
164
+ export function getBinaryGeometryTemplate() {
165
+ return {
166
+ globalFeatureIds: {value: new Uint32Array(0), size: 1},
167
+ positions: {value: new Float32Array(0), size: 2},
168
+ properties: [],
169
+ numericProps: {},
170
+ featureIds: {value: new Uint32Array(0), size: 1}
171
+ };
172
+ }
173
+
174
+ /**
175
+ * Get mean centers from binary geometries
176
+ * @param binaryGeometries binary geometries from geoarrow column, an array of BinaryFeatureCollection
177
+ * @returns mean centers of the binary geometries
178
+ */
179
+ export function getMeanCentersFromBinaryGeometries(
180
+ binaryGeometries: BinaryFeatureCollection[]
181
+ ): number[][] {
182
+ const globalMeanCenters: number[][] = [];
183
+ binaryGeometries.forEach((binaryGeometry: BinaryFeatureCollection) => {
184
+ let binaryGeometryType: keyof typeof BinaryGeometryType | null = null;
185
+ if (binaryGeometry.points && binaryGeometry.points.positions.value.length > 0) {
186
+ binaryGeometryType = BinaryGeometryType.points;
187
+ } else if (binaryGeometry.lines && binaryGeometry.lines.positions.value.length > 0) {
188
+ binaryGeometryType = BinaryGeometryType.lines;
189
+ } else if (binaryGeometry.polygons && binaryGeometry.polygons.positions.value.length > 0) {
190
+ binaryGeometryType = BinaryGeometryType.polygons;
191
+ }
192
+
193
+ const binaryContent = binaryGeometryType ? binaryGeometry[binaryGeometryType] : null;
194
+ if (binaryContent && binaryGeometryType !== null) {
195
+ const featureIds = binaryContent.featureIds.value;
196
+ const flatCoordinateArray = binaryContent.positions.value;
197
+ const nDim = binaryContent.positions.size;
198
+ const primitivePolygonIndices =
199
+ binaryContent.type === 'Polygon' ? binaryContent.primitivePolygonIndices?.value : undefined;
200
+
201
+ const meanCenters = getMeanCentersFromGeometry(
202
+ featureIds,
203
+ flatCoordinateArray,
204
+ nDim,
205
+ binaryGeometryType,
206
+ primitivePolygonIndices
207
+ );
208
+ meanCenters.forEach((center) => {
209
+ globalMeanCenters.push(center);
210
+ });
211
+ }
212
+ });
213
+ return globalMeanCenters;
214
+ }
215
+
216
+ /**
217
+ * Get mean centers from raw coordinates and feature ids
218
+ * @param featureIds Array of feature ids indexes by vertex
219
+ * @param flatCoordinateArray Array of vertex, e.g. x, y or x, y, z, positions
220
+ * @param nDim number of dimensions per position
221
+ * @returns - mean centers of each polygon
222
+ */
223
+ function getMeanCentersFromGeometry(
224
+ featureIds: TypedArray,
225
+ flatCoordinateArray: TypedArray,
226
+ nDim: number,
227
+ geometryType: keyof typeof BinaryGeometryType,
228
+ primitivePolygonIndices?: TypedArray
229
+ ) {
230
+ const meanCenters: number[][] = [];
231
+ const vertexCount = flatCoordinateArray.length;
232
+ let vertexIndex = 0;
233
+ let coordIdx = 0;
234
+ let primitiveIdx = 0;
235
+ while (vertexIndex < vertexCount) {
236
+ const featureId = featureIds[vertexIndex / nDim];
237
+ const center = [0, 0];
238
+ let vertexCountInFeature = 0;
239
+ while (vertexIndex < vertexCount && featureIds[coordIdx] === featureId) {
240
+ if (
241
+ geometryType === BinaryGeometryType.polygons &&
242
+ primitivePolygonIndices?.[primitiveIdx] === coordIdx
243
+ ) {
244
+ // skip the first point since it is the same as the last point in each ring for polygons
245
+ vertexIndex += nDim;
246
+ primitiveIdx++;
247
+ } else {
248
+ center[0] += flatCoordinateArray[vertexIndex];
249
+ center[1] += flatCoordinateArray[vertexIndex + 1];
250
+ vertexIndex += nDim;
251
+ vertexCountInFeature++;
252
+ }
253
+ coordIdx += 1;
254
+ }
255
+ center[0] /= vertexCountInFeature;
256
+ center[1] /= vertexCountInFeature;
257
+ meanCenters.push(center);
258
+ }
259
+ return meanCenters;
260
+ }
261
+
262
+ /**
263
+ * get binary geometries from geoarrow column
264
+ * @param chunk one chunk/batch of geoarrow column
265
+ * @param geoEncoding geo encoding of the geoarrow column
266
+ * @param options options for getting binary geometries
267
+ * @returns BinaryGeometryContent
268
+ */
269
+ function getBinaryGeometriesFromChunk(
270
+ chunk: arrow.Data,
271
+ geoEncoding: GeoArrowEncoding,
272
+ options?: BinaryGeometriesFromArrowOptions
273
+ ): BinaryGeometryContent {
274
+ switch (geoEncoding) {
275
+ case 'geoarrow.point':
276
+ case 'geoarrow.multipoint':
277
+ return getBinaryPointsFromChunk(chunk, geoEncoding);
278
+ case 'geoarrow.linestring':
279
+ case 'geoarrow.multilinestring':
280
+ return getBinaryLinesFromChunk(chunk, geoEncoding);
281
+ case 'geoarrow.polygon':
282
+ case 'geoarrow.multipolygon':
283
+ return getBinaryPolygonsFromChunk(chunk, geoEncoding, options);
284
+ default:
285
+ throw Error('invalid geoarrow encoding');
286
+ }
287
+ }
288
+
289
+ /**
290
+ * get triangle indices. Allows deck.gl to skip performing costly triangulation on main thread.
291
+ * @param polygonIndices Indices within positions of the start of each simple Polygon
292
+ * @param primitivePolygonIndices Indices within positions of the start of each primitive Polygon/ring
293
+ * @param flatCoordinateArray Array of x, y or x, y, z positions
294
+ * @param nDim - number of dimensions per position
295
+ * @returns triangle indices or null if invalid polygon and earcut fails
296
+ */
297
+ export function getTriangleIndices(
298
+ polygonIndices: Uint16Array,
299
+ primitivePolygonIndices: Int32Array,
300
+ flatCoordinateArray: Float64Array,
301
+ nDim: number
302
+ ): Uint32Array | null {
303
+ try {
304
+ let primitiveIndex = 0;
305
+ const triangles: number[] = [];
306
+ // loop polygonIndices to get triangles
307
+ for (let i = 0; i < polygonIndices.length - 1; i++) {
308
+ const startIdx = polygonIndices[i];
309
+ const endIdx = polygonIndices[i + 1];
310
+ // get subarray of flatCoordinateArray
311
+ const slicedFlatCoords = flatCoordinateArray.subarray(startIdx * nDim, endIdx * nDim);
312
+ // get holeIndices for earcut
313
+ const holeIndices: number[] = [];
314
+ while (primitivePolygonIndices[primitiveIndex] < endIdx) {
315
+ if (primitivePolygonIndices[primitiveIndex] > startIdx) {
316
+ holeIndices.push(primitivePolygonIndices[primitiveIndex] - startIdx);
317
+ }
318
+ primitiveIndex++;
319
+ }
320
+ // TODO check if each ring is closed
321
+ const triangleIndices = earcut(
322
+ slicedFlatCoords,
323
+ holeIndices.length > 0 ? holeIndices : undefined,
324
+ nDim
325
+ );
326
+ if (triangleIndices.length === 0) {
327
+ throw Error('earcut failed e.g. invalid polygon');
328
+ }
329
+ for (let j = 0; j < triangleIndices.length; j++) {
330
+ triangles.push(triangleIndices[j] + startIdx);
331
+ }
332
+ }
333
+ // convert traingles to Uint32Array
334
+ const trianglesUint32 = new Uint32Array(triangles.length);
335
+ for (let i = 0; i < triangles.length; i++) {
336
+ trianglesUint32[i] = triangles[i];
337
+ }
338
+ return trianglesUint32;
339
+ } catch (error) {
340
+ // if earcut fails, return null
341
+ return null;
342
+ }
343
+ }
344
+
345
+ /**
346
+ * get binary polygons from geoarrow polygon column
347
+ * @param chunk one chunk of geoarrow polygon column
348
+ * @param geoEncoding the geo encoding of the geoarrow polygon column
349
+ * @param options options for getting binary geometries
350
+ * @returns BinaryGeometryContent
351
+ */
352
+ function getBinaryPolygonsFromChunk(
353
+ chunk: arrow.Data,
354
+ geoEncoding: string,
355
+ options?: BinaryGeometriesFromArrowOptions
356
+ ): BinaryGeometryContent {
357
+ const isMultiPolygon = geoEncoding === 'geoarrow.multipolygon';
358
+
359
+ const polygonData = isMultiPolygon ? chunk.children[0] : chunk;
360
+ const polygonOffset = polygonData.valueOffsets;
361
+ const partData = isMultiPolygon
362
+ ? chunk.valueOffsets.map((i) => polygonOffset.at(i) || i)
363
+ : chunk.valueOffsets;
364
+ const ringData = polygonData.children[0];
365
+ const pointData = ringData.children[0];
366
+ const coordData = pointData.children[0];
367
+ const nDim = pointData.stride;
368
+ const geomOffset = ringData.valueOffsets;
369
+ const flatCoordinateArray = coordData.values;
370
+
371
+ const geometryIndexes = new Uint16Array(polygonOffset.length);
372
+ for (let i = 0; i < polygonOffset.length; i++) {
373
+ geometryIndexes[i] = geomOffset[polygonOffset[i]];
374
+ }
375
+
376
+ const numOfVertices = flatCoordinateArray.length / nDim;
377
+ const featureIds = new Uint32Array(numOfVertices);
378
+ for (let i = 0; i < partData.length - 1; i++) {
379
+ const startIdx = geomOffset[partData[i]];
380
+ const endIdx = geomOffset[partData[i + 1]];
381
+ for (let j = startIdx; j < endIdx; j++) {
382
+ featureIds[j] = i;
383
+ }
384
+ }
385
+
386
+ const triangles = options?.triangulate
387
+ ? getTriangleIndices(geometryIndexes, geomOffset, flatCoordinateArray, nDim)
388
+ : null;
389
+
390
+ return {
391
+ featureIds,
392
+ nDim,
393
+ flatCoordinateArray,
394
+ geomOffset,
395
+ geometryIndexes,
396
+ ...(options?.triangulate && triangles ? {triangles} : {})
397
+ };
398
+ }
399
+
400
+ /**
401
+ * get binary lines from geoarrow line column
402
+ * @param chunk one chunk/batch of geoarrow column
403
+ * @param geoEncoding the geo encoding of the geoarrow column
404
+ * @returns BinaryGeometryContent
405
+ */
406
+ function getBinaryLinesFromChunk(chunk: arrow.Data, geoEncoding: string): BinaryGeometryContent {
407
+ const isMultiLineString = geoEncoding === 'geoarrow.multilinestring';
408
+
409
+ const lineData = isMultiLineString ? chunk.children[0] : chunk;
410
+ const pointData = lineData.children[0];
411
+ const coordData = pointData.children[0];
412
+
413
+ const nDim = pointData.stride;
414
+ const geomOffset = lineData.valueOffsets;
415
+ const flatCoordinateArray = coordData.values;
416
+
417
+ // geometryIndexes is not needed for line string
418
+ const geometryIndexes = new Uint16Array(0);
419
+
420
+ const numOfVertices = flatCoordinateArray.length / nDim;
421
+ const featureIds = new Uint32Array(numOfVertices);
422
+
423
+ if (isMultiLineString) {
424
+ const partData = chunk.valueOffsets;
425
+ for (let i = 0; i < partData.length - 1; i++) {
426
+ const startIdx = geomOffset[partData[i]];
427
+ const endIdx = geomOffset[partData[i + 1]];
428
+ for (let j = startIdx; j < endIdx; j++) {
429
+ featureIds[j] = i;
430
+ }
431
+ }
432
+ } else {
433
+ for (let i = 0; i < chunk.length; i++) {
434
+ const startIdx = geomOffset[i];
435
+ const endIdx = geomOffset[i + 1];
436
+ for (let j = startIdx; j < endIdx; j++) {
437
+ featureIds[j] = i;
438
+ }
439
+ }
440
+ }
441
+
442
+ return {
443
+ featureIds,
444
+ flatCoordinateArray,
445
+ nDim,
446
+ geomOffset,
447
+ geometryIndexes
448
+ };
449
+ }
450
+
451
+ /**
452
+ * get binary points from geoarrow point column
453
+ * @param chunk one chunk/batch of geoarrow column
454
+ * @param geoEncoding geo encoding of the geoarrow column
455
+ * @returns BinaryGeometryContent
456
+ */
457
+ function getBinaryPointsFromChunk(chunk: arrow.Data, geoEncoding: string): BinaryGeometryContent {
458
+ const isMultiPoint = geoEncoding === 'geoarrow.multipoint';
459
+
460
+ const pointData = isMultiPoint ? chunk.children[0] : chunk;
461
+ const coordData = pointData.children[0];
462
+
463
+ const nDim = pointData.stride;
464
+ const flatCoordinateArray = coordData.values;
465
+
466
+ // geometryIndices is not needed for point
467
+ const geometryIndexes = new Uint16Array(0);
468
+ // geomOffset is not needed for point
469
+ const geomOffset = new Int32Array(0);
470
+
471
+ const numOfVertices = flatCoordinateArray.length / nDim;
472
+ const featureIds = new Uint32Array(numOfVertices);
473
+
474
+ if (isMultiPoint) {
475
+ const partData = chunk.valueOffsets;
476
+ for (let i = 0; i < partData.length - 1; i++) {
477
+ const startIdx = partData[i];
478
+ const endIdx = partData[i + 1];
479
+ for (let j = startIdx; j < endIdx; j++) {
480
+ featureIds[j] = i;
481
+ }
482
+ }
483
+ } else {
484
+ for (let i = 0; i < chunk.length; i++) {
485
+ featureIds[i] = i;
486
+ }
487
+ }
488
+
489
+ return {
490
+ featureIds,
491
+ flatCoordinateArray,
492
+ nDim,
493
+ geomOffset,
494
+ geometryIndexes
495
+ };
496
+ }
@@ -1,8 +1,12 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
1
5
  import type {Feature, BinaryFeatureCollection} from '@loaders.gl/schema';
2
6
 
3
- import {extractGeometryInfo} from './extract-geometry-info';
4
- import {geojsonToFlatGeojson} from './geojson-to-flat-geojson';
5
- import {flatGeojsonToBinary} from './flat-geojson-to-binary';
7
+ import {getGeometryInfo} from '../geometry-api/geometry-info';
8
+ import {convertGeojsonToFlatGeojson} from './convert-geojson-to-flat-geojson';
9
+ import {convertFlatGeojsonToBinaryFeatureCollection} from './convert-flat-geojson-to-binary-features';
6
10
 
7
11
  /**
8
12
  * Options for `geojsonToBinary`
@@ -21,15 +25,15 @@ export type GeojsonToBinaryOptions = {
21
25
  * @param options
22
26
  * @returns features in binary format, grouped by geometry type
23
27
  */
24
- export function geojsonToBinary(
28
+ export function convertGeojsonToBinaryFeatureCollection(
25
29
  features: Feature[],
26
30
  options: GeojsonToBinaryOptions = {fixRingWinding: true, triangulate: true}
27
31
  ): BinaryFeatureCollection {
28
- const geometryInfo = extractGeometryInfo(features);
32
+ const geometryInfo = getGeometryInfo(features);
29
33
  const coordLength = geometryInfo.coordLength;
30
34
  const {fixRingWinding} = options;
31
- const flatFeatures = geojsonToFlatGeojson(features, {coordLength, fixRingWinding});
32
- return flatGeojsonToBinary(flatFeatures, geometryInfo, {
35
+ const flatFeatures = convertGeojsonToFlatGeojson(features, {coordLength, fixRingWinding});
36
+ return convertFlatGeojsonToBinaryFeatureCollection(flatFeatures, geometryInfo, {
33
37
  numericPropKeys: options.numericPropKeys,
34
38
  PositionDataType: options.PositionDataType || Float32Array,
35
39
  triangulate: options.triangulate
@@ -1,3 +1,7 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
1
5
  import {getPolygonSignedArea} from '@math.gl/polygon';
2
6
 
3
7
  import {Feature, Position, FlatFeature} from '@loaders.gl/schema';
@@ -24,7 +28,7 @@ type PolygonCoordinates = Position[][];
24
28
  * @param options
25
29
  * @returns an Array of Flat GeoJSON features
26
30
  */
27
- export function geojsonToFlatGeojson(
31
+ export function convertGeojsonToFlatGeojson(
28
32
  features: Feature[],
29
33
  options: GeojsonToFlatGeojsonOptions = {coordLength: 2, fixRingWinding: true}
30
34
  ): FlatFeature[] {
@@ -1,3 +1,7 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
1
5
  import type {TypedArray} from '@loaders.gl/schema';
2
6
 
3
7
  /**
@@ -1,4 +1,22 @@
1
- import {Feature, GeojsonGeometryInfo} from '@loaders.gl/schema';
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {Feature} from '@loaders.gl/schema';
6
+
7
+ /** Aggregate information for converting GeoJSON into other formats */
8
+ export type GeojsonGeometryInfo = {
9
+ coordLength: number;
10
+ pointPositionsCount: number;
11
+ pointFeaturesCount: number;
12
+ linePositionsCount: number;
13
+ linePathsCount: number;
14
+ lineFeaturesCount: number;
15
+ polygonPositionsCount: number;
16
+ polygonObjectsCount: number;
17
+ polygonRingsCount: number;
18
+ polygonFeaturesCount: number;
19
+ };
2
20
 
3
21
  /**
4
22
  * Initial scan over GeoJSON features
@@ -6,7 +24,7 @@ import {Feature, GeojsonGeometryInfo} from '@loaders.gl/schema';
6
24
  * keeps track of the max coordinate dimensions
7
25
  */
8
26
  // eslint-disable-next-line complexity, max-statements
9
- export function extractGeometryInfo(features: Feature[]): GeojsonGeometryInfo {
27
+ export function getGeometryInfo(features: Feature[]): GeojsonGeometryInfo {
10
28
  // Counts the number of _positions_, so [x, y, z] counts as one
11
29
  let pointPositionsCount = 0;
12
30
  let pointFeaturesCount = 0;