@loaders.gl/gis 4.0.0-alpha.16 → 4.0.0-alpha.18

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.
@@ -1 +1 @@
1
- {"version":3,"file":"flat-geojson-to-binary-types.js","names":[],"sources":["../../../src/lib/flat-geojson-to-binary-types.ts"],"sourcesContent":["import type {TypedArray} from '@loaders.gl/schema';\n\n/**\n * Permissable constructor for numeric props\n */\nexport type PropArrayConstructor =\n | Float32ArrayConstructor\n | Float64ArrayConstructor\n | ArrayConstructor;\n\n/**\n * Collection type for holding intermediate binary data before conversion to `BinaryPointGeometry`\n */\nexport type Points = {\n type: 'Point';\n positions: Float32Array | Float64Array;\n globalFeatureIds: Uint16Array | Uint32Array;\n featureIds: Uint16Array | Uint32Array;\n numericProps: {[key: string]: TypedArray};\n properties: {}[];\n fields: {\n id?: string | number;\n }[];\n};\n\n/**\n * Collection type for holding intermediate binary data before conversion to `BinaryLineStringGeometry`\n */\nexport type Lines = {\n type: 'LineString';\n positions: Float32Array | Float64Array;\n pathIndices: Uint16Array | Uint32Array;\n globalFeatureIds: Uint16Array | Uint32Array;\n featureIds: Uint16Array | Uint32Array;\n numericProps: {[key: string]: TypedArray};\n properties: {}[];\n fields: {\n id?: string | number;\n }[];\n};\n\n/**\n * Collection type for holding intermediate binary data before conversion to `BinaryPolygonGeometry`\n */\nexport type Polygons = {\n type: 'Polygon';\n positions: Float32Array | Float64Array;\n polygonIndices: Uint16Array | Uint32Array;\n primitivePolygonIndices: Uint16Array | Uint32Array;\n triangles: number[];\n globalFeatureIds: Uint16Array | Uint32Array;\n featureIds: Uint16Array | Uint32Array;\n numericProps: {[key: string]: TypedArray};\n properties: {}[];\n fields: {\n id?: string | number;\n }[];\n};\n"],"mappings":""}
1
+ {"version":3,"file":"flat-geojson-to-binary-types.js","names":[],"sources":["../../../src/lib/flat-geojson-to-binary-types.ts"],"sourcesContent":["import type {TypedArray} from '@loaders.gl/schema';\n\n/**\n * Permissable constructor for numeric props\n */\nexport type PropArrayConstructor =\n | Float32ArrayConstructor\n | Float64ArrayConstructor\n | ArrayConstructor;\n\n/**\n * Collection type for holding intermediate binary data before conversion to `BinaryPointGeometry`\n */\nexport type Points = {\n type: 'Point';\n positions: Float32Array | Float64Array;\n globalFeatureIds: Uint16Array | Uint32Array;\n featureIds: Uint16Array | Uint32Array;\n numericProps: {[key: string]: TypedArray};\n properties: {}[];\n fields: {\n id?: string | number;\n }[];\n};\n\n/**\n * Collection type for holding intermediate binary data before conversion to `BinaryLineStringGeometry`\n */\nexport type Lines = {\n type: 'LineString';\n positions: Float32Array | Float64Array;\n pathIndices: Uint16Array | Uint32Array;\n globalFeatureIds: Uint16Array | Uint32Array;\n featureIds: Uint16Array | Uint32Array;\n numericProps: {[key: string]: TypedArray};\n properties: {}[];\n fields: {\n id?: string | number;\n }[];\n};\n\n/**\n * Collection type for holding intermediate binary data before conversion to `BinaryPolygonGeometry`\n */\nexport type Polygons = {\n type: 'Polygon';\n positions: Float32Array | Float64Array;\n polygonIndices: Uint16Array | Uint32Array;\n primitivePolygonIndices: Uint16Array | Uint32Array;\n triangles?: number[];\n globalFeatureIds: Uint16Array | Uint32Array;\n featureIds: Uint16Array | Uint32Array;\n numericProps: {[key: string]: TypedArray};\n properties: {}[];\n fields: {\n id?: string | number;\n }[];\n};\n"],"mappings":""}
@@ -22,7 +22,8 @@ function flatGeojsonToBinary(features, geometryInfo, options) {
22
22
  propArrayTypes: propArrayTypes
23
23
  }, geometryInfo), {
24
24
  numericPropKeys: options && options.numericPropKeys || numericPropKeys,
25
- PositionDataType: options ? options.PositionDataType : Float32Array
25
+ PositionDataType: options ? options.PositionDataType : Float32Array,
26
+ triangulate: options ? options.triangulate : true
26
27
  });
27
28
  }
