{
  "version": 3,
  "sources": ["../src/index.ts", "../src/mesharrow/get-bounding-box.ts", "../src/mesharrow/arrow-fixed-size-list-utils.ts", "../src/mesharrow/mesh-accessors.ts", "../src/mesharrow/get-deck-binary-data.ts", "../src/geoarrow-functions.ts", "../src/metadata/metadata-utils.ts", "../src/metadata/geoarrow-metadata.ts", "../src/metadata/geoparquet-metadata.ts", "../src/get-geoarrow-geometry-info.ts", "../src/get-arrow-bounds.ts"],
  "sourcesContent": ["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// MESH CATEGORY\n\nexport {getBoundingBoxFromArrowPositions} from './mesharrow/get-bounding-box';\nexport {getDeckBinaryDataFromArrowMesh} from './mesharrow/get-deck-binary-data';\n\n// GIS CATEGORY - GEOARROW\nexport type {GeoArrowMetadata, GeoArrowEncoding} from './metadata/geoarrow-metadata';\n\nexport type {\n  GeoArrowWKB,\n  GeoArrowWKT,\n  GeoArrowCoordInterleaved,\n  GeoArrowCoordSeparated,\n  GeoArrowCoord,\n  GeoArrowPoint,\n  GeoArrowLineString,\n  GeoArrowPolygon,\n  GeoArrowMultiPoint,\n  GeoArrowMultiLineString,\n  GeoArrowMultiPolygon,\n  GeoArrowGeometry,\n  GeoArrowPointSeparated,\n  GeoArrowLineStringSeparated,\n  GeoArrowPolygonSeparated,\n  GeoArrowMultiPointSeparated,\n  GeoArrowMultiLineStringSeparated,\n  GeoArrowMultiPolygonSeparated,\n  GeoArrowGeometrySeparated\n} from './geoarrow-types';\n\nexport {\n  isGeoArrowPoint,\n  isGeoArrowLineString,\n  isGeoArrowPolygon,\n  isGeoArrowMultiPoint,\n  isGeoArrowMultiLineString,\n  isGeoArrowMultiPolygon,\n  isGeoArrowGeometry\n} from './geoarrow-functions';\n\n// GEOARROW / GEOPARQUET METADATA\nexport {getGeometryColumnsFromSchema} from './metadata/geoarrow-metadata';\n\nexport type {GeoColumnMetadata} from './metadata/geoparquet-metadata';\nexport {\n  getGeoMetadata,\n  unpackGeoMetadata,\n  unpackJSONStringMetadata\n} from './metadata/geoparquet-metadata';\n\nexport {getGeoArrowGeometryInfo} from './get-geoarrow-geometry-info';\n\nexport {updateBoundsFromGeoArrowSamples} from './get-arrow-bounds';\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport * as arrow from 'apache-arrow';\n\nexport type BoundingBox = [[number, number, number], [number, number, number]];\n\n/** basic helper method to calculate a models upper and lower bounds */\nexport function getBoundingBoxFromArrowPositions(\n  column: arrow.Vector<arrow.FixedSizeList>\n): BoundingBox {\n  const mins: [number, number, number] = [Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE];\n  const maxs: [number, number, number] = [Number.MIN_VALUE, Number.MIN_VALUE, Number.MIN_VALUE];\n\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\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\n      if (x < mins[0]) mins[0] = x;\n      else if (x > maxs[0]) maxs[0] = x;\n\n      if (y < mins[1]) mins[1] = y;\n      else if (y > maxs[1]) maxs[1] = y;\n\n      if (z < mins[2]) mins[2] = z;\n      else if (z > maxs[2]) maxs[2] = z;\n    }\n  }\n\n  return [mins, maxs];\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {TypedArray} from '@math.gl/types';\nimport * as arrow from 'apache-arrow';\nimport {getDataTypeFromArray, deserializeArrowType} from '@loaders.gl/schema-utils';\n\nexport function isFixedSizeList(vector: arrow.Vector): vector is arrow.Vector<arrow.FixedSizeList> {\n  return vector.type instanceof arrow.FixedSizeList;\n}\n\nexport function getFixedSizeListSize(vector: arrow.Vector): number {\n  return vector.type instanceof arrow.FixedSizeList ? vector.type.listSize : 1;\n}\n\n/** Get Arrow FixedSizeList vector from a typed array */\nexport function getFixedSizeListVector(\n  typedArray: TypedArray,\n  stride: number\n): arrow.Vector<arrow.FixedSizeList> {\n  const data = getFixedSizeListData(typedArray, stride);\n  return new arrow.Vector<arrow.FixedSizeList>([data]);\n}\n\n/** Get Arrow FixedSizeList vector from a typed array */\nexport function getFixedSizeListData(\n  typedArray: TypedArray,\n  stride: number\n): arrow.Data<arrow.FixedSizeList> {\n  const listType = getFixedSizeListType(typedArray, stride);\n  const nestedType = listType.children[0].type;\n  const buffers: Partial<Record<arrow.BufferType, any>> = {\n    // valueOffsets: undefined,\n    [arrow.BufferType.DATA]: typedArray // values\n    // nullBitmap: undefined,\n    // typeIds: undefined\n  };\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\n  // Wrapped in a FixedSizeList column that provides a \"strided\" view of the data\n  const data = new arrow.Data<arrow.FixedSizeList>(\n    listType,\n    0,\n    typedArray.length / stride,\n    0,\n    undefined,\n    [nestedData]\n  );\n\n  return data;\n}\n\n/** Get Arrow FixedSizeList vector from a typed array */\nexport function getFixedSizeListType(typedArray: TypedArray, stride: number): arrow.FixedSizeList {\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\n\nimport {TypedArray} from '@math.gl/types';\nimport {getFixedSizeListSize} from './arrow-fixed-size-list-utils';\nimport * as arrow from 'apache-arrow';\n\nexport function getSizeAndValueFromMeshArrowVector(attributeVector: arrow.Vector): {\n  size: number;\n  value: TypedArray;\n} {\n  const size = getFixedSizeListSize(attributeVector);\n  const typedArrays = getTypedArraysFromMeshArrowVector(attributeVector);\n  return {size, value: typedArrays[0]};\n}\n\nexport function getTypedArraysFromMeshArrowVector(attributeVector: arrow.Vector): TypedArray[] {\n  const typedArrays: TypedArray[] = [];\n  for (const attributeData of attributeVector.data) {\n    const valueData = attributeData?.children[0];\n    const typedArray = valueData.values;\n    typedArrays.push(typedArray);\n  }\n\n  return typedArrays;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {TypedArray} from '@math.gl/types';\nimport {getSizeAndValueFromMeshArrowVector} from './mesh-accessors';\nimport * as arrow from 'apache-arrow';\n\n/**  */\nexport type DeckBinaryData = {\n  length: number;\n  attributes: Record<\n    string,\n    {\n      value: TypedArray;\n      size: number;\n    }\n  >;\n};\n\n/**  */\nexport function getDeckBinaryDataFromArrowMesh(table: arrow.Table): DeckBinaryData {\n  const positionVector = table.getChild('POSITION');\n  if (!positionVector) {\n    throw new Error('POSITION attribute not found');\n  }\n\n  const getPosition = getSizeAndValueFromMeshArrowVector(positionVector);\n\n  const deckAttributes: DeckBinaryData['attributes'] = {\n    getPosition\n  };\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/**\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 */\n\nimport {DataType} from 'apache-arrow/type';\n\nimport type {\n  GeoArrowPoint,\n  GeoArrowLineString,\n  GeoArrowPolygon,\n  GeoArrowMultiPoint,\n  GeoArrowMultiLineString,\n  GeoArrowMultiPolygon,\n  GeoArrowGeometry\n} from './geoarrow-types';\n\n/** Checks whether the given Apache Arrow JS type is a Point data type */\nexport function isGeoArrowPoint(type: DataType): type is GeoArrowPoint {\n  if (DataType.isFixedSizeList(type)) {\n    // Check list size\n    if (![2, 3, 4].includes(type.listSize)) {\n      return false;\n    }\n\n    // Check child of FixedSizeList is floating type\n    if (!DataType.isFloat(type.children[0])) {\n      return false;\n    }\n\n    return true;\n  }\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\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\n  //   if (!type.children.every((field) => DataType.isFloat(field))) {\n  //     return false;\n  //   }\n\n  //   return true;\n  // }\n\n  return false;\n}\n\n/** Checks whether the given Apache Arrow JS type is a Point data type */\nexport function isGeoArrowLineString(type: DataType): type is GeoArrowLineString {\n  // Check the outer type is a List\n  if (!DataType.isList(type)) {\n    return false;\n  }\n\n  // Check the child is a point type\n  if (!isGeoArrowPoint(type.children[0].type)) {\n    return false;\n  }\n\n  return true;\n}\n\n/** Checks whether the given Apache Arrow JS type is a Polygon data type */\nexport function isGeoArrowPolygon(type: DataType): type is GeoArrowPolygon {\n  // Check the outer vector is a List\n  if (!DataType.isList(type)) {\n    return false;\n  }\n\n  // Check the child is a linestring vector\n  if (!isGeoArrowLineString(type.children[0].type)) {\n    return false;\n  }\n\n  return true;\n}\n\n/** Checks whether the given Apache Arrow JS type is a Polygon data type */\nexport function isGeoArrowMultiPoint(type: DataType): type is GeoArrowMultiPoint {\n  // Check the outer vector is a List\n  if (!DataType.isList(type)) {\n    return false;\n  }\n\n  // Check the child is a point vector\n  if (!isGeoArrowPoint(type.children[0].type)) {\n    return false;\n  }\n\n  return true;\n}\n\n/** Checks whether the given Apache Arrow JS type is a Polygon data type */\nexport function isGeoArrowMultiLineString(type: DataType): type is GeoArrowMultiLineString {\n  // Check the outer vector is a List\n  if (!DataType.isList(type)) {\n    return false;\n  }\n\n  // Check the child is a linestring vector\n  if (!isGeoArrowLineString(type.children[0].type)) {\n    return false;\n  }\n\n  return true;\n}\n\n/** Checks whether the given Apache Arrow JS type is a Polygon data type */\nexport function isGeoArrowMultiPolygon(type: DataType): type is GeoArrowMultiPolygon {\n  // Check the outer vector is a List\n  if (!DataType.isList(type)) {\n    return false;\n  }\n\n  // Check the child is a polygon vector\n  if (!isGeoArrowPolygon(type.children[0].type)) {\n    return false;\n  }\n\n  return true;\n}\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: DataType): type is GeoArrowGeometry {\n  return (\n    isGeoArrowPoint(type) ||\n    isGeoArrowLineString(type) ||\n    isGeoArrowPolygon(type) ||\n    isGeoArrowMultiPoint(type) ||\n    isGeoArrowMultiLineString(type) ||\n    isGeoArrowMultiPolygon(type)\n  );\n}\n\n// CHILD EXTRACTION\n\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\n\n/**\n * A type that matches a string-to-string metadata map\n * in the form of a map or an object.\n */\nexport type Metadata = Map<string, string> | Record<string, string>;\n\n/**\n * A type that matches a variety of Apache arrow like schemas.\n *\n */\nexport type SchemaWithMetadata = {\n  /** Schema level metadata */\n  metadata?: Metadata;\n  /** Field top-level metadata */\n  fields?: {name: string; metadata?: Metadata}[];\n};\n\nexport function getMetadataValue(metadata: Metadata, key: string): string | null {\n  return metadata instanceof Map ? metadata.get(key) || null : metadata[key] || null;\n}\n\nexport function setMetadataValue(metadata: Metadata, key: string, value: string): void {\n  if (metadata instanceof Map) {\n    metadata.set('key', key);\n  } else {\n    metadata.key = key;\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Metadata, SchemaWithMetadata, getMetadataValue} from './metadata-utils';\n\nexport type GeoArrowEncoding =\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\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] as const satisfies GeoArrowEncoding[];\n\nconst GEOARROW_ENCODING = 'ARROW:extension:name';\nconst GEOARROW_METADATA = 'ARROW:extension:metadata';\n\n/**\n * Geospatial metadata for one column, extracted from Apache Arrow metadata\n * @see https://github.com/geoarrow/geoarrow/blob/main/extension-types.md\n */\nexport type GeoArrowMetadata = {\n  /** Encoding of geometry in this column */\n  encoding?: GeoArrowEncoding;\n  /** CRS in [PROJJSON](https://proj.org/specifications/projjson.html). Omitted if producer has no information about CRS */\n  crs?: Record<string, unknown>;\n  /** Edges are either spherical or omitted */\n  edges?: 'spherical';\n  [key: string]: unknown;\n};\n\n/**\n * get geometry columns from arrow table\n */\nexport function getGeometryColumnsFromSchema(\n  schema: SchemaWithMetadata\n): Record<string, GeoArrowMetadata> {\n  const geometryColumns: Record<string, GeoArrowMetadata> = {};\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: Metadata): GeoArrowMetadata | null {\n  let metadata: GeoArrowMetadata | null = null;\n\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 as GeoArrowEncoding)) {\n      // eslint-disable-next-line no-console\n      console.warn(`Invalid GeoArrow encoding: ${geoEncoding}`);\n    } else {\n      metadata ||= {} as GeoArrowMetadata;\n      metadata.encoding = geoEncoding as GeoArrowEncoding;\n    }\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    } catch (error) {\n      // eslint-disable-next-line no-console\n      console.warn('Failed to parse GeoArrow metadata', error);\n    }\n  }\n\n  return metadata || null;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-disable camelcase */\n\nimport {Metadata, getMetadataValue, setMetadataValue} from './metadata-utils';\n\n/**\n * A geoarrow / geoparquet geo metadata object\n * (stored in stringified form in the top level metadata 'geo' key)\n * @see https://github.com/opengeospatial/geoparquet/blob/main/format-specs/geoparquet.md\n * @see https://github.com/geoarrow/geoarrow\n * */\nexport type GeoMetadata = {\n  version?: string;\n  primary_column?: string;\n  columns: Record<string, GeoColumnMetadata>;\n  [key: string]: unknown;\n};\n\n/** A geoarrow / geoparquet geo metadata for one geometry column  */\nexport type GeoColumnMetadata = {\n  encoding: 'wkb' | 'wkt';\n  geometry_types: GeoParquetGeometryType[];\n  crs?: object | null;\n  orientation?: 'counterclockwise';\n  bbox?: [number, number, number, number] | [number, number, number, number, number, number];\n  edges?: 'planar' | 'spherical';\n  epoch?: number;\n  [key: string]: unknown;\n};\n\n/** A GeoParquet metadata geometry type */\nexport type GeoParquetGeometryType =\n  | 'Point'\n  | 'LineString'\n  | 'Polygon'\n  | 'MultiPoint'\n  | 'MultiLineString'\n  | 'MultiPolygon'\n  | 'GeometryCollection'\n  | 'Point Z'\n  | 'LineString Z'\n  | 'Polygon Z'\n  | 'MultiPoint Z'\n  | 'MultiLineString Z'\n  | 'MultiPolygon Z'\n  | 'GeometryCollection Z';\n\n// GEO METADATA\n\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: Metadata): GeoMetadata | null {\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 as GeoMetadata;\n}\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: Metadata, geoMetadata: GeoMetadata): void {\n  const stringifiedGeoMetadata = JSON.stringify(geoMetadata);\n  setMetadataValue(metadata, 'geo', stringifiedGeoMetadata);\n}\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: Metadata): void {\n  const geoMetadata = getGeoMetadata(metadata);\n  if (!geoMetadata) {\n    return;\n  }\n\n  // Store Parquet Schema Level Metadata\n\n  const {version, primary_column, columns} = geoMetadata;\n  if (version) {\n    setMetadataValue(metadata, 'geo.version', version);\n  }\n\n  if (primary_column) {\n    setMetadataValue(metadata, 'geo.primary_column', primary_column);\n  }\n\n  // store column names as comma separated list\n  setMetadataValue(metadata, 'geo.columns', Object.keys(columns || {}).join(''));\n\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}\n\nexport function unpackJSONStringMetadata(metadata: Metadata, metadataKey: string): void {\n  const stringifiedGeoMetadata = getMetadataValue(metadata, 'geo');\n  const json = stringifiedGeoMetadata && parseJSONStringMetadata(stringifiedGeoMetadata);\n  for (const [key, value] of Object.entries(json || {})) {\n    setMetadataValue(\n      metadata,\n      `${metadataKey}.${key}`,\n      typeof value === 'string' ? value : JSON.stringify(value)\n    );\n  }\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\n// function setFieldMetadata(field: Field, key: string, value: string): void {\n//   field.metadata = field.metadata || {};\n//   field.metadata[key] = value;\n// }\n\n// HELPERS\n\n/** Parse a key with stringified arrow metadata */\nexport function parseJSONStringMetadata(\n  stringifiedMetadata: string\n): Record<string, unknown> | null {\n  if (!stringifiedMetadata) {\n    return null;\n  }\n\n  try {\n    const metadata = JSON.parse(stringifiedMetadata);\n    if (!metadata || typeof metadata !== 'object') {\n      return null;\n    }\n    return metadata;\n  } catch {\n    return null;\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport * as arrow from 'apache-arrow';\nimport type {GeoArrowEncoding} from './metadata/geoarrow-metadata';\n\n/**\n * @see https://geoarrow.org/format.html#memory-layouts\n */\nexport type GeoArrowGeometryInfo = {\n  /** Geometry encodings that are compatible with this column (Field) */\n  compatibleEncodings: GeoArrowEncoding[];\n  /** How many levels of List<> nesting  */\n  nesting: 0 | 1 | 2 | 3;\n  /** How many values per coordinate */\n  dimension: number;\n  /**\n   * - 0: A point is just a Coordinate\n   * - 1: A line string or a multipoint is a List<Coordinate>\n   * - 2: A polygon or a multilinestring are List<List<Coordinate>>\n   * - 3: multipolygons are List<List<List<Coordinate>>>\n   */\n  /** Coordinate memory layout {x,y,...} vs [x,y,...] */\n  coordinates: 'separated' | 'interleaved';\n  /** Coordinate  */\n  valueType: 'double'; // 'float'\n};\n\n/** Helper type used to test coordinates */\ntype CoordinateFieldInfo = {\n  coordinates: 'interleaved' | 'separated';\n  dimension: 2 | 3 | 4;\n  valueType: 'double';\n};\n\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: arrow.Field): GeoArrowGeometryInfo | null {\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\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\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\n  coordinateInfo = getCoordinateFieldInfo(arrowField);\n  if (coordinateInfo) {\n    return {\n      compatibleEncodings: ['geoarrow.linestring', 'geoarrow.multipoint'],\n      nesting: 1,\n      ...coordinateInfo\n    };\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\n  coordinateInfo = getCoordinateFieldInfo(arrowField);\n  if (coordinateInfo) {\n    return {\n      compatibleEncodings: ['geoarrow.polygon', 'geoarrow.multilinestring'],\n      nesting: 2,\n      ...coordinateInfo\n    };\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\n  coordinateInfo = getCoordinateFieldInfo(arrowField);\n  if (coordinateInfo) {\n    return {\n      compatibleEncodings: ['geoarrow.multipolygon'],\n      nesting: 3,\n      ...coordinateInfo\n    };\n  }\n\n  return null;\n}\n\n/**\n * @see https://geoarrow.org/format.html#memory-layouts\n */\nfunction getCoordinateFieldInfo(arrowField: arrow.Field): CoordinateFieldInfo | null {\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\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\n    return {\n      coordinates: 'interleaved',\n      dimension: dimension as 2 | 3 | 4,\n      valueType: 'double'\n    };\n  }\n\n  // separated case\n  if (arrowField.type instanceof arrow.Struct) {\n    const children = arrowField.type.children;\n\n    const dimension = children.length;\n    if (dimension < 2 || dimension > 4) {\n      return null;\n    }\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\n    return {\n      coordinates: 'separated',\n      dimension: dimension as 2 | 3 | 4,\n      valueType: 'double'\n    };\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/**\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(\n  flatCoords: Float64Array,\n  nDim: number,\n  bounds: [number, number, number, number],\n  sampleSize: number = 100\n): [number, number, number, number] {\n  const numberOfFeatures = flatCoords.length / nDim;\n  const sampleStep = Math.max(Math.floor(numberOfFeatures / sampleSize), 1);\n\n  const newBounds: [number, number, number, number] = [...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"]
}
