UNPKG

@loaders.gl/geoarrow

Version:

GeoArrow columnar geometry encoding and decoding

8 lines (7 loc) 33 kB
{ "version": 3, "sources": ["index.js", "mesharrow/get-bounding-box.js", "mesharrow/arrow-fixed-size-list-utils.js", "mesharrow/mesh-accessors.js", "mesharrow/get-deck-binary-data.js", "geoarrow-functions.js", "metadata/metadata-utils.js", "metadata/geoarrow-metadata.js", "metadata/geoparquet-metadata.js", "get-geoarrow-geometry-info.js", "get-arrow-bounds.js"], "sourcesContent": ["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n// MESH CATEGORY\nexport { getBoundingBoxFromArrowPositions } from \"./mesharrow/get-bounding-box.js\";\nexport { getDeckBinaryDataFromArrowMesh } from \"./mesharrow/get-deck-binary-data.js\";\nexport { isGeoArrowPoint, isGeoArrowLineString, isGeoArrowPolygon, isGeoArrowMultiPoint, isGeoArrowMultiLineString, isGeoArrowMultiPolygon, isGeoArrowGeometry } from \"./geoarrow-functions.js\";\n// GEOARROW / GEOPARQUET METADATA\nexport { getGeometryColumnsFromSchema } from \"./metadata/geoarrow-metadata.js\";\nexport { getGeoMetadata, unpackGeoMetadata, unpackJSONStringMetadata } from \"./metadata/geoparquet-metadata.js\";\nexport { getGeoArrowGeometryInfo } from \"./get-geoarrow-geometry-info.js\";\nexport { updateBoundsFromGeoArrowSamples } from \"./get-arrow-bounds.js\";\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport * as arrow from 'apache-arrow';\n/** basic helper method to calculate a models upper and lower bounds */\nexport function getBoundingBoxFromArrowPositions(column) {\n const mins = [Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE];\n const maxs = [Number.MIN_VALUE, Number.MIN_VALUE, Number.MIN_VALUE];\n const valueColumn = column.getChildAt(0);\n for (const data of valueColumn.data) {\n const pointSize = 3; // attributes.POSITION.size;\n const pointData = data.buffers[arrow.BufferType.DATA];\n const pointCount = pointData.length / pointSize;\n for (let i = 0; i < pointCount; i += pointSize) {\n const x = pointData[i];\n const y = pointData[i + 1];\n const z = pointData[i + 2];\n if (x < mins[0])\n mins[0] = x;\n else if (x > maxs[0])\n maxs[0] = x;\n if (y < mins[1])\n mins[1] = y;\n else if (y > maxs[1])\n maxs[1] = y;\n if (z < mins[2])\n mins[2] = z;\n else if (z > maxs[2])\n maxs[2] = z;\n }\n }\n return [mins, maxs];\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport * as arrow from 'apache-arrow';\nimport { getDataTypeFromArray, deserializeArrowType } from '@loaders.gl/schema-utils';\nexport function isFixedSizeList(vector) {\n return vector.type instanceof arrow.FixedSizeList;\n}\nexport function getFixedSizeListSize(vector) {\n return vector.type instanceof arrow.FixedSizeList ? vector.type.listSize : 1;\n}\n/** Get Arrow FixedSizeList vector from a typed array */\nexport function getFixedSizeListVector(typedArray, stride) {\n const data = getFixedSizeListData(typedArray, stride);\n return new arrow.Vector([data]);\n}\n/** Get Arrow FixedSizeList vector from a typed array */\nexport function getFixedSizeListData(typedArray, stride) {\n const listType = getFixedSizeListType(typedArray, stride);\n const nestedType = listType.children[0].type;\n const buffers = {\n // valueOffsets: undefined,\n [arrow.BufferType.DATA]: typedArray // values\n // nullBitmap: undefined,\n // typeIds: undefined\n };\n // Note: The contiguous array of data is held by the nested \"primitive type\" column\n const nestedData = new arrow.Data(nestedType, 0, typedArray.length, 0, buffers);\n // Wrapped in a FixedSizeList column that provides a \"strided\" view of the data\n const data = new arrow.Data(listType, 0, typedArray.length / stride, 0, undefined, [nestedData]);\n return data;\n}\n/** Get Arrow FixedSizeList vector from a typed array */\nexport function getFixedSizeListType(typedArray, stride) {\n const { type } = getDataTypeFromArray(typedArray);\n const arrowType = deserializeArrowType(type);\n const listType = new arrow.FixedSizeList(stride, new arrow.Field('value', arrowType));\n return listType;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { getFixedSizeListSize } from \"./arrow-fixed-size-list-utils.js\";\nexport function getSizeAndValueFromMeshArrowVector(attributeVector) {\n const size = getFixedSizeListSize(attributeVector);\n const typedArrays = getTypedArraysFromMeshArrowVector(attributeVector);\n return { size, value: typedArrays[0] };\n}\nexport function getTypedArraysFromMeshArrowVector(attributeVector) {\n const typedArrays = [];\n for (const attributeData of attributeVector.data) {\n const valueData = attributeData?.children[0];\n const typedArray = valueData.values;\n typedArrays.push(typedArray);\n }\n return typedArrays;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { getSizeAndValueFromMeshArrowVector } from \"./mesh-accessors.js\";\n/** */\nexport function getDeckBinaryDataFromArrowMesh(table) {\n const positionVector = table.getChild('POSITION');\n if (!positionVector) {\n throw new Error('POSITION attribute not found');\n }\n const getPosition = getSizeAndValueFromMeshArrowVector(positionVector);\n const deckAttributes = {\n getPosition\n };\n const colorVector = table.getChild('COLOR_0');\n if (colorVector) {\n deckAttributes.getColor = getSizeAndValueFromMeshArrowVector(colorVector);\n }\n // Check PointCloudLayer docs for other supported props?\n return {\n length: table.numRows,\n attributes: deckAttributes\n };\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n/**\n * @note Conforms to the GeoArrow memory layout\n * @see https://geoarrow.org/format.html#memory-layouts\n * @note this is aligned with the geoarrow-js library (MIT license)\n * @see https://github.com/geoarrow/geoarrow-js/\n */\nimport { DataType } from 'apache-arrow/type';\n/** Checks whether the given Apache Arrow JS type is a Point data type */\nexport function isGeoArrowPoint(type) {\n if (DataType.isFixedSizeList(type)) {\n // Check list size\n if (![2, 3, 4].includes(type.listSize)) {\n return false;\n }\n // Check child of FixedSizeList is floating type\n if (!DataType.isFloat(type.children[0])) {\n return false;\n }\n return true;\n }\n // TODO - support separated coordinates\n // if (DataType.isStruct(type)) {\n // // Check number of children\n // if (![2, 3, 4].includes(type.children.length)) {\n // return false;\n // }\n // // Check that children have correct field names\n // if (!type.children.every((field) => ['x', 'y', 'z', 'm'].includes(field.name))) {\n // return false;\n // }\n // if (!type.children.every((field) => DataType.isFloat(field))) {\n // return false;\n // }\n // return true;\n // }\n return false;\n}\n/** Checks whether the given Apache Arrow JS type is a Point data type */\nexport function isGeoArrowLineString(type) {\n // Check the outer type is a List\n if (!DataType.isList(type)) {\n return false;\n }\n // Check the child is a point type\n if (!isGeoArrowPoint(type.children[0].type)) {\n return false;\n }\n return true;\n}\n/** Checks whether the given Apache Arrow JS type is a Polygon data type */\nexport function isGeoArrowPolygon(type) {\n // Check the outer vector is a List\n if (!DataType.isList(type)) {\n return false;\n }\n // Check the child is a linestring vector\n if (!isGeoArrowLineString(type.children[0].type)) {\n return false;\n }\n return true;\n}\n/** Checks whether the given Apache Arrow JS type is a Polygon data type */\nexport function isGeoArrowMultiPoint(type) {\n // Check the outer vector is a List\n if (!DataType.isList(type)) {\n return false;\n }\n // Check the child is a point vector\n if (!isGeoArrowPoint(type.children[0].type)) {\n return false;\n }\n return true;\n}\n/** Checks whether the given Apache Arrow JS type is a Polygon data type */\nexport function isGeoArrowMultiLineString(type) {\n // Check the outer vector is a List\n if (!DataType.isList(type)) {\n return false;\n }\n // Check the child is a linestring vector\n if (!isGeoArrowLineString(type.children[0].type)) {\n return false;\n }\n return true;\n}\n/** Checks whether the given Apache Arrow JS type is a Polygon data type */\nexport function isGeoArrowMultiPolygon(type) {\n // Check the outer vector is a List\n if (!DataType.isList(type)) {\n return false;\n }\n // Check the child is a polygon vector\n if (!isGeoArrowPolygon(type.children[0].type)) {\n return false;\n }\n return true;\n}\n/**\n * Checks if a given Arrow data type is a valid GeoArrowGeometry\n * @note this is somewhat inefficient, it checks the same things multiple times\n */\nexport function isGeoArrowGeometry(type) {\n return (isGeoArrowPoint(type) ||\n isGeoArrowLineString(type) ||\n isGeoArrowPolygon(type) ||\n isGeoArrowMultiPoint(type) ||\n isGeoArrowMultiLineString(type) ||\n isGeoArrowMultiPolygon(type));\n}\n// CHILD EXTRACTION\n/**\n * Strongly typed accessors for children, since arrow.Data.children[] is untyped\n \nimport { Data } from \"apache-arrow/data\";\nimport { Vector } from \"apache-arrow/vector\";\nimport { Float } from \"apache-arrow/type\";\nimport {\n LineStringData,\n MultiLineStringData,\n MultiPointData,\n MultiPolygonData,\n PointData,\n PolygonData,\n} from \"./data\";\nimport {\n LineStringVector,\n MultiLineStringVector,\n MultiPointVector,\n MultiPolygonVector,\n PointVector,\n PolygonVector,\n} from \"./vector\";\n\nexport function getPointChild(input: PointData): Data<Float>;\nexport function getPointChild(input: PointVector): Vector<Float>;\n\nexport function getPointChild(\n input: PointData | PointVector,\n): Data<Float> | Vector<Float> {\n if (\"data\" in input) {\n return input.getChildAt(0)!;\n }\n\n return input.children[0] as Data<Float>;\n}\n\nexport function getLineStringChild(input: LineStringData): PointData;\nexport function getLineStringChild(input: LineStringVector): PointVector;\n\nexport function getLineStringChild(\n input: LineStringData | LineStringVector,\n): PointData | PointVector {\n if (\"data\" in input) {\n return input.getChildAt(0)!;\n }\n\n return input.children[0] as PointData;\n}\n\nexport function getPolygonChild(input: PolygonData): LineStringData;\nexport function getPolygonChild(input: PolygonVector): LineStringVector;\n\nexport function getPolygonChild(\n input: PolygonData | PolygonVector,\n): LineStringData | LineStringVector {\n if (\"data\" in input) {\n return input.getChildAt(0)!;\n }\n\n return input.children[0] as LineStringData;\n}\n\nexport function getMultiPointChild(input: MultiPointData): PointData;\nexport function getMultiPointChild(input: MultiPointVector): PointVector;\n\nexport function getMultiPointChild(\n input: MultiPointData | MultiPointVector,\n): PointData | PointVector {\n if (\"data\" in input) {\n return input.getChildAt(0)!;\n }\n\n return input.children[0] as PointData;\n}\n\nexport function getMultiLineStringChild(\n input: MultiLineStringData,\n): LineStringData;\nexport function getMultiLineStringChild(\n input: MultiLineStringVector,\n): LineStringVector;\n\nexport function getMultiLineStringChild(\n input: MultiLineStringData | MultiLineStringVector,\n): LineStringData | LineStringVector {\n if (\"data\" in input) {\n return input.getChildAt(0)!;\n }\n\n return input.children[0] as LineStringData;\n}\n\nexport function getMultiPolygonChild(input: MultiPolygonData): PolygonData;\nexport function getMultiPolygonChild(input: MultiPolygonVector): PolygonVector;\n\nexport function getMultiPolygonChild(\n input: MultiPolygonData | MultiPolygonVector,\n): PolygonData | PolygonVector {\n if (\"data\" in input) {\n return input.getChildAt(0)!;\n }\n\n return input.children[0] as PolygonData;\n}\n*/\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport function getMetadataValue(metadata, key) {\n return metadata instanceof Map ? metadata.get(key) || null : metadata[key] || null;\n}\nexport function setMetadataValue(metadata, key, value) {\n if (metadata instanceof Map) {\n metadata.set('key', key);\n }\n else {\n metadata.key = key;\n }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { getMetadataValue } from \"./metadata-utils.js\";\n/** Array containing all encodings */\nconst GEOARROW_ENCODINGS = [\n 'geoarrow.multipolygon',\n 'geoarrow.polygon',\n 'geoarrow.multilinestring',\n 'geoarrow.linestring',\n 'geoarrow.multipoint',\n 'geoarrow.point',\n 'geoarrow.wkb',\n 'geoarrow.wkt'\n];\nconst GEOARROW_ENCODING = 'ARROW:extension:name';\nconst GEOARROW_METADATA = 'ARROW:extension:metadata';\n/**\n * get geometry columns from arrow table\n */\nexport function getGeometryColumnsFromSchema(schema) {\n const geometryColumns = {};\n for (const field of schema.fields || []) {\n const metadata = getGeometryMetadataForField(field?.metadata || {});\n if (metadata) {\n geometryColumns[field.name] = metadata;\n }\n }\n return geometryColumns;\n}\n/**\n * Extracts GeoArrow metadata from a field\n * @param field\n * @returns\n * @see https://github.com/geoarrow/geoarrow/blob/d2f56704414d9ae71e8a5170a8671343ed15eefe/extension-types.md\n */\nexport function getGeometryMetadataForField(fieldMetadata) {\n let metadata = null;\n // Check for GeoArrow column encoding\n let geoEncoding = getMetadataValue(fieldMetadata, GEOARROW_ENCODING);\n if (geoEncoding) {\n geoEncoding = geoEncoding.toLowerCase();\n // at time of testing, ogr2ogr uses WKB/WKT for encoding.\n if (geoEncoding === 'wkb') {\n geoEncoding = 'geoarrow.wkb';\n }\n if (geoEncoding === 'wkt') {\n geoEncoding = 'geoarrow.wkt';\n }\n if (!GEOARROW_ENCODINGS.includes(geoEncoding)) {\n // eslint-disable-next-line no-console\n console.warn(`Invalid GeoArrow encoding: ${geoEncoding}`);\n }\n else {\n metadata ||= {};\n metadata.encoding = geoEncoding;\n }\n }\n // Check for GeoArrow metadata\n const columnMetadata = getMetadataValue(fieldMetadata, GEOARROW_METADATA);\n if (columnMetadata) {\n try {\n metadata = JSON.parse(columnMetadata);\n }\n catch (error) {\n // eslint-disable-next-line no-console\n console.warn('Failed to parse GeoArrow metadata', error);\n }\n }\n return metadata || null;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n/* eslint-disable camelcase */\nimport { getMetadataValue, setMetadataValue } from \"./metadata-utils.js\";\n// GEO METADATA\n/**\n * Reads the GeoMetadata object from the metadata\n * @note geoarrow / parquet schema is stringified into a single key-value pair in the parquet metadata\n */\nexport function getGeoMetadata(metadata) {\n const stringifiedGeoMetadata = getMetadataValue(metadata, 'geo');\n const geoMetadata = stringifiedGeoMetadata && parseJSONStringMetadata(stringifiedGeoMetadata);\n if (!geoMetadata) {\n return null;\n }\n for (const column of Object.values(geoMetadata.columns || {})) {\n if (column.encoding) {\n column.encoding = column.encoding.toLowerCase();\n }\n }\n return geoMetadata;\n}\n/**\n * Stores a geoarrow / geoparquet geo metadata object in the schema\n * @note geoarrow / geoparquet geo metadata is a single stringified JSON field\n */\nexport function setGeoMetadata(metadata, geoMetadata) {\n const stringifiedGeoMetadata = JSON.stringify(geoMetadata);\n setMetadataValue(metadata, 'geo', stringifiedGeoMetadata);\n}\n/**\n * Unpacks geo metadata into separate metadata fields (parses the long JSON string)\n * @note geoarrow / parquet schema is stringified into a single key-value pair in the parquet metadata\n */\nexport function unpackGeoMetadata(metadata) {\n const geoMetadata = getGeoMetadata(metadata);\n if (!geoMetadata) {\n return;\n }\n // Store Parquet Schema Level Metadata\n const { version, primary_column, columns } = geoMetadata;\n if (version) {\n setMetadataValue(metadata, 'geo.version', version);\n }\n if (primary_column) {\n setMetadataValue(metadata, 'geo.primary_column', primary_column);\n }\n // store column names as comma separated list\n setMetadataValue(metadata, 'geo.columns', Object.keys(columns || {}).join(''));\n // for (const [columnName, columnMetadata] of Object.entries(columns || {})) {\n // const field = schema.fields.find((field) => field.name === columnName);\n // if (field) {\n // if (field.name === primary_column) {\n // setFieldMetadata(field, 'geo.primary_field', 'true');\n // }\n // unpackGeoFieldMetadata(field, columnMetadata);\n // }\n // }\n}\nexport function unpackJSONStringMetadata(metadata, metadataKey) {\n const stringifiedGeoMetadata = getMetadataValue(metadata, 'geo');\n const json = stringifiedGeoMetadata && parseJSONStringMetadata(stringifiedGeoMetadata);\n for (const [key, value] of Object.entries(json || {})) {\n setMetadataValue(metadata, `${metadataKey}.${key}`, typeof value === 'string' ? value : JSON.stringify(value));\n }\n}\n// eslint-disable-next-line complexity\n// function unpackGeoFieldMetadata(fieldMetadata: Metadata, columnMetadata): void {\n// for (const [key, value] of Object.entries(columnMetadata || {})) {\n// switch (key) {\n// case 'geometry_types':\n// setFieldMetadata(field, `geo.${key}`, (value as string[]).join(','));\n// break;\n// case 'bbox':\n// setFieldMetadata(field, `geo.crs.${key}`, JSON.stringify(value));\n// break;\n// case 'crs':\n// // @ts-ignore\n// for (const [crsKey, crsValue] of Object.entries(value || {})) {\n// switch (crsKey) {\n// case 'id':\n// // prettier-ignore\n// const crsId =\n// typeof crsValue === 'object'\n// ? // @ts-ignore\n// `${crsValue?.authority}:${crsValue?.code}`\n// : JSON.stringify(crsValue);\n// setFieldMetadata(field, `geo.crs.${crsKey}`, crsId);\n// break;\n// default:\n// setFieldMetadata(\n// field,\n// `geo.crs.${crsKey}`,\n// typeof crsValue === 'string' ? crsValue : JSON.stringify(crsValue)\n// );\n// break;\n// }\n// }\n// break;\n// case 'edges':\n// default:\n// setFieldMetadata(\n// field,\n// `geo.${key}`,\n// typeof value === 'string' ? value : JSON.stringify(value)\n// );\n// }\n// }\n// }\n// function setFieldMetadata(field: Field, key: string, value: string): void {\n// field.metadata = field.metadata || {};\n// field.metadata[key] = value;\n// }\n// HELPERS\n/** Parse a key with stringified arrow metadata */\nexport function parseJSONStringMetadata(stringifiedMetadata) {\n if (!stringifiedMetadata) {\n return null;\n }\n try {\n const metadata = JSON.parse(stringifiedMetadata);\n if (!metadata || typeof metadata !== 'object') {\n return null;\n }\n return metadata;\n }\n catch {\n return null;\n }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport * as arrow from 'apache-arrow';\n/**\n * Examines a column containing GeoArrow formatted data and returns information about the geometry type\n * that can be useful during traversal\n * @see https://geoarrow.org/format.html#memory-layouts\n */\n// eslint-disable-next-line max-statements\nexport function getGeoArrowGeometryInfo(arrowField) {\n if (arrowField.type instanceof arrow.Utf8) {\n return {\n compatibleEncodings: ['geoarrow.wkt'],\n nesting: 0,\n /** @note: Dimension encoded in WKT */\n dimension: 2,\n coordinates: 'interleaved',\n valueType: 'double'\n };\n }\n if (arrowField.type instanceof arrow.Binary || arrowField.type instanceof arrow.LargeBinary) {\n return {\n compatibleEncodings: ['geoarrow.wkb'],\n nesting: 0,\n /** @note: Dimension encoded in WKB */\n dimension: 2,\n coordinates: 'interleaved',\n valueType: 'double'\n };\n }\n let coordinateInfo = getCoordinateFieldInfo(arrowField);\n // A point is just a Coordinate\n if (coordinateInfo) {\n return {\n compatibleEncodings: ['geoarrow.point'],\n nesting: 0,\n ...coordinateInfo\n };\n }\n // A line string or a multipoint is a List<Coordinate>\n if (!(arrowField.type instanceof arrow.List)) {\n return null;\n }\n arrowField = arrowField.type.children[0];\n coordinateInfo = getCoordinateFieldInfo(arrowField);\n if (coordinateInfo) {\n return {\n compatibleEncodings: ['geoarrow.linestring', 'geoarrow.multipoint'],\n nesting: 1,\n ...coordinateInfo\n };\n }\n // A polygon or a multiline string are List<List<Coordinate>>\n if (!(arrowField.type instanceof arrow.List)) {\n return null;\n }\n arrowField = arrowField.type.children[0];\n coordinateInfo = getCoordinateFieldInfo(arrowField);\n if (coordinateInfo) {\n return {\n compatibleEncodings: ['geoarrow.polygon', 'geoarrow.multilinestring'],\n nesting: 2,\n ...coordinateInfo\n };\n }\n // A multipolygons are List<List<List<Coordinate>>>\n if (!(arrowField.type instanceof arrow.List)) {\n return null;\n }\n arrowField = arrowField.type.children[0];\n coordinateInfo = getCoordinateFieldInfo(arrowField);\n if (coordinateInfo) {\n return {\n compatibleEncodings: ['geoarrow.multipolygon'],\n nesting: 3,\n ...coordinateInfo\n };\n }\n return null;\n}\n/**\n * @see https://geoarrow.org/format.html#memory-layouts\n */\nfunction getCoordinateFieldInfo(arrowField) {\n // interleaved case\n if (arrowField.type instanceof arrow.FixedSizeList) {\n const dimension = arrowField.type.listSize;\n if (dimension < 2 || dimension > 4) {\n return null;\n }\n const child = arrowField.type.children[0];\n // Spec currently only supports 64 bit coordinates\n if (!(child.type instanceof arrow.Float)) {\n return null;\n }\n return {\n coordinates: 'interleaved',\n dimension: dimension,\n valueType: 'double'\n };\n }\n // separated case\n if (arrowField.type instanceof arrow.Struct) {\n const children = arrowField.type.children;\n const dimension = children.length;\n if (dimension < 2 || dimension > 4) {\n return null;\n }\n // Spec currently only supports 64 bit coordinates\n for (const child of children) {\n if (!(child.type instanceof arrow.Float)) {\n return null;\n }\n }\n return {\n coordinates: 'separated',\n dimension: dimension,\n valueType: 'double'\n };\n }\n // No other types are valid coordinates\n return null;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n/**\n * Update bounds from geoarrow sample data\n *\n * @param flatCoords the flattend coordinates array from one chunk of geoarrow column\n * @param nDim the number of dimensions of the coordinates\n * @param bounds the bounds to be updated\n * @param sampleSize how many samples to be used to update the bounds, default is 1000 per chunk\n * @returns the updated bounds\n */\nexport function updateBoundsFromGeoArrowSamples(flatCoords, nDim, bounds, sampleSize = 100) {\n const numberOfFeatures = flatCoords.length / nDim;\n const sampleStep = Math.max(Math.floor(numberOfFeatures / sampleSize), 1);\n const newBounds = [...bounds];\n for (let i = 0; i < numberOfFeatures; i += sampleStep) {\n const lng = flatCoords[i * nDim];\n const lat = flatCoords[i * nDim + 1];\n if (lng < newBounds[0]) {\n newBounds[0] = lng;\n }\n if (lat < newBounds[1]) {\n newBounds[1] = lat;\n }\n if (lng > newBounds[2]) {\n newBounds[2] = lng;\n }\n if (lat > newBounds[3]) {\n newBounds[3] = lat;\n }\n }\n return newBounds;\n}\n"], "mappings": "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", "names": ["arrow", "arrow"] }