28
29
  var TEST_EXPORTS = {
@@ -65,7 +66,9 @@ function fillArrays(features, geometryInfo, options) {
65
66
  var _options$numericPropK = options.numericPropKeys,
66
67
  numericPropKeys = _options$numericPropK === void 0 ? [] : _options$numericPropK,
67
68
  _options$PositionData = options.PositionDataType,
68
- PositionDataType = _options$PositionData === void 0 ? Float32Array : _options$PositionData;
69
+ PositionDataType = _options$PositionData === void 0 ? Float32Array : _options$PositionData,
70
+ _options$triangulate = options.triangulate,
71
+ triangulate = _options$triangulate === void 0 ? true : _options$triangulate;
69
72
  var hasGlobalId = features[0] && 'id' in features[0];
70
73
  var GlobalFeatureIdsDataType = features.length > 65535 ? Uint32Array : Uint16Array;
71
74
  var points = {
@@ -92,13 +95,15 @@ function fillArrays(features, geometryInfo, options) {
92
95
  polygonIndices: polygonPositionsCount > 65535 ? new Uint32Array(polygonObjectsCount + 1) : new Uint16Array(polygonObjectsCount + 1),
93
96
  primitivePolygonIndices: polygonPositionsCount > 65535 ? new Uint32Array(polygonRingsCount + 1) : new Uint16Array(polygonRingsCount + 1),
94
97
  positions: new PositionDataType(polygonPositionsCount * coordLength),
95
- triangles: [],
96
98
  globalFeatureIds: new GlobalFeatureIdsDataType(polygonPositionsCount),
97
99
  featureIds: polygonFeaturesCount > 65535 ? new Uint32Array(polygonPositionsCount) : new Uint16Array(polygonPositionsCount),
98
100
  numericProps: {},
99
101
  properties: [],
100
102
  fields: []
101
103
  };
104
+ if (triangulate) {
105
+ polygons.triangles = [];
106
+ }
102
107
  for (var _i = 0, _arr = [points, lines, polygons]; _i < _arr.length; _i++) {
103
108
  var object = _arr[_i];
104
109
  var _iterator2 = _createForOfIteratorHelper(numericPropKeys),
@@ -231,6 +236,9 @@ function triangulatePolygon(polygons, areas, indices, _ref) {
231
236
  var startPosition = _ref.startPosition,
232
237
  endPosition = _ref.endPosition,
233
238
  coordLength = _ref.coordLength;
239
+ if (!polygons.triangles) {
240
+ return;
241
+ }
234
242
  var start = startPosition * coordLength;
235
243
  var end = endPosition * coordLength;
236
244
  var polygonPositions = polygons.positions.subarray(start, end);
@@ -254,7 +262,7 @@ function wrapProps(obj, size) {
254
262
  return returnObj;
255
263
  }
256
264
  function makeAccessorObjects(points, lines, polygons, coordLength) {
257
- return {
265
+ var binaryFeatures = {
258
266
  points: _objectSpread(_objectSpread({}, points), {}, {
259
267
  positions: {
260
268
  value: points.positions,
@@ -302,10 +310,6 @@ function makeAccessorObjects(points, lines, polygons, coordLength) {
302
310
  value: polygons.primitivePolygonIndices,
303
311
  size: 1
304
312
  },
305
- triangles: {
306
- value: new Uint32Array(polygons.triangles),
307
- size: 1
308
- },
309
313
  globalFeatureIds: {
310
314
  value: polygons.globalFeatureIds,
311
315
  size: 1
@@ -317,6 +321,13 @@ function makeAccessorObjects(points, lines, polygons, coordLength) {
317
321
  numericProps: wrapProps(polygons.numericProps, 1)
318
322
  })
319
323
  };
324
+ if (polygons.triangles) {
325
+ binaryFeatures.polygons.triangles = {
326
+ value: new Uint32Array(polygons.triangles),
327
+ size: 1
328
+ };
329
+ }
330
+ return binaryFeatures;
320
331
  }
321
332
  function fillNumericProperties(object, properties, index, length) {
322
333
  for (var numericPropName in object.numericProps) {
@@ -1 +1 @@
1
- {"version":3,"file":"flat-geojson-to-binary.js","names":["_polygon","require","_createForOfIteratorHelper","o","allowArrayLike","it","Symbol","iterator","Array","isArray","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","return","minLen","_arrayLikeToArray","Object","prototype","toString","slice","constructor","name","from","test","arr","len","arr2","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","target","arguments","source","forEach","key","_defineProperty2","default","getOwnPropertyDescriptors","defineProperties","defineProperty","flatGeojsonToBinary","features","geometryInfo","options","propArrayTypes","extractNumericPropTypes","numericPropKeys","k","fillArrays","PositionDataType","Float32Array","TEST_EXPORTS","exports","_iterator","_step","feature","properties","val","deduceArrayType","pointPositionsCount","pointFeaturesCount","linePositionsCount","linePathsCount","lineFeaturesCount","polygonPositionsCount","polygonObjectsCount","polygonRingsCount","polygonFeaturesCount","coordLength","_options$numericPropK","_options$PositionData","hasGlobalId","GlobalFeatureIdsDataType","Uint32Array","Uint16Array","points","type","positions","globalFeatureIds","featureIds","numericProps","fields","lines","pathIndices","polygons","polygonIndices","primitivePolygonIndices","triangles","_i","_arr","_iterator2","_step2","propName","T","indexMap","pointPosition","pointFeature","linePosition","linePath","lineFeature","polygonPosition","polygonObject","polygonRing","polygonFeature","_iterator3","_step3","geometry","handlePoint","keepStringProperties","id","handleLineString","handlePolygon","Error","makeAccessorObjects","set","data","nPositions","fillNumericProperties","fill","il","indices","start","end","l","ll","startPosition","areas","nextIndices","undefined","endPosition","triangulatePolygon","_ref","polygonPositions","subarray","offset","holes","map","earcut","t","tl","wrapProps","obj","size","returnObj","index","numericPropName","numericKeys","props","includes","x","Number","isFinite","Float64Array","Math","fround"],"sources":["../../../src/lib/flat-geojson-to-binary.ts"],"sourcesContent":["/* eslint-disable indent */\nimport {earcut} from '@math.gl/polygon';\nimport type {\n BinaryAttribute,\n BinaryFeatures,\n FlatFeature,\n FlatPoint,\n FlatLineString,\n FlatPolygon,\n GeojsonGeometryInfo,\n TypedArray\n} from '@loaders.gl/schema';\nimport {PropArrayConstructor, Lines, Points, Polygons} from './flat-geojson-to-binary-types';\n\n/**\n * Convert binary features to flat binary arrays. Similar to\n * `geojsonToBinary` helper function, except that it expects\n * a binary representation of the feature data, which enables\n * 2X-3X speed increase in parse speed, compared to using\n * geoJSON. See `binary-vector-tile/VectorTileFeature` for\n * data format detais\n *\n * @param features\n * @param geometryInfo\n * @param options\n * @returns filled arrays\n */\nexport function flatGeojsonToBinary(\n features: FlatFeature[],\n geometryInfo: GeojsonGeometryInfo,\n options?: FlatGeojsonToBinaryOptions\n) {\n const propArrayTypes = extractNumericPropTypes(features);\n const numericPropKeys = Object.keys(propArrayTypes).filter((k) => propArrayTypes[k] !== Array);\n return fillArrays(\n features,\n {\n propArrayTypes,\n ...geometryInfo\n },\n {\n numericPropKeys: (options && options.numericPropKeys) || numericPropKeys,\n PositionDataType: options ? options.PositionDataType : Float32Array\n }\n );\n}\n\n/**\n * Options for `flatGeojsonToBinary`\n */\nexport type FlatGeojsonToBinaryOptions = {\n numericPropKeys?: string[];\n PositionDataType?: Float32ArrayConstructor | Float64ArrayConstructor;\n};\n\nexport const TEST_EXPORTS = {\n extractNumericPropTypes\n};\n\n/**\n * Extracts properties that are always numeric\n *\n * @param features\n * @returns object with numeric types\n */\nfunction extractNumericPropTypes(features: FlatFeature[]): {\n [key: string]: PropArrayConstructor;\n} {\n const propArrayTypes = {};\n for (const feature of features) {\n if (feature.properties) {\n for (const key in feature.properties) {\n // If property has not been seen before, or if property has been numeric\n // in all previous features, check if numeric in this feature\n // If not numeric, Array is stored to prevent rechecking in the future\n // Additionally, detects if 64 bit precision is required\n const val = feature.properties[key];\n propArrayTypes[key] = deduceArrayType(val, propArrayTypes[key]);\n }\n }\n }\n\n return propArrayTypes;\n}\n\n/**\n * Fills coordinates into pre-allocated typed arrays\n *\n * @param features\n * @param geometryInfo\n * @param options\n * @returns an accessor object with value and size keys\n */\n// eslint-disable-next-line complexity\nfunction fillArrays(\n features: FlatFeature[],\n geometryInfo: GeojsonGeometryInfo & {\n propArrayTypes: {[key: string]: PropArrayConstructor};\n },\n options: FlatGeojsonToBinaryOptions\n) {\n const {\n pointPositionsCount,\n pointFeaturesCount,\n linePositionsCount,\n linePathsCount,\n lineFeaturesCount,\n polygonPositionsCount,\n polygonObjectsCount,\n polygonRingsCount,\n polygonFeaturesCount,\n propArrayTypes,\n coordLength\n } = geometryInfo;\n const {numericPropKeys = [], PositionDataType = Float32Array} = options;\n const hasGlobalId = features[0] && 'id' in features[0];\n const GlobalFeatureIdsDataType = features.length > 65535 ? Uint32Array : Uint16Array;\n const points: Points = {\n type: 'Point',\n positions: new PositionDataType(pointPositionsCount * coordLength),\n globalFeatureIds: new GlobalFeatureIdsDataType(pointPositionsCount),\n featureIds:\n pointFeaturesCount > 65535\n ? new Uint32Array(pointPositionsCount)\n : new Uint16Array(pointPositionsCount),\n numericProps: {},\n properties: [],\n fields: []\n };\n const lines: Lines = {\n type: 'LineString',\n pathIndices:\n linePositionsCount > 65535\n ? new Uint32Array(linePathsCount + 1)\n : new Uint16Array(linePathsCount + 1),\n positions: new PositionDataType(linePositionsCount * coordLength),\n globalFeatureIds: new GlobalFeatureIdsDataType(linePositionsCount),\n featureIds:\n lineFeaturesCount > 65535\n ? new Uint32Array(linePositionsCount)\n : new Uint16Array(linePositionsCount),\n numericProps: {},\n properties: [],\n fields: []\n };\n const polygons: Polygons = {\n type: 'Polygon',\n polygonIndices:\n polygonPositionsCount > 65535\n ? new Uint32Array(polygonObjectsCount + 1)\n : new Uint16Array(polygonObjectsCount + 1),\n primitivePolygonIndices:\n polygonPositionsCount > 65535\n ? new Uint32Array(polygonRingsCount + 1)\n : new Uint16Array(polygonRingsCount + 1),\n positions: new PositionDataType(polygonPositionsCount * coordLength),\n triangles: [],\n globalFeatureIds: new GlobalFeatureIdsDataType(polygonPositionsCount),\n featureIds:\n polygonFeaturesCount > 65535\n ? new Uint32Array(polygonPositionsCount)\n : new Uint16Array(polygonPositionsCount),\n numericProps: {},\n properties: [],\n fields: []\n };\n\n // Instantiate numeric properties arrays; one value per vertex\n for (const object of [points, lines, polygons]) {\n for (const propName of numericPropKeys) {\n // If property has been numeric in all previous features in which the property existed, check\n // if numeric in this feature\n const T = propArrayTypes[propName];\n object.numericProps[propName] = new T(object.positions.length / coordLength) as TypedArray;\n }\n }\n\n // Set last element of path/polygon indices as positions length\n lines.pathIndices[linePathsCount] = linePositionsCount;\n polygons.polygonIndices[polygonObjectsCount] = polygonPositionsCount;\n polygons.primitivePolygonIndices[polygonRingsCount] = polygonPositionsCount;\n\n const indexMap = {\n pointPosition: 0,\n pointFeature: 0,\n linePosition: 0,\n linePath: 0,\n lineFeature: 0,\n polygonPosition: 0,\n polygonObject: 0,\n polygonRing: 0,\n polygonFeature: 0,\n feature: 0\n };\n\n for (const feature of features) {\n const geometry = feature.geometry;\n const properties = feature.properties || {};\n\n switch (geometry.type) {\n case 'Point':\n handlePoint(geometry, points, indexMap, coordLength, properties);\n points.properties.push(keepStringProperties(properties, numericPropKeys));\n if (hasGlobalId) {\n points.fields.push({id: feature.id});\n }\n indexMap.pointFeature++;\n break;\n case 'LineString':\n handleLineString(geometry, lines, indexMap, coordLength, properties);\n lines.properties.push(keepStringProperties(properties, numericPropKeys));\n if (hasGlobalId) {\n lines.fields.push({id: feature.id});\n }\n indexMap.lineFeature++;\n break;\n case 'Polygon':\n handlePolygon(geometry, polygons, indexMap, coordLength, properties);\n polygons.properties.push(keepStringProperties(properties, numericPropKeys));\n if (hasGlobalId) {\n polygons.fields.push({id: feature.id});\n }\n indexMap.polygonFeature++;\n break;\n default:\n throw new Error('Invalid geometry type');\n }\n\n indexMap.feature++;\n }\n\n // Wrap each array in an accessor object with value and size keys\n return makeAccessorObjects(points, lines, polygons, coordLength);\n}\n\n/**\n * Fills (Multi)Point coordinates into points object of arrays\n *\n * @param geometry\n * @param points\n * @param indexMap\n * @param coordLength\n * @param properties\n */\nfunction handlePoint(\n geometry: FlatPoint,\n points: Points,\n indexMap: {\n pointPosition: number;\n pointFeature: number;\n linePosition?: number;\n linePath?: number;\n lineFeature?: number;\n polygonPosition?: number;\n polygonObject?: number;\n polygonRing?: number;\n polygonFeature?: number;\n feature: number;\n },\n coordLength: number,\n properties: {[x: string]: string | number | boolean | null}\n): void {\n points.positions.set(geometry.data, indexMap.pointPosition * coordLength);\n\n const nPositions = geometry.data.length / coordLength;\n fillNumericProperties(points, properties, indexMap.pointPosition, nPositions);\n points.globalFeatureIds.fill(\n indexMap.feature,\n indexMap.pointPosition,\n indexMap.pointPosition + nPositions\n );\n points.featureIds.fill(\n indexMap.pointFeature,\n indexMap.pointPosition,\n indexMap.pointPosition + nPositions\n );\n\n indexMap.pointPosition += nPositions;\n}\n\n/**\n * Fills (Multi)LineString coordinates into lines object of arrays\n *\n * @param geometry\n * @param lines\n * @param indexMap\n * @param coordLength\n * @param properties\n */\nfunction handleLineString(\n geometry: FlatLineString,\n lines: Lines,\n indexMap: {\n pointPosition?: number;\n pointFeature?: number;\n linePosition: number;\n linePath: number;\n lineFeature: number;\n polygonPosition?: number;\n polygonObject?: number;\n polygonRing?: number;\n polygonFeature?: number;\n feature: number;\n },\n coordLength: number,\n properties: {[x: string]: string | number | boolean | null}\n): void {\n lines.positions.set(geometry.data, indexMap.linePosition * coordLength);\n\n const nPositions = geometry.data.length / coordLength;\n fillNumericProperties(lines, properties, indexMap.linePosition, nPositions);\n\n lines.globalFeatureIds.fill(\n indexMap.feature,\n indexMap.linePosition,\n indexMap.linePosition + nPositions\n );\n lines.featureIds.fill(\n indexMap.lineFeature,\n indexMap.linePosition,\n indexMap.linePosition + nPositions\n );\n\n for (let i = 0, il = geometry.indices.length; i < il; ++i) {\n // Extract range of data we are working with, defined by start\n // and end indices (these index into the geometry.data array)\n const start = geometry.indices[i];\n const end =\n i === il - 1\n ? geometry.data.length // last line, so read to end of data\n : geometry.indices[i + 1]; // start index for next line\n\n lines.pathIndices[indexMap.linePath++] = indexMap.linePosition;\n indexMap.linePosition += (end - start) / coordLength;\n }\n}\n\n/**\n * Fills (Multi)Polygon coordinates into polygons object of arrays\n *\n * @param geometry\n * @param polygons\n * @param indexMap\n * @param coordLength\n * @param properties\n */\nfunction handlePolygon(\n geometry: FlatPolygon,\n polygons: Polygons,\n indexMap: {\n pointPosition?: number;\n pointFeature?: number;\n linePosition?: number;\n linePath?: number;\n lineFeature?: number;\n polygonPosition: number;\n polygonObject: number;\n polygonRing: number;\n polygonFeature: number;\n feature: number;\n },\n coordLength: number,\n properties: {[x: string]: string | number | boolean | null}\n): void {\n polygons.positions.set(geometry.data, indexMap.polygonPosition * coordLength);\n\n const nPositions = geometry.data.length / coordLength;\n fillNumericProperties(polygons, properties, indexMap.polygonPosition, nPositions);\n polygons.globalFeatureIds.fill(\n indexMap.feature,\n indexMap.polygonPosition,\n indexMap.polygonPosition + nPositions\n );\n polygons.featureIds.fill(\n indexMap.polygonFeature,\n indexMap.polygonPosition,\n indexMap.polygonPosition + nPositions\n );\n\n // Unlike Point & LineString geometry.indices is a 2D array\n for (let l = 0, ll = geometry.indices.length; l < ll; ++l) {\n const startPosition = indexMap.polygonPosition;\n polygons.polygonIndices[indexMap.polygonObject++] = startPosition;\n\n const areas = geometry.areas[l];\n const indices = geometry.indices[l];\n const nextIndices = geometry.indices[l + 1];\n\n for (let i = 0, il = indices.length; i < il; ++i) {\n const start = indices[i];\n const end =\n i === il - 1\n ? // last line, so either read to:\n nextIndices === undefined\n ? geometry.data.length // end of data (no next indices)\n : nextIndices[0] // start of first line in nextIndices\n : indices[i + 1]; // start index for next line\n\n polygons.primitivePolygonIndices[indexMap.polygonRing++] = indexMap.polygonPosition;\n indexMap.polygonPosition += (end - start) / coordLength;\n }\n\n const endPosition = indexMap.polygonPosition;\n triangulatePolygon(polygons, areas, indices, {startPosition, endPosition, coordLength});\n }\n}\n\n/**\n * Triangulate polygon using earcut\n *\n * @param polygons\n * @param areas\n * @param indices\n * @param param3\n */\nfunction triangulatePolygon(\n polygons: Polygons,\n areas: number[],\n indices: number[],\n {\n startPosition,\n endPosition,\n coordLength\n }: {startPosition: number; endPosition: number; coordLength: number}\n): void {\n const start = startPosition * coordLength;\n const end = endPosition * coordLength;\n\n // Extract positions and holes for just this polygon\n const polygonPositions = polygons.positions.subarray(start, end);\n\n // Holes are referenced relative to outer polygon\n const offset = indices[0];\n const holes = indices.slice(1).map((n: number) => (n - offset) / coordLength);\n\n // Compute triangulation\n // @ts-expect-error TODO can earcut handle binary arrays? Add tests?\n const triangles = earcut(polygonPositions, holes, coordLength, areas);\n\n // Indices returned by triangulation are relative to start\n // of polygon, so we need to offset\n for (let t = 0, tl = triangles.length; t < tl; ++t) {\n polygons.triangles.push(startPosition + triangles[t]);\n }\n}\n\n/**\n * Wraps an object containing array into accessors\n *\n * @param obj\n * @param size\n */\nfunction wrapProps(\n obj: {[key: string]: TypedArray},\n size: number\n): {[key: string]: BinaryAttribute} {\n const returnObj = {};\n for (const key in obj) {\n returnObj[key] = {value: obj[key], size};\n }\n return returnObj;\n}\n\n/**\n * Wrap each array in an accessor object with value and size keys\n *\n * @param points\n * @param lines\n * @param polygons\n * @param coordLength\n * @returns object\n */\nfunction makeAccessorObjects(\n points: Points,\n lines: Lines,\n polygons: Polygons,\n coordLength: number\n): BinaryFeatures {\n return {\n points: {\n ...points,\n positions: {value: points.positions, size: coordLength},\n globalFeatureIds: {value: points.globalFeatureIds, size: 1},\n featureIds: {value: points.featureIds, size: 1},\n numericProps: wrapProps(points.numericProps, 1)\n },\n lines: {\n ...lines,\n positions: {value: lines.positions, size: coordLength},\n pathIndices: {value: lines.pathIndices, size: 1},\n globalFeatureIds: {value: lines.globalFeatureIds, size: 1},\n featureIds: {value: lines.featureIds, size: 1},\n numericProps: wrapProps(lines.numericProps, 1)\n },\n polygons: {\n ...polygons,\n positions: {value: polygons.positions, size: coordLength},\n polygonIndices: {value: polygons.polygonIndices, size: 1},\n primitivePolygonIndices: {value: polygons.primitivePolygonIndices, size: 1},\n triangles: {value: new Uint32Array(polygons.triangles), size: 1},\n globalFeatureIds: {value: polygons.globalFeatureIds, size: 1},\n featureIds: {value: polygons.featureIds, size: 1},\n numericProps: wrapProps(polygons.numericProps, 1)\n }\n };\n}\n\n/**\n * Add numeric properties to object\n *\n * @param object\n * @param properties\n * @param index\n * @param length\n */\nfunction fillNumericProperties(\n object: Points | Lines | Polygons,\n properties: {[x: string]: string | number | boolean | null},\n index: number,\n length: number\n): void {\n for (const numericPropName in object.numericProps) {\n if (numericPropName in properties) {\n const value = properties[numericPropName] as number;\n object.numericProps[numericPropName].fill(value, index, index + length);\n }\n }\n}\n\n/**\n * Keep string properties in object\n *\n * @param properties\n * @param numericKeys\n * @returns object\n */\nfunction keepStringProperties(\n properties: {[x: string]: string | number | boolean | null},\n numericKeys: string[]\n) {\n const props = {};\n for (const key in properties) {\n if (!numericKeys.includes(key)) {\n props[key] = properties[key];\n }\n }\n return props;\n}\n\n/**\n *\n * Deduce correct array constructor to use for a given value\n *\n * @param x value to test\n * @param constructor previous constructor deduced\n * @returns PropArrayConstructor\n */\nfunction deduceArrayType(x: any, constructor: PropArrayConstructor): PropArrayConstructor {\n if (constructor === Array || !Number.isFinite(x)) {\n return Array;\n }\n\n // If this or previous value required 64bits use Float64Array\n return constructor === Float64Array || Math.fround(x) !== x ? Float64Array : Float32Array;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"flat-geojson-to-binary.js","names":["_polygon","require","_createForOfIteratorHelper","o","allowArrayLike","it","Symbol","iterator","Array","isArray","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","return","minLen","_arrayLikeToArray","Object","prototype","toString","slice","constructor","name","from","test","arr","len","arr2","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","target","arguments","source","forEach","key","_defineProperty2","default","getOwnPropertyDescriptors","defineProperties","defineProperty","flatGeojsonToBinary","features","geometryInfo","options","propArrayTypes","extractNumericPropTypes","numericPropKeys","k","fillArrays","PositionDataType","Float32Array","triangulate","TEST_EXPORTS","exports","_iterator","_step","feature","properties","val","deduceArrayType","pointPositionsCount","pointFeaturesCount","linePositionsCount","linePathsCount","lineFeaturesCount","polygonPositionsCount","polygonObjectsCount","polygonRingsCount","polygonFeaturesCount","coordLength","_options$numericPropK","_options$PositionData","_options$triangulate","hasGlobalId","GlobalFeatureIdsDataType","Uint32Array","Uint16Array","points","type","positions","globalFeatureIds","featureIds","numericProps","fields","lines","pathIndices","polygons","polygonIndices","primitivePolygonIndices","triangles","_i","_arr","_iterator2","_step2","propName","T","indexMap","pointPosition","pointFeature","linePosition","linePath","lineFeature","polygonPosition","polygonObject","polygonRing","polygonFeature","_iterator3","_step3","geometry","handlePoint","keepStringProperties","id","handleLineString","handlePolygon","Error","makeAccessorObjects","set","data","nPositions","fillNumericProperties","fill","il","indices","start","end","l","ll","startPosition","areas","nextIndices","undefined","endPosition","triangulatePolygon","_ref","polygonPositions","subarray","offset","holes","map","earcut","t","tl","wrapProps","obj","size","returnObj","binaryFeatures","index","numericPropName","numericKeys","props","includes","x","Number","isFinite","Float64Array","Math","fround"],"sources":["../../../src/lib/flat-geojson-to-binary.ts"],"sourcesContent":["/* eslint-disable indent */\nimport {earcut} from '@math.gl/polygon';\nimport type {\n BinaryAttribute,\n BinaryFeatures,\n BinaryPolygonFeatures,\n FlatFeature,\n FlatPoint,\n FlatLineString,\n FlatPolygon,\n GeojsonGeometryInfo,\n TypedArray\n} from '@loaders.gl/schema';\nimport {PropArrayConstructor, Lines, Points, Polygons} from './flat-geojson-to-binary-types';\n\n/**\n * Convert binary features to flat binary arrays. Similar to\n * `geojsonToBinary` helper function, except that it expects\n * a binary representation of the feature data, which enables\n * 2X-3X speed increase in parse speed, compared to using\n * geoJSON. See `binary-vector-tile/VectorTileFeature` for\n * data format detais\n *\n * @param features\n * @param geometryInfo\n * @param options\n * @returns filled arrays\n */\nexport function flatGeojsonToBinary(\n features: FlatFeature[],\n geometryInfo: GeojsonGeometryInfo,\n options?: FlatGeojsonToBinaryOptions\n) {\n const propArrayTypes = extractNumericPropTypes(features);\n const numericPropKeys = Object.keys(propArrayTypes).filter((k) => propArrayTypes[k] !== Array);\n return fillArrays(\n features,\n {\n propArrayTypes,\n ...geometryInfo\n },\n {\n numericPropKeys: (options && options.numericPropKeys) || numericPropKeys,\n PositionDataType: options ? options.PositionDataType : Float32Array,\n triangulate: options ? options.triangulate : true\n }\n );\n}\n\n/**\n * Options for `flatGeojsonToBinary`\n */\nexport type FlatGeojsonToBinaryOptions = {\n numericPropKeys?: string[];\n PositionDataType?: Float32ArrayConstructor | Float64ArrayConstructor;\n triangulate?: boolean;\n};\n\nexport const TEST_EXPORTS = {\n extractNumericPropTypes\n};\n\n/**\n * Extracts properties that are always numeric\n *\n * @param features\n * @returns object with numeric types\n */\nfunction extractNumericPropTypes(features: FlatFeature[]): {\n [key: string]: PropArrayConstructor;\n} {\n const propArrayTypes = {};\n for (const feature of features) {\n if (feature.properties) {\n for (const key in feature.properties) {\n // If property has not been seen before, or if property has been numeric\n // in all previous features, check if numeric in this feature\n // If not numeric, Array is stored to prevent rechecking in the future\n // Additionally, detects if 64 bit precision is required\n const val = feature.properties[key];\n propArrayTypes[key] = deduceArrayType(val, propArrayTypes[key]);\n }\n }\n }\n\n return propArrayTypes;\n}\n\n/**\n * Fills coordinates into pre-allocated typed arrays\n *\n * @param features\n * @param geometryInfo\n * @param options\n * @returns an accessor object with value and size keys\n */\n// eslint-disable-next-line complexity, max-statements\nfunction fillArrays(\n features: FlatFeature[],\n geometryInfo: GeojsonGeometryInfo & {\n propArrayTypes: {[key: string]: PropArrayConstructor};\n },\n options: FlatGeojsonToBinaryOptions\n) {\n const {\n pointPositionsCount,\n pointFeaturesCount,\n linePositionsCount,\n linePathsCount,\n lineFeaturesCount,\n polygonPositionsCount,\n polygonObjectsCount,\n polygonRingsCount,\n polygonFeaturesCount,\n propArrayTypes,\n coordLength\n } = geometryInfo;\n const {numericPropKeys = [], PositionDataType = Float32Array, triangulate = true} = options;\n const hasGlobalId = features[0] && 'id' in features[0];\n const GlobalFeatureIdsDataType = features.length > 65535 ? Uint32Array : Uint16Array;\n const points: Points = {\n type: 'Point',\n positions: new PositionDataType(pointPositionsCount * coordLength),\n globalFeatureIds: new GlobalFeatureIdsDataType(pointPositionsCount),\n featureIds:\n pointFeaturesCount > 65535\n ? new Uint32Array(pointPositionsCount)\n : new Uint16Array(pointPositionsCount),\n numericProps: {},\n properties: [],\n fields: []\n };\n const lines: Lines = {\n type: 'LineString',\n pathIndices:\n linePositionsCount > 65535\n ? new Uint32Array(linePathsCount + 1)\n : new Uint16Array(linePathsCount + 1),\n positions: new PositionDataType(linePositionsCount * coordLength),\n globalFeatureIds: new GlobalFeatureIdsDataType(linePositionsCount),\n featureIds:\n lineFeaturesCount > 65535\n ? new Uint32Array(linePositionsCount)\n : new Uint16Array(linePositionsCount),\n numericProps: {},\n properties: [],\n fields: []\n };\n const polygons: Polygons = {\n type: 'Polygon',\n polygonIndices:\n polygonPositionsCount > 65535\n ? new Uint32Array(polygonObjectsCount + 1)\n : new Uint16Array(polygonObjectsCount + 1),\n primitivePolygonIndices:\n polygonPositionsCount > 65535\n ? new Uint32Array(polygonRingsCount + 1)\n : new Uint16Array(polygonRingsCount + 1),\n positions: new PositionDataType(polygonPositionsCount * coordLength),\n globalFeatureIds: new GlobalFeatureIdsDataType(polygonPositionsCount),\n featureIds:\n polygonFeaturesCount > 65535\n ? new Uint32Array(polygonPositionsCount)\n : new Uint16Array(polygonPositionsCount),\n numericProps: {},\n properties: [],\n fields: []\n };\n\n if (triangulate) {\n polygons.triangles = [];\n }\n\n // Instantiate numeric properties arrays; one value per vertex\n for (const object of [points, lines, polygons]) {\n for (const propName of numericPropKeys) {\n // If property has been numeric in all previous features in which the property existed, check\n // if numeric in this feature\n const T = propArrayTypes[propName];\n object.numericProps[propName] = new T(object.positions.length / coordLength) as TypedArray;\n }\n }\n\n // Set last element of path/polygon indices as positions length\n lines.pathIndices[linePathsCount] = linePositionsCount;\n polygons.polygonIndices[polygonObjectsCount] = polygonPositionsCount;\n polygons.primitivePolygonIndices[polygonRingsCount] = polygonPositionsCount;\n\n const indexMap = {\n pointPosition: 0,\n pointFeature: 0,\n linePosition: 0,\n linePath: 0,\n lineFeature: 0,\n polygonPosition: 0,\n polygonObject: 0,\n polygonRing: 0,\n polygonFeature: 0,\n feature: 0\n };\n\n for (const feature of features) {\n const geometry = feature.geometry;\n const properties = feature.properties || {};\n\n switch (geometry.type) {\n case 'Point':\n handlePoint(geometry, points, indexMap, coordLength, properties);\n points.properties.push(keepStringProperties(properties, numericPropKeys));\n if (hasGlobalId) {\n points.fields.push({id: feature.id});\n }\n indexMap.pointFeature++;\n break;\n case 'LineString':\n handleLineString(geometry, lines, indexMap, coordLength, properties);\n lines.properties.push(keepStringProperties(properties, numericPropKeys));\n if (hasGlobalId) {\n lines.fields.push({id: feature.id});\n }\n indexMap.lineFeature++;\n break;\n case 'Polygon':\n handlePolygon(geometry, polygons, indexMap, coordLength, properties);\n polygons.properties.push(keepStringProperties(properties, numericPropKeys));\n if (hasGlobalId) {\n polygons.fields.push({id: feature.id});\n }\n indexMap.polygonFeature++;\n break;\n default:\n throw new Error('Invalid geometry type');\n }\n\n indexMap.feature++;\n }\n\n // Wrap each array in an accessor object with value and size keys\n return makeAccessorObjects(points, lines, polygons, coordLength);\n}\n\n/**\n * Fills (Multi)Point coordinates into points object of arrays\n *\n * @param geometry\n * @param points\n * @param indexMap\n * @param coordLength\n * @param properties\n */\nfunction handlePoint(\n geometry: FlatPoint,\n points: Points,\n indexMap: {\n pointPosition: number;\n pointFeature: number;\n linePosition?: number;\n linePath?: number;\n lineFeature?: number;\n polygonPosition?: number;\n polygonObject?: number;\n polygonRing?: number;\n polygonFeature?: number;\n feature: number;\n },\n coordLength: number,\n properties: {[x: string]: string | number | boolean | null}\n): void {\n points.positions.set(geometry.data, indexMap.pointPosition * coordLength);\n\n const nPositions = geometry.data.length / coordLength;\n fillNumericProperties(points, properties, indexMap.pointPosition, nPositions);\n points.globalFeatureIds.fill(\n indexMap.feature,\n indexMap.pointPosition,\n indexMap.pointPosition + nPositions\n );\n points.featureIds.fill(\n indexMap.pointFeature,\n indexMap.pointPosition,\n indexMap.pointPosition + nPositions\n );\n\n indexMap.pointPosition += nPositions;\n}\n\n/**\n * Fills (Multi)LineString coordinates into lines object of arrays\n *\n * @param geometry\n * @param lines\n * @param indexMap\n * @param coordLength\n * @param properties\n */\nfunction handleLineString(\n geometry: FlatLineString,\n lines: Lines,\n indexMap: {\n pointPosition?: number;\n pointFeature?: number;\n linePosition: number;\n linePath: number;\n lineFeature: number;\n polygonPosition?: number;\n polygonObject?: number;\n polygonRing?: number;\n polygonFeature?: number;\n feature: number;\n },\n coordLength: number,\n properties: {[x: string]: string | number | boolean | null}\n): void {\n lines.positions.set(geometry.data, indexMap.linePosition * coordLength);\n\n const nPositions = geometry.data.length / coordLength;\n fillNumericProperties(lines, properties, indexMap.linePosition, nPositions);\n\n lines.globalFeatureIds.fill(\n indexMap.feature,\n indexMap.linePosition,\n indexMap.linePosition + nPositions\n );\n lines.featureIds.fill(\n indexMap.lineFeature,\n indexMap.linePosition,\n indexMap.linePosition + nPositions\n );\n\n for (let i = 0, il = geometry.indices.length; i < il; ++i) {\n // Extract range of data we are working with, defined by start\n // and end indices (these index into the geometry.data array)\n const start = geometry.indices[i];\n const end =\n i === il - 1\n ? geometry.data.length // last line, so read to end of data\n : geometry.indices[i + 1]; // start index for next line\n\n lines.pathIndices[indexMap.linePath++] = indexMap.linePosition;\n indexMap.linePosition += (end - start) / coordLength;\n }\n}\n\n/**\n * Fills (Multi)Polygon coordinates into polygons object of arrays\n *\n * @param geometry\n * @param polygons\n * @param indexMap\n * @param coordLength\n * @param properties\n */\nfunction handlePolygon(\n geometry: FlatPolygon,\n polygons: Polygons,\n indexMap: {\n pointPosition?: number;\n pointFeature?: number;\n linePosition?: number;\n linePath?: number;\n lineFeature?: number;\n polygonPosition: number;\n polygonObject: number;\n polygonRing: number;\n polygonFeature: number;\n feature: number;\n },\n coordLength: number,\n properties: {[x: string]: string | number | boolean | null}\n): void {\n polygons.positions.set(geometry.data, indexMap.polygonPosition * coordLength);\n\n const nPositions = geometry.data.length / coordLength;\n fillNumericProperties(polygons, properties, indexMap.polygonPosition, nPositions);\n polygons.globalFeatureIds.fill(\n indexMap.feature,\n indexMap.polygonPosition,\n indexMap.polygonPosition + nPositions\n );\n polygons.featureIds.fill(\n indexMap.polygonFeature,\n indexMap.polygonPosition,\n indexMap.polygonPosition + nPositions\n );\n\n // Unlike Point & LineString geometry.indices is a 2D array\n for (let l = 0, ll = geometry.indices.length; l < ll; ++l) {\n const startPosition = indexMap.polygonPosition;\n polygons.polygonIndices[indexMap.polygonObject++] = startPosition;\n\n const areas = geometry.areas[l];\n const indices = geometry.indices[l];\n const nextIndices = geometry.indices[l + 1];\n\n for (let i = 0, il = indices.length; i < il; ++i) {\n const start = indices[i];\n const end =\n i === il - 1\n ? // last line, so either read to:\n nextIndices === undefined\n ? geometry.data.length // end of data (no next indices)\n : nextIndices[0] // start of first line in nextIndices\n : indices[i + 1]; // start index for next line\n\n polygons.primitivePolygonIndices[indexMap.polygonRing++] = indexMap.polygonPosition;\n indexMap.polygonPosition += (end - start) / coordLength;\n }\n\n const endPosition = indexMap.polygonPosition;\n triangulatePolygon(polygons, areas, indices, {startPosition, endPosition, coordLength});\n }\n}\n\n/**\n * Triangulate polygon using earcut\n *\n * @param polygons\n * @param areas\n * @param indices\n * @param param3\n */\nfunction triangulatePolygon(\n polygons: Polygons,\n areas: number[],\n indices: number[],\n {\n startPosition,\n endPosition,\n coordLength\n }: {startPosition: number; endPosition: number; coordLength: number}\n): void {\n if (!polygons.triangles) {\n return;\n }\n\n const start = startPosition * coordLength;\n const end = endPosition * coordLength;\n\n // Extract positions and holes for just this polygon\n const polygonPositions = polygons.positions.subarray(start, end);\n\n // Holes are referenced relative to outer polygon\n const offset = indices[0];\n const holes = indices.slice(1).map((n: number) => (n - offset) / coordLength);\n\n // Compute triangulation\n // @ts-expect-error TODO can earcut handle binary arrays? Add tests?\n const triangles = earcut(polygonPositions, holes, coordLength, areas);\n\n // Indices returned by triangulation are relative to start\n // of polygon, so we need to offset\n for (let t = 0, tl = triangles.length; t < tl; ++t) {\n polygons.triangles.push(startPosition + triangles[t]);\n }\n}\n\n/**\n * Wraps an object containing array into accessors\n *\n * @param obj\n * @param size\n */\nfunction wrapProps(\n obj: {[key: string]: TypedArray},\n size: number\n): {[key: string]: BinaryAttribute} {\n const returnObj = {};\n for (const key in obj) {\n returnObj[key] = {value: obj[key], size};\n }\n return returnObj;\n}\n\n/**\n * Wrap each array in an accessor object with value and size keys\n *\n * @param points\n * @param lines\n * @param polygons\n * @param coordLength\n * @returns object\n */\nfunction makeAccessorObjects(\n points: Points,\n lines: Lines,\n polygons: Polygons,\n coordLength: number\n): BinaryFeatures {\n const binaryFeatures = {\n points: {\n ...points,\n positions: {value: points.positions, size: coordLength},\n globalFeatureIds: {value: points.globalFeatureIds, size: 1},\n featureIds: {value: points.featureIds, size: 1},\n numericProps: wrapProps(points.numericProps, 1)\n },\n lines: {\n ...lines,\n positions: {value: lines.positions, size: coordLength},\n pathIndices: {value: lines.pathIndices, size: 1},\n globalFeatureIds: {value: lines.globalFeatureIds, size: 1},\n featureIds: {value: lines.featureIds, size: 1},\n numericProps: wrapProps(lines.numericProps, 1)\n },\n polygons: {\n ...polygons,\n positions: {value: polygons.positions, size: coordLength},\n polygonIndices: {value: polygons.polygonIndices, size: 1},\n primitivePolygonIndices: {value: polygons.primitivePolygonIndices, size: 1},\n globalFeatureIds: {value: polygons.globalFeatureIds, size: 1},\n featureIds: {value: polygons.featureIds, size: 1},\n numericProps: wrapProps(polygons.numericProps, 1)\n } as BinaryPolygonFeatures\n };\n\n if (polygons.triangles) {\n binaryFeatures.polygons.triangles = {value: new Uint32Array(polygons.triangles), size: 1};\n }\n\n return binaryFeatures;\n}\n\n/**\n * Add numeric properties to object\n *\n * @param object\n * @param properties\n * @param index\n * @param length\n */\nfunction fillNumericProperties(\n object: Points | Lines | Polygons,\n properties: {[x: string]: string | number | boolean | null},\n index: number,\n length: number\n): void {\n for (const numericPropName in object.numericProps) {\n if (numericPropName in properties) {\n const value = properties[numericPropName] as number;\n object.numericProps[numericPropName].fill(value, index, index + length);\n }\n }\n}\n\n/**\n * Keep string properties in object\n *\n * @param properties\n * @param numericKeys\n * @returns object\n */\nfunction keepStringProperties(\n properties: {[x: string]: string | number | boolean | null},\n numericKeys: string[]\n) {\n const props = {};\n for (const key in properties) {\n if (!numericKeys.includes(key)) {\n props[key] = properties[key];\n }\n }\n return props;\n}\n\n/**\n *\n * Deduce correct array constructor to use for a given value\n *\n * @param x value to test\n * @param constructor previous constructor deduced\n * @returns PropArrayConstructor\n */\nfunction deduceArrayType(x: any, constructor: PropArrayConstructor): PropArrayConstructor {\n if (constructor === Array || !Number.isFinite(x)) {\n return Array;\n }\n\n // If this or previous value required 64bits use Float64Array\n return constructor === Float64Array || Math.fround(x) !== x ? Float64Array : Float32Array;\n}\n"],"mappings":"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"}
@@ -9,7 +9,8 @@ var _geojsonToFlatGeojson = require("./geojson-to-flat-geojson");
9
9
  var _flatGeojsonToBinary = require("./flat-geojson-to-binary");
10
10
  function geojsonToBinary(features) {
11
11
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
12
- fixRingWinding: true
12
+ fixRingWinding: true,
13
+ triangulate: true
13
14
  };
14
15
  var geometryInfo = (0, _extractGeometryInfo.extractGeometryInfo)(features);
15
16
  var coordLength = geometryInfo.coordLength;
@@ -20,7 +21,8 @@ function geojsonToBinary(features) {
20
21
  });
21
22
  return (0, _flatGeojsonToBinary.flatGeojsonToBinary)(flatFeatures, geometryInfo, {
22
23
  numericPropKeys: options.numericPropKeys,
23
- PositionDataType: options.PositionDataType || Float32Array
24
+ PositionDataType: options.PositionDataType || Float32Array,
25
+ triangulate: options.triangulate
24
26
  });
25
27
  }
26
28
  //# sourceMappingURL=geojson-to-binary.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"geojson-to-binary.js","names":["_extractGeometryInfo","require","_geojsonToFlatGeojson","_flatGeojsonToBinary","geojsonToBinary","features","options","arguments","length","undefined","fixRingWinding","geometryInfo","extractGeometryInfo","coordLength","flatFeatures","geojsonToFlatGeojson","flatGeojsonToBinary","numericPropKeys","PositionDataType","Float32Array"],"sources":["../../../src/lib/geojson-to-binary.ts"],"sourcesContent":["import type {Feature} from '@loaders.gl/schema';\nimport type {BinaryFeatures} from '@loaders.gl/schema';\n\nimport {extractGeometryInfo} from './extract-geometry-info';\nimport {geojsonToFlatGeojson} from './geojson-to-flat-geojson';\nimport {flatGeojsonToBinary} from './flat-geojson-to-binary';\n\n/**\n * Options for `geojsonToBinary`\n */\nexport type GeojsonToBinaryOptions = {\n fixRingWinding: boolean;\n numericPropKeys?: string[];\n PositionDataType?: Float32ArrayConstructor | Float64ArrayConstructor;\n};\n\n/**\n * Convert GeoJSON features to flat binary arrays\n *\n * @param features\n * @param options\n * @returns features in binary format, grouped by geometry type\n */\nexport function geojsonToBinary(\n features: Feature[],\n options: GeojsonToBinaryOptions = {fixRingWinding: true}\n): BinaryFeatures {\n const geometryInfo = extractGeometryInfo(features);\n const coordLength = geometryInfo.coordLength;\n const {fixRingWinding} = options;\n const flatFeatures = geojsonToFlatGeojson(features, {coordLength, fixRingWinding});\n return flatGeojsonToBinary(flatFeatures, geometryInfo, {\n numericPropKeys: options.numericPropKeys,\n PositionDataType: options.PositionDataType || Float32Array\n });\n}\n"],"mappings":";;;;;;AAGA,IAAAA,oBAAA,GAAAC,OAAA;AACA,IAAAC,qBAAA,GAAAD,OAAA;AACA,IAAAE,oBAAA,GAAAF,OAAA;AAkBO,SAASG,eAAeA,CAC7BC,QAAmB,EAEH;EAAA,IADhBC,OAA+B,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG;IAACG,cAAc,EAAE;EAAI,CAAC;EAExD,IAAMC,YAAY,GAAG,IAAAC,wCAAmB,EAACP,QAAQ,CAAC;EAClD,IAAMQ,WAAW,GAAGF,YAAY,CAACE,WAAW;EAC5C,IAAOH,cAAc,GAAIJ,OAAO,CAAzBI,cAAc;EACrB,IAAMI,YAAY,GAAG,IAAAC,0CAAoB,EAACV,QAAQ,EAAE;IAACQ,WAAW,EAAXA,WAAW;IAAEH,cAAc,EAAdA;EAAc,CAAC,CAAC;EAClF,OAAO,IAAAM,wCAAmB,EAACF,YAAY,EAAEH,YAAY,EAAE;IACrDM,eAAe,EAAEX,OAAO,CAACW,eAAe;IACxCC,gBAAgB,EAAEZ,OAAO,CAACY,gBAAgB,IAAIC;EAChD,CAAC,CAAC;AACJ"}
1
+ {"version":3,"file":"geojson-to-binary.js","names":["_extractGeometryInfo","require","_geojsonToFlatGeojson","_flatGeojsonToBinary","geojsonToBinary","features","options","arguments","length","undefined","fixRingWinding","triangulate","geometryInfo","extractGeometryInfo","coordLength","flatFeatures","geojsonToFlatGeojson","flatGeojsonToBinary","numericPropKeys","PositionDataType","Float32Array"],"sources":["../../../src/lib/geojson-to-binary.ts"],"sourcesContent":["import type {Feature} from '@loaders.gl/schema';\nimport type {BinaryFeatures} from '@loaders.gl/schema';\n\nimport {extractGeometryInfo} from './extract-geometry-info';\nimport {geojsonToFlatGeojson} from './geojson-to-flat-geojson';\nimport {flatGeojsonToBinary} from './flat-geojson-to-binary';\n\n/**\n * Options for `geojsonToBinary`\n */\nexport type GeojsonToBinaryOptions = {\n fixRingWinding: boolean;\n numericPropKeys?: string[];\n PositionDataType?: Float32ArrayConstructor | Float64ArrayConstructor;\n triangulate?: boolean;\n};\n\n/**\n * Convert GeoJSON features to flat binary arrays\n *\n * @param features\n * @param options\n * @returns features in binary format, grouped by geometry type\n */\nexport function geojsonToBinary(\n features: Feature[],\n options: GeojsonToBinaryOptions = {fixRingWinding: true, triangulate: true}\n): BinaryFeatures {\n const geometryInfo = extractGeometryInfo(features);\n const coordLength = geometryInfo.coordLength;\n const {fixRingWinding} = options;\n const flatFeatures = geojsonToFlatGeojson(features, {coordLength, fixRingWinding});\n return flatGeojsonToBinary(flatFeatures, geometryInfo, {\n numericPropKeys: options.numericPropKeys,\n PositionDataType: options.PositionDataType || Float32Array,\n triangulate: options.triangulate\n });\n}\n"],"mappings":";;;;;;AAGA,IAAAA,oBAAA,GAAAC,OAAA;AACA,IAAAC,qBAAA,GAAAD,OAAA;AACA,IAAAE,oBAAA,GAAAF,OAAA;AAmBO,SAASG,eAAeA,CAC7BC,QAAmB,EAEH;EAAA,IADhBC,OAA+B,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG;IAACG,cAAc,EAAE,IAAI;IAAEC,WAAW,EAAE;EAAI,CAAC;EAE3E,IAAMC,YAAY,GAAG,IAAAC,wCAAmB,EAACR,QAAQ,CAAC;EAClD,IAAMS,WAAW,GAAGF,YAAY,CAACE,WAAW;EAC5C,IAAOJ,cAAc,GAAIJ,OAAO,CAAzBI,cAAc;EACrB,IAAMK,YAAY,GAAG,IAAAC,0CAAoB,EAACX,QAAQ,EAAE;IAACS,WAAW,EAAXA,WAAW;IAAEJ,cAAc,EAAdA;EAAc,CAAC,CAAC;EAClF,OAAO,IAAAO,wCAAmB,EAACF,YAAY,EAAEH,YAAY,EAAE;IACrDM,eAAe,EAAEZ,OAAO,CAACY,eAAe;IACxCC,gBAAgB,EAAEb,OAAO,CAACa,gBAAgB,IAAIC,YAAY;IAC1DT,WAAW,EAAEL,OAAO,CAACK;EACvB,CAAC,CAAC;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"flat-geojson-to-binary-types.js","names":[],"sources":["../../../src/lib/flat-geojson-to-binary-types.ts"],"sourcesContent":["import type {TypedArray} from '@loaders.gl/schema';\n\n/**\n * Permissable constructor for numeric props\n */\nexport type PropArrayConstructor =\n | Float32ArrayConstructor\n | Float64ArrayConstructor\n | ArrayConstructor;\n\n/**\n * Collection type for holding intermediate binary data before conversion to `BinaryPointGeometry`\n */\nexport type Points = {\n type: 'Point';\n positions: Float32Array | Float64Array;\n globalFeatureIds: Uint16Array | Uint32Array;\n featureIds: Uint16Array | Uint32Array;\n numericProps: {[key: string]: TypedArray};\n properties: {}[];\n fields: {\n id?: string | number;\n }[];\n};\n\n/**\n * Collection type for holding intermediate binary data before conversion to `BinaryLineStringGeometry`\n */\nexport type Lines = {\n type: 'LineString';\n positions: Float32Array | Float64Array;\n pathIndices: Uint16Array | Uint32Array;\n globalFeatureIds: Uint16Array | Uint32Array;\n featureIds: Uint16Array | Uint32Array;\n numericProps: {[key: string]: TypedArray};\n properties: {}[];\n fields: {\n id?: string | number;\n }[];\n};\n\n/**\n * Collection type for holding intermediate binary data before conversion to `BinaryPolygonGeometry`\n */\nexport type Polygons = {\n type: 'Polygon';\n positions: Float32Array | Float64Array;\n polygonIndices: Uint16Array | Uint32Array;\n primitivePolygonIndices: Uint16Array | Uint32Array;\n triangles: number[];\n globalFeatureIds: Uint16Array | Uint32Array;\n featureIds: Uint16Array | Uint32Array;\n numericProps: {[key: string]: TypedArray};\n properties: {}[];\n fields: {\n id?: string | number;\n }[];\n};\n"],"mappings":""}
1
+ {"version":3,"file":"flat-geojson-to-binary-types.js","names":[],"sources":["../../../src/lib/flat-geojson-to-binary-types.ts"],"sourcesContent":["import type {TypedArray} from '@loaders.gl/schema';\n\n/**\n * Permissable constructor for numeric props\n */\nexport type PropArrayConstructor =\n | Float32ArrayConstructor\n | Float64ArrayConstructor\n | ArrayConstructor;\n\n/**\n * Collection type for holding intermediate binary data before conversion to `BinaryPointGeometry`\n */\nexport type Points = {\n type: 'Point';\n positions: Float32Array | Float64Array;\n globalFeatureIds: Uint16Array | Uint32Array;\n featureIds: Uint16Array | Uint32Array;\n numericProps: {[key: string]: TypedArray};\n properties: {}[];\n fields: {\n id?: string | number;\n }[];\n};\n\n/**\n * Collection type for holding intermediate binary data before conversion to `BinaryLineStringGeometry`\n */\nexport type Lines = {\n type: 'LineString';\n positions: Float32Array | Float64Array;\n pathIndices: Uint16Array | Uint32Array;\n globalFeatureIds: Uint16Array | Uint32Array;\n featureIds: Uint16Array | Uint32Array;\n numericProps: {[key: string]: TypedArray};\n properties: {}[];\n fields: {\n id?: string | number;\n }[];\n};\n\n/**\n * Collection type for holding intermediate binary data before conversion to `BinaryPolygonGeometry`\n */\nexport type Polygons = {\n type: 'Polygon';\n positions: Float32Array | Float64Array;\n polygonIndices: Uint16Array | Uint32Array;\n primitivePolygonIndices: Uint16Array | Uint32Array;\n triangles?: number[];\n globalFeatureIds: Uint16Array | Uint32Array;\n featureIds: Uint16Array | Uint32Array;\n numericProps: {[key: string]: TypedArray};\n properties: {}[];\n fields: {\n id?: string | number;\n }[];\n};\n"],"mappings":""}
@@ -7,7 +7,8 @@ export function flatGeojsonToBinary(features, geometryInfo, options) {
7
7
  ...geometryInfo
8
8
  }, {
9
9
  numericPropKeys: options && options.numericPropKeys || numericPropKeys,
10
- PositionDataType: options ? options.PositionDataType : Float32Array
10
+ PositionDataType: options ? options.PositionDataType : Float32Array,
11
+ triangulate: options ? options.triangulate : true
11
12
  });
12
13
  }
13
14
  export const TEST_EXPORTS = {
@@ -41,7 +42,8 @@ function fillArrays(features, geometryInfo, options) {
41
42
  } = geometryInfo;
42
43
  const {
43
44
  numericPropKeys = [],
44
- PositionDataType = Float32Array
45
+ PositionDataType = Float32Array,
46
+ triangulate = true
45
47
  } = options;
46
48
  const hasGlobalId = features[0] && 'id' in features[0];
47
49
  const GlobalFeatureIdsDataType = features.length > 65535 ? Uint32Array : Uint16Array;
@@ -69,13 +71,15 @@ function fillArrays(features, geometryInfo, options) {
69
71
  polygonIndices: polygonPositionsCount > 65535 ? new Uint32Array(polygonObjectsCount + 1) : new Uint16Array(polygonObjectsCount + 1),
70
72
  primitivePolygonIndices: polygonPositionsCount > 65535 ? new Uint32Array(polygonRingsCount + 1) : new Uint16Array(polygonRingsCount + 1),
71
73
  positions: new PositionDataType(polygonPositionsCount * coordLength),
72
- triangles: [],
73
74
  globalFeatureIds: new GlobalFeatureIdsDataType(polygonPositionsCount),
74
75
  featureIds: polygonFeaturesCount > 65535 ? new Uint32Array(polygonPositionsCount) : new Uint16Array(polygonPositionsCount),
75
76
  numericProps: {},
76
77
  properties: [],
77
78
  fields: []
78
79
  };
80
+ if (triangulate) {
81
+ polygons.triangles = [];
82
+ }
79
83
  for (const object of [points, lines, polygons]) {
80
84
  for (const propName of numericPropKeys) {
81
85
  const T = propArrayTypes[propName];
@@ -191,6 +195,9 @@ function triangulatePolygon(polygons, areas, indices, _ref) {
191
195
  endPosition,
192
196
  coordLength
193
197
  } = _ref;
198
+ if (!polygons.triangles) {
199
+ return;
200
+ }
194
201
  const start = startPosition * coordLength;
195
202
  const end = endPosition * coordLength;
196
203
  const polygonPositions = polygons.positions.subarray(start, end);
@@ -212,7 +219,7 @@ function wrapProps(obj, size) {
212
219
  return returnObj;
213
220
  }
214
221
  function makeAccessorObjects(points, lines, polygons, coordLength) {
215
- return {
222
+ const binaryFeatures = {
216
223
  points: {
217
224
  ...points,
218
225
  positions: {
@@ -263,10 +270,6 @@ function makeAccessorObjects(points, lines, polygons, coordLength) {
263
270
  value: polygons.primitivePolygonIndices,
264
271
  size: 1
265
272
  },
266
- triangles: {
267
- value: new Uint32Array(polygons.triangles),
268
- size: 1
269
- },
270
273
  globalFeatureIds: {
271
274
  value: polygons.globalFeatureIds,
272
275
  size: 1
@@ -278,6 +281,13 @@ function makeAccessorObjects(points, lines, polygons, coordLength) {
278
281
  numericProps: wrapProps(polygons.numericProps, 1)
279
282
  }
280
283
  };
284
+ if (polygons.triangles) {
285
+ binaryFeatures.polygons.triangles = {
286
+ value: new Uint32Array(polygons.triangles),
287
+ size: 1
288
+ };
289
+ }
290
+ return binaryFeatures;
281
291
  }
282
292
  function fillNumericProperties(object, properties, index, length) {
283
293
  for (const numericPropName in object.numericProps) {
@@ -1 +1 @@
1
- {"version":3,"file":"flat-geojson-to-binary.js","names":["earcut","flatGeojsonToBinary","features","geometryInfo","options","propArrayTypes","extractNumericPropTypes","numericPropKeys","Object","keys","filter","k","Array","fillArrays","PositionDataType","Float32Array","TEST_EXPORTS","feature","properties","key","val","deduceArrayType","pointPositionsCount","pointFeaturesCount","linePositionsCount","linePathsCount","lineFeaturesCount","polygonPositionsCount","polygonObjectsCount","polygonRingsCount","polygonFeaturesCount","coordLength","hasGlobalId","GlobalFeatureIdsDataType","length","Uint32Array","Uint16Array","points","type","positions","globalFeatureIds","featureIds","numericProps","fields","lines","pathIndices","polygons","polygonIndices","primitivePolygonIndices","triangles","object","propName","T","indexMap","pointPosition","pointFeature","linePosition","linePath","lineFeature","polygonPosition","polygonObject","polygonRing","polygonFeature","geometry","handlePoint","push","keepStringProperties","id","handleLineString","handlePolygon","Error","makeAccessorObjects","set","data","nPositions","fillNumericProperties","fill","i","il","indices","start","end","l","ll","startPosition","areas","nextIndices","undefined","endPosition","triangulatePolygon","_ref","polygonPositions","subarray","offset","holes","slice","map","n","t","tl","wrapProps","obj","size","returnObj","value","index","numericPropName","numericKeys","props","includes","x","constructor","Number","isFinite","Float64Array","Math","fround"],"sources":["../../../src/lib/flat-geojson-to-binary.ts"],"sourcesContent":["/* eslint-disable indent */\nimport {earcut} from '@math.gl/polygon';\nimport type {\n BinaryAttribute,\n BinaryFeatures,\n FlatFeature,\n FlatPoint,\n FlatLineString,\n FlatPolygon,\n GeojsonGeometryInfo,\n TypedArray\n} from '@loaders.gl/schema';\nimport {PropArrayConstructor, Lines, Points, Polygons} from './flat-geojson-to-binary-types';\n\n/**\n * Convert binary features to flat binary arrays. Similar to\n * `geojsonToBinary` helper function, except that it expects\n * a binary representation of the feature data, which enables\n * 2X-3X speed increase in parse speed, compared to using\n * geoJSON. See `binary-vector-tile/VectorTileFeature` for\n * data format detais\n *\n * @param features\n * @param geometryInfo\n * @param options\n * @returns filled arrays\n */\nexport function flatGeojsonToBinary(\n features: FlatFeature[],\n geometryInfo: GeojsonGeometryInfo,\n options?: FlatGeojsonToBinaryOptions\n) {\n const propArrayTypes = extractNumericPropTypes(features);\n const numericPropKeys = Object.keys(propArrayTypes).filter((k) => propArrayTypes[k] !== Array);\n return fillArrays(\n features,\n {\n propArrayTypes,\n ...geometryInfo\n },\n {\n numericPropKeys: (options && options.numericPropKeys) || numericPropKeys,\n PositionDataType: options ? options.PositionDataType : Float32Array\n }\n );\n}\n\n/**\n * Options for `flatGeojsonToBinary`\n */\nexport type FlatGeojsonToBinaryOptions = {\n numericPropKeys?: string[];\n PositionDataType?: Float32ArrayConstructor | Float64ArrayConstructor;\n};\n\nexport const TEST_EXPORTS = {\n extractNumericPropTypes\n};\n\n/**\n * Extracts properties that are always numeric\n *\n * @param features\n * @returns object with numeric types\n */\nfunction extractNumericPropTypes(features: FlatFeature[]): {\n [key: string]: PropArrayConstructor;\n} {\n const propArrayTypes = {};\n for (const feature of features) {\n if (feature.properties) {\n for (const key in feature.properties) {\n // If property has not been seen before, or if property has been numeric\n // in all previous features, check if numeric in this feature\n // If not numeric, Array is stored to prevent rechecking in the future\n // Additionally, detects if 64 bit precision is required\n const val = feature.properties[key];\n propArrayTypes[key] = deduceArrayType(val, propArrayTypes[key]);\n }\n }\n }\n\n return propArrayTypes;\n}\n\n/**\n * Fills coordinates into pre-allocated typed arrays\n *\n * @param features\n * @param geometryInfo\n * @param options\n * @returns an accessor object with value and size keys\n */\n// eslint-disable-next-line complexity\nfunction fillArrays(\n features: FlatFeature[],\n geometryInfo: GeojsonGeometryInfo & {\n propArrayTypes: {[key: string]: PropArrayConstructor};\n },\n options: FlatGeojsonToBinaryOptions\n) {\n const {\n pointPositionsCount,\n pointFeaturesCount,\n linePositionsCount,\n linePathsCount,\n lineFeaturesCount,\n polygonPositionsCount,\n polygonObjectsCount,\n polygonRingsCount,\n polygonFeaturesCount,\n propArrayTypes,\n coordLength\n } = geometryInfo;\n const {numericPropKeys = [], PositionDataType = Float32Array} = options;\n const hasGlobalId = features[0] && 'id' in features[0];\n const GlobalFeatureIdsDataType = features.length > 65535 ? Uint32Array : Uint16Array;\n const points: Points = {\n type: 'Point',\n positions: new PositionDataType(pointPositionsCount * coordLength),\n globalFeatureIds: new GlobalFeatureIdsDataType(pointPositionsCount),\n featureIds:\n pointFeaturesCount > 65535\n ? new Uint32Array(pointPositionsCount)\n : new Uint16Array(pointPositionsCount),\n numericProps: {},\n properties: [],\n fields: []\n };\n const lines: Lines = {\n type: 'LineString',\n pathIndices:\n linePositionsCount > 65535\n ? new Uint32Array(linePathsCount + 1)\n : new Uint16Array(linePathsCount + 1),\n positions: new PositionDataType(linePositionsCount * coordLength),\n globalFeatureIds: new GlobalFeatureIdsDataType(linePositionsCount),\n featureIds:\n lineFeaturesCount > 65535\n ? new Uint32Array(linePositionsCount)\n : new Uint16Array(linePositionsCount),\n numericProps: {},\n properties: [],\n fields: []\n };\n const polygons: Polygons = {\n type: 'Polygon',\n polygonIndices:\n polygonPositionsCount > 65535\n ? new Uint32Array(polygonObjectsCount + 1)\n : new Uint16Array(polygonObjectsCount + 1),\n primitivePolygonIndices:\n polygonPositionsCount > 65535\n ? new Uint32Array(polygonRingsCount + 1)\n : new Uint16Array(polygonRingsCount + 1),\n positions: new PositionDataType(polygonPositionsCount * coordLength),\n triangles: [],\n globalFeatureIds: new GlobalFeatureIdsDataType(polygonPositionsCount),\n featureIds:\n polygonFeaturesCount > 65535\n ? new Uint32Array(polygonPositionsCount)\n : new Uint16Array(polygonPositionsCount),\n numericProps: {},\n properties: [],\n fields: []\n };\n\n // Instantiate numeric properties arrays; one value per vertex\n for (const object of [points, lines, polygons]) {\n for (const propName of numericPropKeys) {\n // If property has been numeric in all previous features in which the property existed, check\n // if numeric in this feature\n const T = propArrayTypes[propName];\n object.numericProps[propName] = new T(object.positions.length / coordLength) as TypedArray;\n }\n }\n\n // Set last element of path/polygon indices as positions length\n lines.pathIndices[linePathsCount] = linePositionsCount;\n polygons.polygonIndices[polygonObjectsCount] = polygonPositionsCount;\n polygons.primitivePolygonIndices[polygonRingsCount] = polygonPositionsCount;\n\n const indexMap = {\n pointPosition: 0,\n pointFeature: 0,\n linePosition: 0,\n linePath: 0,\n lineFeature: 0,\n polygonPosition: 0,\n polygonObject: 0,\n polygonRing: 0,\n polygonFeature: 0,\n feature: 0\n };\n\n for (const feature of features) {\n const geometry = feature.geometry;\n const properties = feature.properties || {};\n\n switch (geometry.type) {\n case 'Point':\n handlePoint(geometry, points, indexMap, coordLength, properties);\n points.properties.push(keepStringProperties(properties, numericPropKeys));\n if (hasGlobalId) {\n points.fields.push({id: feature.id});\n }\n indexMap.pointFeature++;\n break;\n case 'LineString':\n handleLineString(geometry, lines, indexMap, coordLength, properties);\n lines.properties.push(keepStringProperties(properties, numericPropKeys));\n if (hasGlobalId) {\n lines.fields.push({id: feature.id});\n }\n indexMap.lineFeature++;\n break;\n case 'Polygon':\n handlePolygon(geometry, polygons, indexMap, coordLength, properties);\n polygons.properties.push(keepStringProperties(properties, numericPropKeys));\n if (hasGlobalId) {\n polygons.fields.push({id: feature.id});\n }\n indexMap.polygonFeature++;\n break;\n default:\n throw new Error('Invalid geometry type');\n }\n\n indexMap.feature++;\n }\n\n // Wrap each array in an accessor object with value and size keys\n return makeAccessorObjects(points, lines, polygons, coordLength);\n}\n\n/**\n * Fills (Multi)Point coordinates into points object of arrays\n *\n * @param geometry\n * @param points\n * @param indexMap\n * @param coordLength\n * @param properties\n */\nfunction handlePoint(\n geometry: FlatPoint,\n points: Points,\n indexMap: {\n pointPosition: number;\n pointFeature: number;\n linePosition?: number;\n linePath?: number;\n lineFeature?: number;\n polygonPosition?: number;\n polygonObject?: number;\n polygonRing?: number;\n polygonFeature?: number;\n feature: number;\n },\n coordLength: number,\n properties: {[x: string]: string | number | boolean | null}\n): void {\n points.positions.set(geometry.data, indexMap.pointPosition * coordLength);\n\n const nPositions = geometry.data.length / coordLength;\n fillNumericProperties(points, properties, indexMap.pointPosition, nPositions);\n points.globalFeatureIds.fill(\n indexMap.feature,\n indexMap.pointPosition,\n indexMap.pointPosition + nPositions\n );\n points.featureIds.fill(\n indexMap.pointFeature,\n indexMap.pointPosition,\n indexMap.pointPosition + nPositions\n );\n\n indexMap.pointPosition += nPositions;\n}\n\n/**\n * Fills (Multi)LineString coordinates into lines object of arrays\n *\n * @param geometry\n * @param lines\n * @param indexMap\n * @param coordLength\n * @param properties\n */\nfunction handleLineString(\n geometry: FlatLineString,\n lines: Lines,\n indexMap: {\n pointPosition?: number;\n pointFeature?: number;\n linePosition: number;\n linePath: number;\n lineFeature: number;\n polygonPosition?: number;\n polygonObject?: number;\n polygonRing?: number;\n polygonFeature?: number;\n feature: number;\n },\n coordLength: number,\n properties: {[x: string]: string | number | boolean | null}\n): void {\n lines.positions.set(geometry.data, indexMap.linePosition * coordLength);\n\n const nPositions = geometry.data.length / coordLength;\n fillNumericProperties(lines, properties, indexMap.linePosition, nPositions);\n\n lines.globalFeatureIds.fill(\n indexMap.feature,\n indexMap.linePosition,\n indexMap.linePosition + nPositions\n );\n lines.featureIds.fill(\n indexMap.lineFeature,\n indexMap.linePosition,\n indexMap.linePosition + nPositions\n );\n\n for (let i = 0, il = geometry.indices.length; i < il; ++i) {\n // Extract range of data we are working with, defined by start\n // and end indices (these index into the geometry.data array)\n const start = geometry.indices[i];\n const end =\n i === il - 1\n ? geometry.data.length // last line, so read to end of data\n : geometry.indices[i + 1]; // start index for next line\n\n lines.pathIndices[indexMap.linePath++] = indexMap.linePosition;\n indexMap.linePosition += (end - start) / coordLength;\n }\n}\n\n/**\n * Fills (Multi)Polygon coordinates into polygons object of arrays\n *\n * @param geometry\n * @param polygons\n * @param indexMap\n * @param coordLength\n * @param properties\n */\nfunction handlePolygon(\n geometry: FlatPolygon,\n polygons: Polygons,\n indexMap: {\n pointPosition?: number;\n pointFeature?: number;\n linePosition?: number;\n linePath?: number;\n lineFeature?: number;\n polygonPosition: number;\n polygonObject: number;\n polygonRing: number;\n polygonFeature: number;\n feature: number;\n },\n coordLength: number,\n properties: {[x: string]: string | number | boolean | null}\n): void {\n polygons.positions.set(geometry.data, indexMap.polygonPosition * coordLength);\n\n const nPositions = geometry.data.length / coordLength;\n fillNumericProperties(polygons, properties, indexMap.polygonPosition, nPositions);\n polygons.globalFeatureIds.fill(\n indexMap.feature,\n indexMap.polygonPosition,\n indexMap.polygonPosition + nPositions\n );\n polygons.featureIds.fill(\n indexMap.polygonFeature,\n indexMap.polygonPosition,\n indexMap.polygonPosition + nPositions\n );\n\n // Unlike Point & LineString geometry.indices is a 2D array\n for (let l = 0, ll = geometry.indices.length; l < ll; ++l) {\n const startPosition = indexMap.polygonPosition;\n polygons.polygonIndices[indexMap.polygonObject++] = startPosition;\n\n const areas = geometry.areas[l];\n const indices = geometry.indices[l];\n const nextIndices = geometry.indices[l + 1];\n\n for (let i = 0, il = indices.length; i < il; ++i) {\n const start = indices[i];\n const end =\n i === il - 1\n ? // last line, so either read to:\n nextIndices === undefined\n ? geometry.data.length // end of data (no next indices)\n : nextIndices[0] // start of first line in nextIndices\n : indices[i + 1]; // start index for next line\n\n polygons.primitivePolygonIndices[indexMap.polygonRing++] = indexMap.polygonPosition;\n indexMap.polygonPosition += (end - start) / coordLength;\n }\n\n const endPosition = indexMap.polygonPosition;\n triangulatePolygon(polygons, areas, indices, {startPosition, endPosition, coordLength});\n }\n}\n\n/**\n * Triangulate polygon using earcut\n *\n * @param polygons\n * @param areas\n * @param indices\n * @param param3\n */\nfunction triangulatePolygon(\n polygons: Polygons,\n areas: number[],\n indices: number[],\n {\n startPosition,\n endPosition,\n coordLength\n }: {startPosition: number; endPosition: number; coordLength: number}\n): void {\n const start = startPosition * coordLength;\n const end = endPosition * coordLength;\n\n // Extract positions and holes for just this polygon\n const polygonPositions = polygons.positions.subarray(start, end);\n\n // Holes are referenced relative to outer polygon\n const offset = indices[0];\n const holes = indices.slice(1).map((n: number) => (n - offset) / coordLength);\n\n // Compute triangulation\n // @ts-expect-error TODO can earcut handle binary arrays? Add tests?\n const triangles = earcut(polygonPositions, holes, coordLength, areas);\n\n // Indices returned by triangulation are relative to start\n // of polygon, so we need to offset\n for (let t = 0, tl = triangles.length; t < tl; ++t) {\n polygons.triangles.push(startPosition + triangles[t]);\n }\n}\n\n/**\n * Wraps an object containing array into accessors\n *\n * @param obj\n * @param size\n */\nfunction wrapProps(\n obj: {[key: string]: TypedArray},\n size: number\n): {[key: string]: BinaryAttribute} {\n const returnObj = {};\n for (const key in obj) {\n returnObj[key] = {value: obj[key], size};\n }\n return returnObj;\n}\n\n/**\n * Wrap each array in an accessor object with value and size keys\n *\n * @param points\n * @param lines\n * @param polygons\n * @param coordLength\n * @returns object\n */\nfunction makeAccessorObjects(\n points: Points,\n lines: Lines,\n polygons: Polygons,\n coordLength: number\n): BinaryFeatures {\n return {\n points: {\n ...points,\n positions: {value: points.positions, size: coordLength},\n globalFeatureIds: {value: points.globalFeatureIds, size: 1},\n featureIds: {value: points.featureIds, size: 1},\n numericProps: wrapProps(points.numericProps, 1)\n },\n lines: {\n ...lines,\n positions: {value: lines.positions, size: coordLength},\n pathIndices: {value: lines.pathIndices, size: 1},\n globalFeatureIds: {value: lines.globalFeatureIds, size: 1},\n featureIds: {value: lines.featureIds, size: 1},\n numericProps: wrapProps(lines.numericProps, 1)\n },\n polygons: {\n ...polygons,\n positions: {value: polygons.positions, size: coordLength},\n polygonIndices: {value: polygons.polygonIndices, size: 1},\n primitivePolygonIndices: {value: polygons.primitivePolygonIndices, size: 1},\n triangles: {value: new Uint32Array(polygons.triangles), size: 1},\n globalFeatureIds: {value: polygons.globalFeatureIds, size: 1},\n featureIds: {value: polygons.featureIds, size: 1},\n numericProps: wrapProps(polygons.numericProps, 1)\n }\n };\n}\n\n/**\n * Add numeric properties to object\n *\n * @param object\n * @param properties\n * @param index\n * @param length\n */\nfunction fillNumericProperties(\n object: Points | Lines | Polygons,\n properties: {[x: string]: string | number | boolean | null},\n index: number,\n length: number\n): void {\n for (const numericPropName in object.numericProps) {\n if (numericPropName in properties) {\n const value = properties[numericPropName] as number;\n object.numericProps[numericPropName].fill(value, index, index + length);\n }\n }\n}\n\n/**\n * Keep string properties in object\n *\n * @param properties\n * @param numericKeys\n * @returns object\n */\nfunction keepStringProperties(\n properties: {[x: string]: string | number | boolean | null},\n numericKeys: string[]\n) {\n const props = {};\n for (const key in properties) {\n if (!numericKeys.includes(key)) {\n props[key] = properties[key];\n }\n }\n return props;\n}\n\n/**\n *\n * Deduce correct array constructor to use for a given value\n *\n * @param x value to test\n * @param constructor previous constructor deduced\n * @returns PropArrayConstructor\n */\nfunction deduceArrayType(x: any, constructor: PropArrayConstructor): PropArrayConstructor {\n if (constructor === Array || !Number.isFinite(x)) {\n return Array;\n }\n\n // If this or previous value required 64bits use Float64Array\n return constructor === Float64Array || Math.fround(x) !== x ? Float64Array : Float32Array;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"flat-geojson-to-binary.js","names":["earcut","flatGeojsonToBinary","features","geometryInfo","options","propArrayTypes","extractNumericPropTypes","numericPropKeys","Object","keys","filter","k","Array","fillArrays","PositionDataType","Float32Array","triangulate","TEST_EXPORTS","feature","properties","key","val","deduceArrayType","pointPositionsCount","pointFeaturesCount","linePositionsCount","linePathsCount","lineFeaturesCount","polygonPositionsCount","polygonObjectsCount","polygonRingsCount","polygonFeaturesCount","coordLength","hasGlobalId","GlobalFeatureIdsDataType","length","Uint32Array","Uint16Array","points","type","positions","globalFeatureIds","featureIds","numericProps","fields","lines","pathIndices","polygons","polygonIndices","primitivePolygonIndices","triangles","object","propName","T","indexMap","pointPosition","pointFeature","linePosition","linePath","lineFeature","polygonPosition","polygonObject","polygonRing","polygonFeature","geometry","handlePoint","push","keepStringProperties","id","handleLineString","handlePolygon","Error","makeAccessorObjects","set","data","nPositions","fillNumericProperties","fill","i","il","indices","start","end","l","ll","startPosition","areas","nextIndices","undefined","endPosition","triangulatePolygon","_ref","polygonPositions","subarray","offset","holes","slice","map","n","t","tl","wrapProps","obj","size","returnObj","value","binaryFeatures","index","numericPropName","numericKeys","props","includes","x","constructor","Number","isFinite","Float64Array","Math","fround"],"sources":["../../../src/lib/flat-geojson-to-binary.ts"],"sourcesContent":["/* eslint-disable indent */\nimport {earcut} from '@math.gl/polygon';\nimport type {\n BinaryAttribute,\n BinaryFeatures,\n BinaryPolygonFeatures,\n FlatFeature,\n FlatPoint,\n FlatLineString,\n FlatPolygon,\n GeojsonGeometryInfo,\n TypedArray\n} from '@loaders.gl/schema';\nimport {PropArrayConstructor, Lines, Points, Polygons} from './flat-geojson-to-binary-types';\n\n/**\n * Convert binary features to flat binary arrays. Similar to\n * `geojsonToBinary` helper function, except that it expects\n * a binary representation of the feature data, which enables\n * 2X-3X speed increase in parse speed, compared to using\n * geoJSON. See `binary-vector-tile/VectorTileFeature` for\n * data format detais\n *\n * @param features\n * @param geometryInfo\n * @param options\n * @returns filled arrays\n */\nexport function flatGeojsonToBinary(\n features: FlatFeature[],\n geometryInfo: GeojsonGeometryInfo,\n options?: FlatGeojsonToBinaryOptions\n) {\n const propArrayTypes = extractNumericPropTypes(features);\n const numericPropKeys = Object.keys(propArrayTypes).filter((k) => propArrayTypes[k] !== Array);\n return fillArrays(\n features,\n {\n propArrayTypes,\n ...geometryInfo\n },\n {\n numericPropKeys: (options && options.numericPropKeys) || numericPropKeys,\n PositionDataType: options ? options.PositionDataType : Float32Array,\n triangulate: options ? options.triangulate : true\n }\n );\n}\n\n/**\n * Options for `flatGeojsonToBinary`\n */\nexport type FlatGeojsonToBinaryOptions = {\n numericPropKeys?: string[];\n PositionDataType?: Float32ArrayConstructor | Float64ArrayConstructor;\n triangulate?: boolean;\n};\n\nexport const TEST_EXPORTS = {\n extractNumericPropTypes\n};\n\n/**\n * Extracts properties that are always numeric\n *\n * @param features\n * @returns object with numeric types\n */\nfunction extractNumericPropTypes(features: FlatFeature[]): {\n [key: string]: PropArrayConstructor;\n} {\n const propArrayTypes = {};\n for (const feature of features) {\n if (feature.properties) {\n for (const key in feature.properties) {\n // If property has not been seen before, or if property has been numeric\n // in all previous features, check if numeric in this feature\n // If not numeric, Array is stored to prevent rechecking in the future\n // Additionally, detects if 64 bit precision is required\n const val = feature.properties[key];\n propArrayTypes[key] = deduceArrayType(val, propArrayTypes[key]);\n }\n }\n }\n\n return propArrayTypes;\n}\n\n/**\n * Fills coordinates into pre-allocated typed arrays\n *\n * @param features\n * @param geometryInfo\n * @param options\n * @returns an accessor object with value and size keys\n */\n// eslint-disable-next-line complexity, max-statements\nfunction fillArrays(\n features: FlatFeature[],\n geometryInfo: GeojsonGeometryInfo & {\n propArrayTypes: {[key: string]: PropArrayConstructor};\n },\n options: FlatGeojsonToBinaryOptions\n) {\n const {\n pointPositionsCount,\n pointFeaturesCount,\n linePositionsCount,\n linePathsCount,\n lineFeaturesCount,\n polygonPositionsCount,\n polygonObjectsCount,\n polygonRingsCount,\n polygonFeaturesCount,\n propArrayTypes,\n coordLength\n } = geometryInfo;\n const {numericPropKeys = [], PositionDataType = Float32Array, triangulate = true} = options;\n const hasGlobalId = features[0] && 'id' in features[0];\n const GlobalFeatureIdsDataType = features.length > 65535 ? Uint32Array : Uint16Array;\n const points: Points = {\n type: 'Point',\n positions: new PositionDataType(pointPositionsCount * coordLength),\n globalFeatureIds: new GlobalFeatureIdsDataType(pointPositionsCount),\n featureIds:\n pointFeaturesCount > 65535\n ? new Uint32Array(pointPositionsCount)\n : new Uint16Array(pointPositionsCount),\n numericProps: {},\n properties: [],\n fields: []\n };\n const lines: Lines = {\n type: 'LineString',\n pathIndices:\n linePositionsCount > 65535\n ? new Uint32Array(linePathsCount + 1)\n : new Uint16Array(linePathsCount + 1),\n positions: new PositionDataType(linePositionsCount * coordLength),\n globalFeatureIds: new GlobalFeatureIdsDataType(linePositionsCount),\n featureIds:\n lineFeaturesCount > 65535\n ? new Uint32Array(linePositionsCount)\n : new Uint16Array(linePositionsCount),\n numericProps: {},\n properties: [],\n fields: []\n };\n const polygons: Polygons = {\n type: 'Polygon',\n polygonIndices:\n polygonPositionsCount > 65535\n ? new Uint32Array(polygonObjectsCount + 1)\n : new Uint16Array(polygonObjectsCount + 1),\n primitivePolygonIndices:\n polygonPositionsCount > 65535\n ? new Uint32Array(polygonRingsCount + 1)\n : new Uint16Array(polygonRingsCount + 1),\n positions: new PositionDataType(polygonPositionsCount * coordLength),\n globalFeatureIds: new GlobalFeatureIdsDataType(polygonPositionsCount),\n featureIds:\n polygonFeaturesCount > 65535\n ? new Uint32Array(polygonPositionsCount)\n : new Uint16Array(polygonPositionsCount),\n numericProps: {},\n properties: [],\n fields: []\n };\n\n if (triangulate) {\n polygons.triangles = [];\n }\n\n // Instantiate numeric properties arrays; one value per vertex\n for (const object of [points, lines, polygons]) {\n for (const propName of numericPropKeys) {\n // If property has been numeric in all previous features in which the property existed, check\n // if numeric in this feature\n const T = propArrayTypes[propName];\n object.numericProps[propName] = new T(object.positions.length / coordLength) as TypedArray;\n }\n }\n\n // Set last element of path/polygon indices as positions length\n lines.pathIndices[linePathsCount] = linePositionsCount;\n polygons.polygonIndices[polygonObjectsCount] = polygonPositionsCount;\n polygons.primitivePolygonIndices[polygonRingsCount] = polygonPositionsCount;\n\n const indexMap = {\n pointPosition: 0,\n pointFeature: 0,\n linePosition: 0,\n linePath: 0,\n lineFeature: 0,\n polygonPosition: 0,\n polygonObject: 0,\n polygonRing: 0,\n polygonFeature: 0,\n feature: 0\n };\n\n for (const feature of features) {\n const geometry = feature.geometry;\n const properties = feature.properties || {};\n\n switch (geometry.type) {\n case 'Point':\n handlePoint(geometry, points, indexMap, coordLength, properties);\n points.properties.push(keepStringProperties(properties, numericPropKeys));\n if (hasGlobalId) {\n points.fields.push({id: feature.id});\n }\n indexMap.pointFeature++;\n break;\n case 'LineString':\n handleLineString(geometry, lines, indexMap, coordLength, properties);\n lines.properties.push(keepStringProperties(properties, numericPropKeys));\n if (hasGlobalId) {\n lines.fields.push({id: feature.id});\n }\n indexMap.lineFeature++;\n break;\n case 'Polygon':\n handlePolygon(geometry, polygons, indexMap, coordLength, properties);\n polygons.properties.push(keepStringProperties(properties, numericPropKeys));\n if (hasGlobalId) {\n polygons.fields.push({id: feature.id});\n }\n indexMap.polygonFeature++;\n break;\n default:\n throw new Error('Invalid geometry type');\n }\n\n indexMap.feature++;\n }\n\n // Wrap each array in an accessor object with value and size keys\n return makeAccessorObjects(points, lines, polygons, coordLength);\n}\n\n/**\n * Fills (Multi)Point coordinates into points object of arrays\n *\n * @param geometry\n * @param points\n * @param indexMap\n * @param coordLength\n * @param properties\n */\nfunction handlePoint(\n geometry: FlatPoint,\n points: Points,\n indexMap: {\n pointPosition: number;\n pointFeature: number;\n linePosition?: number;\n linePath?: number;\n lineFeature?: number;\n polygonPosition?: number;\n polygonObject?: number;\n polygonRing?: number;\n polygonFeature?: number;\n feature: number;\n },\n coordLength: number,\n properties: {[x: string]: string | number | boolean | null}\n): void {\n points.positions.set(geometry.data, indexMap.pointPosition * coordLength);\n\n const nPositions = geometry.data.length / coordLength;\n fillNumericProperties(points, properties, indexMap.pointPosition, nPositions);\n points.globalFeatureIds.fill(\n indexMap.feature,\n indexMap.pointPosition,\n indexMap.pointPosition + nPositions\n );\n points.featureIds.fill(\n indexMap.pointFeature,\n indexMap.pointPosition,\n indexMap.pointPosition + nPositions\n );\n\n indexMap.pointPosition += nPositions;\n}\n\n/**\n * Fills (Multi)LineString coordinates into lines object of arrays\n *\n * @param geometry\n * @param lines\n * @param indexMap\n * @param coordLength\n * @param properties\n */\nfunction handleLineString(\n geometry: FlatLineString,\n lines: Lines,\n indexMap: {\n pointPosition?: number;\n pointFeature?: number;\n linePosition: number;\n linePath: number;\n lineFeature: number;\n polygonPosition?: number;\n polygonObject?: number;\n polygonRing?: number;\n polygonFeature?: number;\n feature: number;\n },\n coordLength: number,\n properties: {[x: string]: string | number | boolean | null}\n): void {\n lines.positions.set(geometry.data, indexMap.linePosition * coordLength);\n\n const nPositions = geometry.data.length / coordLength;\n fillNumericProperties(lines, properties, indexMap.linePosition, nPositions);\n\n lines.globalFeatureIds.fill(\n indexMap.feature,\n indexMap.linePosition,\n indexMap.linePosition + nPositions\n );\n lines.featureIds.fill(\n indexMap.lineFeature,\n indexMap.linePosition,\n indexMap.linePosition + nPositions\n );\n\n for (let i = 0, il = geometry.indices.length; i < il; ++i) {\n // Extract range of data we are working with, defined by start\n // and end indices (these index into the geometry.data array)\n const start = geometry.indices[i];\n const end =\n i === il - 1\n ? geometry.data.length // last line, so read to end of data\n : geometry.indices[i + 1]; // start index for next line\n\n lines.pathIndices[indexMap.linePath++] = indexMap.linePosition;\n indexMap.linePosition += (end - start) / coordLength;\n }\n}\n\n/**\n * Fills (Multi)Polygon coordinates into polygons object of arrays\n *\n * @param geometry\n * @param polygons\n * @param indexMap\n * @param coordLength\n * @param properties\n */\nfunction handlePolygon(\n geometry: FlatPolygon,\n polygons: Polygons,\n indexMap: {\n pointPosition?: number;\n pointFeature?: number;\n linePosition?: number;\n linePath?: number;\n lineFeature?: number;\n polygonPosition: number;\n polygonObject: number;\n polygonRing: number;\n polygonFeature: number;\n feature: number;\n },\n coordLength: number,\n properties: {[x: string]: string | number | boolean | null}\n): void {\n polygons.positions.set(geometry.data, indexMap.polygonPosition * coordLength);\n\n const nPositions = geometry.data.length / coordLength;\n fillNumericProperties(polygons, properties, indexMap.polygonPosition, nPositions);\n polygons.globalFeatureIds.fill(\n indexMap.feature,\n indexMap.polygonPosition,\n indexMap.polygonPosition + nPositions\n );\n polygons.featureIds.fill(\n indexMap.polygonFeature,\n indexMap.polygonPosition,\n indexMap.polygonPosition + nPositions\n );\n\n // Unlike Point & LineString geometry.indices is a 2D array\n for (let l = 0, ll = geometry.indices.length; l < ll; ++l) {\n const startPosition = indexMap.polygonPosition;\n polygons.polygonIndices[indexMap.polygonObject++] = startPosition;\n\n const areas = geometry.areas[l];\n const indices = geometry.indices[l];\n const nextIndices = geometry.indices[l + 1];\n\n for (let i = 0, il = indices.length; i < il; ++i) {\n const start = indices[i];\n const end =\n i === il - 1\n ? // last line, so either read to:\n nextIndices === undefined\n ? geometry.data.length // end of data (no next indices)\n : nextIndices[0] // start of first line in nextIndices\n : indices[i + 1]; // start index for next line\n\n polygons.primitivePolygonIndices[indexMap.polygonRing++] = indexMap.polygonPosition;\n indexMap.polygonPosition += (end - start) / coordLength;\n }\n\n const endPosition = indexMap.polygonPosition;\n triangulatePolygon(polygons, areas, indices, {startPosition, endPosition, coordLength});\n }\n}\n\n/**\n * Triangulate polygon using earcut\n *\n * @param polygons\n * @param areas\n * @param indices\n * @param param3\n */\nfunction triangulatePolygon(\n polygons: Polygons,\n areas: number[],\n indices: number[],\n {\n startPosition,\n endPosition,\n coordLength\n }: {startPosition: number; endPosition: number; coordLength: number}\n): void {\n if (!polygons.triangles) {\n return;\n }\n\n const start = startPosition * coordLength;\n const end = endPosition * coordLength;\n\n // Extract positions and holes for just this polygon\n const polygonPositions = polygons.positions.subarray(start, end);\n\n // Holes are referenced relative to outer polygon\n const offset = indices[0];\n const holes = indices.slice(1).map((n: number) => (n - offset) / coordLength);\n\n // Compute triangulation\n // @ts-expect-error TODO can earcut handle binary arrays? Add tests?\n const triangles = earcut(polygonPositions, holes, coordLength, areas);\n\n // Indices returned by triangulation are relative to start\n // of polygon, so we need to offset\n for (let t = 0, tl = triangles.length; t < tl; ++t) {\n polygons.triangles.push(startPosition + triangles[t]);\n }\n}\n\n/**\n * Wraps an object containing array into accessors\n *\n * @param obj\n * @param size\n */\nfunction wrapProps(\n obj: {[key: string]: TypedArray},\n size: number\n): {[key: string]: BinaryAttribute} {\n const returnObj = {};\n for (const key in obj) {\n returnObj[key] = {value: obj[key], size};\n }\n return returnObj;\n}\n\n/**\n * Wrap each array in an accessor object with value and size keys\n *\n * @param points\n * @param lines\n * @param polygons\n * @param coordLength\n * @returns object\n */\nfunction makeAccessorObjects(\n points: Points,\n lines: Lines,\n polygons: Polygons,\n coordLength: number\n): BinaryFeatures {\n const binaryFeatures = {\n points: {\n ...points,\n positions: {value: points.positions, size: coordLength},\n globalFeatureIds: {value: points.globalFeatureIds, size: 1},\n featureIds: {value: points.featureIds, size: 1},\n numericProps: wrapProps(points.numericProps, 1)\n },\n lines: {\n ...lines,\n positions: {value: lines.positions, size: coordLength},\n pathIndices: {value: lines.pathIndices, size: 1},\n globalFeatureIds: {value: lines.globalFeatureIds, size: 1},\n featureIds: {value: lines.featureIds, size: 1},\n numericProps: wrapProps(lines.numericProps, 1)\n },\n polygons: {\n ...polygons,\n positions: {value: polygons.positions, size: coordLength},\n polygonIndices: {value: polygons.polygonIndices, size: 1},\n primitivePolygonIndices: {value: polygons.primitivePolygonIndices, size: 1},\n globalFeatureIds: {value: polygons.globalFeatureIds, size: 1},\n featureIds: {value: polygons.featureIds, size: 1},\n numericProps: wrapProps(polygons.numericProps, 1)\n } as BinaryPolygonFeatures\n };\n\n if (polygons.triangles) {\n binaryFeatures.polygons.triangles = {value: new Uint32Array(polygons.triangles), size: 1};\n }\n\n return binaryFeatures;\n}\n\n/**\n * Add numeric properties to object\n *\n * @param object\n * @param properties\n * @param index\n * @param length\n */\nfunction fillNumericProperties(\n object: Points | Lines | Polygons,\n properties: {[x: string]: string | number | boolean | null},\n index: number,\n length: number\n): void {\n for (const numericPropName in object.numericProps) {\n if (numericPropName in properties) {\n const value = properties[numericPropName] as number;\n object.numericProps[numericPropName].fill(value, index, index + length);\n }\n }\n}\n\n/**\n * Keep string properties in object\n *\n * @param properties\n * @param numericKeys\n * @returns object\n */\nfunction keepStringProperties(\n properties: {[x: string]: string | number | boolean | null},\n numericKeys: string[]\n) {\n const props = {};\n for (const key in properties) {\n if (!numericKeys.includes(key)) {\n props[key] = properties[key];\n }\n }\n return props;\n}\n\n/**\n *\n * Deduce correct array constructor to use for a given value\n *\n * @param x value to test\n * @param constructor previous constructor deduced\n * @returns PropArrayConstructor\n */\nfunction deduceArrayType(x: any, constructor: PropArrayConstructor): PropArrayConstructor {\n if (constructor === Array || !Number.isFinite(x)) {\n return Array;\n }\n\n // If this or previous value required 64bits use Float64Array\n return constructor === Float64Array || Math.fround(x) !== x ? Float64Array : Float32Array;\n}\n"],"mappings":"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"}
@@ -3,7 +3,8 @@ import { geojsonToFlatGeojson } from './geojson-to-flat-geojson';
3
3
  import { flatGeojsonToBinary } from './flat-geojson-to-binary';
4
4
  export function geojsonToBinary(features) {
5
5
  let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
6
- fixRingWinding: true
6
+ fixRingWinding: true,
7
+ triangulate: true
7
8
  };
8
9
  const geometryInfo = extractGeometryInfo(features);
9
10
  const coordLength = geometryInfo.coordLength;
@@ -16,7 +17,8 @@ export function geojsonToBinary(features) {
16
17
  });
17
18
  return flatGeojsonToBinary(flatFeatures, geometryInfo, {
18
19
  numericPropKeys: options.numericPropKeys,
19
- PositionDataType: options.PositionDataType || Float32Array
20
+ PositionDataType: options.PositionDataType || Float32Array,
21
+ triangulate: options.triangulate
20
22
  });
21
23
  }
22
24
  //# sourceMappingURL=geojson-to-binary.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"geojson-to-binary.js","names":["extractGeometryInfo","geojsonToFlatGeojson","flatGeojsonToBinary","geojsonToBinary","features","options","arguments","length","undefined","fixRingWinding","geometryInfo","coordLength","flatFeatures","numericPropKeys","PositionDataType","Float32Array"],"sources":["../../../src/lib/geojson-to-binary.ts"],"sourcesContent":["import type {Feature} from '@loaders.gl/schema';\nimport type {BinaryFeatures} from '@loaders.gl/schema';\n\nimport {extractGeometryInfo} from './extract-geometry-info';\nimport {geojsonToFlatGeojson} from './geojson-to-flat-geojson';\nimport {flatGeojsonToBinary} from './flat-geojson-to-binary';\n\n/**\n * Options for `geojsonToBinary`\n */\nexport type GeojsonToBinaryOptions = {\n fixRingWinding: boolean;\n numericPropKeys?: string[];\n PositionDataType?: Float32ArrayConstructor | Float64ArrayConstructor;\n};\n\n/**\n * Convert GeoJSON features to flat binary arrays\n *\n * @param features\n * @param options\n * @returns features in binary format, grouped by geometry type\n */\nexport function geojsonToBinary(\n features: Feature[],\n options: GeojsonToBinaryOptions = {fixRingWinding: true}\n): BinaryFeatures {\n const geometryInfo = extractGeometryInfo(features);\n const coordLength = geometryInfo.coordLength;\n const {fixRingWinding} = options;\n const flatFeatures = geojsonToFlatGeojson(features, {coordLength, fixRingWinding});\n return flatGeojsonToBinary(flatFeatures, geometryInfo, {\n numericPropKeys: options.numericPropKeys,\n PositionDataType: options.PositionDataType || Float32Array\n });\n}\n"],"mappings":"AAGA,SAAQA,mBAAmB,QAAO,yBAAyB;AAC3D,SAAQC,oBAAoB,QAAO,2BAA2B;AAC9D,SAAQC,mBAAmB,QAAO,0BAA0B;AAkB5D,OAAO,SAASC,eAAeA,CAC7BC,QAAmB,EAEH;EAAA,IADhBC,OAA+B,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG;IAACG,cAAc,EAAE;EAAI,CAAC;EAExD,MAAMC,YAAY,GAAGV,mBAAmB,CAACI,QAAQ,CAAC;EAClD,MAAMO,WAAW,GAAGD,YAAY,CAACC,WAAW;EAC5C,MAAM;IAACF;EAAc,CAAC,GAAGJ,OAAO;EAChC,MAAMO,YAAY,GAAGX,oBAAoB,CAACG,QAAQ,EAAE;IAACO,WAAW;IAAEF;EAAc,CAAC,CAAC;EAClF,OAAOP,mBAAmB,CAACU,YAAY,EAAEF,YAAY,EAAE;IACrDG,eAAe,EAAER,OAAO,CAACQ,eAAe;IACxCC,gBAAgB,EAAET,OAAO,CAACS,gBAAgB,IAAIC;EAChD,CAAC,CAAC;AACJ"}
1
+ {"version":3,"file":"geojson-to-binary.js","names":["extractGeometryInfo","geojsonToFlatGeojson","flatGeojsonToBinary","geojsonToBinary","features","options","arguments","length","undefined","fixRingWinding","triangulate","geometryInfo","coordLength","flatFeatures","numericPropKeys","PositionDataType","Float32Array"],"sources":["../../../src/lib/geojson-to-binary.ts"],"sourcesContent":["import type {Feature} from '@loaders.gl/schema';\nimport type {BinaryFeatures} from '@loaders.gl/schema';\n\nimport {extractGeometryInfo} from './extract-geometry-info';\nimport {geojsonToFlatGeojson} from './geojson-to-flat-geojson';\nimport {flatGeojsonToBinary} from './flat-geojson-to-binary';\n\n/**\n * Options for `geojsonToBinary`\n */\nexport type GeojsonToBinaryOptions = {\n fixRingWinding: boolean;\n numericPropKeys?: string[];\n PositionDataType?: Float32ArrayConstructor | Float64ArrayConstructor;\n triangulate?: boolean;\n};\n\n/**\n * Convert GeoJSON features to flat binary arrays\n *\n * @param features\n * @param options\n * @returns features in binary format, grouped by geometry type\n */\nexport function geojsonToBinary(\n features: Feature[],\n options: GeojsonToBinaryOptions = {fixRingWinding: true, triangulate: true}\n): BinaryFeatures {\n const geometryInfo = extractGeometryInfo(features);\n const coordLength = geometryInfo.coordLength;\n const {fixRingWinding} = options;\n const flatFeatures = geojsonToFlatGeojson(features, {coordLength, fixRingWinding});\n return flatGeojsonToBinary(flatFeatures, geometryInfo, {\n numericPropKeys: options.numericPropKeys,\n PositionDataType: options.PositionDataType || Float32Array,\n triangulate: options.triangulate\n });\n}\n"],"mappings":"AAGA,SAAQA,mBAAmB,QAAO,yBAAyB;AAC3D,SAAQC,oBAAoB,QAAO,2BAA2B;AAC9D,SAAQC,mBAAmB,QAAO,0BAA0B;AAmB5D,OAAO,SAASC,eAAeA,CAC7BC,QAAmB,EAEH;EAAA,IADhBC,OAA+B,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG;IAACG,cAAc,EAAE,IAAI;IAAEC,WAAW,EAAE;EAAI,CAAC;EAE3E,MAAMC,YAAY,GAAGX,mBAAmB,CAACI,QAAQ,CAAC;EAClD,MAAMQ,WAAW,GAAGD,YAAY,CAACC,WAAW;EAC5C,MAAM;IAACH;EAAc,CAAC,GAAGJ,OAAO;EAChC,MAAMQ,YAAY,GAAGZ,oBAAoB,CAACG,QAAQ,EAAE;IAACQ,WAAW;IAAEH;EAAc,CAAC,CAAC;EAClF,OAAOP,mBAAmB,CAACW,YAAY,EAAEF,YAAY,EAAE;IACrDG,eAAe,EAAET,OAAO,CAACS,eAAe;IACxCC,gBAAgB,EAAEV,OAAO,CAACU,gBAAgB,IAAIC,YAAY;IAC1DN,WAAW,EAAEL,OAAO,CAACK;EACvB,CAAC,CAAC;AACJ"}
@@ -44,7 +44,7 @@ export type Polygons = {
44
44
  positions: Float32Array | Float64Array;
45
45
  polygonIndices: Uint16Array | Uint32Array;
46
46
  primitivePolygonIndices: Uint16Array | Uint32Array;
47
- triangles: number[];
47
+ triangles?: number[];
48
48
  globalFeatureIds: Uint16Array | Uint32Array;
49
49
  featureIds: Uint16Array | Uint32Array;
50
50
  numericProps: {
@@ -1 +1 @@
1
- {"version":3,"file":"flat-geojson-to-binary-types.d.ts","sourceRoot":"","sources":["../../src/lib/flat-geojson-to-binary-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,oBAAoB,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAC5B,uBAAuB,GACvB,uBAAuB,GACvB,gBAAgB,CAAC;AAErB;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,YAAY,GAAG,YAAY,CAAC;IACvC,gBAAgB,EAAE,WAAW,GAAG,WAAW,CAAC;IAC5C,UAAU,EAAE,WAAW,GAAG,WAAW,CAAC;IACtC,YAAY,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAA;KAAC,CAAC;IAC1C,UAAU,EAAE,EAAE,EAAE,CAAC;IACjB,MAAM,EAAE;QACN,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;KACtB,EAAE,CAAC;CACL,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,YAAY,GAAG,YAAY,CAAC;IACvC,WAAW,EAAE,WAAW,GAAG,WAAW,CAAC;IACvC,gBAAgB,EAAE,WAAW,GAAG,WAAW,CAAC;IAC5C,UAAU,EAAE,WAAW,GAAG,WAAW,CAAC;IACtC,YAAY,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAA;KAAC,CAAC;IAC1C,UAAU,EAAE,EAAE,EAAE,CAAC;IACjB,MAAM,EAAE;QACN,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;KACtB,EAAE,CAAC;CACL,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,YAAY,GAAG,YAAY,CAAC;IACvC,cAAc,EAAE,WAAW,GAAG,WAAW,CAAC;IAC1C,uBAAuB,EAAE,WAAW,GAAG,WAAW,CAAC;IACnD,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,gBAAgB,EAAE,WAAW,GAAG,WAAW,CAAC;IAC5C,UAAU,EAAE,WAAW,GAAG,WAAW,CAAC;IACtC,YAAY,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAA;KAAC,CAAC;IAC1C,UAAU,EAAE,EAAE,EAAE,CAAC;IACjB,MAAM,EAAE;QACN,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;KACtB,EAAE,CAAC;CACL,CAAC"}
1
+ {"version":3,"file":"flat-geojson-to-binary-types.d.ts","sourceRoot":"","sources":["../../src/lib/flat-geojson-to-binary-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,oBAAoB,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAC5B,uBAAuB,GACvB,uBAAuB,GACvB,gBAAgB,CAAC;AAErB;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,YAAY,GAAG,YAAY,CAAC;IACvC,gBAAgB,EAAE,WAAW,GAAG,WAAW,CAAC;IAC5C,UAAU,EAAE,WAAW,GAAG,WAAW,CAAC;IACtC,YAAY,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAA;KAAC,CAAC;IAC1C,UAAU,EAAE,EAAE,EAAE,CAAC;IACjB,MAAM,EAAE;QACN,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;KACtB,EAAE,CAAC;CACL,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,YAAY,GAAG,YAAY,CAAC;IACvC,WAAW,EAAE,WAAW,GAAG,WAAW,CAAC;IACvC,gBAAgB,EAAE,WAAW,GAAG,WAAW,CAAC;IAC5C,UAAU,EAAE,WAAW,GAAG,WAAW,CAAC;IACtC,YAAY,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAA;KAAC,CAAC;IAC1C,UAAU,EAAE,EAAE,EAAE,CAAC;IACjB,MAAM,EAAE;QACN,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;KACtB,EAAE,CAAC;CACL,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,YAAY,GAAG,YAAY,CAAC;IACvC,cAAc,EAAE,WAAW,GAAG,WAAW,CAAC;IAC1C,uBAAuB,EAAE,WAAW,GAAG,WAAW,CAAC;IACnD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,gBAAgB,EAAE,WAAW,GAAG,WAAW,CAAC;IAC5C,UAAU,EAAE,WAAW,GAAG,WAAW,CAAC;IACtC,YAAY,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAA;KAAC,CAAC;IAC1C,UAAU,EAAE,EAAE,EAAE,CAAC;IACjB,MAAM,EAAE;QACN,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;KACtB,EAAE,CAAC;CACL,CAAC"}
@@ -20,6 +20,7 @@ export declare function flatGeojsonToBinary(features: FlatFeature[], geometryInf
20
20
  export type FlatGeojsonToBinaryOptions = {
21
21
  numericPropKeys?: string[];
22
22
  PositionDataType?: Float32ArrayConstructor | Float64ArrayConstructor;
23
+ triangulate?: boolean;
23
24
  };
24
25
  export declare const TEST_EXPORTS: {
25
26
  extractNumericPropTypes: typeof extractNumericPropTypes;
@@ -1 +1 @@
1
- {"version":3,"file":"flat-geojson-to-binary.d.ts","sourceRoot":"","sources":["../../src/lib/flat-geojson-to-binary.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,cAAc,EACd,WAAW,EAIX,mBAAmB,EAEpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAC,oBAAoB,EAA0B,MAAM,gCAAgC,CAAC;AAE7F;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,WAAW,EAAE,EACvB,YAAY,EAAE,mBAAmB,EACjC,OAAO,CAAC,EAAE,0BAA0B,kBAerC;AAED;;GAEG;AACH,MAAM,MAAM,0BAA0B,GAAG;IACvC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,CAAC,EAAE,uBAAuB,GAAG,uBAAuB,CAAC;CACtE,CAAC;AAEF,eAAO,MAAM,YAAY;;CAExB,CAAC;AAEF;;;;;GAKG;AACH,iBAAS,uBAAuB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG;IACzD,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAAC;CACrC,CAgBA"}
1
+ {"version":3,"file":"flat-geojson-to-binary.d.ts","sourceRoot":"","sources":["../../src/lib/flat-geojson-to-binary.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,cAAc,EAEd,WAAW,EAIX,mBAAmB,EAEpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAC,oBAAoB,EAA0B,MAAM,gCAAgC,CAAC;AAE7F;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,WAAW,EAAE,EACvB,YAAY,EAAE,mBAAmB,EACjC,OAAO,CAAC,EAAE,0BAA0B,kBAgBrC;AAED;;GAEG;AACH,MAAM,MAAM,0BAA0B,GAAG;IACvC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,CAAC,EAAE,uBAAuB,GAAG,uBAAuB,CAAC;IACrE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,YAAY;;CAExB,CAAC;AAEF;;;;;GAKG;AACH,iBAAS,uBAAuB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG;IACzD,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAAC;CACrC,CAgBA"}
@@ -24,7 +24,8 @@ function flatGeojsonToBinary(features, geometryInfo, options) {
24
24
  ...geometryInfo
25
25
  }, {
26
26
  numericPropKeys: (options && options.numericPropKeys) || numericPropKeys,
27
- PositionDataType: options ? options.PositionDataType : Float32Array
27
+ PositionDataType: options ? options.PositionDataType : Float32Array,
28
+ triangulate: options ? options.triangulate : true
28
29
  });
29
30
  }
30
31
  exports.flatGeojsonToBinary = flatGeojsonToBinary;
@@ -61,10 +62,10 @@ function extractNumericPropTypes(features) {
61
62
  * @param options
62
63
  * @returns an accessor object with value and size keys
63
64
  */
64
- // eslint-disable-next-line complexity
65
+ // eslint-disable-next-line complexity, max-statements
65
66
  function fillArrays(features, geometryInfo, options) {
66
67
  const { pointPositionsCount, pointFeaturesCount, linePositionsCount, linePathsCount, lineFeaturesCount, polygonPositionsCount, polygonObjectsCount, polygonRingsCount, polygonFeaturesCount, propArrayTypes, coordLength } = geometryInfo;
67
- const { numericPropKeys = [], PositionDataType = Float32Array } = options;
68
+ const { numericPropKeys = [], PositionDataType = Float32Array, triangulate = true } = options;
68
69
  const hasGlobalId = features[0] && 'id' in features[0];
69
70
  const GlobalFeatureIdsDataType = features.length > 65535 ? Uint32Array : Uint16Array;
70
71
  const points = {
@@ -101,7 +102,6 @@ function fillArrays(features, geometryInfo, options) {
101
102
  ? new Uint32Array(polygonRingsCount + 1)
102
103
  : new Uint16Array(polygonRingsCount + 1),
103
104
  positions: new PositionDataType(polygonPositionsCount * coordLength),
104
- triangles: [],
105
105
  globalFeatureIds: new GlobalFeatureIdsDataType(polygonPositionsCount),
106
106
  featureIds: polygonFeaturesCount > 65535
107
107
  ? new Uint32Array(polygonPositionsCount)
@@ -110,6 +110,9 @@ function fillArrays(features, geometryInfo, options) {
110
110
  properties: [],
111
111
  fields: []
112
112
  };
113
+ if (triangulate) {
114
+ polygons.triangles = [];
115
+ }
113
116
  // Instantiate numeric properties arrays; one value per vertex
114
117
  for (const object of [points, lines, polygons]) {
115
118
  for (const propName of numericPropKeys) {
@@ -260,6 +263,9 @@ function handlePolygon(geometry, polygons, indexMap, coordLength, properties) {
260
263
  * @param param3
261
264
  */
262
265
  function triangulatePolygon(polygons, areas, indices, { startPosition, endPosition, coordLength }) {
266
+ if (!polygons.triangles) {
267
+ return;
268
+ }
263
269
  const start = startPosition * coordLength;
264
270
  const end = endPosition * coordLength;
265
271
  // Extract positions and holes for just this polygon
@@ -299,7 +305,7 @@ function wrapProps(obj, size) {
299
305
  * @returns object
300
306
  */
301
307
  function makeAccessorObjects(points, lines, polygons, coordLength) {
302
- return {
308
+ const binaryFeatures = {
303
309
  points: {
304
310
  ...points,
305
311
  positions: { value: points.positions, size: coordLength },
@@ -320,12 +326,15 @@ function makeAccessorObjects(points, lines, polygons, coordLength) {
320
326
  positions: { value: polygons.positions, size: coordLength },
321
327
  polygonIndices: { value: polygons.polygonIndices, size: 1 },
322
328
  primitivePolygonIndices: { value: polygons.primitivePolygonIndices, size: 1 },
323
- triangles: { value: new Uint32Array(polygons.triangles), size: 1 },
324
329
  globalFeatureIds: { value: polygons.globalFeatureIds, size: 1 },
325
330
  featureIds: { value: polygons.featureIds, size: 1 },
326
331
  numericProps: wrapProps(polygons.numericProps, 1)
327
332
  }
328
333
  };
334
+ if (polygons.triangles) {
335
+ binaryFeatures.polygons.triangles = { value: new Uint32Array(polygons.triangles), size: 1 };
336
+ }
337
+ return binaryFeatures;
329
338
  }
330
339
  /**
331
340
  * Add numeric properties to object
@@ -7,6 +7,7 @@ export type GeojsonToBinaryOptions = {
7
7
  fixRingWinding: boolean;
8
8
  numericPropKeys?: string[];
9
9
  PositionDataType?: Float32ArrayConstructor | Float64ArrayConstructor;
10
+ triangulate?: boolean;
10
11
  };
11
12
  /**
12
13
  * Convert GeoJSON features to flat binary arrays
@@ -1 +1 @@
1
- {"version":3,"file":"geojson-to-binary.d.ts","sourceRoot":"","sources":["../../src/lib/geojson-to-binary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAMvD;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,CAAC,EAAE,uBAAuB,GAAG,uBAAuB,CAAC;CACtE,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,GAAE,sBAA+C,GACvD,cAAc,CAShB"}
1
+ {"version":3,"file":"geojson-to-binary.d.ts","sourceRoot":"","sources":["../../src/lib/geojson-to-binary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAMvD;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,CAAC,EAAE,uBAAuB,GAAG,uBAAuB,CAAC;IACrE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,GAAE,sBAAkE,GAC1E,cAAc,CAUhB"}
@@ -11,14 +11,15 @@ const flat_geojson_to_binary_1 = require("./flat-geojson-to-binary");
11
11
  * @param options
12
12
  * @returns features in binary format, grouped by geometry type
13
13
  */
14
- function geojsonToBinary(features, options = { fixRingWinding: true }) {
14
+ function geojsonToBinary(features, options = { fixRingWinding: true, triangulate: true }) {
15
15
  const geometryInfo = (0, extract_geometry_info_1.extractGeometryInfo)(features);
16
16
  const coordLength = geometryInfo.coordLength;
17
17
  const { fixRingWinding } = options;
18
18
  const flatFeatures = (0, geojson_to_flat_geojson_1.geojsonToFlatGeojson)(features, { coordLength, fixRingWinding });
19
19
  return (0, flat_geojson_to_binary_1.flatGeojsonToBinary)(flatFeatures, geometryInfo, {
20
20
  numericPropKeys: options.numericPropKeys,
21
- PositionDataType: options.PositionDataType || Float32Array
21
+ PositionDataType: options.PositionDataType || Float32Array,
22
+ triangulate: options.triangulate
22
23
  });
23
24
  }
24
25
  exports.geojsonToBinary = geojsonToBinary;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@loaders.gl/gis",
3
3
  "description": "Helpers for GIS category data",
4
- "version": "4.0.0-alpha.16",
4
+ "version": "4.0.0-alpha.18",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
7
7
  "access": "public"
@@ -24,8 +24,8 @@
24
24
  "README.md"
25
25
  ],
26
26
  "dependencies": {
27
- "@loaders.gl/loader-utils": "4.0.0-alpha.16",
28
- "@loaders.gl/schema": "4.0.0-alpha.16",
27
+ "@loaders.gl/loader-utils": "4.0.0-alpha.18",
28
+ "@loaders.gl/schema": "4.0.0-alpha.18",
29
29
  "@mapbox/vector-tile": "^1.3.1",
30
30
  "@math.gl/polygon": "^3.5.1",
31
31
  "pbf": "^3.2.1"
@@ -33,5 +33,5 @@
33
33
  "devDependencies": {
34
34
  "@math.gl/proj4": "^3.5.1"
35
35
  },
36
- "gitHead": "87e9714165c3ce143a04ac45bbd9d922006f1b63"
36
+ "gitHead": "7bc633f46560f661bdd46cf1015ea27b3694ebce"
37
37
  }
@@ -47,7 +47,7 @@ export type Polygons = {
47
47
  positions: Float32Array | Float64Array;
48
48
  polygonIndices: Uint16Array | Uint32Array;
49
49
  primitivePolygonIndices: Uint16Array | Uint32Array;
50
- triangles: number[];
50
+ triangles?: number[];
51
51
  globalFeatureIds: Uint16Array | Uint32Array;
52
52
  featureIds: Uint16Array | Uint32Array;
53
53
  numericProps: {[key: string]: TypedArray};
@@ -3,6 +3,7 @@ import {earcut} from '@math.gl/polygon';
3
3
  import type {
4
4
  BinaryAttribute,
5
5
  BinaryFeatures,
6
+ BinaryPolygonFeatures,
6
7
  FlatFeature,
7
8
  FlatPoint,
8
9
  FlatLineString,
@@ -40,7 +41,8 @@ export function flatGeojsonToBinary(
40
41
  },
41
42
  {
42
43
  numericPropKeys: (options && options.numericPropKeys) || numericPropKeys,
43
- PositionDataType: options ? options.PositionDataType : Float32Array
44
+ PositionDataType: options ? options.PositionDataType : Float32Array,
45
+ triangulate: options ? options.triangulate : true
44
46
  }
45
47
  );
46
48
  }
@@ -51,6 +53,7 @@ export function flatGeojsonToBinary(
51
53
  export type FlatGeojsonToBinaryOptions = {
52
54
  numericPropKeys?: string[];
53
55
  PositionDataType?: Float32ArrayConstructor | Float64ArrayConstructor;
56
+ triangulate?: boolean;
54
57
  };
55
58
 
56
59
  export const TEST_EXPORTS = {
@@ -91,7 +94,7 @@ function extractNumericPropTypes(features: FlatFeature[]): {
91
94
  * @param options
92
95
  * @returns an accessor object with value and size keys
93
96
  */
94
- // eslint-disable-next-line complexity
97
+ // eslint-disable-next-line complexity, max-statements
95
98
  function fillArrays(
96
99
  features: FlatFeature[],
97
100
  geometryInfo: GeojsonGeometryInfo & {
@@ -112,7 +115,7 @@ function fillArrays(
112
115
  propArrayTypes,
113
116
  coordLength
114
117
  } = geometryInfo;
115
- const {numericPropKeys = [], PositionDataType = Float32Array} = options;
118
+ const {numericPropKeys = [], PositionDataType = Float32Array, triangulate = true} = options;
116
119
  const hasGlobalId = features[0] && 'id' in features[0];
117
120
  const GlobalFeatureIdsDataType = features.length > 65535 ? Uint32Array : Uint16Array;
118
121
  const points: Points = {
@@ -154,7 +157,6 @@ function fillArrays(
154
157
  ? new Uint32Array(polygonRingsCount + 1)
155
158
  : new Uint16Array(polygonRingsCount + 1),
156
159
  positions: new PositionDataType(polygonPositionsCount * coordLength),
157
- triangles: [],
158
160
  globalFeatureIds: new GlobalFeatureIdsDataType(polygonPositionsCount),
159
161
  featureIds:
160
162
  polygonFeaturesCount > 65535
@@ -165,6 +167,10 @@ function fillArrays(
165
167
  fields: []
166
168
  };
167
169
 
170
+ if (triangulate) {
171
+ polygons.triangles = [];
172
+ }
173
+
168
174
  // Instantiate numeric properties arrays; one value per vertex
169
175
  for (const object of [points, lines, polygons]) {
170
176
  for (const propName of numericPropKeys) {
@@ -423,6 +429,10 @@ function triangulatePolygon(
423
429
  coordLength
424
430
  }: {startPosition: number; endPosition: number; coordLength: number}
425
431
  ): void {
432
+ if (!polygons.triangles) {
433
+ return;
434
+ }
435
+
426
436
  const start = startPosition * coordLength;
427
437
  const end = endPosition * coordLength;
428
438
 
@@ -476,7 +486,7 @@ function makeAccessorObjects(
476
486
  polygons: Polygons,
477
487
  coordLength: number
478
488
  ): BinaryFeatures {
479
- return {
489
+ const binaryFeatures = {
480
490
  points: {
481
491
  ...points,
482
492
  positions: {value: points.positions, size: coordLength},
@@ -497,12 +507,17 @@ function makeAccessorObjects(
497
507
  positions: {value: polygons.positions, size: coordLength},
498
508
  polygonIndices: {value: polygons.polygonIndices, size: 1},
499
509
  primitivePolygonIndices: {value: polygons.primitivePolygonIndices, size: 1},
500
- triangles: {value: new Uint32Array(polygons.triangles), size: 1},
501
510
  globalFeatureIds: {value: polygons.globalFeatureIds, size: 1},
502
511
  featureIds: {value: polygons.featureIds, size: 1},
503
512
  numericProps: wrapProps(polygons.numericProps, 1)
504
- }
513
+ } as BinaryPolygonFeatures
505
514
  };
515
+
516
+ if (polygons.triangles) {
517
+ binaryFeatures.polygons.triangles = {value: new Uint32Array(polygons.triangles), size: 1};
518
+ }
519
+
520
+ return binaryFeatures;
506
521
  }
507
522
 
508
523
  /**
@@ -12,6 +12,7 @@ export type GeojsonToBinaryOptions = {
12
12
  fixRingWinding: boolean;
13
13
  numericPropKeys?: string[];
14
14
  PositionDataType?: Float32ArrayConstructor | Float64ArrayConstructor;
15
+ triangulate?: boolean;
15
16
  };
16
17
 
17
18
  /**
@@ -23,7 +24,7 @@ export type GeojsonToBinaryOptions = {
23
24
  */
24
25
  export function geojsonToBinary(
25
26
  features: Feature[],
26
- options: GeojsonToBinaryOptions = {fixRingWinding: true}
27
+ options: GeojsonToBinaryOptions = {fixRingWinding: true, triangulate: true}
27
28
  ): BinaryFeatures {
28
29
  const geometryInfo = extractGeometryInfo(features);
29
30
  const coordLength = geometryInfo.coordLength;
@@ -31,6 +32,7 @@ export function geojsonToBinary(
31
32
  const flatFeatures = geojsonToFlatGeojson(features, {coordLength, fixRingWinding});
32
33
  return flatGeojsonToBinary(flatFeatures, geometryInfo, {
33
34
  numericPropKeys: options.numericPropKeys,
34
- PositionDataType: options.PositionDataType || Float32Array
35
+ PositionDataType: options.PositionDataType || Float32Array,
36
+ triangulate: options.triangulate
35
37
  });
36
38
  }