@loaders.gl/gis 3.1.0-beta.5 → 3.1.0-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es5/lib/geojson-to-binary.js +13 -6
- package/dist/es5/lib/geojson-to-binary.js.map +1 -1
- package/dist/esm/lib/geojson-to-binary.js +13 -6
- package/dist/esm/lib/geojson-to-binary.js.map +1 -1
- package/dist/lib/geojson-to-binary.d.ts +4 -0
- package/dist/lib/geojson-to-binary.d.ts.map +1 -1
- package/dist/lib/geojson-to-binary.js +15 -11
- package/package.json +4 -4
- package/src/lib/geojson-to-binary.ts +19 -10
|
@@ -32,7 +32,7 @@ function firstPass(features) {
|
|
|
32
32
|
let polygonRingsCount = 0;
|
|
33
33
|
let polygonFeaturesCount = 0;
|
|
34
34
|
const coordLengths = new Set();
|
|
35
|
-
const
|
|
35
|
+
const propArrayTypes = {};
|
|
36
36
|
|
|
37
37
|
for (const feature of features) {
|
|
38
38
|
const geometry = feature.geometry;
|
|
@@ -113,7 +113,7 @@ function firstPass(features) {
|
|
|
113
113
|
if (feature.properties) {
|
|
114
114
|
for (const key in feature.properties) {
|
|
115
115
|
const val = feature.properties[key];
|
|
116
|
-
|
|
116
|
+
propArrayTypes[key] = deduceArrayType(val, propArrayTypes[key]);
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
}
|
|
@@ -129,7 +129,8 @@ function firstPass(features) {
|
|
|
129
129
|
polygonObjectsCount,
|
|
130
130
|
polygonRingsCount,
|
|
131
131
|
polygonFeaturesCount,
|
|
132
|
-
numericPropKeys: Object.keys(
|
|
132
|
+
numericPropKeys: Object.keys(propArrayTypes).filter(k => propArrayTypes[k] !== Array),
|
|
133
|
+
propArrayTypes
|
|
133
134
|
};
|
|
134
135
|
}
|
|
135
136
|
|
|
@@ -143,6 +144,7 @@ function secondPass(features, firstPassData, options) {
|
|
|
143
144
|
polygonPositionsCount,
|
|
144
145
|
polygonObjectsCount,
|
|
145
146
|
polygonRingsCount,
|
|
147
|
+
propArrayTypes,
|
|
146
148
|
polygonFeaturesCount
|
|
147
149
|
} = firstPassData;
|
|
148
150
|
const {
|
|
@@ -181,7 +183,8 @@ function secondPass(features, firstPassData, options) {
|
|
|
181
183
|
|
|
182
184
|
for (const object of [points, lines, polygons]) {
|
|
183
185
|
for (const propName of numericPropKeys || []) {
|
|
184
|
-
|
|
186
|
+
const TypedArray = propArrayTypes[propName];
|
|
187
|
+
object.numericProps[propName] = new TypedArray(object.positions.length / coordLength);
|
|
185
188
|
}
|
|
186
189
|
}
|
|
187
190
|
|
|
@@ -411,7 +414,11 @@ function flatten(arrays) {
|
|
|
411
414
|
return [].concat(...arrays);
|
|
412
415
|
}
|
|
413
416
|
|
|
414
|
-
function
|
|
415
|
-
|
|
417
|
+
function deduceArrayType(x, constructor) {
|
|
418
|
+
if (constructor === Array || !Number.isFinite(x)) {
|
|
419
|
+
return Array;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
return constructor === Float64Array || Math.fround(x) !== x ? Float64Array : Float32Array;
|
|
416
423
|
}
|
|
417
424
|
//# sourceMappingURL=geojson-to-binary.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/geojson-to-binary.ts"],"names":["geojsonToBinary","features","options","firstPassData","firstPass","secondPass","coordLength","numericPropKeys","PositionDataType","Float32Array","TEST_EXPORTS","pointPositionsCount","pointFeaturesCount","linePositionsCount","linePathsCount","lineFeaturesCount","polygonPositionsCount","polygonObjectsCount","polygonRingsCount","polygonFeaturesCount","coordLengths","Set","feature","geometry","type","add","coordinates","length","point","coord","line","flatten","polygon","Error","properties","key","val","undefined","isNumeric","size","Math","max","Object","keys","filter","k","GlobalFeatureIdsDataType","Uint32Array","Uint16Array","points","positions","globalFeatureIds","featureIds","numericProps","Array","fields","lines","pathIndices","polygons","polygonIndices","primitivePolygonIndices","object","propName","indexMap","pointPosition","pointFeature","linePosition","linePath","lineFeature","polygonPosition","polygonObject","polygonRing","polygonFeature","handlePoint","push","keepStringProperties","handleMultiPoint","handleLineString","handleMultiLineString","handlePolygon","handleMultiPolygon","makeAccessorObjects","coords","set","fillNumericProperties","fillCoords","nPositions","fill","ring","returnObj","value","geomType","numericProp","index","numericPropName","numericKeys","props","includes","array","startVertex","arrays","concat","x","Number","isFinite"],"mappings":"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","sourcesContent":["import {Feature, GeoJsonProperties} from '@loaders.gl/schema';\nimport type {BinaryFeatures} from '@loaders.gl/schema';\n\nexport type GeojsonToBinaryOptions = {\n coordLength?: number;\n numericPropKeys?: string[];\n PositionDataType?: Function;\n};\n\n/** Convert GeoJSON features to flat binary arrays */\nexport function geojsonToBinary(\n features: Feature[],\n options: GeojsonToBinaryOptions = {}\n): BinaryFeatures {\n const firstPassData = firstPass(features);\n return secondPass(features, firstPassData, {\n coordLength: options.coordLength || firstPassData.coordLength,\n numericPropKeys: options.numericPropKeys || firstPassData.numericPropKeys,\n PositionDataType: options.PositionDataType || Float32Array\n });\n}\n\nexport const TEST_EXPORTS = {\n firstPass,\n secondPass\n};\n\ntype FirstPassData = {\n coordLength: number;\n numericPropKeys: string[];\n\n pointPositionsCount: number;\n pointFeaturesCount: number;\n linePositionsCount: number;\n linePathsCount: number;\n lineFeaturesCount: number;\n polygonPositionsCount: number;\n polygonObjectsCount: number;\n polygonRingsCount: number;\n polygonFeaturesCount: number;\n};\n\n/**\n * Initial scan over GeoJSON features\n * Counts number of coordinates of each geometry type and\n * keeps track of the max coordinate dimensions\n */\n// eslint-disable-next-line complexity, max-statements\nfunction firstPass(features: Feature[]): FirstPassData {\n // Counts the number of _positions_, so [x, y, z] counts as one\n let pointPositionsCount = 0;\n let pointFeaturesCount = 0;\n let linePositionsCount = 0;\n let linePathsCount = 0;\n let lineFeaturesCount = 0;\n let polygonPositionsCount = 0;\n let polygonObjectsCount = 0;\n let polygonRingsCount = 0;\n let polygonFeaturesCount = 0;\n const coordLengths = new Set<number>();\n const numericPropKeys = {};\n\n for (const feature of features) {\n const geometry = feature.geometry;\n switch (geometry.type) {\n case 'Point':\n pointFeaturesCount++;\n pointPositionsCount++;\n coordLengths.add(geometry.coordinates.length);\n break;\n case 'MultiPoint':\n pointFeaturesCount++;\n pointPositionsCount += geometry.coordinates.length;\n for (const point of geometry.coordinates) {\n coordLengths.add(point.length);\n }\n break;\n case 'LineString':\n lineFeaturesCount++;\n linePositionsCount += geometry.coordinates.length;\n linePathsCount++;\n\n for (const coord of geometry.coordinates) {\n coordLengths.add(coord.length);\n }\n break;\n case 'MultiLineString':\n lineFeaturesCount++;\n for (const line of geometry.coordinates) {\n linePositionsCount += line.length;\n linePathsCount++;\n\n // eslint-disable-next-line max-depth\n for (const coord of line) {\n coordLengths.add(coord.length);\n }\n }\n break;\n case 'Polygon':\n polygonFeaturesCount++;\n polygonObjectsCount++;\n polygonRingsCount += geometry.coordinates.length;\n polygonPositionsCount += flatten(geometry.coordinates).length;\n\n for (const coord of flatten(geometry.coordinates)) {\n coordLengths.add(coord.length);\n }\n break;\n case 'MultiPolygon':\n polygonFeaturesCount++;\n for (const polygon of geometry.coordinates) {\n polygonObjectsCount++;\n polygonRingsCount += polygon.length;\n polygonPositionsCount += flatten(polygon).length;\n\n // eslint-disable-next-line max-depth\n for (const coord of flatten(polygon)) {\n coordLengths.add(coord.length);\n }\n }\n break;\n default:\n throw new Error(`Unsupported geometry type: ${geometry.type}`);\n }\n\n if (feature.properties) {\n for (const key in feature.properties) {\n const val = feature.properties[key];\n\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, false is stored to prevent rechecking in the future\n numericPropKeys[key] =\n numericPropKeys[key] || numericPropKeys[key] === undefined\n ? isNumeric(val)\n : numericPropKeys[key];\n }\n }\n }\n\n return {\n coordLength: coordLengths.size > 0 ? Math.max(...coordLengths) : 2,\n\n pointPositionsCount,\n pointFeaturesCount,\n linePositionsCount,\n linePathsCount,\n lineFeaturesCount,\n polygonPositionsCount,\n polygonObjectsCount,\n polygonRingsCount,\n polygonFeaturesCount,\n\n // Array of keys whose values are always numeric\n numericPropKeys: Object.keys(numericPropKeys).filter((k) => numericPropKeys[k])\n };\n}\n\n/**\n * Second scan over GeoJSON features\n * Fills coordinates into pre-allocated typed arrays\n */\n// eslint-disable-next-line complexity\nfunction secondPass(\n features,\n firstPassData: FirstPassData,\n options: Required<GeojsonToBinaryOptions>\n) {\n const {\n pointPositionsCount,\n pointFeaturesCount,\n linePositionsCount,\n linePathsCount,\n lineFeaturesCount,\n polygonPositionsCount,\n polygonObjectsCount,\n polygonRingsCount,\n polygonFeaturesCount\n } = firstPassData;\n const {coordLength, numericPropKeys, PositionDataType = Float32Array} = options;\n const GlobalFeatureIdsDataType = features.length > 65535 ? Uint32Array : Uint16Array;\n const points = {\n // @ts-ignore Typescript doesn't like dynamic constructors\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: Array<any>(),\n fields: Array<any>()\n };\n const lines = {\n // @ts-ignore Typescript doesn't like dynamic constructors\n positions: new PositionDataType(linePositionsCount * coordLength),\n pathIndices:\n linePositionsCount > 65535\n ? new Uint32Array(linePathsCount + 1)\n : new Uint16Array(linePathsCount + 1),\n globalFeatureIds: new GlobalFeatureIdsDataType(linePositionsCount),\n featureIds:\n lineFeaturesCount > 65535\n ? new Uint32Array(linePositionsCount)\n : new Uint16Array(linePositionsCount),\n numericProps: {},\n properties: Array<any>(),\n fields: Array<any>()\n };\n const polygons = {\n // @ts-ignore Typescript doesn't like dynamic constructors\n positions: new PositionDataType(polygonPositionsCount * coordLength),\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 globalFeatureIds: new GlobalFeatureIdsDataType(polygonPositionsCount),\n featureIds:\n polygonFeaturesCount > 65535\n ? new Uint32Array(polygonPositionsCount)\n : new Uint16Array(polygonPositionsCount),\n numericProps: {},\n properties: Array<any>(),\n fields: Array<any>()\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 object.numericProps[propName] = new Float32Array(object.positions.length / coordLength);\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: GeoJsonProperties = feature.properties || {};\n\n switch (geometry.type) {\n case 'Point':\n handlePoint(geometry.coordinates, points, indexMap, coordLength, properties);\n points.properties.push(keepStringProperties(properties, numericPropKeys));\n indexMap.pointFeature++;\n break;\n case 'MultiPoint':\n handleMultiPoint(geometry.coordinates, points, indexMap, coordLength, properties);\n points.properties.push(keepStringProperties(properties, numericPropKeys));\n indexMap.pointFeature++;\n break;\n case 'LineString':\n handleLineString(geometry.coordinates, lines, indexMap, coordLength, properties);\n lines.properties.push(keepStringProperties(properties, numericPropKeys));\n indexMap.lineFeature++;\n break;\n case 'MultiLineString':\n handleMultiLineString(geometry.coordinates, lines, indexMap, coordLength, properties);\n lines.properties.push(keepStringProperties(properties, numericPropKeys));\n indexMap.lineFeature++;\n break;\n case 'Polygon':\n handlePolygon(geometry.coordinates, polygons, indexMap, coordLength, properties);\n polygons.properties.push(keepStringProperties(properties, numericPropKeys));\n indexMap.polygonFeature++;\n break;\n case 'MultiPolygon':\n handleMultiPolygon(geometry.coordinates, polygons, indexMap, coordLength, properties);\n polygons.properties.push(keepStringProperties(properties, numericPropKeys));\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/** Fills Point coordinates into points object of arrays */\nfunction handlePoint(coords, points, indexMap, coordLength, properties) {\n points.positions.set(coords, indexMap.pointPosition * coordLength);\n points.globalFeatureIds[indexMap.pointPosition] = indexMap.feature;\n points.featureIds[indexMap.pointPosition] = indexMap.pointFeature;\n\n fillNumericProperties(points, properties, indexMap.pointPosition, 1);\n indexMap.pointPosition++;\n}\n\n/** Fills MultiPoint coordinates into points object of arrays */\nfunction handleMultiPoint(coords, points, indexMap, coordLength, properties) {\n for (const point of coords) {\n handlePoint(point, points, indexMap, coordLength, properties);\n }\n}\n\n/** Fills LineString coordinates into lines object of arrays */\nfunction handleLineString(coords, lines, indexMap, coordLength, properties) {\n lines.pathIndices[indexMap.linePath] = indexMap.linePosition;\n indexMap.linePath++;\n\n fillCoords(lines.positions, coords, indexMap.linePosition, coordLength);\n\n const nPositions = coords.length;\n fillNumericProperties(lines, properties, indexMap.linePosition, nPositions);\n\n lines.globalFeatureIds.set(\n new Uint32Array(nPositions).fill(indexMap.feature),\n indexMap.linePosition\n );\n lines.featureIds.set(\n new Uint32Array(nPositions).fill(indexMap.lineFeature),\n indexMap.linePosition\n );\n indexMap.linePosition += nPositions;\n}\n\n/** Fills MultiLineString coordinates into lines object of arrays */\nfunction handleMultiLineString(coords, lines, indexMap, coordLength, properties) {\n for (const line of coords) {\n handleLineString(line, lines, indexMap, coordLength, properties);\n }\n}\n\n/** Fills Polygon coordinates into polygons object of arrays */\nfunction handlePolygon(coords, polygons, indexMap, coordLength, properties) {\n polygons.polygonIndices[indexMap.polygonObject] = indexMap.polygonPosition;\n indexMap.polygonObject++;\n\n for (const ring of coords) {\n polygons.primitivePolygonIndices[indexMap.polygonRing] = indexMap.polygonPosition;\n indexMap.polygonRing++;\n\n fillCoords(polygons.positions, ring, indexMap.polygonPosition, coordLength);\n\n const nPositions = ring.length;\n fillNumericProperties(polygons, properties, indexMap.polygonPosition, nPositions);\n\n polygons.globalFeatureIds.set(\n new Uint32Array(nPositions).fill(indexMap.feature),\n indexMap.polygonPosition\n );\n polygons.featureIds.set(\n new Uint32Array(nPositions).fill(indexMap.polygonFeature),\n indexMap.polygonPosition\n );\n indexMap.polygonPosition += nPositions;\n }\n}\n\n/** Fills MultiPolygon coordinates into polygons object of arrays */\nfunction handleMultiPolygon(coords, polygons, indexMap, coordLength, properties) {\n for (const polygon of coords) {\n handlePolygon(polygon, polygons, indexMap, coordLength, properties);\n }\n}\n\n/** Wrap each array in an accessor object with value and size keys */\nfunction makeAccessorObjects(points, lines, polygons, coordLength): BinaryFeatures {\n const returnObj = {\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 type: 'Point'\n },\n lines: {\n ...lines,\n pathIndices: {value: lines.pathIndices, size: 1},\n positions: {value: lines.positions, size: coordLength},\n globalFeatureIds: {value: lines.globalFeatureIds, size: 1},\n featureIds: {value: lines.featureIds, size: 1},\n type: 'LineString'\n },\n polygons: {\n ...polygons,\n polygonIndices: {value: polygons.polygonIndices, size: 1},\n primitivePolygonIndices: {value: polygons.primitivePolygonIndices, size: 1},\n positions: {value: polygons.positions, size: coordLength},\n globalFeatureIds: {value: polygons.globalFeatureIds, size: 1},\n featureIds: {value: polygons.featureIds, size: 1},\n type: 'Polygon'\n }\n };\n\n for (const geomType in returnObj) {\n for (const numericProp in returnObj[geomType].numericProps) {\n returnObj[geomType].numericProps[numericProp] = {\n value: returnObj[geomType].numericProps[numericProp],\n size: 1\n };\n }\n }\n\n return returnObj as unknown as BinaryFeatures;\n}\n\n/** Add numeric properties to object */\nfunction fillNumericProperties(object, properties, index, length) {\n for (const numericPropName in object.numericProps) {\n if (numericPropName in properties) {\n object.numericProps[numericPropName].set(\n new Array(length).fill(properties[numericPropName]),\n index\n );\n }\n }\n}\n\n/** Keep string properties in object */\nfunction keepStringProperties(properties, numericKeys: string[]): GeoJsonProperties {\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/** @param coords is expected to be a list of arrays, each with length 2-3 */\nfunction fillCoords(array, coords, startVertex, coordLength): void {\n let index = startVertex * coordLength;\n for (const coord of coords) {\n array.set(coord, index);\n index += coordLength;\n }\n}\n\n// TODO - how does this work? Different `coordinates` have different nesting\nfunction flatten(arrays): number[][] {\n return [].concat(...arrays);\n}\n\nfunction isNumeric(x: any): boolean {\n return Number.isFinite(x);\n}\n"],"file":"geojson-to-binary.js"}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/geojson-to-binary.ts"],"names":["geojsonToBinary","features","options","firstPassData","firstPass","secondPass","coordLength","numericPropKeys","PositionDataType","Float32Array","TEST_EXPORTS","pointPositionsCount","pointFeaturesCount","linePositionsCount","linePathsCount","lineFeaturesCount","polygonPositionsCount","polygonObjectsCount","polygonRingsCount","polygonFeaturesCount","coordLengths","Set","propArrayTypes","feature","geometry","type","add","coordinates","length","point","coord","line","flatten","polygon","Error","properties","key","val","deduceArrayType","size","Math","max","Object","keys","filter","k","Array","GlobalFeatureIdsDataType","Uint32Array","Uint16Array","points","positions","globalFeatureIds","featureIds","numericProps","fields","lines","pathIndices","polygons","polygonIndices","primitivePolygonIndices","object","propName","TypedArray","indexMap","pointPosition","pointFeature","linePosition","linePath","lineFeature","polygonPosition","polygonObject","polygonRing","polygonFeature","handlePoint","push","keepStringProperties","handleMultiPoint","handleLineString","handleMultiLineString","handlePolygon","handleMultiPolygon","makeAccessorObjects","coords","set","fillNumericProperties","fillCoords","nPositions","fill","ring","returnObj","value","geomType","numericProp","index","numericPropName","numericKeys","props","includes","array","startVertex","arrays","concat","x","constructor","Number","isFinite","Float64Array","fround"],"mappings":"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","sourcesContent":["import {Feature, GeoJsonProperties} from '@loaders.gl/schema';\nimport type {BinaryFeatures} from '@loaders.gl/schema';\n\nexport type GeojsonToBinaryOptions = {\n coordLength?: number;\n numericPropKeys?: string[];\n PositionDataType?: Function;\n};\n\n/** Convert GeoJSON features to flat binary arrays */\nexport function geojsonToBinary(\n features: Feature[],\n options: GeojsonToBinaryOptions = {}\n): BinaryFeatures {\n const firstPassData = firstPass(features);\n return secondPass(features, firstPassData, {\n coordLength: options.coordLength || firstPassData.coordLength,\n numericPropKeys: options.numericPropKeys || firstPassData.numericPropKeys,\n PositionDataType: options.PositionDataType || Float32Array\n });\n}\n\nexport const TEST_EXPORTS = {\n firstPass,\n secondPass\n};\n\ntype PropArrayConstructor = Float32ArrayConstructor | Float64ArrayConstructor | ArrayConstructor;\n\ntype FirstPassData = {\n coordLength: number;\n numericPropKeys: string[];\n propArrayTypes: {[key: string]: PropArrayConstructor};\n\n pointPositionsCount: number;\n pointFeaturesCount: number;\n linePositionsCount: number;\n linePathsCount: number;\n lineFeaturesCount: number;\n polygonPositionsCount: number;\n polygonObjectsCount: number;\n polygonRingsCount: number;\n polygonFeaturesCount: number;\n};\n\n/**\n * Initial scan over GeoJSON features\n * Counts number of coordinates of each geometry type and\n * keeps track of the max coordinate dimensions\n */\n// eslint-disable-next-line complexity, max-statements\nfunction firstPass(features: Feature[]): FirstPassData {\n // Counts the number of _positions_, so [x, y, z] counts as one\n let pointPositionsCount = 0;\n let pointFeaturesCount = 0;\n let linePositionsCount = 0;\n let linePathsCount = 0;\n let lineFeaturesCount = 0;\n let polygonPositionsCount = 0;\n let polygonObjectsCount = 0;\n let polygonRingsCount = 0;\n let polygonFeaturesCount = 0;\n const coordLengths = new Set<number>();\n const propArrayTypes = {};\n\n for (const feature of features) {\n const geometry = feature.geometry;\n switch (geometry.type) {\n case 'Point':\n pointFeaturesCount++;\n pointPositionsCount++;\n coordLengths.add(geometry.coordinates.length);\n break;\n case 'MultiPoint':\n pointFeaturesCount++;\n pointPositionsCount += geometry.coordinates.length;\n for (const point of geometry.coordinates) {\n coordLengths.add(point.length);\n }\n break;\n case 'LineString':\n lineFeaturesCount++;\n linePositionsCount += geometry.coordinates.length;\n linePathsCount++;\n\n for (const coord of geometry.coordinates) {\n coordLengths.add(coord.length);\n }\n break;\n case 'MultiLineString':\n lineFeaturesCount++;\n for (const line of geometry.coordinates) {\n linePositionsCount += line.length;\n linePathsCount++;\n\n // eslint-disable-next-line max-depth\n for (const coord of line) {\n coordLengths.add(coord.length);\n }\n }\n break;\n case 'Polygon':\n polygonFeaturesCount++;\n polygonObjectsCount++;\n polygonRingsCount += geometry.coordinates.length;\n polygonPositionsCount += flatten(geometry.coordinates).length;\n\n for (const coord of flatten(geometry.coordinates)) {\n coordLengths.add(coord.length);\n }\n break;\n case 'MultiPolygon':\n polygonFeaturesCount++;\n for (const polygon of geometry.coordinates) {\n polygonObjectsCount++;\n polygonRingsCount += polygon.length;\n polygonPositionsCount += flatten(polygon).length;\n\n // eslint-disable-next-line max-depth\n for (const coord of flatten(polygon)) {\n coordLengths.add(coord.length);\n }\n }\n break;\n default:\n throw new Error(`Unsupported geometry type: ${geometry.type}`);\n }\n\n if (feature.properties) {\n for (const key in feature.properties) {\n const val = feature.properties[key];\n\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 propArrayTypes[key] = deduceArrayType(val, propArrayTypes[key]);\n }\n }\n }\n\n return {\n coordLength: coordLengths.size > 0 ? Math.max(...coordLengths) : 2,\n\n pointPositionsCount,\n pointFeaturesCount,\n linePositionsCount,\n linePathsCount,\n lineFeaturesCount,\n polygonPositionsCount,\n polygonObjectsCount,\n polygonRingsCount,\n polygonFeaturesCount,\n\n // Array of keys whose values are always numeric\n numericPropKeys: Object.keys(propArrayTypes).filter((k) => propArrayTypes[k] !== Array),\n propArrayTypes\n };\n}\n\n/**\n * Second scan over GeoJSON features\n * Fills coordinates into pre-allocated typed arrays\n */\n// eslint-disable-next-line complexity\nfunction secondPass(\n features,\n firstPassData: FirstPassData,\n options: Required<GeojsonToBinaryOptions>\n) {\n const {\n pointPositionsCount,\n pointFeaturesCount,\n linePositionsCount,\n linePathsCount,\n lineFeaturesCount,\n polygonPositionsCount,\n polygonObjectsCount,\n polygonRingsCount,\n propArrayTypes,\n polygonFeaturesCount\n } = firstPassData;\n const {coordLength, numericPropKeys, PositionDataType = Float32Array} = options;\n const GlobalFeatureIdsDataType = features.length > 65535 ? Uint32Array : Uint16Array;\n const points = {\n // @ts-ignore Typescript doesn't like dynamic constructors\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: Array<any>(),\n fields: Array<any>()\n };\n const lines = {\n // @ts-ignore Typescript doesn't like dynamic constructors\n positions: new PositionDataType(linePositionsCount * coordLength),\n pathIndices:\n linePositionsCount > 65535\n ? new Uint32Array(linePathsCount + 1)\n : new Uint16Array(linePathsCount + 1),\n globalFeatureIds: new GlobalFeatureIdsDataType(linePositionsCount),\n featureIds:\n lineFeaturesCount > 65535\n ? new Uint32Array(linePositionsCount)\n : new Uint16Array(linePositionsCount),\n numericProps: {},\n properties: Array<any>(),\n fields: Array<any>()\n };\n const polygons = {\n // @ts-ignore Typescript doesn't like dynamic constructors\n positions: new PositionDataType(polygonPositionsCount * coordLength),\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 globalFeatureIds: new GlobalFeatureIdsDataType(polygonPositionsCount),\n featureIds:\n polygonFeaturesCount > 65535\n ? new Uint32Array(polygonPositionsCount)\n : new Uint16Array(polygonPositionsCount),\n numericProps: {},\n properties: Array<any>(),\n fields: Array<any>()\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 TypedArray = propArrayTypes[propName];\n object.numericProps[propName] = new TypedArray(object.positions.length / coordLength);\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: GeoJsonProperties = feature.properties || {};\n\n switch (geometry.type) {\n case 'Point':\n handlePoint(geometry.coordinates, points, indexMap, coordLength, properties);\n points.properties.push(keepStringProperties(properties, numericPropKeys));\n indexMap.pointFeature++;\n break;\n case 'MultiPoint':\n handleMultiPoint(geometry.coordinates, points, indexMap, coordLength, properties);\n points.properties.push(keepStringProperties(properties, numericPropKeys));\n indexMap.pointFeature++;\n break;\n case 'LineString':\n handleLineString(geometry.coordinates, lines, indexMap, coordLength, properties);\n lines.properties.push(keepStringProperties(properties, numericPropKeys));\n indexMap.lineFeature++;\n break;\n case 'MultiLineString':\n handleMultiLineString(geometry.coordinates, lines, indexMap, coordLength, properties);\n lines.properties.push(keepStringProperties(properties, numericPropKeys));\n indexMap.lineFeature++;\n break;\n case 'Polygon':\n handlePolygon(geometry.coordinates, polygons, indexMap, coordLength, properties);\n polygons.properties.push(keepStringProperties(properties, numericPropKeys));\n indexMap.polygonFeature++;\n break;\n case 'MultiPolygon':\n handleMultiPolygon(geometry.coordinates, polygons, indexMap, coordLength, properties);\n polygons.properties.push(keepStringProperties(properties, numericPropKeys));\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/** Fills Point coordinates into points object of arrays */\nfunction handlePoint(coords, points, indexMap, coordLength, properties) {\n points.positions.set(coords, indexMap.pointPosition * coordLength);\n points.globalFeatureIds[indexMap.pointPosition] = indexMap.feature;\n points.featureIds[indexMap.pointPosition] = indexMap.pointFeature;\n\n fillNumericProperties(points, properties, indexMap.pointPosition, 1);\n indexMap.pointPosition++;\n}\n\n/** Fills MultiPoint coordinates into points object of arrays */\nfunction handleMultiPoint(coords, points, indexMap, coordLength, properties) {\n for (const point of coords) {\n handlePoint(point, points, indexMap, coordLength, properties);\n }\n}\n\n/** Fills LineString coordinates into lines object of arrays */\nfunction handleLineString(coords, lines, indexMap, coordLength, properties) {\n lines.pathIndices[indexMap.linePath] = indexMap.linePosition;\n indexMap.linePath++;\n\n fillCoords(lines.positions, coords, indexMap.linePosition, coordLength);\n\n const nPositions = coords.length;\n fillNumericProperties(lines, properties, indexMap.linePosition, nPositions);\n\n lines.globalFeatureIds.set(\n new Uint32Array(nPositions).fill(indexMap.feature),\n indexMap.linePosition\n );\n lines.featureIds.set(\n new Uint32Array(nPositions).fill(indexMap.lineFeature),\n indexMap.linePosition\n );\n indexMap.linePosition += nPositions;\n}\n\n/** Fills MultiLineString coordinates into lines object of arrays */\nfunction handleMultiLineString(coords, lines, indexMap, coordLength, properties) {\n for (const line of coords) {\n handleLineString(line, lines, indexMap, coordLength, properties);\n }\n}\n\n/** Fills Polygon coordinates into polygons object of arrays */\nfunction handlePolygon(coords, polygons, indexMap, coordLength, properties) {\n polygons.polygonIndices[indexMap.polygonObject] = indexMap.polygonPosition;\n indexMap.polygonObject++;\n\n for (const ring of coords) {\n polygons.primitivePolygonIndices[indexMap.polygonRing] = indexMap.polygonPosition;\n indexMap.polygonRing++;\n\n fillCoords(polygons.positions, ring, indexMap.polygonPosition, coordLength);\n\n const nPositions = ring.length;\n fillNumericProperties(polygons, properties, indexMap.polygonPosition, nPositions);\n\n polygons.globalFeatureIds.set(\n new Uint32Array(nPositions).fill(indexMap.feature),\n indexMap.polygonPosition\n );\n polygons.featureIds.set(\n new Uint32Array(nPositions).fill(indexMap.polygonFeature),\n indexMap.polygonPosition\n );\n indexMap.polygonPosition += nPositions;\n }\n}\n\n/** Fills MultiPolygon coordinates into polygons object of arrays */\nfunction handleMultiPolygon(coords, polygons, indexMap, coordLength, properties) {\n for (const polygon of coords) {\n handlePolygon(polygon, polygons, indexMap, coordLength, properties);\n }\n}\n\n/** Wrap each array in an accessor object with value and size keys */\nfunction makeAccessorObjects(points, lines, polygons, coordLength): BinaryFeatures {\n const returnObj = {\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 type: 'Point'\n },\n lines: {\n ...lines,\n pathIndices: {value: lines.pathIndices, size: 1},\n positions: {value: lines.positions, size: coordLength},\n globalFeatureIds: {value: lines.globalFeatureIds, size: 1},\n featureIds: {value: lines.featureIds, size: 1},\n type: 'LineString'\n },\n polygons: {\n ...polygons,\n polygonIndices: {value: polygons.polygonIndices, size: 1},\n primitivePolygonIndices: {value: polygons.primitivePolygonIndices, size: 1},\n positions: {value: polygons.positions, size: coordLength},\n globalFeatureIds: {value: polygons.globalFeatureIds, size: 1},\n featureIds: {value: polygons.featureIds, size: 1},\n type: 'Polygon'\n }\n };\n\n for (const geomType in returnObj) {\n for (const numericProp in returnObj[geomType].numericProps) {\n returnObj[geomType].numericProps[numericProp] = {\n value: returnObj[geomType].numericProps[numericProp],\n size: 1\n };\n }\n }\n\n return returnObj as unknown as BinaryFeatures;\n}\n\n/** Add numeric properties to object */\nfunction fillNumericProperties(object, properties, index, length) {\n for (const numericPropName in object.numericProps) {\n if (numericPropName in properties) {\n object.numericProps[numericPropName].set(\n new Array(length).fill(properties[numericPropName]),\n index\n );\n }\n }\n}\n\n/** Keep string properties in object */\nfunction keepStringProperties(properties, numericKeys: string[]): GeoJsonProperties {\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/** @param coords is expected to be a list of arrays, each with length 2-3 */\nfunction fillCoords(array, coords, startVertex, coordLength): void {\n let index = startVertex * coordLength;\n for (const coord of coords) {\n array.set(coord, index);\n index += coordLength;\n }\n}\n\n// TODO - how does this work? Different `coordinates` have different nesting\nfunction flatten(arrays): number[][] {\n return [].concat(...arrays);\n}\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"],"file":"geojson-to-binary.js"}
|
|
@@ -22,7 +22,7 @@ function firstPass(features) {
|
|
|
22
22
|
let polygonRingsCount = 0;
|
|
23
23
|
let polygonFeaturesCount = 0;
|
|
24
24
|
const coordLengths = new Set();
|
|
25
|
-
const
|
|
25
|
+
const propArrayTypes = {};
|
|
26
26
|
|
|
27
27
|
for (const feature of features) {
|
|
28
28
|
const geometry = feature.geometry;
|
|
@@ -103,7 +103,7 @@ function firstPass(features) {
|
|
|
103
103
|
if (feature.properties) {
|
|
104
104
|
for (const key in feature.properties) {
|
|
105
105
|
const val = feature.properties[key];
|
|
106
|
-
|
|
106
|
+
propArrayTypes[key] = deduceArrayType(val, propArrayTypes[key]);
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
}
|
|
@@ -119,7 +119,8 @@ function firstPass(features) {
|
|
|
119
119
|
polygonObjectsCount,
|
|
120
120
|
polygonRingsCount,
|
|
121
121
|
polygonFeaturesCount,
|
|
122
|
-
numericPropKeys: Object.keys(
|
|
122
|
+
numericPropKeys: Object.keys(propArrayTypes).filter(k => propArrayTypes[k] !== Array),
|
|
123
|
+
propArrayTypes
|
|
123
124
|
};
|
|
124
125
|
}
|
|
125
126
|
|
|
@@ -133,6 +134,7 @@ function secondPass(features, firstPassData, options) {
|
|
|
133
134
|
polygonPositionsCount,
|
|
134
135
|
polygonObjectsCount,
|
|
135
136
|
polygonRingsCount,
|
|
137
|
+
propArrayTypes,
|
|
136
138
|
polygonFeaturesCount
|
|
137
139
|
} = firstPassData;
|
|
138
140
|
const {
|
|
@@ -171,7 +173,8 @@ function secondPass(features, firstPassData, options) {
|
|
|
171
173
|
|
|
172
174
|
for (const object of [points, lines, polygons]) {
|
|
173
175
|
for (const propName of numericPropKeys || []) {
|
|
174
|
-
|
|
176
|
+
const TypedArray = propArrayTypes[propName];
|
|
177
|
+
object.numericProps[propName] = new TypedArray(object.positions.length / coordLength);
|
|
175
178
|
}
|
|
176
179
|
}
|
|
177
180
|
|
|
@@ -401,7 +404,11 @@ function flatten(arrays) {
|
|
|
401
404
|
return [].concat(...arrays);
|
|
402
405
|
}
|
|
403
406
|
|
|
404
|
-
function
|
|
405
|
-
|
|
407
|
+
function deduceArrayType(x, constructor) {
|
|
408
|
+
if (constructor === Array || !Number.isFinite(x)) {
|
|
409
|
+
return Array;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
return constructor === Float64Array || Math.fround(x) !== x ? Float64Array : Float32Array;
|
|
406
413
|
}
|
|
407
414
|
//# sourceMappingURL=geojson-to-binary.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/geojson-to-binary.ts"],"names":["geojsonToBinary","features","options","firstPassData","firstPass","secondPass","coordLength","numericPropKeys","PositionDataType","Float32Array","TEST_EXPORTS","pointPositionsCount","pointFeaturesCount","linePositionsCount","linePathsCount","lineFeaturesCount","polygonPositionsCount","polygonObjectsCount","polygonRingsCount","polygonFeaturesCount","coordLengths","Set","feature","geometry","type","add","coordinates","length","point","coord","line","flatten","polygon","Error","properties","key","val","undefined","isNumeric","size","Math","max","Object","keys","filter","k","GlobalFeatureIdsDataType","Uint32Array","Uint16Array","points","positions","globalFeatureIds","featureIds","numericProps","Array","fields","lines","pathIndices","polygons","polygonIndices","primitivePolygonIndices","object","propName","indexMap","pointPosition","pointFeature","linePosition","linePath","lineFeature","polygonPosition","polygonObject","polygonRing","polygonFeature","handlePoint","push","keepStringProperties","handleMultiPoint","handleLineString","handleMultiLineString","handlePolygon","handleMultiPolygon","makeAccessorObjects","coords","set","fillNumericProperties","fillCoords","nPositions","fill","ring","returnObj","value","geomType","numericProp","index","numericPropName","numericKeys","props","includes","array","startVertex","arrays","concat","x","Number","isFinite"],"mappings":"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","sourcesContent":["import {Feature, GeoJsonProperties} from '@loaders.gl/schema';\nimport type {BinaryFeatures} from '@loaders.gl/schema';\n\nexport type GeojsonToBinaryOptions = {\n coordLength?: number;\n numericPropKeys?: string[];\n PositionDataType?: Function;\n};\n\n/** Convert GeoJSON features to flat binary arrays */\nexport function geojsonToBinary(\n features: Feature[],\n options: GeojsonToBinaryOptions = {}\n): BinaryFeatures {\n const firstPassData = firstPass(features);\n return secondPass(features, firstPassData, {\n coordLength: options.coordLength || firstPassData.coordLength,\n numericPropKeys: options.numericPropKeys || firstPassData.numericPropKeys,\n PositionDataType: options.PositionDataType || Float32Array\n });\n}\n\nexport const TEST_EXPORTS = {\n firstPass,\n secondPass\n};\n\ntype FirstPassData = {\n coordLength: number;\n numericPropKeys: string[];\n\n pointPositionsCount: number;\n pointFeaturesCount: number;\n linePositionsCount: number;\n linePathsCount: number;\n lineFeaturesCount: number;\n polygonPositionsCount: number;\n polygonObjectsCount: number;\n polygonRingsCount: number;\n polygonFeaturesCount: number;\n};\n\n/**\n * Initial scan over GeoJSON features\n * Counts number of coordinates of each geometry type and\n * keeps track of the max coordinate dimensions\n */\n// eslint-disable-next-line complexity, max-statements\nfunction firstPass(features: Feature[]): FirstPassData {\n // Counts the number of _positions_, so [x, y, z] counts as one\n let pointPositionsCount = 0;\n let pointFeaturesCount = 0;\n let linePositionsCount = 0;\n let linePathsCount = 0;\n let lineFeaturesCount = 0;\n let polygonPositionsCount = 0;\n let polygonObjectsCount = 0;\n let polygonRingsCount = 0;\n let polygonFeaturesCount = 0;\n const coordLengths = new Set<number>();\n const numericPropKeys = {};\n\n for (const feature of features) {\n const geometry = feature.geometry;\n switch (geometry.type) {\n case 'Point':\n pointFeaturesCount++;\n pointPositionsCount++;\n coordLengths.add(geometry.coordinates.length);\n break;\n case 'MultiPoint':\n pointFeaturesCount++;\n pointPositionsCount += geometry.coordinates.length;\n for (const point of geometry.coordinates) {\n coordLengths.add(point.length);\n }\n break;\n case 'LineString':\n lineFeaturesCount++;\n linePositionsCount += geometry.coordinates.length;\n linePathsCount++;\n\n for (const coord of geometry.coordinates) {\n coordLengths.add(coord.length);\n }\n break;\n case 'MultiLineString':\n lineFeaturesCount++;\n for (const line of geometry.coordinates) {\n linePositionsCount += line.length;\n linePathsCount++;\n\n // eslint-disable-next-line max-depth\n for (const coord of line) {\n coordLengths.add(coord.length);\n }\n }\n break;\n case 'Polygon':\n polygonFeaturesCount++;\n polygonObjectsCount++;\n polygonRingsCount += geometry.coordinates.length;\n polygonPositionsCount += flatten(geometry.coordinates).length;\n\n for (const coord of flatten(geometry.coordinates)) {\n coordLengths.add(coord.length);\n }\n break;\n case 'MultiPolygon':\n polygonFeaturesCount++;\n for (const polygon of geometry.coordinates) {\n polygonObjectsCount++;\n polygonRingsCount += polygon.length;\n polygonPositionsCount += flatten(polygon).length;\n\n // eslint-disable-next-line max-depth\n for (const coord of flatten(polygon)) {\n coordLengths.add(coord.length);\n }\n }\n break;\n default:\n throw new Error(`Unsupported geometry type: ${geometry.type}`);\n }\n\n if (feature.properties) {\n for (const key in feature.properties) {\n const val = feature.properties[key];\n\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, false is stored to prevent rechecking in the future\n numericPropKeys[key] =\n numericPropKeys[key] || numericPropKeys[key] === undefined\n ? isNumeric(val)\n : numericPropKeys[key];\n }\n }\n }\n\n return {\n coordLength: coordLengths.size > 0 ? Math.max(...coordLengths) : 2,\n\n pointPositionsCount,\n pointFeaturesCount,\n linePositionsCount,\n linePathsCount,\n lineFeaturesCount,\n polygonPositionsCount,\n polygonObjectsCount,\n polygonRingsCount,\n polygonFeaturesCount,\n\n // Array of keys whose values are always numeric\n numericPropKeys: Object.keys(numericPropKeys).filter((k) => numericPropKeys[k])\n };\n}\n\n/**\n * Second scan over GeoJSON features\n * Fills coordinates into pre-allocated typed arrays\n */\n// eslint-disable-next-line complexity\nfunction secondPass(\n features,\n firstPassData: FirstPassData,\n options: Required<GeojsonToBinaryOptions>\n) {\n const {\n pointPositionsCount,\n pointFeaturesCount,\n linePositionsCount,\n linePathsCount,\n lineFeaturesCount,\n polygonPositionsCount,\n polygonObjectsCount,\n polygonRingsCount,\n polygonFeaturesCount\n } = firstPassData;\n const {coordLength, numericPropKeys, PositionDataType = Float32Array} = options;\n const GlobalFeatureIdsDataType = features.length > 65535 ? Uint32Array : Uint16Array;\n const points = {\n // @ts-ignore Typescript doesn't like dynamic constructors\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: Array<any>(),\n fields: Array<any>()\n };\n const lines = {\n // @ts-ignore Typescript doesn't like dynamic constructors\n positions: new PositionDataType(linePositionsCount * coordLength),\n pathIndices:\n linePositionsCount > 65535\n ? new Uint32Array(linePathsCount + 1)\n : new Uint16Array(linePathsCount + 1),\n globalFeatureIds: new GlobalFeatureIdsDataType(linePositionsCount),\n featureIds:\n lineFeaturesCount > 65535\n ? new Uint32Array(linePositionsCount)\n : new Uint16Array(linePositionsCount),\n numericProps: {},\n properties: Array<any>(),\n fields: Array<any>()\n };\n const polygons = {\n // @ts-ignore Typescript doesn't like dynamic constructors\n positions: new PositionDataType(polygonPositionsCount * coordLength),\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 globalFeatureIds: new GlobalFeatureIdsDataType(polygonPositionsCount),\n featureIds:\n polygonFeaturesCount > 65535\n ? new Uint32Array(polygonPositionsCount)\n : new Uint16Array(polygonPositionsCount),\n numericProps: {},\n properties: Array<any>(),\n fields: Array<any>()\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 object.numericProps[propName] = new Float32Array(object.positions.length / coordLength);\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: GeoJsonProperties = feature.properties || {};\n\n switch (geometry.type) {\n case 'Point':\n handlePoint(geometry.coordinates, points, indexMap, coordLength, properties);\n points.properties.push(keepStringProperties(properties, numericPropKeys));\n indexMap.pointFeature++;\n break;\n case 'MultiPoint':\n handleMultiPoint(geometry.coordinates, points, indexMap, coordLength, properties);\n points.properties.push(keepStringProperties(properties, numericPropKeys));\n indexMap.pointFeature++;\n break;\n case 'LineString':\n handleLineString(geometry.coordinates, lines, indexMap, coordLength, properties);\n lines.properties.push(keepStringProperties(properties, numericPropKeys));\n indexMap.lineFeature++;\n break;\n case 'MultiLineString':\n handleMultiLineString(geometry.coordinates, lines, indexMap, coordLength, properties);\n lines.properties.push(keepStringProperties(properties, numericPropKeys));\n indexMap.lineFeature++;\n break;\n case 'Polygon':\n handlePolygon(geometry.coordinates, polygons, indexMap, coordLength, properties);\n polygons.properties.push(keepStringProperties(properties, numericPropKeys));\n indexMap.polygonFeature++;\n break;\n case 'MultiPolygon':\n handleMultiPolygon(geometry.coordinates, polygons, indexMap, coordLength, properties);\n polygons.properties.push(keepStringProperties(properties, numericPropKeys));\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/** Fills Point coordinates into points object of arrays */\nfunction handlePoint(coords, points, indexMap, coordLength, properties) {\n points.positions.set(coords, indexMap.pointPosition * coordLength);\n points.globalFeatureIds[indexMap.pointPosition] = indexMap.feature;\n points.featureIds[indexMap.pointPosition] = indexMap.pointFeature;\n\n fillNumericProperties(points, properties, indexMap.pointPosition, 1);\n indexMap.pointPosition++;\n}\n\n/** Fills MultiPoint coordinates into points object of arrays */\nfunction handleMultiPoint(coords, points, indexMap, coordLength, properties) {\n for (const point of coords) {\n handlePoint(point, points, indexMap, coordLength, properties);\n }\n}\n\n/** Fills LineString coordinates into lines object of arrays */\nfunction handleLineString(coords, lines, indexMap, coordLength, properties) {\n lines.pathIndices[indexMap.linePath] = indexMap.linePosition;\n indexMap.linePath++;\n\n fillCoords(lines.positions, coords, indexMap.linePosition, coordLength);\n\n const nPositions = coords.length;\n fillNumericProperties(lines, properties, indexMap.linePosition, nPositions);\n\n lines.globalFeatureIds.set(\n new Uint32Array(nPositions).fill(indexMap.feature),\n indexMap.linePosition\n );\n lines.featureIds.set(\n new Uint32Array(nPositions).fill(indexMap.lineFeature),\n indexMap.linePosition\n );\n indexMap.linePosition += nPositions;\n}\n\n/** Fills MultiLineString coordinates into lines object of arrays */\nfunction handleMultiLineString(coords, lines, indexMap, coordLength, properties) {\n for (const line of coords) {\n handleLineString(line, lines, indexMap, coordLength, properties);\n }\n}\n\n/** Fills Polygon coordinates into polygons object of arrays */\nfunction handlePolygon(coords, polygons, indexMap, coordLength, properties) {\n polygons.polygonIndices[indexMap.polygonObject] = indexMap.polygonPosition;\n indexMap.polygonObject++;\n\n for (const ring of coords) {\n polygons.primitivePolygonIndices[indexMap.polygonRing] = indexMap.polygonPosition;\n indexMap.polygonRing++;\n\n fillCoords(polygons.positions, ring, indexMap.polygonPosition, coordLength);\n\n const nPositions = ring.length;\n fillNumericProperties(polygons, properties, indexMap.polygonPosition, nPositions);\n\n polygons.globalFeatureIds.set(\n new Uint32Array(nPositions).fill(indexMap.feature),\n indexMap.polygonPosition\n );\n polygons.featureIds.set(\n new Uint32Array(nPositions).fill(indexMap.polygonFeature),\n indexMap.polygonPosition\n );\n indexMap.polygonPosition += nPositions;\n }\n}\n\n/** Fills MultiPolygon coordinates into polygons object of arrays */\nfunction handleMultiPolygon(coords, polygons, indexMap, coordLength, properties) {\n for (const polygon of coords) {\n handlePolygon(polygon, polygons, indexMap, coordLength, properties);\n }\n}\n\n/** Wrap each array in an accessor object with value and size keys */\nfunction makeAccessorObjects(points, lines, polygons, coordLength): BinaryFeatures {\n const returnObj = {\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 type: 'Point'\n },\n lines: {\n ...lines,\n pathIndices: {value: lines.pathIndices, size: 1},\n positions: {value: lines.positions, size: coordLength},\n globalFeatureIds: {value: lines.globalFeatureIds, size: 1},\n featureIds: {value: lines.featureIds, size: 1},\n type: 'LineString'\n },\n polygons: {\n ...polygons,\n polygonIndices: {value: polygons.polygonIndices, size: 1},\n primitivePolygonIndices: {value: polygons.primitivePolygonIndices, size: 1},\n positions: {value: polygons.positions, size: coordLength},\n globalFeatureIds: {value: polygons.globalFeatureIds, size: 1},\n featureIds: {value: polygons.featureIds, size: 1},\n type: 'Polygon'\n }\n };\n\n for (const geomType in returnObj) {\n for (const numericProp in returnObj[geomType].numericProps) {\n returnObj[geomType].numericProps[numericProp] = {\n value: returnObj[geomType].numericProps[numericProp],\n size: 1\n };\n }\n }\n\n return returnObj as unknown as BinaryFeatures;\n}\n\n/** Add numeric properties to object */\nfunction fillNumericProperties(object, properties, index, length) {\n for (const numericPropName in object.numericProps) {\n if (numericPropName in properties) {\n object.numericProps[numericPropName].set(\n new Array(length).fill(properties[numericPropName]),\n index\n );\n }\n }\n}\n\n/** Keep string properties in object */\nfunction keepStringProperties(properties, numericKeys: string[]): GeoJsonProperties {\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/** @param coords is expected to be a list of arrays, each with length 2-3 */\nfunction fillCoords(array, coords, startVertex, coordLength): void {\n let index = startVertex * coordLength;\n for (const coord of coords) {\n array.set(coord, index);\n index += coordLength;\n }\n}\n\n// TODO - how does this work? Different `coordinates` have different nesting\nfunction flatten(arrays): number[][] {\n return [].concat(...arrays);\n}\n\nfunction isNumeric(x: any): boolean {\n return Number.isFinite(x);\n}\n"],"file":"geojson-to-binary.js"}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/geojson-to-binary.ts"],"names":["geojsonToBinary","features","options","firstPassData","firstPass","secondPass","coordLength","numericPropKeys","PositionDataType","Float32Array","TEST_EXPORTS","pointPositionsCount","pointFeaturesCount","linePositionsCount","linePathsCount","lineFeaturesCount","polygonPositionsCount","polygonObjectsCount","polygonRingsCount","polygonFeaturesCount","coordLengths","Set","propArrayTypes","feature","geometry","type","add","coordinates","length","point","coord","line","flatten","polygon","Error","properties","key","val","deduceArrayType","size","Math","max","Object","keys","filter","k","Array","GlobalFeatureIdsDataType","Uint32Array","Uint16Array","points","positions","globalFeatureIds","featureIds","numericProps","fields","lines","pathIndices","polygons","polygonIndices","primitivePolygonIndices","object","propName","TypedArray","indexMap","pointPosition","pointFeature","linePosition","linePath","lineFeature","polygonPosition","polygonObject","polygonRing","polygonFeature","handlePoint","push","keepStringProperties","handleMultiPoint","handleLineString","handleMultiLineString","handlePolygon","handleMultiPolygon","makeAccessorObjects","coords","set","fillNumericProperties","fillCoords","nPositions","fill","ring","returnObj","value","geomType","numericProp","index","numericPropName","numericKeys","props","includes","array","startVertex","arrays","concat","x","constructor","Number","isFinite","Float64Array","fround"],"mappings":"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","sourcesContent":["import {Feature, GeoJsonProperties} from '@loaders.gl/schema';\nimport type {BinaryFeatures} from '@loaders.gl/schema';\n\nexport type GeojsonToBinaryOptions = {\n coordLength?: number;\n numericPropKeys?: string[];\n PositionDataType?: Function;\n};\n\n/** Convert GeoJSON features to flat binary arrays */\nexport function geojsonToBinary(\n features: Feature[],\n options: GeojsonToBinaryOptions = {}\n): BinaryFeatures {\n const firstPassData = firstPass(features);\n return secondPass(features, firstPassData, {\n coordLength: options.coordLength || firstPassData.coordLength,\n numericPropKeys: options.numericPropKeys || firstPassData.numericPropKeys,\n PositionDataType: options.PositionDataType || Float32Array\n });\n}\n\nexport const TEST_EXPORTS = {\n firstPass,\n secondPass\n};\n\ntype PropArrayConstructor = Float32ArrayConstructor | Float64ArrayConstructor | ArrayConstructor;\n\ntype FirstPassData = {\n coordLength: number;\n numericPropKeys: string[];\n propArrayTypes: {[key: string]: PropArrayConstructor};\n\n pointPositionsCount: number;\n pointFeaturesCount: number;\n linePositionsCount: number;\n linePathsCount: number;\n lineFeaturesCount: number;\n polygonPositionsCount: number;\n polygonObjectsCount: number;\n polygonRingsCount: number;\n polygonFeaturesCount: number;\n};\n\n/**\n * Initial scan over GeoJSON features\n * Counts number of coordinates of each geometry type and\n * keeps track of the max coordinate dimensions\n */\n// eslint-disable-next-line complexity, max-statements\nfunction firstPass(features: Feature[]): FirstPassData {\n // Counts the number of _positions_, so [x, y, z] counts as one\n let pointPositionsCount = 0;\n let pointFeaturesCount = 0;\n let linePositionsCount = 0;\n let linePathsCount = 0;\n let lineFeaturesCount = 0;\n let polygonPositionsCount = 0;\n let polygonObjectsCount = 0;\n let polygonRingsCount = 0;\n let polygonFeaturesCount = 0;\n const coordLengths = new Set<number>();\n const propArrayTypes = {};\n\n for (const feature of features) {\n const geometry = feature.geometry;\n switch (geometry.type) {\n case 'Point':\n pointFeaturesCount++;\n pointPositionsCount++;\n coordLengths.add(geometry.coordinates.length);\n break;\n case 'MultiPoint':\n pointFeaturesCount++;\n pointPositionsCount += geometry.coordinates.length;\n for (const point of geometry.coordinates) {\n coordLengths.add(point.length);\n }\n break;\n case 'LineString':\n lineFeaturesCount++;\n linePositionsCount += geometry.coordinates.length;\n linePathsCount++;\n\n for (const coord of geometry.coordinates) {\n coordLengths.add(coord.length);\n }\n break;\n case 'MultiLineString':\n lineFeaturesCount++;\n for (const line of geometry.coordinates) {\n linePositionsCount += line.length;\n linePathsCount++;\n\n // eslint-disable-next-line max-depth\n for (const coord of line) {\n coordLengths.add(coord.length);\n }\n }\n break;\n case 'Polygon':\n polygonFeaturesCount++;\n polygonObjectsCount++;\n polygonRingsCount += geometry.coordinates.length;\n polygonPositionsCount += flatten(geometry.coordinates).length;\n\n for (const coord of flatten(geometry.coordinates)) {\n coordLengths.add(coord.length);\n }\n break;\n case 'MultiPolygon':\n polygonFeaturesCount++;\n for (const polygon of geometry.coordinates) {\n polygonObjectsCount++;\n polygonRingsCount += polygon.length;\n polygonPositionsCount += flatten(polygon).length;\n\n // eslint-disable-next-line max-depth\n for (const coord of flatten(polygon)) {\n coordLengths.add(coord.length);\n }\n }\n break;\n default:\n throw new Error(`Unsupported geometry type: ${geometry.type}`);\n }\n\n if (feature.properties) {\n for (const key in feature.properties) {\n const val = feature.properties[key];\n\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 propArrayTypes[key] = deduceArrayType(val, propArrayTypes[key]);\n }\n }\n }\n\n return {\n coordLength: coordLengths.size > 0 ? Math.max(...coordLengths) : 2,\n\n pointPositionsCount,\n pointFeaturesCount,\n linePositionsCount,\n linePathsCount,\n lineFeaturesCount,\n polygonPositionsCount,\n polygonObjectsCount,\n polygonRingsCount,\n polygonFeaturesCount,\n\n // Array of keys whose values are always numeric\n numericPropKeys: Object.keys(propArrayTypes).filter((k) => propArrayTypes[k] !== Array),\n propArrayTypes\n };\n}\n\n/**\n * Second scan over GeoJSON features\n * Fills coordinates into pre-allocated typed arrays\n */\n// eslint-disable-next-line complexity\nfunction secondPass(\n features,\n firstPassData: FirstPassData,\n options: Required<GeojsonToBinaryOptions>\n) {\n const {\n pointPositionsCount,\n pointFeaturesCount,\n linePositionsCount,\n linePathsCount,\n lineFeaturesCount,\n polygonPositionsCount,\n polygonObjectsCount,\n polygonRingsCount,\n propArrayTypes,\n polygonFeaturesCount\n } = firstPassData;\n const {coordLength, numericPropKeys, PositionDataType = Float32Array} = options;\n const GlobalFeatureIdsDataType = features.length > 65535 ? Uint32Array : Uint16Array;\n const points = {\n // @ts-ignore Typescript doesn't like dynamic constructors\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: Array<any>(),\n fields: Array<any>()\n };\n const lines = {\n // @ts-ignore Typescript doesn't like dynamic constructors\n positions: new PositionDataType(linePositionsCount * coordLength),\n pathIndices:\n linePositionsCount > 65535\n ? new Uint32Array(linePathsCount + 1)\n : new Uint16Array(linePathsCount + 1),\n globalFeatureIds: new GlobalFeatureIdsDataType(linePositionsCount),\n featureIds:\n lineFeaturesCount > 65535\n ? new Uint32Array(linePositionsCount)\n : new Uint16Array(linePositionsCount),\n numericProps: {},\n properties: Array<any>(),\n fields: Array<any>()\n };\n const polygons = {\n // @ts-ignore Typescript doesn't like dynamic constructors\n positions: new PositionDataType(polygonPositionsCount * coordLength),\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 globalFeatureIds: new GlobalFeatureIdsDataType(polygonPositionsCount),\n featureIds:\n polygonFeaturesCount > 65535\n ? new Uint32Array(polygonPositionsCount)\n : new Uint16Array(polygonPositionsCount),\n numericProps: {},\n properties: Array<any>(),\n fields: Array<any>()\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 TypedArray = propArrayTypes[propName];\n object.numericProps[propName] = new TypedArray(object.positions.length / coordLength);\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: GeoJsonProperties = feature.properties || {};\n\n switch (geometry.type) {\n case 'Point':\n handlePoint(geometry.coordinates, points, indexMap, coordLength, properties);\n points.properties.push(keepStringProperties(properties, numericPropKeys));\n indexMap.pointFeature++;\n break;\n case 'MultiPoint':\n handleMultiPoint(geometry.coordinates, points, indexMap, coordLength, properties);\n points.properties.push(keepStringProperties(properties, numericPropKeys));\n indexMap.pointFeature++;\n break;\n case 'LineString':\n handleLineString(geometry.coordinates, lines, indexMap, coordLength, properties);\n lines.properties.push(keepStringProperties(properties, numericPropKeys));\n indexMap.lineFeature++;\n break;\n case 'MultiLineString':\n handleMultiLineString(geometry.coordinates, lines, indexMap, coordLength, properties);\n lines.properties.push(keepStringProperties(properties, numericPropKeys));\n indexMap.lineFeature++;\n break;\n case 'Polygon':\n handlePolygon(geometry.coordinates, polygons, indexMap, coordLength, properties);\n polygons.properties.push(keepStringProperties(properties, numericPropKeys));\n indexMap.polygonFeature++;\n break;\n case 'MultiPolygon':\n handleMultiPolygon(geometry.coordinates, polygons, indexMap, coordLength, properties);\n polygons.properties.push(keepStringProperties(properties, numericPropKeys));\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/** Fills Point coordinates into points object of arrays */\nfunction handlePoint(coords, points, indexMap, coordLength, properties) {\n points.positions.set(coords, indexMap.pointPosition * coordLength);\n points.globalFeatureIds[indexMap.pointPosition] = indexMap.feature;\n points.featureIds[indexMap.pointPosition] = indexMap.pointFeature;\n\n fillNumericProperties(points, properties, indexMap.pointPosition, 1);\n indexMap.pointPosition++;\n}\n\n/** Fills MultiPoint coordinates into points object of arrays */\nfunction handleMultiPoint(coords, points, indexMap, coordLength, properties) {\n for (const point of coords) {\n handlePoint(point, points, indexMap, coordLength, properties);\n }\n}\n\n/** Fills LineString coordinates into lines object of arrays */\nfunction handleLineString(coords, lines, indexMap, coordLength, properties) {\n lines.pathIndices[indexMap.linePath] = indexMap.linePosition;\n indexMap.linePath++;\n\n fillCoords(lines.positions, coords, indexMap.linePosition, coordLength);\n\n const nPositions = coords.length;\n fillNumericProperties(lines, properties, indexMap.linePosition, nPositions);\n\n lines.globalFeatureIds.set(\n new Uint32Array(nPositions).fill(indexMap.feature),\n indexMap.linePosition\n );\n lines.featureIds.set(\n new Uint32Array(nPositions).fill(indexMap.lineFeature),\n indexMap.linePosition\n );\n indexMap.linePosition += nPositions;\n}\n\n/** Fills MultiLineString coordinates into lines object of arrays */\nfunction handleMultiLineString(coords, lines, indexMap, coordLength, properties) {\n for (const line of coords) {\n handleLineString(line, lines, indexMap, coordLength, properties);\n }\n}\n\n/** Fills Polygon coordinates into polygons object of arrays */\nfunction handlePolygon(coords, polygons, indexMap, coordLength, properties) {\n polygons.polygonIndices[indexMap.polygonObject] = indexMap.polygonPosition;\n indexMap.polygonObject++;\n\n for (const ring of coords) {\n polygons.primitivePolygonIndices[indexMap.polygonRing] = indexMap.polygonPosition;\n indexMap.polygonRing++;\n\n fillCoords(polygons.positions, ring, indexMap.polygonPosition, coordLength);\n\n const nPositions = ring.length;\n fillNumericProperties(polygons, properties, indexMap.polygonPosition, nPositions);\n\n polygons.globalFeatureIds.set(\n new Uint32Array(nPositions).fill(indexMap.feature),\n indexMap.polygonPosition\n );\n polygons.featureIds.set(\n new Uint32Array(nPositions).fill(indexMap.polygonFeature),\n indexMap.polygonPosition\n );\n indexMap.polygonPosition += nPositions;\n }\n}\n\n/** Fills MultiPolygon coordinates into polygons object of arrays */\nfunction handleMultiPolygon(coords, polygons, indexMap, coordLength, properties) {\n for (const polygon of coords) {\n handlePolygon(polygon, polygons, indexMap, coordLength, properties);\n }\n}\n\n/** Wrap each array in an accessor object with value and size keys */\nfunction makeAccessorObjects(points, lines, polygons, coordLength): BinaryFeatures {\n const returnObj = {\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 type: 'Point'\n },\n lines: {\n ...lines,\n pathIndices: {value: lines.pathIndices, size: 1},\n positions: {value: lines.positions, size: coordLength},\n globalFeatureIds: {value: lines.globalFeatureIds, size: 1},\n featureIds: {value: lines.featureIds, size: 1},\n type: 'LineString'\n },\n polygons: {\n ...polygons,\n polygonIndices: {value: polygons.polygonIndices, size: 1},\n primitivePolygonIndices: {value: polygons.primitivePolygonIndices, size: 1},\n positions: {value: polygons.positions, size: coordLength},\n globalFeatureIds: {value: polygons.globalFeatureIds, size: 1},\n featureIds: {value: polygons.featureIds, size: 1},\n type: 'Polygon'\n }\n };\n\n for (const geomType in returnObj) {\n for (const numericProp in returnObj[geomType].numericProps) {\n returnObj[geomType].numericProps[numericProp] = {\n value: returnObj[geomType].numericProps[numericProp],\n size: 1\n };\n }\n }\n\n return returnObj as unknown as BinaryFeatures;\n}\n\n/** Add numeric properties to object */\nfunction fillNumericProperties(object, properties, index, length) {\n for (const numericPropName in object.numericProps) {\n if (numericPropName in properties) {\n object.numericProps[numericPropName].set(\n new Array(length).fill(properties[numericPropName]),\n index\n );\n }\n }\n}\n\n/** Keep string properties in object */\nfunction keepStringProperties(properties, numericKeys: string[]): GeoJsonProperties {\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/** @param coords is expected to be a list of arrays, each with length 2-3 */\nfunction fillCoords(array, coords, startVertex, coordLength): void {\n let index = startVertex * coordLength;\n for (const coord of coords) {\n array.set(coord, index);\n index += coordLength;\n }\n}\n\n// TODO - how does this work? Different `coordinates` have different nesting\nfunction flatten(arrays): number[][] {\n return [].concat(...arrays);\n}\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"],"file":"geojson-to-binary.js"}
|
|
@@ -11,9 +11,13 @@ export declare const TEST_EXPORTS: {
|
|
|
11
11
|
firstPass: typeof firstPass;
|
|
12
12
|
secondPass: typeof secondPass;
|
|
13
13
|
};
|
|
14
|
+
declare type PropArrayConstructor = Float32ArrayConstructor | Float64ArrayConstructor | ArrayConstructor;
|
|
14
15
|
declare type FirstPassData = {
|
|
15
16
|
coordLength: number;
|
|
16
17
|
numericPropKeys: string[];
|
|
18
|
+
propArrayTypes: {
|
|
19
|
+
[key: string]: PropArrayConstructor;
|
|
20
|
+
};
|
|
17
21
|
pointPositionsCount: number;
|
|
18
22
|
pointFeaturesCount: number;
|
|
19
23
|
linePositionsCount: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geojson-to-binary.d.ts","sourceRoot":"","sources":["../../src/lib/geojson-to-binary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAoB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAEvD,oBAAY,sBAAsB,GAAG;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,CAAC,EAAE,QAAQ,CAAC;CAC7B,CAAC;AAEF,qDAAqD;AACrD,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,GAAE,sBAA2B,GACnC,cAAc,CAOhB;AAED,eAAO,MAAM,YAAY;;;CAGxB,CAAC;AAEF,aAAK,aAAa,GAAG;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"geojson-to-binary.d.ts","sourceRoot":"","sources":["../../src/lib/geojson-to-binary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAoB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAEvD,oBAAY,sBAAsB,GAAG;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,CAAC,EAAE,QAAQ,CAAC;CAC7B,CAAC;AAEF,qDAAqD;AACrD,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,GAAE,sBAA2B,GACnC,cAAc,CAOhB;AAED,eAAO,MAAM,YAAY;;;CAGxB,CAAC;AAEF,aAAK,oBAAoB,GAAG,uBAAuB,GAAG,uBAAuB,GAAG,gBAAgB,CAAC;AAEjG,aAAK,aAAa,GAAG;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAAA;KAAC,CAAC;IAEtD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF;;;;GAIG;AAEH,iBAAS,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,aAAa,CA2GrD;AAED;;;GAGG;AAEH,iBAAS,UAAU,CACjB,QAAQ,KAAA,EACR,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,QAAQ,CAAC,sBAAsB,CAAC,kBAyI1C"}
|
|
@@ -33,7 +33,7 @@ function firstPass(features) {
|
|
|
33
33
|
let polygonRingsCount = 0;
|
|
34
34
|
let polygonFeaturesCount = 0;
|
|
35
35
|
const coordLengths = new Set();
|
|
36
|
-
const
|
|
36
|
+
const propArrayTypes = {};
|
|
37
37
|
for (const feature of features) {
|
|
38
38
|
const geometry = feature.geometry;
|
|
39
39
|
switch (geometry.type) {
|
|
@@ -97,11 +97,9 @@ function firstPass(features) {
|
|
|
97
97
|
const val = feature.properties[key];
|
|
98
98
|
// If property has not been seen before, or if property has been numeric
|
|
99
99
|
// in all previous features, check if numeric in this feature
|
|
100
|
-
// If not numeric,
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
? isNumeric(val)
|
|
104
|
-
: numericPropKeys[key];
|
|
100
|
+
// If not numeric, Array is stored to prevent rechecking in the future
|
|
101
|
+
// Additionally, detects if 64 bit precision is required
|
|
102
|
+
propArrayTypes[key] = deduceArrayType(val, propArrayTypes[key]);
|
|
105
103
|
}
|
|
106
104
|
}
|
|
107
105
|
}
|
|
@@ -117,7 +115,8 @@ function firstPass(features) {
|
|
|
117
115
|
polygonRingsCount,
|
|
118
116
|
polygonFeaturesCount,
|
|
119
117
|
// Array of keys whose values are always numeric
|
|
120
|
-
numericPropKeys: Object.keys(
|
|
118
|
+
numericPropKeys: Object.keys(propArrayTypes).filter((k) => propArrayTypes[k] !== Array),
|
|
119
|
+
propArrayTypes
|
|
121
120
|
};
|
|
122
121
|
}
|
|
123
122
|
/**
|
|
@@ -126,7 +125,7 @@ function firstPass(features) {
|
|
|
126
125
|
*/
|
|
127
126
|
// eslint-disable-next-line complexity
|
|
128
127
|
function secondPass(features, firstPassData, options) {
|
|
129
|
-
const { pointPositionsCount, pointFeaturesCount, linePositionsCount, linePathsCount, lineFeaturesCount, polygonPositionsCount, polygonObjectsCount, polygonRingsCount, polygonFeaturesCount } = firstPassData;
|
|
128
|
+
const { pointPositionsCount, pointFeaturesCount, linePositionsCount, linePathsCount, lineFeaturesCount, polygonPositionsCount, polygonObjectsCount, polygonRingsCount, propArrayTypes, polygonFeaturesCount } = firstPassData;
|
|
130
129
|
const { coordLength, numericPropKeys, PositionDataType = Float32Array } = options;
|
|
131
130
|
const GlobalFeatureIdsDataType = features.length > 65535 ? Uint32Array : Uint16Array;
|
|
132
131
|
const points = {
|
|
@@ -176,7 +175,8 @@ function secondPass(features, firstPassData, options) {
|
|
|
176
175
|
for (const propName of numericPropKeys || []) {
|
|
177
176
|
// If property has been numeric in all previous features in which the property existed, check
|
|
178
177
|
// if numeric in this feature
|
|
179
|
-
|
|
178
|
+
const TypedArray = propArrayTypes[propName];
|
|
179
|
+
object.numericProps[propName] = new TypedArray(object.positions.length / coordLength);
|
|
180
180
|
}
|
|
181
181
|
}
|
|
182
182
|
// Set last element of path/polygon indices as positions length
|
|
@@ -357,6 +357,10 @@ function fillCoords(array, coords, startVertex, coordLength) {
|
|
|
357
357
|
function flatten(arrays) {
|
|
358
358
|
return [].concat(...arrays);
|
|
359
359
|
}
|
|
360
|
-
function
|
|
361
|
-
|
|
360
|
+
function deduceArrayType(x, constructor) {
|
|
361
|
+
if (constructor === Array || !Number.isFinite(x)) {
|
|
362
|
+
return Array;
|
|
363
|
+
}
|
|
364
|
+
// If this or previous value required 64bits use Float64Array
|
|
365
|
+
return constructor === Float64Array || Math.fround(x) !== x ? Float64Array : Float32Array;
|
|
362
366
|
}
|
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": "3.1.0-beta.
|
|
4
|
+
"version": "3.1.0-beta.7",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"access": "public"
|
|
@@ -24,13 +24,13 @@
|
|
|
24
24
|
"README.md"
|
|
25
25
|
],
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@loaders.gl/loader-utils": "3.1.0-beta.
|
|
28
|
-
"@loaders.gl/schema": "3.1.0-beta.
|
|
27
|
+
"@loaders.gl/loader-utils": "3.1.0-beta.7",
|
|
28
|
+
"@loaders.gl/schema": "3.1.0-beta.7",
|
|
29
29
|
"@mapbox/vector-tile": "^1.3.1",
|
|
30
30
|
"pbf": "^3.2.1"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@math.gl/proj4": "^3.5.1"
|
|
34
34
|
},
|
|
35
|
-
"gitHead": "
|
|
35
|
+
"gitHead": "f3b4d81ac02758398c4e4eef5e556b206ef2dfbe"
|
|
36
36
|
}
|
|
@@ -25,9 +25,12 @@ export const TEST_EXPORTS = {
|
|
|
25
25
|
secondPass
|
|
26
26
|
};
|
|
27
27
|
|
|
28
|
+
type PropArrayConstructor = Float32ArrayConstructor | Float64ArrayConstructor | ArrayConstructor;
|
|
29
|
+
|
|
28
30
|
type FirstPassData = {
|
|
29
31
|
coordLength: number;
|
|
30
32
|
numericPropKeys: string[];
|
|
33
|
+
propArrayTypes: {[key: string]: PropArrayConstructor};
|
|
31
34
|
|
|
32
35
|
pointPositionsCount: number;
|
|
33
36
|
pointFeaturesCount: number;
|
|
@@ -58,7 +61,7 @@ function firstPass(features: Feature[]): FirstPassData {
|
|
|
58
61
|
let polygonRingsCount = 0;
|
|
59
62
|
let polygonFeaturesCount = 0;
|
|
60
63
|
const coordLengths = new Set<number>();
|
|
61
|
-
const
|
|
64
|
+
const propArrayTypes = {};
|
|
62
65
|
|
|
63
66
|
for (const feature of features) {
|
|
64
67
|
const geometry = feature.geometry;
|
|
@@ -129,11 +132,9 @@ function firstPass(features: Feature[]): FirstPassData {
|
|
|
129
132
|
|
|
130
133
|
// If property has not been seen before, or if property has been numeric
|
|
131
134
|
// in all previous features, check if numeric in this feature
|
|
132
|
-
// If not numeric,
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
? isNumeric(val)
|
|
136
|
-
: numericPropKeys[key];
|
|
135
|
+
// If not numeric, Array is stored to prevent rechecking in the future
|
|
136
|
+
// Additionally, detects if 64 bit precision is required
|
|
137
|
+
propArrayTypes[key] = deduceArrayType(val, propArrayTypes[key]);
|
|
137
138
|
}
|
|
138
139
|
}
|
|
139
140
|
}
|
|
@@ -152,7 +153,8 @@ function firstPass(features: Feature[]): FirstPassData {
|
|
|
152
153
|
polygonFeaturesCount,
|
|
153
154
|
|
|
154
155
|
// Array of keys whose values are always numeric
|
|
155
|
-
numericPropKeys: Object.keys(
|
|
156
|
+
numericPropKeys: Object.keys(propArrayTypes).filter((k) => propArrayTypes[k] !== Array),
|
|
157
|
+
propArrayTypes
|
|
156
158
|
};
|
|
157
159
|
}
|
|
158
160
|
|
|
@@ -175,6 +177,7 @@ function secondPass(
|
|
|
175
177
|
polygonPositionsCount,
|
|
176
178
|
polygonObjectsCount,
|
|
177
179
|
polygonRingsCount,
|
|
180
|
+
propArrayTypes,
|
|
178
181
|
polygonFeaturesCount
|
|
179
182
|
} = firstPassData;
|
|
180
183
|
const {coordLength, numericPropKeys, PositionDataType = Float32Array} = options;
|
|
@@ -233,7 +236,8 @@ function secondPass(
|
|
|
233
236
|
for (const propName of numericPropKeys || []) {
|
|
234
237
|
// If property has been numeric in all previous features in which the property existed, check
|
|
235
238
|
// if numeric in this feature
|
|
236
|
-
|
|
239
|
+
const TypedArray = propArrayTypes[propName];
|
|
240
|
+
object.numericProps[propName] = new TypedArray(object.positions.length / coordLength);
|
|
237
241
|
}
|
|
238
242
|
}
|
|
239
243
|
|
|
@@ -457,6 +461,11 @@ function flatten(arrays): number[][] {
|
|
|
457
461
|
return [].concat(...arrays);
|
|
458
462
|
}
|
|
459
463
|
|
|
460
|
-
function
|
|
461
|
-
|
|
464
|
+
function deduceArrayType(x: any, constructor: PropArrayConstructor): PropArrayConstructor {
|
|
465
|
+
if (constructor === Array || !Number.isFinite(x)) {
|
|
466
|
+
return Array;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
// If this or previous value required 64bits use Float64Array
|
|
470
|
+
return constructor === Float64Array || Math.fround(x) !== x ? Float64Array : Float32Array;
|
|
462
471
|
}
|