@loaders.gl/flatgeobuf 4.3.0-beta.2 → 4.3.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["index.js", "lib/parse-flatgeobuf.js", "lib/binary-geometries.js", "lib/get-schema-from-fgb-header.js", "flatgeobuf/3.27.2/flat-geobuf/geometry-type.js", "flatgeobuf/3.27.2/flat-geobuf/geometry.js", "flatgeobuf/3.27.2/generic/geometry.js", "flatgeobuf/3.27.2/geojson/geometry.js", "flatgeobuf/3.27.2/generic/feature.js", "flatgeobuf/3.27.2/flat-geobuf/column-type.js", "flatgeobuf/3.27.2/flat-geobuf/feature.js", "flatgeobuf/3.27.2/flat-geobuf/column.js", "flatgeobuf/3.27.2/geojson/feature.js", "flatgeobuf/3.27.2/generic/featurecollection.js", "flatgeobuf/3.27.2/flat-geobuf/header.js", "flatgeobuf/3.27.2/flat-geobuf/crs.js", "flatgeobuf/3.27.2/header-meta.js", "flatgeobuf/3.27.2/http-reader.js", "flatgeobuf/3.27.2/config.js", "flatgeobuf/3.27.2/logger.js", "flatgeobuf/3.27.2/packedrtree.js", "flatgeobuf/3.27.2/constants.js", "flatgeobuf/3.27.2/geojson/featurecollection.js", "flatgeobuf/3.27.2/geojson.js", "flatgeobuf/3.27.2/generic.js", "flatgeobuf-loader.js"],
4
- "sourcesContent": ["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport { FlatGeobufLoader, FlatGeobufWorkerLoader } from \"./flatgeobuf-loader.js\";\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { Proj4Projection } from '@math.gl/proj4';\nimport { transformGeoJsonCoords } from '@loaders.gl/gis';\nimport { fgbToBinaryGeometry } from \"./binary-geometries.js\";\nimport { getSchemaFromFGBHeader } from \"./get-schema-from-fgb-header.js\";\nimport * as geojson from \"../flatgeobuf/3.27.2/geojson.js\";\nimport * as generic from \"../flatgeobuf/3.27.2/generic.js\";\nimport { parseProperties as parsePropertiesBinary } from \"../flatgeobuf/3.27.2/generic/feature.js\";\nconst deserializeGeoJson = geojson.deserialize;\nconst deserializeGeneric = generic.deserialize;\n/*\n * Parse FlatGeobuf arrayBuffer and return GeoJSON.\n *\n * @param arrayBuffer A FlatGeobuf arrayBuffer\n * @return A GeoJSON geometry object\n */\nexport function parseFlatGeobuf(arrayBuffer, options) {\n const shape = options.shape;\n switch (shape) {\n case 'geojson-table': {\n return parseFlatGeobufToGeoJSONTable(arrayBuffer, options);\n }\n case 'columnar-table': // binary + some JS arrays\n const binary = parseFlatGeobufToBinary(arrayBuffer, options);\n // @ts-expect-error\n return { shape: 'columnar-table', data: binary };\n case 'binary':\n // @ts-expect-error\n return parseFlatGeobufToBinary(arrayBuffer, options);\n default:\n throw new Error(shape);\n }\n}\nfunction parseFlatGeobufToBinary(arrayBuffer, options = {}) {\n // TODO: reproject binary features\n // const {reproject = false, _targetCrs = 'WGS84'} = (options && options.gis) || {};\n const array = new Uint8Array(arrayBuffer);\n // @ts-expect-error\n return deserializeGeneric(array, fgbToBinaryGeometry);\n}\nfunction parseFlatGeobufToGeoJSONTable(arrayBuffer, options) {\n if (arrayBuffer.byteLength === 0) {\n return { shape: 'geojson-table', type: 'FeatureCollection', features: [] };\n }\n const { reproject = false, crs = 'WGS84' } = options;\n const arr = new Uint8Array(arrayBuffer);\n let fgbHeader;\n let schema;\n const rect = options.boundingBox && convertBoundingBox(options.boundingBox);\n // @ts-expect-error this looks wrong\n let { features } = deserializeGeoJson(arr, rect, (headerMeta) => {\n fgbHeader = headerMeta;\n schema = getSchemaFromFGBHeader(fgbHeader);\n });\n const fromCRS = fgbHeader?.crs?.wkt;\n let projection;\n if (reproject && fromCRS) {\n // Constructing the projection may fail for some invalid WKT strings\n try {\n projection = new Proj4Projection({ from: fromCRS, to: crs });\n }\n catch (error) {\n // no op\n }\n }\n if (projection) {\n features = transformGeoJsonCoords(features, (coords) => projection.project(coords));\n }\n return { shape: 'geojson-table', schema, type: 'FeatureCollection', features };\n}\n/*\n * Parse FlatGeobuf arrayBuffer and return GeoJSON.\n *\n * @param {ReadableStream} _ A FlatGeobuf arrayBuffer\n * @return A GeoJSON geometry object iterator\n */\n// eslint-disable-next-line complexity\nexport function parseFlatGeobufInBatches(stream, options) {\n const shape = options.shape;\n switch (shape) {\n case 'binary':\n return parseFlatGeobufInBatchesToBinary(stream, options);\n case 'geojson-table':\n return parseFlatGeobufInBatchesToGeoJSON(stream, options);\n default:\n throw new Error(shape);\n }\n}\nfunction parseFlatGeobufInBatchesToBinary(stream, options) {\n // TODO: reproject binary streaming features\n // const {reproject = false, _targetCrs = 'WGS84'} = (options && options.gis) || {};\n const rect = options.boundingBox && convertBoundingBox(options.boundingBox);\n // @ts-expect-error\n const iterator = deserializeGeneric(stream, binaryFromFeature, rect);\n return iterator;\n}\n/**\n * @todo this does not return proper GeoJSONTable batches\n * @param stream\n * @param options\n */\n// eslint-disable-next-line complexity\nasync function* parseFlatGeobufInBatchesToGeoJSON(stream, options) {\n const { reproject = false, crs = 'WGS84' } = options || {};\n let fgbHeader;\n // let schema: Schema | undefined;\n const iterator = deserializeGeoJson(stream, undefined, (headerMeta) => {\n fgbHeader = headerMeta;\n // schema = getSchemaFromFGBHeader(fgbHeader);\n });\n let projection;\n let firstRecord = true;\n // @ts-expect-error this looks wrong\n for await (const feature of iterator) {\n if (firstRecord) {\n const fromCRS = fgbHeader?.crs?.wkt;\n if (reproject && fromCRS) {\n projection = new Proj4Projection({ from: fromCRS, to: crs });\n }\n firstRecord = false;\n }\n if (reproject && projection) {\n // eslint-disable-next-line\n yield transformGeoJsonCoords([feature], (coords) => projection.project(coords));\n }\n else {\n yield feature;\n }\n }\n}\n// HELPERS\nfunction convertBoundingBox(boundingBox) {\n return {\n minX: boundingBox[0][0],\n minY: boundingBox[0][1],\n maxX: boundingBox[1][0],\n maxY: boundingBox[1][1]\n };\n}\n// TODO: reproject binary features\nfunction binaryFromFeature(feature, header) {\n const geometry = feature.geometry();\n // FlatGeobuf files can only hold a single geometry type per file, otherwise\n // GeometryType is GeometryCollection\n // I believe geometry.type() is null (0) except when the geometry type isn't\n // known in the header?\n const geometryType = header.geometryType || geometry?.type();\n const parsedGeometry = fgbToBinaryGeometry(geometry, geometryType);\n // @ts-expect-error this looks wrong\n parsedGeometry.properties = parsePropertiesBinary(feature, header.columns);\n // TODO: wrap binary data either in points, lines, or polygons key\n return parsedGeometry;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport function fgbToBinaryFeature(geometry, type) {\n const fgbGeometry = geometry?.geometry() || null;\n return fgbToBinaryGeometry(fgbGeometry, type);\n}\nexport function fgbToBinaryGeometry(geometry, type) {\n if (geometry === null) {\n return null;\n }\n switch (type) {\n case GeometryType.Point:\n case GeometryType.MultiPoint:\n return parsePoint(geometry);\n case GeometryType.LineString:\n case GeometryType.MultiLineString:\n return parseLines(geometry);\n case GeometryType.Polygon:\n return parsePolygons(geometry);\n case GeometryType.MultiPolygon:\n return parseMultiPolygons(geometry);\n default:\n throw new Error(`Unimplemented geometry type: ${type}`);\n }\n}\n// Parse Point to flat array\nfunction parsePoint(geometry) {\n const xy = geometry.xyArray();\n const z = geometry.zArray();\n // @ts-expect-error TODO handle null geometries\n const positions = blitArrays(xy, z);\n return { positions };\n}\nfunction parseLines(geometry) {\n const xy = geometry.xyArray();\n const z = geometry.zArray();\n const positions = blitArrays(xy, z);\n // If endsArray is null, a single LineString. Otherwise, contains the end\n // indices of each part of the MultiLineString. geometry.endsArray() omits the\n // initial 0 that we have in our internal format.\n // @ts-expect-error TODO handle null geometries\n const ends = (geometry.endsArray() && Array.from(geometry.endsArray())) || [xy.length / 2];\n ends.unshift(0);\n const pathIndices = { value: new Uint16Array(ends), size: 1 };\n return {\n positions,\n pathIndices\n };\n}\nfunction parsePolygons(geometry) {\n const xy = geometry.xyArray();\n const z = geometry.zArray();\n // @ts-expect-error TODO handle null geometries\n const positions = blitArrays(xy, z);\n // If endsArray is null, a simple Polygon with no inner rings. Otherwise,\n // contains the end indices of each ring of the Polygon. geometry.endsArray()\n // omits the initial 0 that we have in our internal format.\n // @ts-expect-error TODO handle null geometries\n const ends = (geometry.endsArray() && Array.from(geometry.endsArray())) || [xy.length / 2];\n ends.unshift(0);\n const primitivePolygonIndices = { value: new Uint16Array(ends), size: 1 };\n const polygonIndices = { value: new Uint16Array([0, xy.length / 2]), size: 1 };\n return {\n positions,\n primitivePolygonIndices,\n polygonIndices\n };\n}\n// eslint-disable-next-line max-statements\nfunction parseMultiPolygons(geometry) {\n // Create arrays for each geometry part, then concatenate\n const parsedParts = [];\n let nPositions = 0;\n let nPrimitivePolygonIndices = 1;\n let nPolygonIndices = 1;\n for (let i = 0; i < geometry.partsLength(); i++) {\n const part = geometry.parts(i);\n // @ts-expect-error TODO handle null geometries\n const polygon = parsePolygons(part);\n nPositions += polygon.positions.value.length;\n nPrimitivePolygonIndices += polygon.primitivePolygonIndices.value.length - 1;\n nPolygonIndices += polygon.polygonIndices.value.length - 1;\n parsedParts.push(polygon);\n }\n const concatPositions = new Float64Array(nPositions);\n const concatPrimitivePolygonIndices = new Uint32Array(nPrimitivePolygonIndices);\n const concatPolygonIndices = new Uint32Array(nPolygonIndices);\n let positionCounter = 0;\n let primitivePolygonIndicesCounter = 1;\n let polygonIndicesCounter = 1;\n // Assumes all parts of the multipolygon have the same size\n const positionSize = parsedParts[0].positions.size;\n for (const parsedPart of parsedParts) {\n concatPositions.set(parsedPart.positions.value, positionCounter * positionSize);\n // For indices, need to add positionCounter so that position indices are\n // correct in the concatenated positions\n concatPrimitivePolygonIndices.set(\n // eslint-disable-next-line\n parsedPart.primitivePolygonIndices.value.subarray(1).map((x) => x + positionCounter), primitivePolygonIndicesCounter);\n concatPolygonIndices.set(\n // eslint-disable-next-line\n parsedPart.polygonIndices.value.subarray(1).map((x) => x + positionCounter), polygonIndicesCounter);\n positionCounter += parsedPart.positions.value.length / positionSize;\n primitivePolygonIndicesCounter += parsedPart.primitivePolygonIndices.value.length - 1;\n polygonIndicesCounter += parsedPart.polygonIndices.value.length - 1;\n }\n return {\n positions: { value: concatPositions, size: positionSize },\n primitivePolygonIndices: { value: concatPrimitivePolygonIndices, size: 1 },\n polygonIndices: { value: concatPolygonIndices, size: 1 }\n };\n}\n// Combine xy and z arrays\nfunction blitArrays(xy, z) {\n if (!z) {\n return { value: xy, size: 2 };\n }\n if (z.length * 2 !== xy.length) {\n throw new Error('Z array must be half XY array\\'s length');\n }\n const totalLength = xy.length + z.length;\n const xyz = new Float64Array(totalLength);\n for (let i = 0; i < xy.length / 2; i++) {\n xyz[i * 3 + 0] = xy[i * 2 + 0];\n xyz[i * 3 + 1] = xy[i * 2 + 1];\n xyz[i * 3 + 2] = z[i];\n }\n return { value: xyz, size: 3 };\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n/**\n * @param fgbHeader\n * geometryType: GeometryType;\n * columns: ColumnMeta[] | null;\n * envelope: Float64Array | null;\n * featuresCount: number;\n * indexNodeSize: number;\n * crs: CrsMeta | null;\n * title: string | null;\n * description: string | null;\n * metadata: string | null;\n */\nexport function getSchemaFromFGBHeader(fgbHeader) {\n const metadata = {\n title: fgbHeader.title || '',\n description: fgbHeader.description || '',\n crs: JSON.stringify(fgbHeader.crs) || '',\n metadata: fgbHeader.metadata || '',\n geometryType: String(fgbHeader.geometryType),\n indexNodeSize: String(fgbHeader.indexNodeSize),\n featureCount: String(fgbHeader.featuresCount),\n bounds: fgbHeader.envelope?.join(',') || ''\n };\n const fields = fgbHeader.columns?.map((column) => getFieldFromFGBColumn(column)) || [];\n return { metadata, fields };\n}\n/**\n * name: string;\n * type: ColumnType;\n * title: string | null;\n * description: string | null;\n * width: number;\n * precision: number;\n * scale: number;\n * nullable: boolean;\n * unique: boolean;\n * primary_key: boolean;\n */\nfunction getFieldFromFGBColumn(fgbColumn) {\n const metadata = {\n title: fgbColumn.title || '',\n description: fgbColumn.description || '',\n width: String(fgbColumn.width),\n precision: String(fgbColumn.precision),\n scale: String(fgbColumn.scale),\n unique: String(fgbColumn.unique),\n primary_key: String(fgbColumn.primary_key)\n };\n return {\n name: fgbColumn.name,\n type: getTypeFromFGBType(fgbColumn.type),\n nullable: fgbColumn.nullable,\n metadata\n };\n}\n/** Note: fgb.ColumType does not appear to be exported */\nvar fgbColumnType;\n(function (fgbColumnType) {\n fgbColumnType[fgbColumnType[\"Byte\"] = 0] = \"Byte\";\n fgbColumnType[fgbColumnType[\"UByte\"] = 1] = \"UByte\";\n fgbColumnType[fgbColumnType[\"Bool\"] = 2] = \"Bool\";\n fgbColumnType[fgbColumnType[\"Short\"] = 3] = \"Short\";\n fgbColumnType[fgbColumnType[\"UShort\"] = 4] = \"UShort\";\n fgbColumnType[fgbColumnType[\"Int\"] = 5] = \"Int\";\n fgbColumnType[fgbColumnType[\"UInt\"] = 6] = \"UInt\";\n fgbColumnType[fgbColumnType[\"Long\"] = 7] = \"Long\";\n fgbColumnType[fgbColumnType[\"ULong\"] = 8] = \"ULong\";\n fgbColumnType[fgbColumnType[\"Float\"] = 9] = \"Float\";\n fgbColumnType[fgbColumnType[\"Double\"] = 10] = \"Double\";\n fgbColumnType[fgbColumnType[\"String\"] = 11] = \"String\";\n fgbColumnType[fgbColumnType[\"Json\"] = 12] = \"Json\";\n fgbColumnType[fgbColumnType[\"DateTime\"] = 13] = \"DateTime\";\n fgbColumnType[fgbColumnType[\"Binary\"] = 14] = \"Binary\";\n})(fgbColumnType || (fgbColumnType = {}));\n/** Convert FGB types to arrow like types */\n// eslint-disable-next-line complexity\nfunction getTypeFromFGBType(fgbType /* fgb.ColumnMeta['type'] */) {\n switch (fgbType) {\n case fgbColumnType.Byte:\n return 'int8';\n case fgbColumnType.UByte:\n return 'uint8';\n case fgbColumnType.Bool:\n return 'bool';\n case fgbColumnType.Short:\n return 'int16';\n case fgbColumnType.UShort:\n return 'uint16';\n case fgbColumnType.Int:\n return 'int32';\n case fgbColumnType.UInt:\n return 'uint32';\n case fgbColumnType.Long:\n return 'int64';\n case fgbColumnType.ULong:\n return 'uint64';\n case fgbColumnType.Float:\n return 'float32';\n case fgbColumnType.Double:\n return 'float64';\n case fgbColumnType.String:\n return 'utf8';\n case fgbColumnType.Json:\n return 'null';\n case fgbColumnType.DateTime:\n return 'date-millisecond';\n case fgbColumnType.Binary:\n return 'binary';\n default:\n return 'null';\n }\n}\n", "// automatically generated by the FlatBuffers compiler, do not modify\nexport var GeometryType;\n(function (GeometryType) {\n GeometryType[GeometryType[\"Unknown\"] = 0] = \"Unknown\";\n GeometryType[GeometryType[\"Point\"] = 1] = \"Point\";\n GeometryType[GeometryType[\"LineString\"] = 2] = \"LineString\";\n GeometryType[GeometryType[\"Polygon\"] = 3] = \"Polygon\";\n GeometryType[GeometryType[\"MultiPoint\"] = 4] = \"MultiPoint\";\n GeometryType[GeometryType[\"MultiLineString\"] = 5] = \"MultiLineString\";\n GeometryType[GeometryType[\"MultiPolygon\"] = 6] = \"MultiPolygon\";\n GeometryType[GeometryType[\"GeometryCollection\"] = 7] = \"GeometryCollection\";\n GeometryType[GeometryType[\"CircularString\"] = 8] = \"CircularString\";\n GeometryType[GeometryType[\"CompoundCurve\"] = 9] = \"CompoundCurve\";\n GeometryType[GeometryType[\"CurvePolygon\"] = 10] = \"CurvePolygon\";\n GeometryType[GeometryType[\"MultiCurve\"] = 11] = \"MultiCurve\";\n GeometryType[GeometryType[\"MultiSurface\"] = 12] = \"MultiSurface\";\n GeometryType[GeometryType[\"Curve\"] = 13] = \"Curve\";\n GeometryType[GeometryType[\"Surface\"] = 14] = \"Surface\";\n GeometryType[GeometryType[\"PolyhedralSurface\"] = 15] = \"PolyhedralSurface\";\n GeometryType[GeometryType[\"TIN\"] = 16] = \"TIN\";\n GeometryType[GeometryType[\"Triangle\"] = 17] = \"Triangle\";\n})(GeometryType || (GeometryType = {}));\n", "// automatically generated by the FlatBuffers compiler, do not modify\nimport * as flatbuffers from 'flatbuffers';\nimport { GeometryType } from \"../flat-geobuf/geometry-type.js\";\nexport class Geometry {\n bb = null;\n bb_pos = 0;\n __init(i, bb) {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n static getRootAsGeometry(bb, obj) {\n return (obj || new Geometry()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n static getSizePrefixedRootAsGeometry(bb, obj) {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Geometry()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n ends(index) {\n const offset = this.bb.__offset(this.bb_pos, 4);\n return offset ? this.bb.readUint32(this.bb.__vector(this.bb_pos + offset) + index * 4) : 0;\n }\n endsLength() {\n const offset = this.bb.__offset(this.bb_pos, 4);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n }\n endsArray() {\n const offset = this.bb.__offset(this.bb_pos, 4);\n return offset\n ? new Uint32Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset))\n : null;\n }\n xy(index) {\n const offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? this.bb.readFloat64(this.bb.__vector(this.bb_pos + offset) + index * 8) : 0;\n }\n xyLength() {\n const offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n }\n xyArray() {\n const offset = this.bb.__offset(this.bb_pos, 6);\n return offset\n ? new Float64Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset))\n : null;\n }\n z(index) {\n const offset = this.bb.__offset(this.bb_pos, 8);\n return offset ? this.bb.readFloat64(this.bb.__vector(this.bb_pos + offset) + index * 8) : 0;\n }\n zLength() {\n const offset = this.bb.__offset(this.bb_pos, 8);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n }\n zArray() {\n const offset = this.bb.__offset(this.bb_pos, 8);\n return offset\n ? new Float64Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset))\n : null;\n }\n m(index) {\n const offset = this.bb.__offset(this.bb_pos, 10);\n return offset ? this.bb.readFloat64(this.bb.__vector(this.bb_pos + offset) + index * 8) : 0;\n }\n mLength() {\n const offset = this.bb.__offset(this.bb_pos, 10);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n }\n mArray() {\n const offset = this.bb.__offset(this.bb_pos, 10);\n return offset\n ? new Float64Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset))\n : null;\n }\n t(index) {\n const offset = this.bb.__offset(this.bb_pos, 12);\n return offset ? this.bb.readFloat64(this.bb.__vector(this.bb_pos + offset) + index * 8) : 0;\n }\n tLength() {\n const offset = this.bb.__offset(this.bb_pos, 12);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n }\n tArray() {\n const offset = this.bb.__offset(this.bb_pos, 12);\n return offset\n ? new Float64Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset))\n : null;\n }\n tm(index) {\n const offset = this.bb.__offset(this.bb_pos, 14);\n return offset\n ? this.bb.readUint64(this.bb.__vector(this.bb_pos + offset) + index * 8)\n : BigInt(0);\n }\n tmLength() {\n const offset = this.bb.__offset(this.bb_pos, 14);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n }\n type() {\n const offset = this.bb.__offset(this.bb_pos, 16);\n return offset ? this.bb.readUint8(this.bb_pos + offset) : GeometryType.Unknown;\n }\n parts(index, obj) {\n const offset = this.bb.__offset(this.bb_pos, 18);\n return offset\n ? (obj || new Geometry()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb)\n : null;\n }\n partsLength() {\n const offset = this.bb.__offset(this.bb_pos, 18);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n }\n static startGeometry(builder) {\n builder.startObject(8);\n }\n static addEnds(builder, endsOffset) {\n builder.addFieldOffset(0, endsOffset, 0);\n }\n static createEndsVector(builder, data) {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addInt32(data[i]);\n }\n return builder.endVector();\n }\n static startEndsVector(builder, numElems) {\n builder.startVector(4, numElems, 4);\n }\n static addXy(builder, xyOffset) {\n builder.addFieldOffset(1, xyOffset, 0);\n }\n static createXyVector(builder, data) {\n builder.startVector(8, data.length, 8);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addFloat64(data[i]);\n }\n return builder.endVector();\n }\n static startXyVector(builder, numElems) {\n builder.startVector(8, numElems, 8);\n }\n static addZ(builder, zOffset) {\n builder.addFieldOffset(2, zOffset, 0);\n }\n static createZVector(builder, data) {\n builder.startVector(8, data.length, 8);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addFloat64(data[i]);\n }\n return builder.endVector();\n }\n static startZVector(builder, numElems) {\n builder.startVector(8, numElems, 8);\n }\n static addM(builder, mOffset) {\n builder.addFieldOffset(3, mOffset, 0);\n }\n static createMVector(builder, data) {\n builder.startVector(8, data.length, 8);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addFloat64(data[i]);\n }\n return builder.endVector();\n }\n static startMVector(builder, numElems) {\n builder.startVector(8, numElems, 8);\n }\n static addT(builder, tOffset) {\n builder.addFieldOffset(4, tOffset, 0);\n }\n static createTVector(builder, data) {\n builder.startVector(8, data.length, 8);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addFloat64(data[i]);\n }\n return builder.endVector();\n }\n static startTVector(builder, numElems) {\n builder.startVector(8, numElems, 8);\n }\n static addTm(builder, tmOffset) {\n builder.addFieldOffset(5, tmOffset, 0);\n }\n static createTmVector(builder, data) {\n builder.startVector(8, data.length, 8);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addInt64(data[i]);\n }\n return builder.endVector();\n }\n static startTmVector(builder, numElems) {\n builder.startVector(8, numElems, 8);\n }\n static addType(builder, type) {\n builder.addFieldInt8(6, type, GeometryType.Unknown);\n }\n static addParts(builder, partsOffset) {\n builder.addFieldOffset(7, partsOffset, 0);\n }\n static createPartsVector(builder, data) {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n static startPartsVector(builder, numElems) {\n builder.startVector(4, numElems, 4);\n }\n static endGeometry(builder) {\n const offset = builder.endObject();\n return offset;\n }\n static createGeometry(builder, endsOffset, xyOffset, zOffset, mOffset, tOffset, tmOffset, type, partsOffset) {\n Geometry.startGeometry(builder);\n Geometry.addEnds(builder, endsOffset);\n Geometry.addXy(builder, xyOffset);\n Geometry.addZ(builder, zOffset);\n Geometry.addM(builder, mOffset);\n Geometry.addT(builder, tOffset);\n Geometry.addTm(builder, tmOffset);\n Geometry.addType(builder, type);\n Geometry.addParts(builder, partsOffset);\n return Geometry.endGeometry(builder);\n }\n}\n", "import { GeometryType } from \"../flat-geobuf/geometry-type.js\";\nimport { Geometry } from \"../flat-geobuf/geometry.js\";\nexport function buildGeometry(builder, parsedGeometry) {\n const { xy, z, ends, parts, type } = parsedGeometry;\n if (parts) {\n const partOffsets = parts.map((part) => buildGeometry(builder, part));\n const partsOffset = Geometry.createPartsVector(builder, partOffsets);\n Geometry.startGeometry(builder);\n Geometry.addParts(builder, partsOffset);\n Geometry.addType(builder, type);\n return Geometry.endGeometry(builder);\n }\n const xyOffset = Geometry.createXyVector(builder, xy);\n let zOffset;\n if (z)\n zOffset = Geometry.createZVector(builder, z);\n let endsOffset;\n if (ends)\n endsOffset = Geometry.createEndsVector(builder, ends);\n Geometry.startGeometry(builder);\n if (endsOffset)\n Geometry.addEnds(builder, endsOffset);\n Geometry.addXy(builder, xyOffset);\n if (zOffset)\n Geometry.addZ(builder, zOffset);\n Geometry.addType(builder, type);\n return Geometry.endGeometry(builder);\n}\nexport function flat(a, xy, z) {\n if (a.length === 0)\n return;\n if (Array.isArray(a[0])) {\n for (const sa of a)\n flat(sa, xy, z);\n }\n else if (a.length === 2)\n xy.push(...a);\n else {\n xy.push(a[0], a[1]);\n z.push(a[2]);\n }\n}\nexport function parseGeometry(geometry, headerGeomType) {\n let xy;\n let ends;\n let parts;\n let type = headerGeomType;\n if (type === GeometryType.Unknown) {\n type = toGeometryType(geometry.getType());\n }\n if (type === GeometryType.MultiLineString) {\n if (geometry.getFlatCoordinates)\n xy = geometry.getFlatCoordinates();\n const mlsEnds = geometry.getEnds();\n if (mlsEnds.length > 1)\n ends = mlsEnds.map((e) => e >> 1);\n }\n else if (type === GeometryType.Polygon) {\n if (geometry.getFlatCoordinates)\n xy = geometry.getFlatCoordinates();\n const pEnds = geometry.getEnds();\n if (pEnds.length > 1)\n ends = pEnds.map((e) => e >> 1);\n }\n else if (type === GeometryType.MultiPolygon) {\n const mp = geometry;\n parts = mp.getPolygons().map((p) => parseGeometry(p, GeometryType.Polygon));\n }\n else if (geometry.getFlatCoordinates)\n xy = geometry.getFlatCoordinates();\n return {\n xy,\n ends,\n type,\n parts\n };\n}\nexport function pairFlatCoordinates(xy, z) {\n const newArray = [];\n for (let i = 0; i < xy.length; i += 2) {\n const a = [xy[i], xy[i + 1]];\n if (z)\n a.push(z[i >> 1]);\n newArray.push(a);\n }\n return newArray;\n}\nexport function toGeometryType(name) {\n if (!name)\n return GeometryType.Unknown;\n const type = GeometryType[name];\n return type;\n}\n", "import { GeometryType } from \"../flat-geobuf/geometry-type.js\";\nimport { flat, pairFlatCoordinates, toGeometryType } from \"../generic/geometry.js\";\nexport function parseGeometry(geometry) {\n const cs = geometry.coordinates;\n const xy = [];\n const z = [];\n let ends;\n let parts;\n const type = toGeometryType(geometry.type);\n let end = 0;\n switch (geometry.type) {\n case 'Point':\n flat(cs, xy, z);\n break;\n case 'MultiPoint':\n case 'LineString':\n flat(cs, xy, z);\n break;\n case 'MultiLineString':\n case 'Polygon': {\n const css = cs;\n flat(css, xy, z);\n if (css.length > 1)\n ends = css.map((c) => (end += c.length));\n break;\n }\n case 'MultiPolygon': {\n const csss = cs;\n const geometries = csss.map((coordinates) => ({\n type: 'Polygon',\n coordinates\n }));\n parts = geometries.map(parseGeometry);\n break;\n }\n }\n return {\n xy,\n z: z.length > 0 ? z : undefined,\n ends,\n type,\n parts\n };\n}\nexport function parseGC(geometry) {\n const type = toGeometryType(geometry.type);\n const parts = [];\n for (let i = 0; i < geometry.geometries.length; i++) {\n const g = geometry.geometries[i];\n if (g.type === 'GeometryCollection')\n parts.push(parseGC(g));\n else\n parts.push(parseGeometry(g));\n }\n return {\n type,\n parts\n };\n}\nfunction extractParts(xy, z, ends) {\n if (!ends || ends.length === 0)\n return [pairFlatCoordinates(xy, z)];\n let s = 0;\n const xySlices = Array.from(ends).map((e) => xy.slice(s, (s = e << 1)));\n let zSlices;\n if (z) {\n s = 0;\n zSlices = Array.from(ends).map((e) => z.slice(s, (s = e)));\n }\n return xySlices.map((xy, i) => pairFlatCoordinates(xy, zSlices ? zSlices[i] : undefined));\n}\nfunction toGeoJsonCoordinates(geometry, type) {\n const xy = geometry.xyArray();\n const z = geometry.zArray();\n switch (type) {\n case GeometryType.Point: {\n const a = Array.from(xy);\n if (z)\n a.push(z[0]);\n return a;\n }\n case GeometryType.MultiPoint:\n case GeometryType.LineString:\n return pairFlatCoordinates(xy, z);\n case GeometryType.MultiLineString:\n return extractParts(xy, z, geometry.endsArray());\n case GeometryType.Polygon:\n return extractParts(xy, z, geometry.endsArray());\n }\n}\nexport function fromGeometry(geometry, headerType) {\n let type = headerType;\n if (type === GeometryType.Unknown) {\n type = geometry.type();\n }\n if (type === GeometryType.GeometryCollection) {\n const geometries = [];\n for (let i = 0; i < geometry.partsLength(); i++) {\n const part = geometry.parts(i);\n const partType = part.type();\n geometries.push(fromGeometry(part, partType));\n }\n return {\n type: GeometryType[type],\n geometries\n };\n }\n else if (type === GeometryType.MultiPolygon) {\n const geometries = [];\n for (let i = 0; i < geometry.partsLength(); i++)\n geometries.push(fromGeometry(geometry.parts(i), GeometryType.Polygon));\n return {\n type: GeometryType[type],\n coordinates: geometries.map((g) => g.coordinates)\n };\n }\n const coordinates = toGeoJsonCoordinates(geometry, type);\n return {\n type: GeometryType[type],\n coordinates\n };\n}\n", "import * as flatbuffers from 'flatbuffers';\nimport { ColumnType } from \"../flat-geobuf/column-type.js\";\nimport { Feature } from \"../flat-geobuf/feature.js\";\nimport { buildGeometry } from \"./geometry.js\";\nconst textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\nexport function fromFeature(feature, header, createGeometry, createFeature) {\n const columns = header.columns;\n const geometry = feature.geometry();\n const simpleGeometry = createGeometry(geometry, header.geometryType);\n const properties = parseProperties(feature, columns);\n return createFeature(simpleGeometry, properties);\n}\nexport function buildFeature(geometry, properties, header) {\n const columns = header.columns;\n const builder = new flatbuffers.Builder();\n let offset = 0;\n let capacity = 1024;\n let bytes = new Uint8Array(capacity);\n let view = new DataView(bytes.buffer);\n const prep = function (size) {\n if (offset + size < capacity)\n return;\n capacity = Math.max(capacity + size, capacity * 2);\n const newBytes = new Uint8Array(capacity);\n newBytes.set(bytes);\n bytes = newBytes;\n view = new DataView(bytes.buffer);\n };\n if (columns) {\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i];\n const value = properties[column.name];\n if (value === null)\n continue;\n prep(2);\n view.setUint16(offset, i, true);\n offset += 2;\n switch (column.type) {\n case ColumnType.Bool:\n prep(1);\n view.setUint8(offset, value);\n offset += 1;\n break;\n case ColumnType.Short:\n prep(2);\n view.setInt16(offset, value, true);\n offset += 2;\n break;\n case ColumnType.UShort:\n prep(2);\n view.setUint16(offset, value, true);\n offset += 2;\n break;\n case ColumnType.Int:\n prep(4);\n view.setInt32(offset, value, true);\n offset += 4;\n break;\n case ColumnType.UInt:\n prep(4);\n view.setUint32(offset, value, true);\n offset += 4;\n break;\n case ColumnType.Long:\n prep(8);\n view.setBigInt64(offset, BigInt(value), true);\n offset += 8;\n break;\n case ColumnType.Float:\n prep(4);\n view.setFloat32(offset, value, true);\n offset += 4;\n break;\n case ColumnType.Double:\n prep(8);\n view.setFloat64(offset, value, true);\n offset += 8;\n break;\n case ColumnType.DateTime:\n case ColumnType.String: {\n const str = textEncoder.encode(value);\n prep(4);\n view.setUint32(offset, str.length, true);\n offset += 4;\n prep(str.length);\n bytes.set(str, offset);\n offset += str.length;\n break;\n }\n case ColumnType.Json: {\n const str = textEncoder.encode(JSON.stringify(value));\n prep(4);\n view.setUint32(offset, str.length, true);\n offset += 4;\n prep(str.length);\n bytes.set(str, offset);\n offset += str.length;\n break;\n }\n default:\n throw new Error(`Unknown type ${column.type}`);\n }\n }\n }\n let propertiesOffset = null;\n if (offset > 0)\n propertiesOffset = Feature.createPropertiesVector(builder, bytes.slice(0, offset));\n const geometryOffset = buildGeometry(builder, geometry);\n Feature.startFeature(builder);\n Feature.addGeometry(builder, geometryOffset);\n if (propertiesOffset)\n Feature.addProperties(builder, propertiesOffset);\n const featureOffset = Feature.endFeature(builder);\n builder.finishSizePrefixed(featureOffset);\n return builder.asUint8Array();\n}\nexport function parseProperties(feature, columns) {\n const properties = {};\n if (!columns || columns.length === 0)\n return properties;\n const array = feature.propertiesArray();\n if (!array)\n return properties;\n const view = new DataView(array.buffer, array.byteOffset);\n const length = feature.propertiesLength();\n let offset = 0;\n while (offset < length) {\n const i = view.getUint16(offset, true);\n offset += 2;\n const column = columns[i];\n const name = column.name;\n switch (column.type) {\n case ColumnType.Bool: {\n properties[name] = Boolean(view.getUint8(offset));\n offset += 1;\n break;\n }\n case ColumnType.Byte: {\n properties[name] = view.getInt8(offset);\n offset += 1;\n break;\n }\n case ColumnType.UByte: {\n properties[name] = view.getUint8(offset);\n offset += 1;\n break;\n }\n case ColumnType.Short: {\n properties[name] = view.getInt16(offset, true);\n offset += 2;\n break;\n }\n case ColumnType.UShort: {\n properties[name] = view.getUint16(offset, true);\n offset += 2;\n break;\n }\n case ColumnType.Int: {\n properties[name] = view.getInt32(offset, true);\n offset += 4;\n break;\n }\n case ColumnType.UInt: {\n properties[name] = view.getUint32(offset, true);\n offset += 4;\n break;\n }\n case ColumnType.Long: {\n properties[name] = Number(view.getBigInt64(offset, true));\n offset += 8;\n break;\n }\n case ColumnType.ULong: {\n properties[name] = Number(view.getBigUint64(offset, true));\n offset += 8;\n break;\n }\n case ColumnType.Float: {\n properties[name] = view.getFloat32(offset, true);\n offset += 4;\n break;\n }\n case ColumnType.Double: {\n properties[name] = view.getFloat64(offset, true);\n offset += 8;\n break;\n }\n case ColumnType.DateTime:\n case ColumnType.String: {\n const length = view.getUint32(offset, true);\n offset += 4;\n properties[name] = textDecoder.decode(array.subarray(offset, offset + length));\n offset += length;\n break;\n }\n case ColumnType.Json: {\n const length = view.getUint32(offset, true);\n offset += 4;\n const str = textDecoder.decode(array.subarray(offset, offset + length));\n properties[name] = JSON.parse(str);\n offset += length;\n break;\n }\n default:\n throw new Error(`Unknown type ${column.type}`);\n }\n }\n return properties;\n}\n", "// automatically generated by the FlatBuffers compiler, do not modify\nexport var ColumnType;\n(function (ColumnType) {\n ColumnType[ColumnType[\"Byte\"] = 0] = \"Byte\";\n ColumnType[ColumnType[\"UByte\"] = 1] = \"UByte\";\n ColumnType[ColumnType[\"Bool\"] = 2] = \"Bool\";\n ColumnType[ColumnType[\"Short\"] = 3] = \"Short\";\n ColumnType[ColumnType[\"UShort\"] = 4] = \"UShort\";\n ColumnType[ColumnType[\"Int\"] = 5] = \"Int\";\n ColumnType[ColumnType[\"UInt\"] = 6] = \"UInt\";\n ColumnType[ColumnType[\"Long\"] = 7] = \"Long\";\n ColumnType[ColumnType[\"ULong\"] = 8] = \"ULong\";\n ColumnType[ColumnType[\"Float\"] = 9] = \"Float\";\n ColumnType[ColumnType[\"Double\"] = 10] = \"Double\";\n ColumnType[ColumnType[\"String\"] = 11] = \"String\";\n ColumnType[ColumnType[\"Json\"] = 12] = \"Json\";\n ColumnType[ColumnType[\"DateTime\"] = 13] = \"DateTime\";\n ColumnType[ColumnType[\"Binary\"] = 14] = \"Binary\";\n})(ColumnType || (ColumnType = {}));\n", "// automatically generated by the FlatBuffers compiler, do not modify\nimport * as flatbuffers from 'flatbuffers';\nimport { Column } from \"../flat-geobuf/column.js\";\nimport { Geometry } from \"../flat-geobuf/geometry.js\";\nexport class Feature {\n bb = null;\n bb_pos = 0;\n __init(i, bb) {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n static getRootAsFeature(bb, obj) {\n return (obj || new Feature()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n static getSizePrefixedRootAsFeature(bb, obj) {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Feature()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n geometry(obj) {\n const offset = this.bb.__offset(this.bb_pos, 4);\n return offset\n ? (obj || new Geometry()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb)\n : null;\n }\n properties(index) {\n const offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) : 0;\n }\n propertiesLength() {\n const offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n }\n propertiesArray() {\n const offset = this.bb.__offset(this.bb_pos, 6);\n return offset\n ? new Uint8Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset))\n : null;\n }\n columns(index, obj) {\n const offset = this.bb.__offset(this.bb_pos, 8);\n return offset\n ? (obj || new Column()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb)\n : null;\n }\n columnsLength() {\n const offset = this.bb.__offset(this.bb_pos, 8);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n }\n static startFeature(builder) {\n builder.startObject(3);\n }\n static addGeometry(builder, geometryOffset) {\n builder.addFieldOffset(0, geometryOffset, 0);\n }\n static addProperties(builder, propertiesOffset) {\n builder.addFieldOffset(1, propertiesOffset, 0);\n }\n static createPropertiesVector(builder, data) {\n builder.startVector(1, data.length, 1);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addInt8(data[i]);\n }\n return builder.endVector();\n }\n static startPropertiesVector(builder, numElems) {\n builder.startVector(1, numElems, 1);\n }\n static addColumns(builder, columnsOffset) {\n builder.addFieldOffset(2, columnsOffset, 0);\n }\n static createColumnsVector(builder, data) {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n static startColumnsVector(builder, numElems) {\n builder.startVector(4, numElems, 4);\n }\n static endFeature(builder) {\n const offset = builder.endObject();\n return offset;\n }\n static finishFeatureBuffer(builder, offset) {\n builder.finish(offset);\n }\n static finishSizePrefixedFeatureBuffer(builder, offset) {\n builder.finish(offset, undefined, true);\n }\n static createFeature(builder, geometryOffset, propertiesOffset, columnsOffset) {\n Feature.startFeature(builder);\n Feature.addGeometry(builder, geometryOffset);\n Feature.addProperties(builder, propertiesOffset);\n Feature.addColumns(builder, columnsOffset);\n return Feature.endFeature(builder);\n }\n}\n", "// automatically generated by the FlatBuffers compiler, do not modify\nimport * as flatbuffers from 'flatbuffers';\nimport { ColumnType } from \"../flat-geobuf/column-type.js\";\nexport class Column {\n bb = null;\n bb_pos = 0;\n __init(i, bb) {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n static getRootAsColumn(bb, obj) {\n return (obj || new Column()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n static getSizePrefixedRootAsColumn(bb, obj) {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Column()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n name(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 4);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n type() {\n const offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? this.bb.readUint8(this.bb_pos + offset) : ColumnType.Byte;\n }\n title(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 8);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n description(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 10);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n width() {\n const offset = this.bb.__offset(this.bb_pos, 12);\n return offset ? this.bb.readInt32(this.bb_pos + offset) : -1;\n }\n precision() {\n const offset = this.bb.__offset(this.bb_pos, 14);\n return offset ? this.bb.readInt32(this.bb_pos + offset) : -1;\n }\n scale() {\n const offset = this.bb.__offset(this.bb_pos, 16);\n return offset ? this.bb.readInt32(this.bb_pos + offset) : -1;\n }\n nullable() {\n const offset = this.bb.__offset(this.bb_pos, 18);\n return offset ? Boolean(this.bb.readInt8(this.bb_pos + offset)) : true;\n }\n unique() {\n const offset = this.bb.__offset(this.bb_pos, 20);\n return offset ? Boolean(this.bb.readInt8(this.bb_pos + offset)) : false;\n }\n primaryKey() {\n const offset = this.bb.__offset(this.bb_pos, 22);\n return offset ? Boolean(this.bb.readInt8(this.bb_pos + offset)) : false;\n }\n metadata(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 24);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n static startColumn(builder) {\n builder.startObject(11);\n }\n static addName(builder, nameOffset) {\n builder.addFieldOffset(0, nameOffset, 0);\n }\n static addType(builder, type) {\n builder.addFieldInt8(1, type, ColumnType.Byte);\n }\n static addTitle(builder, titleOffset) {\n builder.addFieldOffset(2, titleOffset, 0);\n }\n static addDescription(builder, descriptionOffset) {\n builder.addFieldOffset(3, descriptionOffset, 0);\n }\n static addWidth(builder, width) {\n builder.addFieldInt32(4, width, -1);\n }\n static addPrecision(builder, precision) {\n builder.addFieldInt32(5, precision, -1);\n }\n static addScale(builder, scale) {\n builder.addFieldInt32(6, scale, -1);\n }\n static addNullable(builder, nullable) {\n builder.addFieldInt8(7, Number(nullable), Number(true));\n }\n static addUnique(builder, unique) {\n builder.addFieldInt8(8, Number(unique), Number(false));\n }\n static addPrimaryKey(builder, primaryKey) {\n builder.addFieldInt8(9, Number(primaryKey), Number(false));\n }\n static addMetadata(builder, metadataOffset) {\n builder.addFieldOffset(10, metadataOffset, 0);\n }\n static endColumn(builder) {\n const offset = builder.endObject();\n builder.requiredField(offset, 4); // name\n return offset;\n }\n static createColumn(builder, nameOffset, type, titleOffset, descriptionOffset, width, precision, scale, nullable, unique, primaryKey, metadataOffset) {\n Column.startColumn(builder);\n Column.addName(builder, nameOffset);\n Column.addType(builder, type);\n Column.addTitle(builder, titleOffset);\n Column.addDescription(builder, descriptionOffset);\n Column.addWidth(builder, width);\n Column.addPrecision(builder, precision);\n Column.addScale(builder, scale);\n Column.addNullable(builder, nullable);\n Column.addUnique(builder, unique);\n Column.addPrimaryKey(builder, primaryKey);\n Column.addMetadata(builder, metadataOffset);\n return Column.endColumn(builder);\n }\n}\n", "import { fromGeometry } from \"./geometry.js\";\nimport { parseProperties } from \"../generic/feature.js\";\nexport function fromFeature(feature, header) {\n const columns = header.columns;\n const geometry = fromGeometry(feature.geometry(), header.geometryType);\n const geoJsonfeature = {\n type: 'Feature',\n geometry,\n properties: parseProperties(feature, columns)\n };\n return geoJsonfeature;\n}\n", "import * as flatbuffers from 'flatbuffers';\nimport slice from 'slice-source';\nimport { Header } from \"../flat-geobuf/header.js\";\nimport { Column } from \"../flat-geobuf/column.js\";\nimport { ColumnType } from \"../flat-geobuf/column-type.js\";\nimport { Feature } from \"../flat-geobuf/feature.js\";\nimport { fromByteBuffer } from \"../header-meta.js\";\nimport { buildFeature } from \"./feature.js\";\nimport { HttpReader } from \"../http-reader.js\";\nimport Logger from \"../logger.js\";\nimport { calcTreeSize } from \"../packedrtree.js\";\nimport { parseGeometry } from \"./geometry.js\";\nimport { magicbytes, SIZE_PREFIX_LEN } from \"../constants.js\";\nimport { inferGeometryType } from \"./header.js\";\n/**\n * Serialize generic features to FlatGeobuf\n * @param features\n */\nexport function serialize(features) {\n const headerMeta = introspectHeaderMeta(features);\n const header = buildHeader(headerMeta);\n const featureBuffers = features.map((f) => {\n if (!f.getGeometry)\n throw new Error('Missing getGeometry implementation');\n if (!f.getProperties)\n throw new Error('Missing getProperties implementation');\n return buildFeature(parseGeometry(f.getGeometry(), headerMeta.geometryType), f.getProperties(), headerMeta);\n });\n const featuresLength = featureBuffers.map((f) => f.length).reduce((a, b) => a + b);\n const uint8 = new Uint8Array(magicbytes.length + header.length + featuresLength);\n uint8.set(header, magicbytes.length);\n let offset = magicbytes.length + header.length;\n for (const feature of featureBuffers) {\n uint8.set(feature, offset);\n offset += feature.length;\n }\n uint8.set(magicbytes);\n return uint8;\n}\nexport function deserialize(bytes, fromFeature, headerMetaFn) {\n if (!bytes.subarray(0, 3).every((v, i) => magicbytes[i] === v))\n throw new Error('Not a FlatGeobuf file');\n const bb = new flatbuffers.ByteBuffer(bytes);\n const headerLength = bb.readUint32(magicbytes.length);\n bb.setPosition(magicbytes.length + SIZE_PREFIX_LEN);\n const headerMeta = fromByteBuffer(bb);\n if (headerMetaFn)\n headerMetaFn(headerMeta);\n let offset = magicbytes.length + SIZE_PREFIX_LEN + headerLength;\n const { indexNodeSize, featuresCount } = headerMeta;\n if (indexNodeSize > 0)\n offset += calcTreeSize(featuresCount, indexNodeSize);\n const features = [];\n while (offset < bb.capacity()) {\n const featureLength = bb.readUint32(offset);\n bb.setPosition(offset + SIZE_PREFIX_LEN);\n const feature = Feature.getRootAsFeature(bb);\n features.push(fromFeature(feature, headerMeta));\n offset += SIZE_PREFIX_LEN + featureLength;\n }\n return features;\n}\nexport async function* deserializeStream(stream, fromFeature, headerMetaFn) {\n const reader = slice(stream);\n const read = async (size) => await reader.slice(size);\n let bytes = new Uint8Array(await read(8, 'magic bytes'));\n if (!bytes.subarray(0, 3).every((v, i) => magicbytes[i] === v))\n throw new Error('Not a FlatGeobuf file');\n bytes = new Uint8Array(await read(4, 'header length'));\n let bb = new flatbuffers.ByteBuffer(bytes);\n const headerLength = bb.readUint32(0);\n bytes = new Uint8Array(await read(headerLength, 'header data'));\n bb = new flatbuffers.ByteBuffer(bytes);\n const headerMeta = fromByteBuffer(bb);\n if (headerMetaFn)\n headerMetaFn(headerMeta);\n const { indexNodeSize, featuresCount } = headerMeta;\n if (indexNodeSize > 0) {\n const treeSize = calcTreeSize(featuresCount, indexNodeSize);\n await read(treeSize, 'entire index, w/o rect');\n }\n let feature;\n while ((feature = await readFeature(read, headerMeta, fromFeature)))\n yield feature;\n}\nexport async function* deserializeFiltered(url, rect, fromFeature, headerMetaFn) {\n const reader = await HttpReader.open(url);\n Logger.debug('opened reader');\n if (headerMetaFn)\n headerMetaFn(reader.header);\n for await (const feature of reader.selectBbox(rect)) {\n yield fromFeature(feature, reader.header);\n }\n}\nasync function readFeature(read, headerMeta, fromFeature) {\n let bytes = new Uint8Array(await read(4, 'feature length'));\n if (bytes.byteLength === 0)\n return;\n let bb = new flatbuffers.ByteBuffer(bytes);\n const featureLength = bb.readUint32(0);\n bytes = new Uint8Array(await read(featureLength, 'feature data'));\n const bytesAligned = new Uint8Array(featureLength + 4);\n bytesAligned.set(bytes, 4);\n bb = new flatbuffers.ByteBuffer(bytesAligned);\n bb.setPosition(SIZE_PREFIX_LEN);\n const feature = Feature.getRootAsFeature(bb);\n return fromFeature(feature, headerMeta);\n}\nfunction buildColumn(builder, column) {\n const nameOffset = builder.createString(column.name);\n Column.startColumn(builder);\n Column.addName(builder, nameOffset);\n Column.addType(builder, column.type);\n return Column.endColumn(builder);\n}\nexport function buildHeader(header) {\n const builder = new flatbuffers.Builder();\n let columnOffsets = null;\n if (header.columns)\n columnOffsets = Header.createColumnsVector(builder, header.columns.map((c) => buildColumn(builder, c)));\n const nameOffset = builder.createString('L1');\n Header.startHeader(builder);\n Header.addFeaturesCount(builder, BigInt(header.featuresCount));\n Header.addGeometryType(builder, header.geometryType);\n Header.addIndexNodeSize(builder, 0);\n if (columnOffsets)\n Header.addColumns(builder, columnOffsets);\n Header.addName(builder, nameOffset);\n const offset = Header.endHeader(builder);\n builder.finishSizePrefixed(offset);\n return builder.asUint8Array();\n}\nfunction valueToType(value) {\n if (typeof value === 'boolean')\n return ColumnType.Bool;\n else if (typeof value === 'number')\n if (value % 1 === 0)\n return ColumnType.Int;\n else\n return ColumnType.Double;\n else if (typeof value === 'string')\n return ColumnType.String;\n else if (value === null)\n return ColumnType.String;\n else if (typeof value === 'object')\n return ColumnType.Json;\n throw new Error(`Unknown type (value '${value}')`);\n}\nexport function mapColumn(properties, k) {\n return {\n name: k,\n type: valueToType(properties[k]),\n title: null,\n description: null,\n width: -1,\n precision: -1,\n scale: -1,\n nullable: true,\n unique: false,\n primary_key: false\n };\n}\nfunction introspectHeaderMeta(features) {\n const sampleFeature = features[0];\n const properties = sampleFeature.getProperties ? sampleFeature.getProperties() : {};\n let columns = null;\n if (properties)\n columns = Object.keys(properties)\n .filter((key) => key !== 'geometry')\n .map((k) => mapColumn(properties, k));\n const geometryType = inferGeometryType(features);\n const headerMeta = {\n geometryType,\n columns,\n envelope: null,\n featuresCount: features.length,\n indexNodeSize: 0,\n crs: null,\n title: null,\n description: null,\n metadata: null\n };\n return headerMeta;\n}\n", "// automatically generated by the FlatBuffers compiler, do not modify\nimport * as flatbuffers from 'flatbuffers';\nimport { Column } from \"../flat-geobuf/column.js\";\nimport { Crs } from \"../flat-geobuf/crs.js\";\nimport { GeometryType } from \"../flat-geobuf/geometry-type.js\";\nexport class Header {\n bb = null;\n bb_pos = 0;\n __init(i, bb) {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n static getRootAsHeader(bb, obj) {\n return (obj || new Header()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n static getSizePrefixedRootAsHeader(bb, obj) {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Header()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n name(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 4);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n envelope(index) {\n const offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? this.bb.readFloat64(this.bb.__vector(this.bb_pos + offset) + index * 8) : 0;\n }\n envelopeLength() {\n const offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n }\n envelopeArray() {\n const offset = this.bb.__offset(this.bb_pos, 6);\n return offset\n ? new Float64Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset))\n : null;\n }\n geometryType() {\n const offset = this.bb.__offset(this.bb_pos, 8);\n return offset ? this.bb.readUint8(this.bb_pos + offset) : GeometryType.Unknown;\n }\n hasZ() {\n const offset = this.bb.__offset(this.bb_pos, 10);\n return offset ? Boolean(this.bb.readInt8(this.bb_pos + offset)) : false;\n }\n hasM() {\n const offset = this.bb.__offset(this.bb_pos, 12);\n return offset ? Boolean(this.bb.readInt8(this.bb_pos + offset)) : false;\n }\n hasT() {\n const offset = this.bb.__offset(this.bb_pos, 14);\n return offset ? Boolean(this.bb.readInt8(this.bb_pos + offset)) : false;\n }\n hasTm() {\n const offset = this.bb.__offset(this.bb_pos, 16);\n return offset ? Boolean(this.bb.readInt8(this.bb_pos + offset)) : false;\n }\n columns(index, obj) {\n const offset = this.bb.__offset(this.bb_pos, 18);\n return offset\n ? (obj || new Column()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb)\n : null;\n }\n columnsLength() {\n const offset = this.bb.__offset(this.bb_pos, 18);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n }\n featuresCount() {\n const offset = this.bb.__offset(this.bb_pos, 20);\n return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt('0');\n }\n indexNodeSize() {\n const offset = this.bb.__offset(this.bb_pos, 22);\n return offset ? this.bb.readUint16(this.bb_pos + offset) : 16;\n }\n crs(obj) {\n const offset = this.bb.__offset(this.bb_pos, 24);\n return offset\n ? (obj || new Crs()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb)\n : null;\n }\n title(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 26);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n description(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 28);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n metadata(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 30);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n static startHeader(builder) {\n builder.startObject(14);\n }\n static addName(builder, nameOffset) {\n builder.addFieldOffset(0, nameOffset, 0);\n }\n static addEnvelope(builder, envelopeOffset) {\n builder.addFieldOffset(1, envelopeOffset, 0);\n }\n static createEnvelopeVector(builder, data) {\n builder.startVector(8, data.length, 8);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addFloat64(data[i]);\n }\n return builder.endVector();\n }\n static startEnvelopeVector(builder, numElems) {\n builder.startVector(8, numElems, 8);\n }\n static addGeometryType(builder, geometryType) {\n builder.addFieldInt8(2, geometryType, GeometryType.Unknown);\n }\n static addHasZ(builder, hasZ) {\n builder.addFieldInt8(3, Number(hasZ), Number(false));\n }\n static addHasM(builder, hasM) {\n builder.addFieldInt8(4, Number(hasM), Number(false));\n }\n static addHasT(builder, hasT) {\n builder.addFieldInt8(5, Number(hasT), Number(false));\n }\n static addHasTm(builder, hasTm) {\n builder.addFieldInt8(6, Number(hasTm), Number(false));\n }\n static addColumns(builder, columnsOffset) {\n builder.addFieldOffset(7, columnsOffset, 0);\n }\n static createColumnsVector(builder, data) {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n static startColumnsVector(builder, numElems) {\n builder.startVector(4, numElems, 4);\n }\n static addFeaturesCount(builder, featuresCount) {\n builder.addFieldInt64(8, featuresCount, BigInt('0'));\n }\n static addIndexNodeSize(builder, indexNodeSize) {\n builder.addFieldInt16(9, indexNodeSize, 16);\n }\n static addCrs(builder, crsOffset) {\n builder.addFieldOffset(10, crsOffset, 0);\n }\n static addTitle(builder, titleOffset) {\n builder.addFieldOffset(11, titleOffset, 0);\n }\n static addDescription(builder, descriptionOffset) {\n builder.addFieldOffset(12, descriptionOffset, 0);\n }\n static addMetadata(builder, metadataOffset) {\n builder.addFieldOffset(13, metadataOffset, 0);\n }\n static endHeader(builder) {\n const offset = builder.endObject();\n return offset;\n }\n static finishHeaderBuffer(builder, offset) {\n builder.finish(offset);\n }\n static finishSizePrefixedHeaderBuffer(builder, offset) {\n builder.finish(offset, undefined, true);\n }\n}\n", "// automatically generated by the FlatBuffers compiler, do not modify\nimport * as flatbuffers from 'flatbuffers';\nexport class Crs {\n bb = null;\n bb_pos = 0;\n __init(i, bb) {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n static getRootAsCrs(bb, obj) {\n return (obj || new Crs()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n static getSizePrefixedRootAsCrs(bb, obj) {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Crs()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n org(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 4);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n code() {\n const offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n }\n name(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 8);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n description(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 10);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n wkt(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 12);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n codeString(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 14);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n static startCrs(builder) {\n builder.startObject(6);\n }\n static addOrg(builder, orgOffset) {\n builder.addFieldOffset(0, orgOffset, 0);\n }\n static addCode(builder, code) {\n builder.addFieldInt32(1, code, 0);\n }\n static addName(builder, nameOffset) {\n builder.addFieldOffset(2, nameOffset, 0);\n }\n static addDescription(builder, descriptionOffset) {\n builder.addFieldOffset(3, descriptionOffset, 0);\n }\n static addWkt(builder, wktOffset) {\n builder.addFieldOffset(4, wktOffset, 0);\n }\n static addCodeString(builder, codeStringOffset) {\n builder.addFieldOffset(5, codeStringOffset, 0);\n }\n static endCrs(builder) {\n const offset = builder.endObject();\n return offset;\n }\n static createCrs(builder, orgOffset, code, nameOffset, descriptionOffset, wktOffset, codeStringOffset) {\n Crs.startCrs(builder);\n Crs.addOrg(builder, orgOffset);\n Crs.addCode(builder, code);\n Crs.addName(builder, nameOffset);\n Crs.addDescription(builder, descriptionOffset);\n Crs.addWkt(builder, wktOffset);\n Crs.addCodeString(builder, codeStringOffset);\n return Crs.endCrs(builder);\n }\n}\n", "import { Header } from \"./flat-geobuf/header.js\";\nexport function fromByteBuffer(bb) {\n const header = Header.getRootAsHeader(bb);\n const featuresCount = header.featuresCount();\n const indexNodeSize = header.indexNodeSize();\n const columns = [];\n for (let j = 0; j < header.columnsLength(); j++) {\n const column = header.columns(j);\n if (!column)\n throw new Error('Column unexpectedly missing');\n if (!column.name())\n throw new Error('Column name unexpectedly missing');\n columns.push({\n name: column.name(),\n type: column.type(),\n title: column.title(),\n description: column.description(),\n width: column.width(),\n precision: column.precision(),\n scale: column.scale(),\n nullable: column.nullable(),\n unique: column.unique(),\n primary_key: column.primaryKey()\n });\n }\n const crs = header.crs();\n const crsMeta = crs\n ? {\n org: crs.org(),\n code: crs.code(),\n name: crs.name(),\n description: crs.description(),\n wkt: crs.wkt(),\n code_string: crs.codeString()\n }\n : null;\n const headerMeta = {\n geometryType: header.geometryType(),\n columns,\n envelope: null,\n featuresCount: Number(featuresCount),\n indexNodeSize,\n crs: crsMeta,\n title: header.title(),\n description: header.description(),\n metadata: header.metadata()\n };\n return headerMeta;\n}\n", "import * as flatbuffers from 'flatbuffers';\nimport { Repeater } from '@repeaterjs/repeater';\nimport { calcTreeSize, DEFAULT_NODE_SIZE, NODE_ITEM_BYTE_LEN, streamSearch } from \"./packedrtree.js\";\nimport { magicbytes, SIZE_PREFIX_LEN } from \"./constants.js\";\nimport Config from \"./config.js\";\nimport Logger from \"./logger.js\";\nimport { fromByteBuffer } from \"./header-meta.js\";\nimport { Feature } from \"./flat-geobuf/feature.js\";\nexport class HttpReader {\n headerClient;\n header;\n headerLength;\n indexLength;\n constructor(headerClient, header, headerLength, indexLength) {\n this.headerClient = headerClient;\n this.header = header;\n this.headerLength = headerLength;\n this.indexLength = indexLength;\n }\n // Fetch the header, preparing the reader to read Feature data.\n //\n // and potentially some opportunistic fetching of the index.\n static async open(url) {\n // In reality, the header is probably less than half this size, but\n // better to overshoot and fetch an extra kb rather than have to issue\n // a second request.\n const assumedHeaderLength = 2024;\n const headerClient = new BufferedHttpRangeClient(url);\n // Immediately following the header is the optional spatial index, we deliberately fetch\n // a small part of that to skip subsequent requests.\n const assumedIndexLength = (() => {\n // The actual branching factor will be in the header, but since we\n // don't have the header yet, we just guess. The consequence of\n // getting this wrong isn't terminal, it only means we may be\n // fetching slightly more than we need or that we need to make an\n // extra request later.\n const assumedBranchingFactor = DEFAULT_NODE_SIZE;\n // NOTE: each layer is exponentially larger\n const prefetchedLayers = 3;\n let result = 0;\n let i;\n for (i = 0; i < prefetchedLayers; i++) {\n const layer_width = assumedBranchingFactor ** i * NODE_ITEM_BYTE_LEN;\n result += layer_width;\n }\n return result;\n })();\n const minReqLength = assumedHeaderLength + assumedIndexLength;\n Logger.debug(`fetching header. minReqLength: ${minReqLength} (assumedHeaderLength: ${assumedHeaderLength}, assumedIndexLength: ${assumedIndexLength})`);\n {\n const bytes = new Uint8Array(await headerClient.getRange(0, 8, minReqLength, 'header'));\n if (!bytes.subarray(0, 3).every((v, i) => magicbytes[i] === v)) {\n Logger.error(`bytes: ${bytes} != ${magicbytes}`);\n throw new Error('Not a FlatGeobuf file');\n }\n Logger.debug('magic bytes look good');\n }\n let headerLength;\n {\n const bytes = await headerClient.getRange(8, 4, minReqLength, 'header');\n headerLength = new DataView(bytes).getUint32(0, true);\n const HEADER_MAX_BUFFER_SIZE = 1048576 * 10;\n if (headerLength > HEADER_MAX_BUFFER_SIZE || headerLength < 8) {\n // minimum size check avoids panic in FlatBuffers header decoding\n throw new Error('Invalid header size');\n }\n Logger.debug(`headerLength: ${headerLength}`);\n }\n const bytes = await headerClient.getRange(12, headerLength, minReqLength, 'header');\n const bb = new flatbuffers.ByteBuffer(new Uint8Array(bytes));\n const header = fromByteBuffer(bb);\n const indexLength = calcTreeSize(header.featuresCount, header.indexNodeSize);\n Logger.debug('completed: opening http reader');\n return new HttpReader(headerClient, header, headerLength, indexLength);\n }\n async *selectBbox(rect) {\n // Read R-Tree index and build filter for features within bbox\n const lengthBeforeTree = this.lengthBeforeTree();\n const bufferedClient = this.headerClient;\n const readNode = async function (offsetIntoTree, size) {\n const minReqLength = 0;\n return bufferedClient.getRange(lengthBeforeTree + offsetIntoTree, size, minReqLength, 'index');\n };\n const batches = [];\n let currentBatch = [];\n for await (const searchResult of streamSearch(this.header.featuresCount, this.header.indexNodeSize, rect, readNode)) {\n const [featureOffset, ,] = searchResult;\n let [, , featureLength] = searchResult;\n if (!featureLength) {\n Logger.info('final feature');\n // Normally we get the feature length by subtracting between\n // adjacent nodes from the index, which we can't do for the\n // _very_ last feature in a dataset.\n //\n // We could *guess* the size, but we'd risk overshooting the length,\n // which will cause some webservers to return HTTP 416: Unsatisfiable range\n //\n // So instead we fetch only the final features byte length, stored in the\n // first 4 bytes.\n featureLength = 4;\n }\n if (currentBatch.length == 0) {\n currentBatch.push([featureOffset, featureLength]);\n continue;\n }\n const prevFeature = currentBatch[currentBatch.length - 1];\n const gap = featureOffset - (prevFeature[0] + prevFeature[1]);\n if (gap > Config.global.extraRequestThreshold()) {\n Logger.info(`Pushing new feature batch, since gap ${gap} was too large`);\n batches.push(currentBatch);\n currentBatch = [];\n }\n currentBatch.push([featureOffset, featureLength]);\n }\n this.headerClient.logUsage('header+index');\n if (currentBatch.length > 0) {\n batches.push(currentBatch);\n }\n const promises = batches.flatMap((batch) => this.readFeatureBatch(batch));\n // Fetch all batches concurrently, yielding features as they become\n // available, meaning the results may be intermixed.\n yield* Repeater.merge(promises);\n }\n lengthBeforeTree() {\n // FGB Layout is: [magicbytes (fixed), headerLength (i32), header (variable), Tree (variable), Features (variable)]\n return magicbytes.length + SIZE_PREFIX_LEN + this.headerLength;\n }\n lengthBeforeFeatures() {\n return this.lengthBeforeTree() + this.indexLength;\n }\n buildFeatureClient() {\n return new BufferedHttpRangeClient(this.headerClient.httpClient);\n }\n /**\n * Fetch a batch of features in a single request, yielding each Feature\n *\n * `batch`: [offset, length] of features in the batch\n */\n async *readFeatureBatch(batch) {\n const [firstFeatureOffset] = batch[0];\n const [lastFeatureOffset, lastFeatureLength] = batch[batch.length - 1];\n const batchStart = firstFeatureOffset;\n const batchEnd = lastFeatureOffset + lastFeatureLength;\n const batchSize = batchEnd - batchStart;\n // A new feature client is needed for each batch to own the underlying buffer as features are yielded.\n const featureClient = this.buildFeatureClient();\n let minFeatureReqLength = batchSize;\n for (const [featureOffset] of batch) {\n yield await this.readFeature(featureClient, featureOffset, minFeatureReqLength);\n // Only set minFeatureReqLength for the first request.\n //\n // This should only affect a batch that contains the final feature, otherwise\n // we've calculated `batchSize` to get all the data we need for the batch.\n // For the very final feature in a dataset, we don't know it's length, so we\n // will end up executing an extra request for that batch.\n minFeatureReqLength = 0;\n }\n featureClient.logUsage('feature');\n }\n async readFeature(featureClient, featureOffset, minFeatureReqLength) {\n const offset = featureOffset + this.lengthBeforeFeatures();\n let featureLength;\n {\n const bytes = await featureClient.getRange(offset, 4, minFeatureReqLength, 'feature length');\n featureLength = new DataView(bytes).getUint32(0, true);\n }\n const byteBuffer = await featureClient.getRange(offset + 4, featureLength, minFeatureReqLength, 'feature data');\n const bytes = new Uint8Array(byteBuffer);\n const bytesAligned = new Uint8Array(featureLength + SIZE_PREFIX_LEN);\n bytesAligned.set(bytes, SIZE_PREFIX_LEN);\n const bb = new flatbuffers.ByteBuffer(bytesAligned);\n bb.setPosition(SIZE_PREFIX_LEN);\n return Feature.getRootAsFeature(bb);\n }\n}\nclass BufferedHttpRangeClient {\n httpClient;\n bytesEverUsed = 0;\n bytesEverFetched = 0;\n buffer = new ArrayBuffer(0);\n // Byte offset of `buffer` with respect to the beginning of the file being\n // buffered\n head = 0;\n constructor(source) {\n if (typeof source === 'string') {\n this.httpClient = new HttpRangeClient(source);\n }\n else if (source instanceof HttpRangeClient) {\n this.httpClient = source;\n }\n else {\n throw new Error('Unknown source ');\n }\n }\n async getRange(start, length, minReqLength, purpose) {\n this.bytesEverUsed += length;\n const start_i = start - this.head;\n const end_i = start_i + length;\n if (start_i >= 0 && end_i <= this.buffer.byteLength) {\n return this.buffer.slice(start_i, end_i);\n }\n const lengthToFetch = Math.max(length, minReqLength);\n this.bytesEverFetched += lengthToFetch;\n Logger.debug(`requesting for new Range: ${start}-${start + lengthToFetch - 1}`);\n this.buffer = await this.httpClient.getRange(start, lengthToFetch, purpose);\n this.head = start;\n return this.buffer.slice(0, length);\n }\n logUsage(purpose) {\n const category = purpose.split(' ')[0];\n const used = this.bytesEverUsed;\n const requested = this.bytesEverFetched;\n const efficiency = ((100.0 * used) / requested).toFixed(2);\n Logger.info(`${category} bytes used/requested: ${used} / ${requested} = ${efficiency}%`);\n }\n}\nclass HttpRangeClient {\n url;\n requestsEverMade = 0;\n bytesEverRequested = 0;\n constructor(url) {\n this.url = url;\n }\n async getRange(begin, length, purpose) {\n this.requestsEverMade += 1;\n this.bytesEverRequested += length;\n const range = `bytes=${begin}-${begin + length - 1}`;\n Logger.info(`request: #${this.requestsEverMade}, purpose: ${purpose}), bytes: (this_request: ${length}, ever: ${this.bytesEverRequested}), Range: ${range}`);\n const response = await fetch(this.url, {\n headers: {\n Range: range\n // TODO: better parallelize requests on Chrome\n //\n // Safari and Firefox have no issue performing Range requests\n // for a resource in parallel, but Chrome will stall a\n // subsequent request to the resource until it's received the\n // response headers of the prior request. So, it still allows\n // some limited parallelization, but it's not ideal.\n //\n // This is seemingly an artifact of how Chrome manages caching\n // and it might differ between platforms. We could work around it\n // by setting the request header:\n //\n // 'Cache-Control': 'no-cache, no-store'\n //\n // This allows requests to be fully parallelized in Chrome, but\n // then Chrome won't cache the response, so it seems not a\n // great trade-off.\n //\n // Another work around would be to make each Range request for\n // a separate URL by appending something like\n // `?cache_buster=<range>` to the URL, but then Chrome will\n // require an additional CORS preflight OPTIONS requests per\n // Range, which is also not a great trade-off.\n //\n // See:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=969828&q=concurrent%20range%20requests&can=2\n // https://stackoverflow.com/questions/27513994/chrome-stalls-when-making-multiple-requests-to-same-resource\n }\n });\n return response.arrayBuffer();\n }\n}\n", "export default class Config {\n static global = new Config();\n _extraRequestThreshold = 256 * 1024;\n /**\n * Fetch up to this many extra bytes if it will eliminate an extra request\n */\n extraRequestThreshold() {\n return this._extraRequestThreshold;\n }\n setExtraRequestThreshold(bytes) {\n if (bytes < 0) {\n throw new Error('extraRequestThreshold cannot be negative');\n }\n this._extraRequestThreshold = bytes;\n }\n}\n", "export var LogLevel;\n(function (LogLevel) {\n LogLevel[LogLevel[\"Debug\"] = 0] = \"Debug\";\n LogLevel[LogLevel[\"Info\"] = 1] = \"Info\";\n LogLevel[LogLevel[\"Warn\"] = 2] = \"Warn\";\n LogLevel[LogLevel[\"Error\"] = 3] = \"Error\";\n})(LogLevel || (LogLevel = {}));\nexport default class Logger {\n static logLevel = LogLevel.Warn;\n static debug(...args) {\n this.log(LogLevel.Debug, ...args);\n }\n static info(...args) {\n this.log(LogLevel.Info, ...args);\n }\n static warn(...args) {\n this.log(LogLevel.Warn, ...args);\n }\n static error(...args) {\n this.log(LogLevel.Error, ...args);\n }\n static log(level, ...args) {\n if (this.logLevel > level) {\n return;\n }\n switch (level) {\n case LogLevel.Debug: {\n console.debug(...args);\n break;\n }\n case LogLevel.Info: {\n console.info(...args);\n break;\n }\n case LogLevel.Warn: {\n console.warn(...args);\n break;\n }\n case LogLevel.Error: {\n console.error(...args);\n break;\n }\n }\n }\n}\n", "import Config from \"./config.js\";\nimport Logger from \"./logger.js\";\nexport const NODE_ITEM_BYTE_LEN = 8 * 4 + 8;\n/**\n * @deprecated Use `NODE_ITEM_BYTE_LEN` instead.\n */\nexport const NODE_ITEM_LEN = NODE_ITEM_BYTE_LEN;\n// default branching factor of a node in the rtree\n//\n// actual value will be specified in the header but\n// this can be useful for having reasonably sized guesses for fetch-sizes when\n// streaming results\nexport const DEFAULT_NODE_SIZE = 16;\nexport function calcTreeSize(numItems, nodeSize) {\n nodeSize = Math.min(Math.max(Number(nodeSize), 2), 65535);\n let n = numItems;\n let numNodes = n;\n do {\n n = Math.ceil(n / nodeSize);\n numNodes += n;\n } while (n !== 1);\n return numNodes * NODE_ITEM_BYTE_LEN;\n}\n/**\n * returns [levelOffset, numNodes] for each level\n */\nexport function generateLevelBounds(numItems, nodeSize) {\n if (nodeSize < 2)\n throw new Error('Node size must be at least 2');\n if (numItems === 0)\n throw new Error('Number of items must be greater than 0');\n // number of nodes per level in bottom-up order\n let n = numItems;\n let numNodes = n;\n const levelNumNodes = [n];\n do {\n n = Math.ceil(n / nodeSize);\n numNodes += n;\n levelNumNodes.push(n);\n } while (n !== 1);\n // bounds per level in reversed storage order (top-down)\n const levelOffsets = [];\n n = numNodes;\n for (const size of levelNumNodes) {\n levelOffsets.push(n - size);\n n -= size;\n }\n const levelBounds = [];\n for (let i = 0; i < levelNumNodes.length; i++)\n levelBounds.push([levelOffsets[i], levelOffsets[i] + levelNumNodes[i]]);\n return levelBounds;\n}\n/**\n * Yield's a `SearchResult` for each feature within the bounds of `rect`.\n *\n * Every node in the FGB index tree has a bounding rect, all of the nodes children\n * are contained within that bounding rect. The leaf nodes of the tree represent\n * the features of the collection.\n *\n * As we traverse the tree, starting from the root, we'll need to read more data\n * from the index. When we don't already have this range data buffered locally,\n * an HTTP fetch is triggered. For performance, we merge adjacent and nearby\n * request ranges into a single request, reasoning that fetching a few extra\n * bytes is a good tradeoff if it means we can reduce the number of requests.\n */\nexport async function* streamSearch(numItems, nodeSize, rect, readNode) {\n class NodeRange {\n _level;\n nodes;\n constructor(nodes, level) {\n this._level = level;\n this.nodes = nodes;\n }\n level() {\n return this._level;\n }\n startNodeIdx() {\n return this.nodes[0];\n }\n endNodeIdx() {\n return this.nodes[1];\n }\n extendEndNodeIdx(newIdx) {\n console.assert(newIdx > this.nodes[1]);\n this.nodes[1] = newIdx;\n }\n toString() {\n return `[NodeRange level: ${this._level}, nodes: ${this.nodes[0]}-${this.nodes[1]}]`;\n }\n }\n const { minX, minY, maxX, maxY } = rect;\n Logger.info(`tree items: ${numItems}, nodeSize: ${nodeSize}`);\n const levelBounds = generateLevelBounds(numItems, nodeSize);\n const firstLeafNodeIdx = levelBounds[0][0];\n const rootNodeRange = (() => {\n const range = [0, 1];\n const level = levelBounds.length - 1;\n return new NodeRange(range, level);\n })();\n const queue = [rootNodeRange];\n Logger.debug(`starting stream search with queue: ${queue}, numItems: ${numItems}, nodeSize: ${nodeSize}, levelBounds: ${levelBounds}`);\n while (queue.length != 0) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const nodeRange = queue.shift();\n Logger.debug(`popped node: ${nodeRange}, queueLength: ${queue.length}`);\n const nodeRangeStartIdx = nodeRange.startNodeIdx();\n const isLeafNode = nodeRangeStartIdx >= firstLeafNodeIdx;\n // find the end index of the node\n const nodeRangeEndIdx = (() => {\n const [, levelBound] = levelBounds[nodeRange.level()];\n const nodeIdx = Math.min(nodeRange.endNodeIdx() + nodeSize, levelBound);\n if (isLeafNode && nodeIdx < levelBound) {\n // We can infer the length of *this* feature by getting the start of the *next*\n // feature, so we get an extra node.\n // This approach doesn't work for the final node in the index,\n // but in that case we know that the feature runs to the end of the FGB file and\n // could make an open ended range request to get \"the rest of the data\".\n return nodeIdx + 1;\n }\n return nodeIdx;\n })();\n const numNodesInRange = nodeRangeEndIdx - nodeRangeStartIdx;\n const buffer = await readNode(nodeRangeStartIdx * NODE_ITEM_BYTE_LEN, numNodesInRange * NODE_ITEM_BYTE_LEN);\n const dataView = new DataView(buffer);\n for (let nodeIdx = nodeRangeStartIdx; nodeIdx < nodeRangeEndIdx; nodeIdx++) {\n const nodeIdxInDataView = nodeIdx - nodeRangeStartIdx;\n const dataViewByteStart = nodeIdxInDataView * NODE_ITEM_BYTE_LEN;\n if (maxX < dataView.getFloat64(dataViewByteStart + 0, true))\n continue; // maxX < nodeMinX\n if (maxY < dataView.getFloat64(dataViewByteStart + 8, true))\n continue; // maxY < nodeMinY\n if (minX > dataView.getFloat64(dataViewByteStart + 16, true))\n continue; // minX > nodeMaxX\n if (minY > dataView.getFloat64(dataViewByteStart + 24, true))\n continue; // minY > nodeMaxY\n // `offset` is:\n // For leaf nodes: the byte-offset into the feature buffer.\n // For inner nodes: the node-idx of its first child.\n const offset = dataView.getBigUint64(dataViewByteStart + 32, true);\n if (isLeafNode) {\n const featureByteOffset = offset;\n const featureLength = (() => {\n if (nodeIdx < numItems - 1) {\n // Since features are tightly packed, we infer the\n // length of _this_ feature by measuring to the _next_\n // feature's start.\n const nextPos = (nodeIdxInDataView + 1) * NODE_ITEM_BYTE_LEN;\n // console.debug(`nodeIdx: ${nodeIdx} of ${numItems}, nodeRangeStartIdx: ${nodeRangeStartIdx}, nextPos: ${nextPos}, dataView.byteLength: ${dataView.byteLength}`,);\n const nextOffset = dataView.getBigUint64(nextPos + 32, true);\n return nextOffset - featureByteOffset;\n }\n // This is the last feature - there's no \"next\" feature\n // to measure to, so we can't know it's length.\n return null;\n })();\n // Logger.debug(`featureByteOffset: ${featureByteOffset}, nodeIdx: ${nodeIdx}, featureLength: ${featureLength}`);\n const featureIdx = nodeIdx - firstLeafNodeIdx;\n yield [Number(featureByteOffset), featureIdx, Number(featureLength)];\n continue;\n }\n const firstChildNodeIdx = offset;\n // request up to this many nodes if it means we can eliminate an\n // extra request\n const extraRequestThresholdNodes = Config.global.extraRequestThreshold() / NODE_ITEM_BYTE_LEN;\n // Since we're traversing the tree by monotonically increasing byte\n // offset, the most recently enqueued node range will be the\n // nearest, and thus presents the best candidate for merging.\n const nearestNodeRange = queue[queue.length - 1];\n if (nearestNodeRange !== undefined &&\n nearestNodeRange.level() == nodeRange.level() - 1 &&\n firstChildNodeIdx < nearestNodeRange.endNodeIdx() + extraRequestThresholdNodes) {\n Logger.debug(`Merging \"nodeRange\" request into existing range: ${nearestNodeRange}, newEndNodeIdx: ${nearestNodeRange.endNodeIdx()} -> ${firstChildNodeIdx}`);\n nearestNodeRange.extendEndNodeIdx(Number(firstChildNodeIdx));\n continue;\n }\n const newNodeRange = (() => {\n const level = nodeRange.level() - 1;\n const range = [Number(firstChildNodeIdx), Number(firstChildNodeIdx) + 1];\n return new NodeRange(range, level);\n })();\n // We're going to add a new node range - log the reason\n if (nearestNodeRange !== undefined && nearestNodeRange.level() == newNodeRange.level()) {\n Logger.info(`Same level, but too far away. Pushing new request for nodeIdx: ${firstChildNodeIdx} rather than merging with distant ${nearestNodeRange}`);\n }\n else {\n Logger.info(`Pushing new level for ${newNodeRange} onto queue with nearestNodeRange: ${nearestNodeRange} since there's not already a range for this level.`);\n }\n queue.push(newNodeRange);\n }\n }\n}\n", "export const magicbytes = new Uint8Array([\n 0x66, 0x67, 0x62, 0x03, 0x66, 0x67, 0x62, 0x00\n]);\nexport const SIZE_PREFIX_LEN = 4;\n", "import { fromFeature } from \"./feature.js\";\nimport { parseGeometry, parseGC } from \"./geometry.js\";\nimport { buildHeader, deserialize as genericDeserialize, deserializeStream as genericDeserializeStream, deserializeFiltered as genericDeserializeFiltered, mapColumn } from \"../generic/featurecollection.js\";\nimport { buildFeature } from \"../generic/feature.js\";\nimport { magicbytes } from \"../constants.js\";\nimport { inferGeometryType } from \"../generic/header.js\";\nexport function serialize(featurecollection) {\n const headerMeta = introspectHeaderMeta(featurecollection);\n const header = buildHeader(headerMeta);\n const features = featurecollection.features.map((f) => buildFeature(f.geometry.type === 'GeometryCollection'\n ? parseGC(f.geometry)\n : parseGeometry(f.geometry), f.properties, headerMeta));\n const featuresLength = features.map((f) => f.length).reduce((a, b) => a + b);\n const uint8 = new Uint8Array(magicbytes.length + header.length + featuresLength);\n uint8.set(header, magicbytes.length);\n let offset = magicbytes.length + header.length;\n for (const feature of features) {\n uint8.set(feature, offset);\n offset += feature.length;\n }\n uint8.set(magicbytes);\n return uint8;\n}\nexport function deserialize(bytes, headerMetaFn) {\n const features = genericDeserialize(bytes, fromFeature, headerMetaFn);\n return {\n type: 'FeatureCollection',\n features\n };\n}\nexport function deserializeStream(stream, headerMetaFn) {\n return genericDeserializeStream(stream, fromFeature, headerMetaFn);\n}\nexport function deserializeFiltered(url, rect, headerMetaFn) {\n return genericDeserializeFiltered(url, rect, fromFeature, headerMetaFn);\n}\nfunction introspectHeaderMeta(featurecollection) {\n const feature = featurecollection.features[0];\n const properties = feature.properties;\n let columns = null;\n if (properties)\n columns = Object.keys(properties).map((k) => mapColumn(properties, k));\n const geometryType = inferGeometryType(featurecollection.features);\n const headerMeta = {\n geometryType,\n columns,\n envelope: null,\n featuresCount: featurecollection.features.length,\n indexNodeSize: 0,\n crs: null,\n title: null,\n description: null,\n metadata: null\n };\n return headerMeta;\n}\n", "import { deserialize as fcDeserialize, deserializeStream as fcDeserializeStream, deserializeFiltered as fcDeserializeFiltered, serialize as fcSerialize } from \"./geojson/featurecollection.js\";\n/**\n * Serialize GeoJSON to FlatGeobuf\n * @param geojson GeoJSON object to serialize\n */\nexport function serialize(geojson) {\n const bytes = fcSerialize(geojson);\n return bytes;\n}\n/**\n * Deserialize FlatGeobuf into GeoJSON\n * @param input Input byte array, stream or string\n * @param rect Filter rectangle\n * @param headerMetaFn Callback that will recieve header metadata when available\n */\nexport function deserialize(input, rect, headerMetaFn) {\n if (input instanceof Uint8Array)\n return fcDeserialize(input, headerMetaFn);\n else if (input instanceof ReadableStream)\n return fcDeserializeStream(input, headerMetaFn);\n return fcDeserializeFiltered(input, rect, headerMetaFn);\n}\n", "import { deserialize as deserializeArray, deserializeStream, deserializeFiltered } from \"./generic/featurecollection.js\";\n/**\n * Deserialize FlatGeobuf into generic features\n * @param input Input byte array, stream or string\n * @param fromFeature Callback that recieves generic features\n * @param rect Filter rectangle\n */\nexport function deserialize(input, fromFeature, rect) {\n if (input instanceof Uint8Array)\n return deserializeArray(input, fromFeature);\n else if (input instanceof ReadableStream)\n return deserializeStream(input, fromFeature);\n return deserializeFiltered(input, rect, fromFeature);\n}\nexport { serialize } from \"./generic/featurecollection.js\";\nexport { GeometryType } from \"./flat-geobuf/geometry-type.js\";\nexport { ColumnType } from \"./flat-geobuf/column-type.js\";\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { parseFlatGeobuf, parseFlatGeobufInBatches } from \"./lib/parse-flatgeobuf.js\";\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof \"4.3.0-beta.1\" !== 'undefined' ? \"4.3.0-beta.1\" : 'latest';\n// FGB\\3FGB\\1\nconst FGB_MAGIC_NUMBER = [0x66, 0x67, 0x62, 0x03, 0x66, 0x67, 0x62, 0x01];\n/** Load flatgeobuf on a worker */\nexport const FlatGeobufWorkerLoader = {\n dataType: null,\n batchType: null,\n id: 'flatgeobuf',\n name: 'FlatGeobuf',\n module: 'flatgeobuf',\n version: VERSION,\n worker: true,\n extensions: ['fgb'],\n mimeTypes: ['application/octet-stream'],\n category: 'geometry',\n tests: [new Uint8Array(FGB_MAGIC_NUMBER).buffer],\n options: {\n flatgeobuf: {\n shape: 'geojson-table'\n },\n gis: {\n reproject: false\n }\n }\n};\nexport const FlatGeobufLoader = {\n ...FlatGeobufWorkerLoader,\n parse: async (arrayBuffer, options = {}) => parseSync(arrayBuffer, options),\n parseSync,\n // @ts-expect-error this is a stream parser not an async iterator parser\n parseInBatchesFromStream,\n binary: true\n};\nfunction parseSync(arrayBuffer, options = {}) {\n return parseFlatGeobuf(arrayBuffer, getOptions(options));\n}\nfunction parseInBatchesFromStream(stream, options) {\n return parseFlatGeobufInBatches(stream, getOptions(options));\n}\nfunction getOptions(options) {\n options = {\n ...options,\n flatgeobuf: { ...FlatGeobufLoader.options.flatgeobuf, ...options?.flatgeobuf },\n gis: { ...FlatGeobufLoader.options.gis, ...options?.gis }\n };\n return {\n shape: options?.flatgeobuf?.shape ?? 'geojson-table',\n boundingBox: options?.flatgeobuf?.boundingBox,\n crs: options?.gis?._targetCrs || 'WGS84',\n reproject: options?.gis?.reproject || false\n };\n}\n"],
4
+ "sourcesContent": ["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport { FlatGeobufLoader, FlatGeobufWorkerLoader } from \"./flatgeobuf-loader.js\";\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { Proj4Projection } from '@math.gl/proj4';\nimport { transformGeoJsonCoords } from '@loaders.gl/gis';\nimport { fgbToBinaryGeometry } from \"./binary-geometries.js\";\nimport { getSchemaFromFGBHeader } from \"./get-schema-from-fgb-header.js\";\nimport * as geojson from \"../flatgeobuf/3.27.2/geojson.js\";\nimport * as generic from \"../flatgeobuf/3.27.2/generic.js\";\nimport { parseProperties as parsePropertiesBinary } from \"../flatgeobuf/3.27.2/generic/feature.js\";\nconst deserializeGeoJson = geojson.deserialize;\nconst deserializeGeneric = generic.deserialize;\n/*\n * Parse FlatGeobuf arrayBuffer and return GeoJSON.\n *\n * @param arrayBuffer A FlatGeobuf arrayBuffer\n * @return A GeoJSON geometry object\n */\nexport function parseFlatGeobuf(arrayBuffer, options) {\n const shape = options.shape;\n switch (shape) {\n case 'geojson-table': {\n return parseFlatGeobufToGeoJSONTable(arrayBuffer, options);\n }\n case 'columnar-table': // binary + some JS arrays\n const binary = parseFlatGeobufToBinary(arrayBuffer, options);\n // @ts-expect-error\n return { shape: 'columnar-table', data: binary };\n case 'binary':\n // @ts-expect-error\n return parseFlatGeobufToBinary(arrayBuffer, options);\n default:\n throw new Error(shape);\n }\n}\nfunction parseFlatGeobufToBinary(arrayBuffer, options = {}) {\n // TODO: reproject binary features\n // const {reproject = false, _targetCrs = 'WGS84'} = (options && options.gis) || {};\n const array = new Uint8Array(arrayBuffer);\n // @ts-expect-error\n return deserializeGeneric(array, fgbToBinaryGeometry);\n}\nfunction parseFlatGeobufToGeoJSONTable(arrayBuffer, options) {\n if (arrayBuffer.byteLength === 0) {\n return { shape: 'geojson-table', type: 'FeatureCollection', features: [] };\n }\n const { reproject = false, crs = 'WGS84' } = options;\n const arr = new Uint8Array(arrayBuffer);\n let fgbHeader;\n let schema;\n const rect = options.boundingBox && convertBoundingBox(options.boundingBox);\n // @ts-expect-error this looks wrong\n let { features } = deserializeGeoJson(arr, rect, (headerMeta) => {\n fgbHeader = headerMeta;\n schema = getSchemaFromFGBHeader(fgbHeader);\n });\n const fromCRS = fgbHeader?.crs?.wkt;\n let projection;\n if (reproject && fromCRS) {\n // Constructing the projection may fail for some invalid WKT strings\n try {\n projection = new Proj4Projection({ from: fromCRS, to: crs });\n }\n catch (error) {\n // no op\n }\n }\n if (projection) {\n features = transformGeoJsonCoords(features, (coords) => projection.project(coords));\n }\n return { shape: 'geojson-table', schema, type: 'FeatureCollection', features };\n}\n/*\n * Parse FlatGeobuf arrayBuffer and return GeoJSON.\n *\n * @param {ReadableStream} _ A FlatGeobuf arrayBuffer\n * @return A GeoJSON geometry object iterator\n */\n// eslint-disable-next-line complexity\nexport function parseFlatGeobufInBatches(stream, options) {\n const shape = options.shape;\n switch (shape) {\n case 'binary':\n return parseFlatGeobufInBatchesToBinary(stream, options);\n case 'geojson-table':\n return parseFlatGeobufInBatchesToGeoJSON(stream, options);\n default:\n throw new Error(shape);\n }\n}\nfunction parseFlatGeobufInBatchesToBinary(stream, options) {\n // TODO: reproject binary streaming features\n // const {reproject = false, _targetCrs = 'WGS84'} = (options && options.gis) || {};\n const rect = options.boundingBox && convertBoundingBox(options.boundingBox);\n // @ts-expect-error\n const iterator = deserializeGeneric(stream, binaryFromFeature, rect);\n return iterator;\n}\n/**\n * @todo this does not return proper GeoJSONTable batches\n * @param stream\n * @param options\n */\n// eslint-disable-next-line complexity\nasync function* parseFlatGeobufInBatchesToGeoJSON(stream, options) {\n const { reproject = false, crs = 'WGS84' } = options || {};\n let fgbHeader;\n // let schema: Schema | undefined;\n const iterator = deserializeGeoJson(stream, undefined, (headerMeta) => {\n fgbHeader = headerMeta;\n // schema = getSchemaFromFGBHeader(fgbHeader);\n });\n let projection;\n let firstRecord = true;\n // @ts-expect-error this looks wrong\n for await (const feature of iterator) {\n if (firstRecord) {\n const fromCRS = fgbHeader?.crs?.wkt;\n if (reproject && fromCRS) {\n projection = new Proj4Projection({ from: fromCRS, to: crs });\n }\n firstRecord = false;\n }\n if (reproject && projection) {\n // eslint-disable-next-line\n yield transformGeoJsonCoords([feature], (coords) => projection.project(coords));\n }\n else {\n yield feature;\n }\n }\n}\n// HELPERS\nfunction convertBoundingBox(boundingBox) {\n return {\n minX: boundingBox[0][0],\n minY: boundingBox[0][1],\n maxX: boundingBox[1][0],\n maxY: boundingBox[1][1]\n };\n}\n// TODO: reproject binary features\nfunction binaryFromFeature(feature, header) {\n const geometry = feature.geometry();\n // FlatGeobuf files can only hold a single geometry type per file, otherwise\n // GeometryType is GeometryCollection\n // I believe geometry.type() is null (0) except when the geometry type isn't\n // known in the header?\n const geometryType = header.geometryType || geometry?.type();\n const parsedGeometry = fgbToBinaryGeometry(geometry, geometryType);\n // @ts-expect-error this looks wrong\n parsedGeometry.properties = parsePropertiesBinary(feature, header.columns);\n // TODO: wrap binary data either in points, lines, or polygons key\n return parsedGeometry;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport function fgbToBinaryFeature(geometry, type) {\n const fgbGeometry = geometry?.geometry() || null;\n return fgbToBinaryGeometry(fgbGeometry, type);\n}\nexport function fgbToBinaryGeometry(geometry, type) {\n if (geometry === null) {\n return null;\n }\n switch (type) {\n case GeometryType.Point:\n case GeometryType.MultiPoint:\n return parsePoint(geometry);\n case GeometryType.LineString:\n case GeometryType.MultiLineString:\n return parseLines(geometry);\n case GeometryType.Polygon:\n return parsePolygons(geometry);\n case GeometryType.MultiPolygon:\n return parseMultiPolygons(geometry);\n default:\n throw new Error(`Unimplemented geometry type: ${type}`);\n }\n}\n// Parse Point to flat array\nfunction parsePoint(geometry) {\n const xy = geometry.xyArray();\n const z = geometry.zArray();\n // @ts-expect-error TODO handle null geometries\n const positions = blitArrays(xy, z);\n return { positions };\n}\nfunction parseLines(geometry) {\n const xy = geometry.xyArray();\n const z = geometry.zArray();\n const positions = blitArrays(xy, z);\n // If endsArray is null, a single LineString. Otherwise, contains the end\n // indices of each part of the MultiLineString. geometry.endsArray() omits the\n // initial 0 that we have in our internal format.\n // @ts-expect-error TODO handle null geometries\n const ends = (geometry.endsArray() && Array.from(geometry.endsArray())) || [xy.length / 2];\n ends.unshift(0);\n const pathIndices = { value: new Uint16Array(ends), size: 1 };\n return {\n positions,\n pathIndices\n };\n}\nfunction parsePolygons(geometry) {\n const xy = geometry.xyArray();\n const z = geometry.zArray();\n // @ts-expect-error TODO handle null geometries\n const positions = blitArrays(xy, z);\n // If endsArray is null, a simple Polygon with no inner rings. Otherwise,\n // contains the end indices of each ring of the Polygon. geometry.endsArray()\n // omits the initial 0 that we have in our internal format.\n // @ts-expect-error TODO handle null geometries\n const ends = (geometry.endsArray() && Array.from(geometry.endsArray())) || [xy.length / 2];\n ends.unshift(0);\n const primitivePolygonIndices = { value: new Uint16Array(ends), size: 1 };\n const polygonIndices = { value: new Uint16Array([0, xy.length / 2]), size: 1 };\n return {\n positions,\n primitivePolygonIndices,\n polygonIndices\n };\n}\n// eslint-disable-next-line max-statements\nfunction parseMultiPolygons(geometry) {\n // Create arrays for each geometry part, then concatenate\n const parsedParts = [];\n let nPositions = 0;\n let nPrimitivePolygonIndices = 1;\n let nPolygonIndices = 1;\n for (let i = 0; i < geometry.partsLength(); i++) {\n const part = geometry.parts(i);\n // @ts-expect-error TODO handle null geometries\n const polygon = parsePolygons(part);\n nPositions += polygon.positions.value.length;\n nPrimitivePolygonIndices += polygon.primitivePolygonIndices.value.length - 1;\n nPolygonIndices += polygon.polygonIndices.value.length - 1;\n parsedParts.push(polygon);\n }\n const concatPositions = new Float64Array(nPositions);\n const concatPrimitivePolygonIndices = new Uint32Array(nPrimitivePolygonIndices);\n const concatPolygonIndices = new Uint32Array(nPolygonIndices);\n let positionCounter = 0;\n let primitivePolygonIndicesCounter = 1;\n let polygonIndicesCounter = 1;\n // Assumes all parts of the multipolygon have the same size\n const positionSize = parsedParts[0].positions.size;\n for (const parsedPart of parsedParts) {\n concatPositions.set(parsedPart.positions.value, positionCounter * positionSize);\n // For indices, need to add positionCounter so that position indices are\n // correct in the concatenated positions\n concatPrimitivePolygonIndices.set(\n // eslint-disable-next-line\n parsedPart.primitivePolygonIndices.value.subarray(1).map((x) => x + positionCounter), primitivePolygonIndicesCounter);\n concatPolygonIndices.set(\n // eslint-disable-next-line\n parsedPart.polygonIndices.value.subarray(1).map((x) => x + positionCounter), polygonIndicesCounter);\n positionCounter += parsedPart.positions.value.length / positionSize;\n primitivePolygonIndicesCounter += parsedPart.primitivePolygonIndices.value.length - 1;\n polygonIndicesCounter += parsedPart.polygonIndices.value.length - 1;\n }\n return {\n positions: { value: concatPositions, size: positionSize },\n primitivePolygonIndices: { value: concatPrimitivePolygonIndices, size: 1 },\n polygonIndices: { value: concatPolygonIndices, size: 1 }\n };\n}\n// Combine xy and z arrays\nfunction blitArrays(xy, z) {\n if (!z) {\n return { value: xy, size: 2 };\n }\n if (z.length * 2 !== xy.length) {\n throw new Error('Z array must be half XY array\\'s length');\n }\n const totalLength = xy.length + z.length;\n const xyz = new Float64Array(totalLength);\n for (let i = 0; i < xy.length / 2; i++) {\n xyz[i * 3 + 0] = xy[i * 2 + 0];\n xyz[i * 3 + 1] = xy[i * 2 + 1];\n xyz[i * 3 + 2] = z[i];\n }\n return { value: xyz, size: 3 };\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n/**\n * @param fgbHeader\n * geometryType: GeometryType;\n * columns: ColumnMeta[] | null;\n * envelope: Float64Array | null;\n * featuresCount: number;\n * indexNodeSize: number;\n * crs: CrsMeta | null;\n * title: string | null;\n * description: string | null;\n * metadata: string | null;\n */\nexport function getSchemaFromFGBHeader(fgbHeader) {\n const metadata = {\n title: fgbHeader.title || '',\n description: fgbHeader.description || '',\n crs: JSON.stringify(fgbHeader.crs) || '',\n metadata: fgbHeader.metadata || '',\n geometryType: String(fgbHeader.geometryType),\n indexNodeSize: String(fgbHeader.indexNodeSize),\n featureCount: String(fgbHeader.featuresCount),\n bounds: fgbHeader.envelope?.join(',') || ''\n };\n const fields = fgbHeader.columns?.map((column) => getFieldFromFGBColumn(column)) || [];\n return { metadata, fields };\n}\n/**\n * name: string;\n * type: ColumnType;\n * title: string | null;\n * description: string | null;\n * width: number;\n * precision: number;\n * scale: number;\n * nullable: boolean;\n * unique: boolean;\n * primary_key: boolean;\n */\nfunction getFieldFromFGBColumn(fgbColumn) {\n const metadata = {\n title: fgbColumn.title || '',\n description: fgbColumn.description || '',\n width: String(fgbColumn.width),\n precision: String(fgbColumn.precision),\n scale: String(fgbColumn.scale),\n unique: String(fgbColumn.unique),\n primary_key: String(fgbColumn.primary_key)\n };\n return {\n name: fgbColumn.name,\n type: getTypeFromFGBType(fgbColumn.type),\n nullable: fgbColumn.nullable,\n metadata\n };\n}\n/** Note: fgb.ColumType does not appear to be exported */\nvar fgbColumnType;\n(function (fgbColumnType) {\n fgbColumnType[fgbColumnType[\"Byte\"] = 0] = \"Byte\";\n fgbColumnType[fgbColumnType[\"UByte\"] = 1] = \"UByte\";\n fgbColumnType[fgbColumnType[\"Bool\"] = 2] = \"Bool\";\n fgbColumnType[fgbColumnType[\"Short\"] = 3] = \"Short\";\n fgbColumnType[fgbColumnType[\"UShort\"] = 4] = \"UShort\";\n fgbColumnType[fgbColumnType[\"Int\"] = 5] = \"Int\";\n fgbColumnType[fgbColumnType[\"UInt\"] = 6] = \"UInt\";\n fgbColumnType[fgbColumnType[\"Long\"] = 7] = \"Long\";\n fgbColumnType[fgbColumnType[\"ULong\"] = 8] = \"ULong\";\n fgbColumnType[fgbColumnType[\"Float\"] = 9] = \"Float\";\n fgbColumnType[fgbColumnType[\"Double\"] = 10] = \"Double\";\n fgbColumnType[fgbColumnType[\"String\"] = 11] = \"String\";\n fgbColumnType[fgbColumnType[\"Json\"] = 12] = \"Json\";\n fgbColumnType[fgbColumnType[\"DateTime\"] = 13] = \"DateTime\";\n fgbColumnType[fgbColumnType[\"Binary\"] = 14] = \"Binary\";\n})(fgbColumnType || (fgbColumnType = {}));\n/** Convert FGB types to arrow like types */\n// eslint-disable-next-line complexity\nfunction getTypeFromFGBType(fgbType /* fgb.ColumnMeta['type'] */) {\n switch (fgbType) {\n case fgbColumnType.Byte:\n return 'int8';\n case fgbColumnType.UByte:\n return 'uint8';\n case fgbColumnType.Bool:\n return 'bool';\n case fgbColumnType.Short:\n return 'int16';\n case fgbColumnType.UShort:\n return 'uint16';\n case fgbColumnType.Int:\n return 'int32';\n case fgbColumnType.UInt:\n return 'uint32';\n case fgbColumnType.Long:\n return 'int64';\n case fgbColumnType.ULong:\n return 'uint64';\n case fgbColumnType.Float:\n return 'float32';\n case fgbColumnType.Double:\n return 'float64';\n case fgbColumnType.String:\n return 'utf8';\n case fgbColumnType.Json:\n return 'null';\n case fgbColumnType.DateTime:\n return 'date-millisecond';\n case fgbColumnType.Binary:\n return 'binary';\n default:\n return 'null';\n }\n}\n", "// automatically generated by the FlatBuffers compiler, do not modify\nexport var GeometryType;\n(function (GeometryType) {\n GeometryType[GeometryType[\"Unknown\"] = 0] = \"Unknown\";\n GeometryType[GeometryType[\"Point\"] = 1] = \"Point\";\n GeometryType[GeometryType[\"LineString\"] = 2] = \"LineString\";\n GeometryType[GeometryType[\"Polygon\"] = 3] = \"Polygon\";\n GeometryType[GeometryType[\"MultiPoint\"] = 4] = \"MultiPoint\";\n GeometryType[GeometryType[\"MultiLineString\"] = 5] = \"MultiLineString\";\n GeometryType[GeometryType[\"MultiPolygon\"] = 6] = \"MultiPolygon\";\n GeometryType[GeometryType[\"GeometryCollection\"] = 7] = \"GeometryCollection\";\n GeometryType[GeometryType[\"CircularString\"] = 8] = \"CircularString\";\n GeometryType[GeometryType[\"CompoundCurve\"] = 9] = \"CompoundCurve\";\n GeometryType[GeometryType[\"CurvePolygon\"] = 10] = \"CurvePolygon\";\n GeometryType[GeometryType[\"MultiCurve\"] = 11] = \"MultiCurve\";\n GeometryType[GeometryType[\"MultiSurface\"] = 12] = \"MultiSurface\";\n GeometryType[GeometryType[\"Curve\"] = 13] = \"Curve\";\n GeometryType[GeometryType[\"Surface\"] = 14] = \"Surface\";\n GeometryType[GeometryType[\"PolyhedralSurface\"] = 15] = \"PolyhedralSurface\";\n GeometryType[GeometryType[\"TIN\"] = 16] = \"TIN\";\n GeometryType[GeometryType[\"Triangle\"] = 17] = \"Triangle\";\n})(GeometryType || (GeometryType = {}));\n", "// automatically generated by the FlatBuffers compiler, do not modify\nimport * as flatbuffers from 'flatbuffers';\nimport { GeometryType } from \"../flat-geobuf/geometry-type.js\";\nexport class Geometry {\n bb = null;\n bb_pos = 0;\n __init(i, bb) {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n static getRootAsGeometry(bb, obj) {\n return (obj || new Geometry()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n static getSizePrefixedRootAsGeometry(bb, obj) {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Geometry()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n ends(index) {\n const offset = this.bb.__offset(this.bb_pos, 4);\n return offset ? this.bb.readUint32(this.bb.__vector(this.bb_pos + offset) + index * 4) : 0;\n }\n endsLength() {\n const offset = this.bb.__offset(this.bb_pos, 4);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n }\n endsArray() {\n const offset = this.bb.__offset(this.bb_pos, 4);\n return offset\n ? new Uint32Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset))\n : null;\n }\n xy(index) {\n const offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? this.bb.readFloat64(this.bb.__vector(this.bb_pos + offset) + index * 8) : 0;\n }\n xyLength() {\n const offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n }\n xyArray() {\n const offset = this.bb.__offset(this.bb_pos, 6);\n return offset\n ? new Float64Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset))\n : null;\n }\n z(index) {\n const offset = this.bb.__offset(this.bb_pos, 8);\n return offset ? this.bb.readFloat64(this.bb.__vector(this.bb_pos + offset) + index * 8) : 0;\n }\n zLength() {\n const offset = this.bb.__offset(this.bb_pos, 8);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n }\n zArray() {\n const offset = this.bb.__offset(this.bb_pos, 8);\n return offset\n ? new Float64Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset))\n : null;\n }\n m(index) {\n const offset = this.bb.__offset(this.bb_pos, 10);\n return offset ? this.bb.readFloat64(this.bb.__vector(this.bb_pos + offset) + index * 8) : 0;\n }\n mLength() {\n const offset = this.bb.__offset(this.bb_pos, 10);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n }\n mArray() {\n const offset = this.bb.__offset(this.bb_pos, 10);\n return offset\n ? new Float64Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset))\n : null;\n }\n t(index) {\n const offset = this.bb.__offset(this.bb_pos, 12);\n return offset ? this.bb.readFloat64(this.bb.__vector(this.bb_pos + offset) + index * 8) : 0;\n }\n tLength() {\n const offset = this.bb.__offset(this.bb_pos, 12);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n }\n tArray() {\n const offset = this.bb.__offset(this.bb_pos, 12);\n return offset\n ? new Float64Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset))\n : null;\n }\n tm(index) {\n const offset = this.bb.__offset(this.bb_pos, 14);\n return offset\n ? this.bb.readUint64(this.bb.__vector(this.bb_pos + offset) + index * 8)\n : BigInt(0);\n }\n tmLength() {\n const offset = this.bb.__offset(this.bb_pos, 14);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n }\n type() {\n const offset = this.bb.__offset(this.bb_pos, 16);\n return offset ? this.bb.readUint8(this.bb_pos + offset) : GeometryType.Unknown;\n }\n parts(index, obj) {\n const offset = this.bb.__offset(this.bb_pos, 18);\n return offset\n ? (obj || new Geometry()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb)\n : null;\n }\n partsLength() {\n const offset = this.bb.__offset(this.bb_pos, 18);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n }\n static startGeometry(builder) {\n builder.startObject(8);\n }\n static addEnds(builder, endsOffset) {\n builder.addFieldOffset(0, endsOffset, 0);\n }\n static createEndsVector(builder, data) {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addInt32(data[i]);\n }\n return builder.endVector();\n }\n static startEndsVector(builder, numElems) {\n builder.startVector(4, numElems, 4);\n }\n static addXy(builder, xyOffset) {\n builder.addFieldOffset(1, xyOffset, 0);\n }\n static createXyVector(builder, data) {\n builder.startVector(8, data.length, 8);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addFloat64(data[i]);\n }\n return builder.endVector();\n }\n static startXyVector(builder, numElems) {\n builder.startVector(8, numElems, 8);\n }\n static addZ(builder, zOffset) {\n builder.addFieldOffset(2, zOffset, 0);\n }\n static createZVector(builder, data) {\n builder.startVector(8, data.length, 8);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addFloat64(data[i]);\n }\n return builder.endVector();\n }\n static startZVector(builder, numElems) {\n builder.startVector(8, numElems, 8);\n }\n static addM(builder, mOffset) {\n builder.addFieldOffset(3, mOffset, 0);\n }\n static createMVector(builder, data) {\n builder.startVector(8, data.length, 8);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addFloat64(data[i]);\n }\n return builder.endVector();\n }\n static startMVector(builder, numElems) {\n builder.startVector(8, numElems, 8);\n }\n static addT(builder, tOffset) {\n builder.addFieldOffset(4, tOffset, 0);\n }\n static createTVector(builder, data) {\n builder.startVector(8, data.length, 8);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addFloat64(data[i]);\n }\n return builder.endVector();\n }\n static startTVector(builder, numElems) {\n builder.startVector(8, numElems, 8);\n }\n static addTm(builder, tmOffset) {\n builder.addFieldOffset(5, tmOffset, 0);\n }\n static createTmVector(builder, data) {\n builder.startVector(8, data.length, 8);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addInt64(data[i]);\n }\n return builder.endVector();\n }\n static startTmVector(builder, numElems) {\n builder.startVector(8, numElems, 8);\n }\n static addType(builder, type) {\n builder.addFieldInt8(6, type, GeometryType.Unknown);\n }\n static addParts(builder, partsOffset) {\n builder.addFieldOffset(7, partsOffset, 0);\n }\n static createPartsVector(builder, data) {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n static startPartsVector(builder, numElems) {\n builder.startVector(4, numElems, 4);\n }\n static endGeometry(builder) {\n const offset = builder.endObject();\n return offset;\n }\n static createGeometry(builder, endsOffset, xyOffset, zOffset, mOffset, tOffset, tmOffset, type, partsOffset) {\n Geometry.startGeometry(builder);\n Geometry.addEnds(builder, endsOffset);\n Geometry.addXy(builder, xyOffset);\n Geometry.addZ(builder, zOffset);\n Geometry.addM(builder, mOffset);\n Geometry.addT(builder, tOffset);\n Geometry.addTm(builder, tmOffset);\n Geometry.addType(builder, type);\n Geometry.addParts(builder, partsOffset);\n return Geometry.endGeometry(builder);\n }\n}\n", "import { GeometryType } from \"../flat-geobuf/geometry-type.js\";\nimport { Geometry } from \"../flat-geobuf/geometry.js\";\nexport function buildGeometry(builder, parsedGeometry) {\n const { xy, z, ends, parts, type } = parsedGeometry;\n if (parts) {\n const partOffsets = parts.map((part) => buildGeometry(builder, part));\n const partsOffset = Geometry.createPartsVector(builder, partOffsets);\n Geometry.startGeometry(builder);\n Geometry.addParts(builder, partsOffset);\n Geometry.addType(builder, type);\n return Geometry.endGeometry(builder);\n }\n const xyOffset = Geometry.createXyVector(builder, xy);\n let zOffset;\n if (z)\n zOffset = Geometry.createZVector(builder, z);\n let endsOffset;\n if (ends)\n endsOffset = Geometry.createEndsVector(builder, ends);\n Geometry.startGeometry(builder);\n if (endsOffset)\n Geometry.addEnds(builder, endsOffset);\n Geometry.addXy(builder, xyOffset);\n if (zOffset)\n Geometry.addZ(builder, zOffset);\n Geometry.addType(builder, type);\n return Geometry.endGeometry(builder);\n}\nexport function flat(a, xy, z) {\n if (a.length === 0)\n return;\n if (Array.isArray(a[0])) {\n for (const sa of a)\n flat(sa, xy, z);\n }\n else if (a.length === 2)\n xy.push(...a);\n else {\n xy.push(a[0], a[1]);\n z.push(a[2]);\n }\n}\nexport function parseGeometry(geometry, headerGeomType) {\n let xy;\n let ends;\n let parts;\n let type = headerGeomType;\n if (type === GeometryType.Unknown) {\n type = toGeometryType(geometry.getType());\n }\n if (type === GeometryType.MultiLineString) {\n if (geometry.getFlatCoordinates)\n xy = geometry.getFlatCoordinates();\n const mlsEnds = geometry.getEnds();\n if (mlsEnds.length > 1)\n ends = mlsEnds.map((e) => e >> 1);\n }\n else if (type === GeometryType.Polygon) {\n if (geometry.getFlatCoordinates)\n xy = geometry.getFlatCoordinates();\n const pEnds = geometry.getEnds();\n if (pEnds.length > 1)\n ends = pEnds.map((e) => e >> 1);\n }\n else if (type === GeometryType.MultiPolygon) {\n const mp = geometry;\n parts = mp.getPolygons().map((p) => parseGeometry(p, GeometryType.Polygon));\n }\n else if (geometry.getFlatCoordinates)\n xy = geometry.getFlatCoordinates();\n return {\n xy,\n ends,\n type,\n parts\n };\n}\nexport function pairFlatCoordinates(xy, z) {\n const newArray = [];\n for (let i = 0; i < xy.length; i += 2) {\n const a = [xy[i], xy[i + 1]];\n if (z)\n a.push(z[i >> 1]);\n newArray.push(a);\n }\n return newArray;\n}\nexport function toGeometryType(name) {\n if (!name)\n return GeometryType.Unknown;\n const type = GeometryType[name];\n return type;\n}\n", "import { GeometryType } from \"../flat-geobuf/geometry-type.js\";\nimport { flat, pairFlatCoordinates, toGeometryType } from \"../generic/geometry.js\";\nexport function parseGeometry(geometry) {\n const cs = geometry.coordinates;\n const xy = [];\n const z = [];\n let ends;\n let parts;\n const type = toGeometryType(geometry.type);\n let end = 0;\n switch (geometry.type) {\n case 'Point':\n flat(cs, xy, z);\n break;\n case 'MultiPoint':\n case 'LineString':\n flat(cs, xy, z);\n break;\n case 'MultiLineString':\n case 'Polygon': {\n const css = cs;\n flat(css, xy, z);\n if (css.length > 1)\n ends = css.map((c) => (end += c.length));\n break;\n }\n case 'MultiPolygon': {\n const csss = cs;\n const geometries = csss.map((coordinates) => ({\n type: 'Polygon',\n coordinates\n }));\n parts = geometries.map(parseGeometry);\n break;\n }\n }\n return {\n xy,\n z: z.length > 0 ? z : undefined,\n ends,\n type,\n parts\n };\n}\nexport function parseGC(geometry) {\n const type = toGeometryType(geometry.type);\n const parts = [];\n for (let i = 0; i < geometry.geometries.length; i++) {\n const g = geometry.geometries[i];\n if (g.type === 'GeometryCollection')\n parts.push(parseGC(g));\n else\n parts.push(parseGeometry(g));\n }\n return {\n type,\n parts\n };\n}\nfunction extractParts(xy, z, ends) {\n if (!ends || ends.length === 0)\n return [pairFlatCoordinates(xy, z)];\n let s = 0;\n const xySlices = Array.from(ends).map((e) => xy.slice(s, (s = e << 1)));\n let zSlices;\n if (z) {\n s = 0;\n zSlices = Array.from(ends).map((e) => z.slice(s, (s = e)));\n }\n return xySlices.map((xy, i) => pairFlatCoordinates(xy, zSlices ? zSlices[i] : undefined));\n}\nfunction toGeoJsonCoordinates(geometry, type) {\n const xy = geometry.xyArray();\n const z = geometry.zArray();\n switch (type) {\n case GeometryType.Point: {\n const a = Array.from(xy);\n if (z)\n a.push(z[0]);\n return a;\n }\n case GeometryType.MultiPoint:\n case GeometryType.LineString:\n return pairFlatCoordinates(xy, z);\n case GeometryType.MultiLineString:\n return extractParts(xy, z, geometry.endsArray());\n case GeometryType.Polygon:\n return extractParts(xy, z, geometry.endsArray());\n }\n}\nexport function fromGeometry(geometry, headerType) {\n let type = headerType;\n if (type === GeometryType.Unknown) {\n type = geometry.type();\n }\n if (type === GeometryType.GeometryCollection) {\n const geometries = [];\n for (let i = 0; i < geometry.partsLength(); i++) {\n const part = geometry.parts(i);\n const partType = part.type();\n geometries.push(fromGeometry(part, partType));\n }\n return {\n type: GeometryType[type],\n geometries\n };\n }\n else if (type === GeometryType.MultiPolygon) {\n const geometries = [];\n for (let i = 0; i < geometry.partsLength(); i++)\n geometries.push(fromGeometry(geometry.parts(i), GeometryType.Polygon));\n return {\n type: GeometryType[type],\n coordinates: geometries.map((g) => g.coordinates)\n };\n }\n const coordinates = toGeoJsonCoordinates(geometry, type);\n return {\n type: GeometryType[type],\n coordinates\n };\n}\n", "import * as flatbuffers from 'flatbuffers';\nimport { ColumnType } from \"../flat-geobuf/column-type.js\";\nimport { Feature } from \"../flat-geobuf/feature.js\";\nimport { buildGeometry } from \"./geometry.js\";\nconst textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\nexport function fromFeature(feature, header, createGeometry, createFeature) {\n const columns = header.columns;\n const geometry = feature.geometry();\n const simpleGeometry = createGeometry(geometry, header.geometryType);\n const properties = parseProperties(feature, columns);\n return createFeature(simpleGeometry, properties);\n}\nexport function buildFeature(geometry, properties, header) {\n const columns = header.columns;\n const builder = new flatbuffers.Builder();\n let offset = 0;\n let capacity = 1024;\n let bytes = new Uint8Array(capacity);\n let view = new DataView(bytes.buffer);\n const prep = function (size) {\n if (offset + size < capacity)\n return;\n capacity = Math.max(capacity + size, capacity * 2);\n const newBytes = new Uint8Array(capacity);\n newBytes.set(bytes);\n bytes = newBytes;\n view = new DataView(bytes.buffer);\n };\n if (columns) {\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i];\n const value = properties[column.name];\n if (value === null)\n continue;\n prep(2);\n view.setUint16(offset, i, true);\n offset += 2;\n switch (column.type) {\n case ColumnType.Bool:\n prep(1);\n view.setUint8(offset, value);\n offset += 1;\n break;\n case ColumnType.Short:\n prep(2);\n view.setInt16(offset, value, true);\n offset += 2;\n break;\n case ColumnType.UShort:\n prep(2);\n view.setUint16(offset, value, true);\n offset += 2;\n break;\n case ColumnType.Int:\n prep(4);\n view.setInt32(offset, value, true);\n offset += 4;\n break;\n case ColumnType.UInt:\n prep(4);\n view.setUint32(offset, value, true);\n offset += 4;\n break;\n case ColumnType.Long:\n prep(8);\n view.setBigInt64(offset, BigInt(value), true);\n offset += 8;\n break;\n case ColumnType.Float:\n prep(4);\n view.setFloat32(offset, value, true);\n offset += 4;\n break;\n case ColumnType.Double:\n prep(8);\n view.setFloat64(offset, value, true);\n offset += 8;\n break;\n case ColumnType.DateTime:\n case ColumnType.String: {\n const str = textEncoder.encode(value);\n prep(4);\n view.setUint32(offset, str.length, true);\n offset += 4;\n prep(str.length);\n bytes.set(str, offset);\n offset += str.length;\n break;\n }\n case ColumnType.Json: {\n const str = textEncoder.encode(JSON.stringify(value));\n prep(4);\n view.setUint32(offset, str.length, true);\n offset += 4;\n prep(str.length);\n bytes.set(str, offset);\n offset += str.length;\n break;\n }\n default:\n throw new Error(`Unknown type ${column.type}`);\n }\n }\n }\n let propertiesOffset = null;\n if (offset > 0)\n propertiesOffset = Feature.createPropertiesVector(builder, bytes.slice(0, offset));\n const geometryOffset = buildGeometry(builder, geometry);\n Feature.startFeature(builder);\n Feature.addGeometry(builder, geometryOffset);\n if (propertiesOffset)\n Feature.addProperties(builder, propertiesOffset);\n const featureOffset = Feature.endFeature(builder);\n builder.finishSizePrefixed(featureOffset);\n return builder.asUint8Array();\n}\nexport function parseProperties(feature, columns) {\n const properties = {};\n if (!columns || columns.length === 0)\n return properties;\n const array = feature.propertiesArray();\n if (!array)\n return properties;\n const view = new DataView(array.buffer, array.byteOffset);\n const length = feature.propertiesLength();\n let offset = 0;\n while (offset < length) {\n const i = view.getUint16(offset, true);\n offset += 2;\n const column = columns[i];\n const name = column.name;\n switch (column.type) {\n case ColumnType.Bool: {\n properties[name] = Boolean(view.getUint8(offset));\n offset += 1;\n break;\n }\n case ColumnType.Byte: {\n properties[name] = view.getInt8(offset);\n offset += 1;\n break;\n }\n case ColumnType.UByte: {\n properties[name] = view.getUint8(offset);\n offset += 1;\n break;\n }\n case ColumnType.Short: {\n properties[name] = view.getInt16(offset, true);\n offset += 2;\n break;\n }\n case ColumnType.UShort: {\n properties[name] = view.getUint16(offset, true);\n offset += 2;\n break;\n }\n case ColumnType.Int: {\n properties[name] = view.getInt32(offset, true);\n offset += 4;\n break;\n }\n case ColumnType.UInt: {\n properties[name] = view.getUint32(offset, true);\n offset += 4;\n break;\n }\n case ColumnType.Long: {\n properties[name] = Number(view.getBigInt64(offset, true));\n offset += 8;\n break;\n }\n case ColumnType.ULong: {\n properties[name] = Number(view.getBigUint64(offset, true));\n offset += 8;\n break;\n }\n case ColumnType.Float: {\n properties[name] = view.getFloat32(offset, true);\n offset += 4;\n break;\n }\n case ColumnType.Double: {\n properties[name] = view.getFloat64(offset, true);\n offset += 8;\n break;\n }\n case ColumnType.DateTime:\n case ColumnType.String: {\n const length = view.getUint32(offset, true);\n offset += 4;\n properties[name] = textDecoder.decode(array.subarray(offset, offset + length));\n offset += length;\n break;\n }\n case ColumnType.Json: {\n const length = view.getUint32(offset, true);\n offset += 4;\n const str = textDecoder.decode(array.subarray(offset, offset + length));\n properties[name] = JSON.parse(str);\n offset += length;\n break;\n }\n default:\n throw new Error(`Unknown type ${column.type}`);\n }\n }\n return properties;\n}\n", "// automatically generated by the FlatBuffers compiler, do not modify\nexport var ColumnType;\n(function (ColumnType) {\n ColumnType[ColumnType[\"Byte\"] = 0] = \"Byte\";\n ColumnType[ColumnType[\"UByte\"] = 1] = \"UByte\";\n ColumnType[ColumnType[\"Bool\"] = 2] = \"Bool\";\n ColumnType[ColumnType[\"Short\"] = 3] = \"Short\";\n ColumnType[ColumnType[\"UShort\"] = 4] = \"UShort\";\n ColumnType[ColumnType[\"Int\"] = 5] = \"Int\";\n ColumnType[ColumnType[\"UInt\"] = 6] = \"UInt\";\n ColumnType[ColumnType[\"Long\"] = 7] = \"Long\";\n ColumnType[ColumnType[\"ULong\"] = 8] = \"ULong\";\n ColumnType[ColumnType[\"Float\"] = 9] = \"Float\";\n ColumnType[ColumnType[\"Double\"] = 10] = \"Double\";\n ColumnType[ColumnType[\"String\"] = 11] = \"String\";\n ColumnType[ColumnType[\"Json\"] = 12] = \"Json\";\n ColumnType[ColumnType[\"DateTime\"] = 13] = \"DateTime\";\n ColumnType[ColumnType[\"Binary\"] = 14] = \"Binary\";\n})(ColumnType || (ColumnType = {}));\n", "// automatically generated by the FlatBuffers compiler, do not modify\nimport * as flatbuffers from 'flatbuffers';\nimport { Column } from \"../flat-geobuf/column.js\";\nimport { Geometry } from \"../flat-geobuf/geometry.js\";\nexport class Feature {\n bb = null;\n bb_pos = 0;\n __init(i, bb) {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n static getRootAsFeature(bb, obj) {\n return (obj || new Feature()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n static getSizePrefixedRootAsFeature(bb, obj) {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Feature()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n geometry(obj) {\n const offset = this.bb.__offset(this.bb_pos, 4);\n return offset\n ? (obj || new Geometry()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb)\n : null;\n }\n properties(index) {\n const offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) : 0;\n }\n propertiesLength() {\n const offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n }\n propertiesArray() {\n const offset = this.bb.__offset(this.bb_pos, 6);\n return offset\n ? new Uint8Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset))\n : null;\n }\n columns(index, obj) {\n const offset = this.bb.__offset(this.bb_pos, 8);\n return offset\n ? (obj || new Column()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb)\n : null;\n }\n columnsLength() {\n const offset = this.bb.__offset(this.bb_pos, 8);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n }\n static startFeature(builder) {\n builder.startObject(3);\n }\n static addGeometry(builder, geometryOffset) {\n builder.addFieldOffset(0, geometryOffset, 0);\n }\n static addProperties(builder, propertiesOffset) {\n builder.addFieldOffset(1, propertiesOffset, 0);\n }\n static createPropertiesVector(builder, data) {\n builder.startVector(1, data.length, 1);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addInt8(data[i]);\n }\n return builder.endVector();\n }\n static startPropertiesVector(builder, numElems) {\n builder.startVector(1, numElems, 1);\n }\n static addColumns(builder, columnsOffset) {\n builder.addFieldOffset(2, columnsOffset, 0);\n }\n static createColumnsVector(builder, data) {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n static startColumnsVector(builder, numElems) {\n builder.startVector(4, numElems, 4);\n }\n static endFeature(builder) {\n const offset = builder.endObject();\n return offset;\n }\n static finishFeatureBuffer(builder, offset) {\n builder.finish(offset);\n }\n static finishSizePrefixedFeatureBuffer(builder, offset) {\n builder.finish(offset, undefined, true);\n }\n static createFeature(builder, geometryOffset, propertiesOffset, columnsOffset) {\n Feature.startFeature(builder);\n Feature.addGeometry(builder, geometryOffset);\n Feature.addProperties(builder, propertiesOffset);\n Feature.addColumns(builder, columnsOffset);\n return Feature.endFeature(builder);\n }\n}\n", "// automatically generated by the FlatBuffers compiler, do not modify\nimport * as flatbuffers from 'flatbuffers';\nimport { ColumnType } from \"../flat-geobuf/column-type.js\";\nexport class Column {\n bb = null;\n bb_pos = 0;\n __init(i, bb) {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n static getRootAsColumn(bb, obj) {\n return (obj || new Column()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n static getSizePrefixedRootAsColumn(bb, obj) {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Column()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n name(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 4);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n type() {\n const offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? this.bb.readUint8(this.bb_pos + offset) : ColumnType.Byte;\n }\n title(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 8);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n description(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 10);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n width() {\n const offset = this.bb.__offset(this.bb_pos, 12);\n return offset ? this.bb.readInt32(this.bb_pos + offset) : -1;\n }\n precision() {\n const offset = this.bb.__offset(this.bb_pos, 14);\n return offset ? this.bb.readInt32(this.bb_pos + offset) : -1;\n }\n scale() {\n const offset = this.bb.__offset(this.bb_pos, 16);\n return offset ? this.bb.readInt32(this.bb_pos + offset) : -1;\n }\n nullable() {\n const offset = this.bb.__offset(this.bb_pos, 18);\n return offset ? Boolean(this.bb.readInt8(this.bb_pos + offset)) : true;\n }\n unique() {\n const offset = this.bb.__offset(this.bb_pos, 20);\n return offset ? Boolean(this.bb.readInt8(this.bb_pos + offset)) : false;\n }\n primaryKey() {\n const offset = this.bb.__offset(this.bb_pos, 22);\n return offset ? Boolean(this.bb.readInt8(this.bb_pos + offset)) : false;\n }\n metadata(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 24);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n static startColumn(builder) {\n builder.startObject(11);\n }\n static addName(builder, nameOffset) {\n builder.addFieldOffset(0, nameOffset, 0);\n }\n static addType(builder, type) {\n builder.addFieldInt8(1, type, ColumnType.Byte);\n }\n static addTitle(builder, titleOffset) {\n builder.addFieldOffset(2, titleOffset, 0);\n }\n static addDescription(builder, descriptionOffset) {\n builder.addFieldOffset(3, descriptionOffset, 0);\n }\n static addWidth(builder, width) {\n builder.addFieldInt32(4, width, -1);\n }\n static addPrecision(builder, precision) {\n builder.addFieldInt32(5, precision, -1);\n }\n static addScale(builder, scale) {\n builder.addFieldInt32(6, scale, -1);\n }\n static addNullable(builder, nullable) {\n builder.addFieldInt8(7, Number(nullable), Number(true));\n }\n static addUnique(builder, unique) {\n builder.addFieldInt8(8, Number(unique), Number(false));\n }\n static addPrimaryKey(builder, primaryKey) {\n builder.addFieldInt8(9, Number(primaryKey), Number(false));\n }\n static addMetadata(builder, metadataOffset) {\n builder.addFieldOffset(10, metadataOffset, 0);\n }\n static endColumn(builder) {\n const offset = builder.endObject();\n builder.requiredField(offset, 4); // name\n return offset;\n }\n static createColumn(builder, nameOffset, type, titleOffset, descriptionOffset, width, precision, scale, nullable, unique, primaryKey, metadataOffset) {\n Column.startColumn(builder);\n Column.addName(builder, nameOffset);\n Column.addType(builder, type);\n Column.addTitle(builder, titleOffset);\n Column.addDescription(builder, descriptionOffset);\n Column.addWidth(builder, width);\n Column.addPrecision(builder, precision);\n Column.addScale(builder, scale);\n Column.addNullable(builder, nullable);\n Column.addUnique(builder, unique);\n Column.addPrimaryKey(builder, primaryKey);\n Column.addMetadata(builder, metadataOffset);\n return Column.endColumn(builder);\n }\n}\n", "import { fromGeometry } from \"./geometry.js\";\nimport { parseProperties } from \"../generic/feature.js\";\nexport function fromFeature(feature, header) {\n const columns = header.columns;\n const geometry = fromGeometry(feature.geometry(), header.geometryType);\n const geoJsonfeature = {\n type: 'Feature',\n geometry,\n properties: parseProperties(feature, columns)\n };\n return geoJsonfeature;\n}\n", "import * as flatbuffers from 'flatbuffers';\nimport slice from 'slice-source';\nimport { Header } from \"../flat-geobuf/header.js\";\nimport { Column } from \"../flat-geobuf/column.js\";\nimport { ColumnType } from \"../flat-geobuf/column-type.js\";\nimport { Feature } from \"../flat-geobuf/feature.js\";\nimport { fromByteBuffer } from \"../header-meta.js\";\nimport { buildFeature } from \"./feature.js\";\nimport { HttpReader } from \"../http-reader.js\";\nimport Logger from \"../logger.js\";\nimport { calcTreeSize } from \"../packedrtree.js\";\nimport { parseGeometry } from \"./geometry.js\";\nimport { magicbytes, SIZE_PREFIX_LEN } from \"../constants.js\";\nimport { inferGeometryType } from \"./header.js\";\n/**\n * Serialize generic features to FlatGeobuf\n * @param features\n */\nexport function serialize(features) {\n const headerMeta = introspectHeaderMeta(features);\n const header = buildHeader(headerMeta);\n const featureBuffers = features.map((f) => {\n if (!f.getGeometry)\n throw new Error('Missing getGeometry implementation');\n if (!f.getProperties)\n throw new Error('Missing getProperties implementation');\n return buildFeature(parseGeometry(f.getGeometry(), headerMeta.geometryType), f.getProperties(), headerMeta);\n });\n const featuresLength = featureBuffers.map((f) => f.length).reduce((a, b) => a + b);\n const uint8 = new Uint8Array(magicbytes.length + header.length + featuresLength);\n uint8.set(header, magicbytes.length);\n let offset = magicbytes.length + header.length;\n for (const feature of featureBuffers) {\n uint8.set(feature, offset);\n offset += feature.length;\n }\n uint8.set(magicbytes);\n return uint8;\n}\nexport function deserialize(bytes, fromFeature, headerMetaFn) {\n if (!bytes.subarray(0, 3).every((v, i) => magicbytes[i] === v))\n throw new Error('Not a FlatGeobuf file');\n const bb = new flatbuffers.ByteBuffer(bytes);\n const headerLength = bb.readUint32(magicbytes.length);\n bb.setPosition(magicbytes.length + SIZE_PREFIX_LEN);\n const headerMeta = fromByteBuffer(bb);\n if (headerMetaFn)\n headerMetaFn(headerMeta);\n let offset = magicbytes.length + SIZE_PREFIX_LEN + headerLength;\n const { indexNodeSize, featuresCount } = headerMeta;\n if (indexNodeSize > 0)\n offset += calcTreeSize(featuresCount, indexNodeSize);\n const features = [];\n while (offset < bb.capacity()) {\n const featureLength = bb.readUint32(offset);\n bb.setPosition(offset + SIZE_PREFIX_LEN);\n const feature = Feature.getRootAsFeature(bb);\n features.push(fromFeature(feature, headerMeta));\n offset += SIZE_PREFIX_LEN + featureLength;\n }\n return features;\n}\nexport async function* deserializeStream(stream, fromFeature, headerMetaFn) {\n const reader = slice(stream);\n const read = async (size) => await reader.slice(size);\n let bytes = new Uint8Array(await read(8, 'magic bytes'));\n if (!bytes.subarray(0, 3).every((v, i) => magicbytes[i] === v))\n throw new Error('Not a FlatGeobuf file');\n bytes = new Uint8Array(await read(4, 'header length'));\n let bb = new flatbuffers.ByteBuffer(bytes);\n const headerLength = bb.readUint32(0);\n bytes = new Uint8Array(await read(headerLength, 'header data'));\n bb = new flatbuffers.ByteBuffer(bytes);\n const headerMeta = fromByteBuffer(bb);\n if (headerMetaFn)\n headerMetaFn(headerMeta);\n const { indexNodeSize, featuresCount } = headerMeta;\n if (indexNodeSize > 0) {\n const treeSize = calcTreeSize(featuresCount, indexNodeSize);\n await read(treeSize, 'entire index, w/o rect');\n }\n let feature;\n while ((feature = await readFeature(read, headerMeta, fromFeature)))\n yield feature;\n}\nexport async function* deserializeFiltered(url, rect, fromFeature, headerMetaFn) {\n const reader = await HttpReader.open(url);\n Logger.debug('opened reader');\n if (headerMetaFn)\n headerMetaFn(reader.header);\n for await (const feature of reader.selectBbox(rect)) {\n yield fromFeature(feature, reader.header);\n }\n}\nasync function readFeature(read, headerMeta, fromFeature) {\n let bytes = new Uint8Array(await read(4, 'feature length'));\n if (bytes.byteLength === 0)\n return;\n let bb = new flatbuffers.ByteBuffer(bytes);\n const featureLength = bb.readUint32(0);\n bytes = new Uint8Array(await read(featureLength, 'feature data'));\n const bytesAligned = new Uint8Array(featureLength + 4);\n bytesAligned.set(bytes, 4);\n bb = new flatbuffers.ByteBuffer(bytesAligned);\n bb.setPosition(SIZE_PREFIX_LEN);\n const feature = Feature.getRootAsFeature(bb);\n return fromFeature(feature, headerMeta);\n}\nfunction buildColumn(builder, column) {\n const nameOffset = builder.createString(column.name);\n Column.startColumn(builder);\n Column.addName(builder, nameOffset);\n Column.addType(builder, column.type);\n return Column.endColumn(builder);\n}\nexport function buildHeader(header) {\n const builder = new flatbuffers.Builder();\n let columnOffsets = null;\n if (header.columns)\n columnOffsets = Header.createColumnsVector(builder, header.columns.map((c) => buildColumn(builder, c)));\n const nameOffset = builder.createString('L1');\n Header.startHeader(builder);\n Header.addFeaturesCount(builder, BigInt(header.featuresCount));\n Header.addGeometryType(builder, header.geometryType);\n Header.addIndexNodeSize(builder, 0);\n if (columnOffsets)\n Header.addColumns(builder, columnOffsets);\n Header.addName(builder, nameOffset);\n const offset = Header.endHeader(builder);\n builder.finishSizePrefixed(offset);\n return builder.asUint8Array();\n}\nfunction valueToType(value) {\n if (typeof value === 'boolean')\n return ColumnType.Bool;\n else if (typeof value === 'number')\n if (value % 1 === 0)\n return ColumnType.Int;\n else\n return ColumnType.Double;\n else if (typeof value === 'string')\n return ColumnType.String;\n else if (value === null)\n return ColumnType.String;\n else if (typeof value === 'object')\n return ColumnType.Json;\n throw new Error(`Unknown type (value '${value}')`);\n}\nexport function mapColumn(properties, k) {\n return {\n name: k,\n type: valueToType(properties[k]),\n title: null,\n description: null,\n width: -1,\n precision: -1,\n scale: -1,\n nullable: true,\n unique: false,\n primary_key: false\n };\n}\nfunction introspectHeaderMeta(features) {\n const sampleFeature = features[0];\n const properties = sampleFeature.getProperties ? sampleFeature.getProperties() : {};\n let columns = null;\n if (properties)\n columns = Object.keys(properties)\n .filter((key) => key !== 'geometry')\n .map((k) => mapColumn(properties, k));\n const geometryType = inferGeometryType(features);\n const headerMeta = {\n geometryType,\n columns,\n envelope: null,\n featuresCount: features.length,\n indexNodeSize: 0,\n crs: null,\n title: null,\n description: null,\n metadata: null\n };\n return headerMeta;\n}\n", "// automatically generated by the FlatBuffers compiler, do not modify\nimport * as flatbuffers from 'flatbuffers';\nimport { Column } from \"../flat-geobuf/column.js\";\nimport { Crs } from \"../flat-geobuf/crs.js\";\nimport { GeometryType } from \"../flat-geobuf/geometry-type.js\";\nexport class Header {\n bb = null;\n bb_pos = 0;\n __init(i, bb) {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n static getRootAsHeader(bb, obj) {\n return (obj || new Header()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n static getSizePrefixedRootAsHeader(bb, obj) {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Header()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n name(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 4);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n envelope(index) {\n const offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? this.bb.readFloat64(this.bb.__vector(this.bb_pos + offset) + index * 8) : 0;\n }\n envelopeLength() {\n const offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n }\n envelopeArray() {\n const offset = this.bb.__offset(this.bb_pos, 6);\n return offset\n ? new Float64Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset))\n : null;\n }\n geometryType() {\n const offset = this.bb.__offset(this.bb_pos, 8);\n return offset ? this.bb.readUint8(this.bb_pos + offset) : GeometryType.Unknown;\n }\n hasZ() {\n const offset = this.bb.__offset(this.bb_pos, 10);\n return offset ? Boolean(this.bb.readInt8(this.bb_pos + offset)) : false;\n }\n hasM() {\n const offset = this.bb.__offset(this.bb_pos, 12);\n return offset ? Boolean(this.bb.readInt8(this.bb_pos + offset)) : false;\n }\n hasT() {\n const offset = this.bb.__offset(this.bb_pos, 14);\n return offset ? Boolean(this.bb.readInt8(this.bb_pos + offset)) : false;\n }\n hasTm() {\n const offset = this.bb.__offset(this.bb_pos, 16);\n return offset ? Boolean(this.bb.readInt8(this.bb_pos + offset)) : false;\n }\n columns(index, obj) {\n const offset = this.bb.__offset(this.bb_pos, 18);\n return offset\n ? (obj || new Column()).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos + offset) + index * 4), this.bb)\n : null;\n }\n columnsLength() {\n const offset = this.bb.__offset(this.bb_pos, 18);\n return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0;\n }\n featuresCount() {\n const offset = this.bb.__offset(this.bb_pos, 20);\n return offset ? this.bb.readUint64(this.bb_pos + offset) : BigInt('0');\n }\n indexNodeSize() {\n const offset = this.bb.__offset(this.bb_pos, 22);\n return offset ? this.bb.readUint16(this.bb_pos + offset) : 16;\n }\n crs(obj) {\n const offset = this.bb.__offset(this.bb_pos, 24);\n return offset\n ? (obj || new Crs()).__init(this.bb.__indirect(this.bb_pos + offset), this.bb)\n : null;\n }\n title(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 26);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n description(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 28);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n metadata(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 30);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n static startHeader(builder) {\n builder.startObject(14);\n }\n static addName(builder, nameOffset) {\n builder.addFieldOffset(0, nameOffset, 0);\n }\n static addEnvelope(builder, envelopeOffset) {\n builder.addFieldOffset(1, envelopeOffset, 0);\n }\n static createEnvelopeVector(builder, data) {\n builder.startVector(8, data.length, 8);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addFloat64(data[i]);\n }\n return builder.endVector();\n }\n static startEnvelopeVector(builder, numElems) {\n builder.startVector(8, numElems, 8);\n }\n static addGeometryType(builder, geometryType) {\n builder.addFieldInt8(2, geometryType, GeometryType.Unknown);\n }\n static addHasZ(builder, hasZ) {\n builder.addFieldInt8(3, Number(hasZ), Number(false));\n }\n static addHasM(builder, hasM) {\n builder.addFieldInt8(4, Number(hasM), Number(false));\n }\n static addHasT(builder, hasT) {\n builder.addFieldInt8(5, Number(hasT), Number(false));\n }\n static addHasTm(builder, hasTm) {\n builder.addFieldInt8(6, Number(hasTm), Number(false));\n }\n static addColumns(builder, columnsOffset) {\n builder.addFieldOffset(7, columnsOffset, 0);\n }\n static createColumnsVector(builder, data) {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n static startColumnsVector(builder, numElems) {\n builder.startVector(4, numElems, 4);\n }\n static addFeaturesCount(builder, featuresCount) {\n builder.addFieldInt64(8, featuresCount, BigInt('0'));\n }\n static addIndexNodeSize(builder, indexNodeSize) {\n builder.addFieldInt16(9, indexNodeSize, 16);\n }\n static addCrs(builder, crsOffset) {\n builder.addFieldOffset(10, crsOffset, 0);\n }\n static addTitle(builder, titleOffset) {\n builder.addFieldOffset(11, titleOffset, 0);\n }\n static addDescription(builder, descriptionOffset) {\n builder.addFieldOffset(12, descriptionOffset, 0);\n }\n static addMetadata(builder, metadataOffset) {\n builder.addFieldOffset(13, metadataOffset, 0);\n }\n static endHeader(builder) {\n const offset = builder.endObject();\n return offset;\n }\n static finishHeaderBuffer(builder, offset) {\n builder.finish(offset);\n }\n static finishSizePrefixedHeaderBuffer(builder, offset) {\n builder.finish(offset, undefined, true);\n }\n}\n", "// automatically generated by the FlatBuffers compiler, do not modify\nimport * as flatbuffers from 'flatbuffers';\nexport class Crs {\n bb = null;\n bb_pos = 0;\n __init(i, bb) {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n static getRootAsCrs(bb, obj) {\n return (obj || new Crs()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n static getSizePrefixedRootAsCrs(bb, obj) {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Crs()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n org(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 4);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n code() {\n const offset = this.bb.__offset(this.bb_pos, 6);\n return offset ? this.bb.readInt32(this.bb_pos + offset) : 0;\n }\n name(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 8);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n description(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 10);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n wkt(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 12);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n codeString(optionalEncoding) {\n const offset = this.bb.__offset(this.bb_pos, 14);\n return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n static startCrs(builder) {\n builder.startObject(6);\n }\n static addOrg(builder, orgOffset) {\n builder.addFieldOffset(0, orgOffset, 0);\n }\n static addCode(builder, code) {\n builder.addFieldInt32(1, code, 0);\n }\n static addName(builder, nameOffset) {\n builder.addFieldOffset(2, nameOffset, 0);\n }\n static addDescription(builder, descriptionOffset) {\n builder.addFieldOffset(3, descriptionOffset, 0);\n }\n static addWkt(builder, wktOffset) {\n builder.addFieldOffset(4, wktOffset, 0);\n }\n static addCodeString(builder, codeStringOffset) {\n builder.addFieldOffset(5, codeStringOffset, 0);\n }\n static endCrs(builder) {\n const offset = builder.endObject();\n return offset;\n }\n static createCrs(builder, orgOffset, code, nameOffset, descriptionOffset, wktOffset, codeStringOffset) {\n Crs.startCrs(builder);\n Crs.addOrg(builder, orgOffset);\n Crs.addCode(builder, code);\n Crs.addName(builder, nameOffset);\n Crs.addDescription(builder, descriptionOffset);\n Crs.addWkt(builder, wktOffset);\n Crs.addCodeString(builder, codeStringOffset);\n return Crs.endCrs(builder);\n }\n}\n", "import { Header } from \"./flat-geobuf/header.js\";\nexport function fromByteBuffer(bb) {\n const header = Header.getRootAsHeader(bb);\n const featuresCount = header.featuresCount();\n const indexNodeSize = header.indexNodeSize();\n const columns = [];\n for (let j = 0; j < header.columnsLength(); j++) {\n const column = header.columns(j);\n if (!column)\n throw new Error('Column unexpectedly missing');\n if (!column.name())\n throw new Error('Column name unexpectedly missing');\n columns.push({\n name: column.name(),\n type: column.type(),\n title: column.title(),\n description: column.description(),\n width: column.width(),\n precision: column.precision(),\n scale: column.scale(),\n nullable: column.nullable(),\n unique: column.unique(),\n primary_key: column.primaryKey()\n });\n }\n const crs = header.crs();\n const crsMeta = crs\n ? {\n org: crs.org(),\n code: crs.code(),\n name: crs.name(),\n description: crs.description(),\n wkt: crs.wkt(),\n code_string: crs.codeString()\n }\n : null;\n const headerMeta = {\n geometryType: header.geometryType(),\n columns,\n envelope: null,\n featuresCount: Number(featuresCount),\n indexNodeSize,\n crs: crsMeta,\n title: header.title(),\n description: header.description(),\n metadata: header.metadata()\n };\n return headerMeta;\n}\n", "import * as flatbuffers from 'flatbuffers';\nimport { Repeater } from '@repeaterjs/repeater';\nimport { calcTreeSize, DEFAULT_NODE_SIZE, NODE_ITEM_BYTE_LEN, streamSearch } from \"./packedrtree.js\";\nimport { magicbytes, SIZE_PREFIX_LEN } from \"./constants.js\";\nimport Config from \"./config.js\";\nimport Logger from \"./logger.js\";\nimport { fromByteBuffer } from \"./header-meta.js\";\nimport { Feature } from \"./flat-geobuf/feature.js\";\nexport class HttpReader {\n headerClient;\n header;\n headerLength;\n indexLength;\n constructor(headerClient, header, headerLength, indexLength) {\n this.headerClient = headerClient;\n this.header = header;\n this.headerLength = headerLength;\n this.indexLength = indexLength;\n }\n // Fetch the header, preparing the reader to read Feature data.\n //\n // and potentially some opportunistic fetching of the index.\n static async open(url) {\n // In reality, the header is probably less than half this size, but\n // better to overshoot and fetch an extra kb rather than have to issue\n // a second request.\n const assumedHeaderLength = 2024;\n const headerClient = new BufferedHttpRangeClient(url);\n // Immediately following the header is the optional spatial index, we deliberately fetch\n // a small part of that to skip subsequent requests.\n const assumedIndexLength = (() => {\n // The actual branching factor will be in the header, but since we\n // don't have the header yet, we just guess. The consequence of\n // getting this wrong isn't terminal, it only means we may be\n // fetching slightly more than we need or that we need to make an\n // extra request later.\n const assumedBranchingFactor = DEFAULT_NODE_SIZE;\n // NOTE: each layer is exponentially larger\n const prefetchedLayers = 3;\n let result = 0;\n let i;\n for (i = 0; i < prefetchedLayers; i++) {\n const layer_width = assumedBranchingFactor ** i * NODE_ITEM_BYTE_LEN;\n result += layer_width;\n }\n return result;\n })();\n const minReqLength = assumedHeaderLength + assumedIndexLength;\n Logger.debug(`fetching header. minReqLength: ${minReqLength} (assumedHeaderLength: ${assumedHeaderLength}, assumedIndexLength: ${assumedIndexLength})`);\n {\n const bytes = new Uint8Array(await headerClient.getRange(0, 8, minReqLength, 'header'));\n if (!bytes.subarray(0, 3).every((v, i) => magicbytes[i] === v)) {\n Logger.error(`bytes: ${bytes} != ${magicbytes}`);\n throw new Error('Not a FlatGeobuf file');\n }\n Logger.debug('magic bytes look good');\n }\n let headerLength;\n {\n const bytes = await headerClient.getRange(8, 4, minReqLength, 'header');\n headerLength = new DataView(bytes).getUint32(0, true);\n const HEADER_MAX_BUFFER_SIZE = 1048576 * 10;\n if (headerLength > HEADER_MAX_BUFFER_SIZE || headerLength < 8) {\n // minimum size check avoids panic in FlatBuffers header decoding\n throw new Error('Invalid header size');\n }\n Logger.debug(`headerLength: ${headerLength}`);\n }\n const bytes = await headerClient.getRange(12, headerLength, minReqLength, 'header');\n const bb = new flatbuffers.ByteBuffer(new Uint8Array(bytes));\n const header = fromByteBuffer(bb);\n const indexLength = calcTreeSize(header.featuresCount, header.indexNodeSize);\n Logger.debug('completed: opening http reader');\n return new HttpReader(headerClient, header, headerLength, indexLength);\n }\n async *selectBbox(rect) {\n // Read R-Tree index and build filter for features within bbox\n const lengthBeforeTree = this.lengthBeforeTree();\n const bufferedClient = this.headerClient;\n const readNode = async function (offsetIntoTree, size) {\n const minReqLength = 0;\n return bufferedClient.getRange(lengthBeforeTree + offsetIntoTree, size, minReqLength, 'index');\n };\n const batches = [];\n let currentBatch = [];\n for await (const searchResult of streamSearch(this.header.featuresCount, this.header.indexNodeSize, rect, readNode)) {\n const [featureOffset, ,] = searchResult;\n let [, , featureLength] = searchResult;\n if (!featureLength) {\n Logger.info('final feature');\n // Normally we get the feature length by subtracting between\n // adjacent nodes from the index, which we can't do for the\n // _very_ last feature in a dataset.\n //\n // We could *guess* the size, but we'd risk overshooting the length,\n // which will cause some webservers to return HTTP 416: Unsatisfiable range\n //\n // So instead we fetch only the final features byte length, stored in the\n // first 4 bytes.\n featureLength = 4;\n }\n if (currentBatch.length == 0) {\n currentBatch.push([featureOffset, featureLength]);\n continue;\n }\n const prevFeature = currentBatch[currentBatch.length - 1];\n const gap = featureOffset - (prevFeature[0] + prevFeature[1]);\n if (gap > Config.global.extraRequestThreshold()) {\n Logger.info(`Pushing new feature batch, since gap ${gap} was too large`);\n batches.push(currentBatch);\n currentBatch = [];\n }\n currentBatch.push([featureOffset, featureLength]);\n }\n this.headerClient.logUsage('header+index');\n if (currentBatch.length > 0) {\n batches.push(currentBatch);\n }\n const promises = batches.flatMap((batch) => this.readFeatureBatch(batch));\n // Fetch all batches concurrently, yielding features as they become\n // available, meaning the results may be intermixed.\n yield* Repeater.merge(promises);\n }\n lengthBeforeTree() {\n // FGB Layout is: [magicbytes (fixed), headerLength (i32), header (variable), Tree (variable), Features (variable)]\n return magicbytes.length + SIZE_PREFIX_LEN + this.headerLength;\n }\n lengthBeforeFeatures() {\n return this.lengthBeforeTree() + this.indexLength;\n }\n buildFeatureClient() {\n return new BufferedHttpRangeClient(this.headerClient.httpClient);\n }\n /**\n * Fetch a batch of features in a single request, yielding each Feature\n *\n * `batch`: [offset, length] of features in the batch\n */\n async *readFeatureBatch(batch) {\n const [firstFeatureOffset] = batch[0];\n const [lastFeatureOffset, lastFeatureLength] = batch[batch.length - 1];\n const batchStart = firstFeatureOffset;\n const batchEnd = lastFeatureOffset + lastFeatureLength;\n const batchSize = batchEnd - batchStart;\n // A new feature client is needed for each batch to own the underlying buffer as features are yielded.\n const featureClient = this.buildFeatureClient();\n let minFeatureReqLength = batchSize;\n for (const [featureOffset] of batch) {\n yield await this.readFeature(featureClient, featureOffset, minFeatureReqLength);\n // Only set minFeatureReqLength for the first request.\n //\n // This should only affect a batch that contains the final feature, otherwise\n // we've calculated `batchSize` to get all the data we need for the batch.\n // For the very final feature in a dataset, we don't know it's length, so we\n // will end up executing an extra request for that batch.\n minFeatureReqLength = 0;\n }\n featureClient.logUsage('feature');\n }\n async readFeature(featureClient, featureOffset, minFeatureReqLength) {\n const offset = featureOffset + this.lengthBeforeFeatures();\n let featureLength;\n {\n const bytes = await featureClient.getRange(offset, 4, minFeatureReqLength, 'feature length');\n featureLength = new DataView(bytes).getUint32(0, true);\n }\n const byteBuffer = await featureClient.getRange(offset + 4, featureLength, minFeatureReqLength, 'feature data');\n const bytes = new Uint8Array(byteBuffer);\n const bytesAligned = new Uint8Array(featureLength + SIZE_PREFIX_LEN);\n bytesAligned.set(bytes, SIZE_PREFIX_LEN);\n const bb = new flatbuffers.ByteBuffer(bytesAligned);\n bb.setPosition(SIZE_PREFIX_LEN);\n return Feature.getRootAsFeature(bb);\n }\n}\nclass BufferedHttpRangeClient {\n httpClient;\n bytesEverUsed = 0;\n bytesEverFetched = 0;\n buffer = new ArrayBuffer(0);\n // Byte offset of `buffer` with respect to the beginning of the file being\n // buffered\n head = 0;\n constructor(source) {\n if (typeof source === 'string') {\n this.httpClient = new HttpRangeClient(source);\n }\n else if (source instanceof HttpRangeClient) {\n this.httpClient = source;\n }\n else {\n throw new Error('Unknown source ');\n }\n }\n async getRange(start, length, minReqLength, purpose) {\n this.bytesEverUsed += length;\n const start_i = start - this.head;\n const end_i = start_i + length;\n if (start_i >= 0 && end_i <= this.buffer.byteLength) {\n return this.buffer.slice(start_i, end_i);\n }\n const lengthToFetch = Math.max(length, minReqLength);\n this.bytesEverFetched += lengthToFetch;\n Logger.debug(`requesting for new Range: ${start}-${start + lengthToFetch - 1}`);\n this.buffer = await this.httpClient.getRange(start, lengthToFetch, purpose);\n this.head = start;\n return this.buffer.slice(0, length);\n }\n logUsage(purpose) {\n const category = purpose.split(' ')[0];\n const used = this.bytesEverUsed;\n const requested = this.bytesEverFetched;\n const efficiency = ((100.0 * used) / requested).toFixed(2);\n Logger.info(`${category} bytes used/requested: ${used} / ${requested} = ${efficiency}%`);\n }\n}\nclass HttpRangeClient {\n url;\n requestsEverMade = 0;\n bytesEverRequested = 0;\n constructor(url) {\n this.url = url;\n }\n async getRange(begin, length, purpose) {\n this.requestsEverMade += 1;\n this.bytesEverRequested += length;\n const range = `bytes=${begin}-${begin + length - 1}`;\n Logger.info(`request: #${this.requestsEverMade}, purpose: ${purpose}), bytes: (this_request: ${length}, ever: ${this.bytesEverRequested}), Range: ${range}`);\n const response = await fetch(this.url, {\n headers: {\n Range: range\n // TODO: better parallelize requests on Chrome\n //\n // Safari and Firefox have no issue performing Range requests\n // for a resource in parallel, but Chrome will stall a\n // subsequent request to the resource until it's received the\n // response headers of the prior request. So, it still allows\n // some limited parallelization, but it's not ideal.\n //\n // This is seemingly an artifact of how Chrome manages caching\n // and it might differ between platforms. We could work around it\n // by setting the request header:\n //\n // 'Cache-Control': 'no-cache, no-store'\n //\n // This allows requests to be fully parallelized in Chrome, but\n // then Chrome won't cache the response, so it seems not a\n // great trade-off.\n //\n // Another work around would be to make each Range request for\n // a separate URL by appending something like\n // `?cache_buster=<range>` to the URL, but then Chrome will\n // require an additional CORS preflight OPTIONS requests per\n // Range, which is also not a great trade-off.\n //\n // See:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=969828&q=concurrent%20range%20requests&can=2\n // https://stackoverflow.com/questions/27513994/chrome-stalls-when-making-multiple-requests-to-same-resource\n }\n });\n return response.arrayBuffer();\n }\n}\n", "export default class Config {\n static global = new Config();\n _extraRequestThreshold = 256 * 1024;\n /**\n * Fetch up to this many extra bytes if it will eliminate an extra request\n */\n extraRequestThreshold() {\n return this._extraRequestThreshold;\n }\n setExtraRequestThreshold(bytes) {\n if (bytes < 0) {\n throw new Error('extraRequestThreshold cannot be negative');\n }\n this._extraRequestThreshold = bytes;\n }\n}\n", "export var LogLevel;\n(function (LogLevel) {\n LogLevel[LogLevel[\"Debug\"] = 0] = \"Debug\";\n LogLevel[LogLevel[\"Info\"] = 1] = \"Info\";\n LogLevel[LogLevel[\"Warn\"] = 2] = \"Warn\";\n LogLevel[LogLevel[\"Error\"] = 3] = \"Error\";\n})(LogLevel || (LogLevel = {}));\nexport default class Logger {\n static logLevel = LogLevel.Warn;\n static debug(...args) {\n this.log(LogLevel.Debug, ...args);\n }\n static info(...args) {\n this.log(LogLevel.Info, ...args);\n }\n static warn(...args) {\n this.log(LogLevel.Warn, ...args);\n }\n static error(...args) {\n this.log(LogLevel.Error, ...args);\n }\n static log(level, ...args) {\n if (this.logLevel > level) {\n return;\n }\n switch (level) {\n case LogLevel.Debug: {\n console.debug(...args);\n break;\n }\n case LogLevel.Info: {\n console.info(...args);\n break;\n }\n case LogLevel.Warn: {\n console.warn(...args);\n break;\n }\n case LogLevel.Error: {\n console.error(...args);\n break;\n }\n }\n }\n}\n", "import Config from \"./config.js\";\nimport Logger from \"./logger.js\";\nexport const NODE_ITEM_BYTE_LEN = 8 * 4 + 8;\n/**\n * @deprecated Use `NODE_ITEM_BYTE_LEN` instead.\n */\nexport const NODE_ITEM_LEN = NODE_ITEM_BYTE_LEN;\n// default branching factor of a node in the rtree\n//\n// actual value will be specified in the header but\n// this can be useful for having reasonably sized guesses for fetch-sizes when\n// streaming results\nexport const DEFAULT_NODE_SIZE = 16;\nexport function calcTreeSize(numItems, nodeSize) {\n nodeSize = Math.min(Math.max(Number(nodeSize), 2), 65535);\n let n = numItems;\n let numNodes = n;\n do {\n n = Math.ceil(n / nodeSize);\n numNodes += n;\n } while (n !== 1);\n return numNodes * NODE_ITEM_BYTE_LEN;\n}\n/**\n * returns [levelOffset, numNodes] for each level\n */\nexport function generateLevelBounds(numItems, nodeSize) {\n if (nodeSize < 2)\n throw new Error('Node size must be at least 2');\n if (numItems === 0)\n throw new Error('Number of items must be greater than 0');\n // number of nodes per level in bottom-up order\n let n = numItems;\n let numNodes = n;\n const levelNumNodes = [n];\n do {\n n = Math.ceil(n / nodeSize);\n numNodes += n;\n levelNumNodes.push(n);\n } while (n !== 1);\n // bounds per level in reversed storage order (top-down)\n const levelOffsets = [];\n n = numNodes;\n for (const size of levelNumNodes) {\n levelOffsets.push(n - size);\n n -= size;\n }\n const levelBounds = [];\n for (let i = 0; i < levelNumNodes.length; i++)\n levelBounds.push([levelOffsets[i], levelOffsets[i] + levelNumNodes[i]]);\n return levelBounds;\n}\n/**\n * Yield's a `SearchResult` for each feature within the bounds of `rect`.\n *\n * Every node in the FGB index tree has a bounding rect, all of the nodes children\n * are contained within that bounding rect. The leaf nodes of the tree represent\n * the features of the collection.\n *\n * As we traverse the tree, starting from the root, we'll need to read more data\n * from the index. When we don't already have this range data buffered locally,\n * an HTTP fetch is triggered. For performance, we merge adjacent and nearby\n * request ranges into a single request, reasoning that fetching a few extra\n * bytes is a good tradeoff if it means we can reduce the number of requests.\n */\nexport async function* streamSearch(numItems, nodeSize, rect, readNode) {\n class NodeRange {\n _level;\n nodes;\n constructor(nodes, level) {\n this._level = level;\n this.nodes = nodes;\n }\n level() {\n return this._level;\n }\n startNodeIdx() {\n return this.nodes[0];\n }\n endNodeIdx() {\n return this.nodes[1];\n }\n extendEndNodeIdx(newIdx) {\n console.assert(newIdx > this.nodes[1]);\n this.nodes[1] = newIdx;\n }\n toString() {\n return `[NodeRange level: ${this._level}, nodes: ${this.nodes[0]}-${this.nodes[1]}]`;\n }\n }\n const { minX, minY, maxX, maxY } = rect;\n Logger.info(`tree items: ${numItems}, nodeSize: ${nodeSize}`);\n const levelBounds = generateLevelBounds(numItems, nodeSize);\n const firstLeafNodeIdx = levelBounds[0][0];\n const rootNodeRange = (() => {\n const range = [0, 1];\n const level = levelBounds.length - 1;\n return new NodeRange(range, level);\n })();\n const queue = [rootNodeRange];\n Logger.debug(`starting stream search with queue: ${queue}, numItems: ${numItems}, nodeSize: ${nodeSize}, levelBounds: ${levelBounds}`);\n while (queue.length != 0) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const nodeRange = queue.shift();\n Logger.debug(`popped node: ${nodeRange}, queueLength: ${queue.length}`);\n const nodeRangeStartIdx = nodeRange.startNodeIdx();\n const isLeafNode = nodeRangeStartIdx >= firstLeafNodeIdx;\n // find the end index of the node\n const nodeRangeEndIdx = (() => {\n const [, levelBound] = levelBounds[nodeRange.level()];\n const nodeIdx = Math.min(nodeRange.endNodeIdx() + nodeSize, levelBound);\n if (isLeafNode && nodeIdx < levelBound) {\n // We can infer the length of *this* feature by getting the start of the *next*\n // feature, so we get an extra node.\n // This approach doesn't work for the final node in the index,\n // but in that case we know that the feature runs to the end of the FGB file and\n // could make an open ended range request to get \"the rest of the data\".\n return nodeIdx + 1;\n }\n return nodeIdx;\n })();\n const numNodesInRange = nodeRangeEndIdx - nodeRangeStartIdx;\n const buffer = await readNode(nodeRangeStartIdx * NODE_ITEM_BYTE_LEN, numNodesInRange * NODE_ITEM_BYTE_LEN);\n const dataView = new DataView(buffer);\n for (let nodeIdx = nodeRangeStartIdx; nodeIdx < nodeRangeEndIdx; nodeIdx++) {\n const nodeIdxInDataView = nodeIdx - nodeRangeStartIdx;\n const dataViewByteStart = nodeIdxInDataView * NODE_ITEM_BYTE_LEN;\n if (maxX < dataView.getFloat64(dataViewByteStart + 0, true))\n continue; // maxX < nodeMinX\n if (maxY < dataView.getFloat64(dataViewByteStart + 8, true))\n continue; // maxY < nodeMinY\n if (minX > dataView.getFloat64(dataViewByteStart + 16, true))\n continue; // minX > nodeMaxX\n if (minY > dataView.getFloat64(dataViewByteStart + 24, true))\n continue; // minY > nodeMaxY\n // `offset` is:\n // For leaf nodes: the byte-offset into the feature buffer.\n // For inner nodes: the node-idx of its first child.\n const offset = dataView.getBigUint64(dataViewByteStart + 32, true);\n if (isLeafNode) {\n const featureByteOffset = offset;\n const featureLength = (() => {\n if (nodeIdx < numItems - 1) {\n // Since features are tightly packed, we infer the\n // length of _this_ feature by measuring to the _next_\n // feature's start.\n const nextPos = (nodeIdxInDataView + 1) * NODE_ITEM_BYTE_LEN;\n // console.debug(`nodeIdx: ${nodeIdx} of ${numItems}, nodeRangeStartIdx: ${nodeRangeStartIdx}, nextPos: ${nextPos}, dataView.byteLength: ${dataView.byteLength}`,);\n const nextOffset = dataView.getBigUint64(nextPos + 32, true);\n return nextOffset - featureByteOffset;\n }\n // This is the last feature - there's no \"next\" feature\n // to measure to, so we can't know it's length.\n return null;\n })();\n // Logger.debug(`featureByteOffset: ${featureByteOffset}, nodeIdx: ${nodeIdx}, featureLength: ${featureLength}`);\n const featureIdx = nodeIdx - firstLeafNodeIdx;\n yield [Number(featureByteOffset), featureIdx, Number(featureLength)];\n continue;\n }\n const firstChildNodeIdx = offset;\n // request up to this many nodes if it means we can eliminate an\n // extra request\n const extraRequestThresholdNodes = Config.global.extraRequestThreshold() / NODE_ITEM_BYTE_LEN;\n // Since we're traversing the tree by monotonically increasing byte\n // offset, the most recently enqueued node range will be the\n // nearest, and thus presents the best candidate for merging.\n const nearestNodeRange = queue[queue.length - 1];\n if (nearestNodeRange !== undefined &&\n nearestNodeRange.level() == nodeRange.level() - 1 &&\n firstChildNodeIdx < nearestNodeRange.endNodeIdx() + extraRequestThresholdNodes) {\n Logger.debug(`Merging \"nodeRange\" request into existing range: ${nearestNodeRange}, newEndNodeIdx: ${nearestNodeRange.endNodeIdx()} -> ${firstChildNodeIdx}`);\n nearestNodeRange.extendEndNodeIdx(Number(firstChildNodeIdx));\n continue;\n }\n const newNodeRange = (() => {\n const level = nodeRange.level() - 1;\n const range = [Number(firstChildNodeIdx), Number(firstChildNodeIdx) + 1];\n return new NodeRange(range, level);\n })();\n // We're going to add a new node range - log the reason\n if (nearestNodeRange !== undefined && nearestNodeRange.level() == newNodeRange.level()) {\n Logger.info(`Same level, but too far away. Pushing new request for nodeIdx: ${firstChildNodeIdx} rather than merging with distant ${nearestNodeRange}`);\n }\n else {\n Logger.info(`Pushing new level for ${newNodeRange} onto queue with nearestNodeRange: ${nearestNodeRange} since there's not already a range for this level.`);\n }\n queue.push(newNodeRange);\n }\n }\n}\n", "export const magicbytes = new Uint8Array([\n 0x66, 0x67, 0x62, 0x03, 0x66, 0x67, 0x62, 0x00\n]);\nexport const SIZE_PREFIX_LEN = 4;\n", "import { fromFeature } from \"./feature.js\";\nimport { parseGeometry, parseGC } from \"./geometry.js\";\nimport { buildHeader, deserialize as genericDeserialize, deserializeStream as genericDeserializeStream, deserializeFiltered as genericDeserializeFiltered, mapColumn } from \"../generic/featurecollection.js\";\nimport { buildFeature } from \"../generic/feature.js\";\nimport { magicbytes } from \"../constants.js\";\nimport { inferGeometryType } from \"../generic/header.js\";\nexport function serialize(featurecollection) {\n const headerMeta = introspectHeaderMeta(featurecollection);\n const header = buildHeader(headerMeta);\n const features = featurecollection.features.map((f) => buildFeature(f.geometry.type === 'GeometryCollection'\n ? parseGC(f.geometry)\n : parseGeometry(f.geometry), f.properties, headerMeta));\n const featuresLength = features.map((f) => f.length).reduce((a, b) => a + b);\n const uint8 = new Uint8Array(magicbytes.length + header.length + featuresLength);\n uint8.set(header, magicbytes.length);\n let offset = magicbytes.length + header.length;\n for (const feature of features) {\n uint8.set(feature, offset);\n offset += feature.length;\n }\n uint8.set(magicbytes);\n return uint8;\n}\nexport function deserialize(bytes, headerMetaFn) {\n const features = genericDeserialize(bytes, fromFeature, headerMetaFn);\n return {\n type: 'FeatureCollection',\n features\n };\n}\nexport function deserializeStream(stream, headerMetaFn) {\n return genericDeserializeStream(stream, fromFeature, headerMetaFn);\n}\nexport function deserializeFiltered(url, rect, headerMetaFn) {\n return genericDeserializeFiltered(url, rect, fromFeature, headerMetaFn);\n}\nfunction introspectHeaderMeta(featurecollection) {\n const feature = featurecollection.features[0];\n const properties = feature.properties;\n let columns = null;\n if (properties)\n columns = Object.keys(properties).map((k) => mapColumn(properties, k));\n const geometryType = inferGeometryType(featurecollection.features);\n const headerMeta = {\n geometryType,\n columns,\n envelope: null,\n featuresCount: featurecollection.features.length,\n indexNodeSize: 0,\n crs: null,\n title: null,\n description: null,\n metadata: null\n };\n return headerMeta;\n}\n", "import { deserialize as fcDeserialize, deserializeStream as fcDeserializeStream, deserializeFiltered as fcDeserializeFiltered, serialize as fcSerialize } from \"./geojson/featurecollection.js\";\n/**\n * Serialize GeoJSON to FlatGeobuf\n * @param geojson GeoJSON object to serialize\n */\nexport function serialize(geojson) {\n const bytes = fcSerialize(geojson);\n return bytes;\n}\n/**\n * Deserialize FlatGeobuf into GeoJSON\n * @param input Input byte array, stream or string\n * @param rect Filter rectangle\n * @param headerMetaFn Callback that will recieve header metadata when available\n */\nexport function deserialize(input, rect, headerMetaFn) {\n if (input instanceof Uint8Array)\n return fcDeserialize(input, headerMetaFn);\n else if (input instanceof ReadableStream)\n return fcDeserializeStream(input, headerMetaFn);\n return fcDeserializeFiltered(input, rect, headerMetaFn);\n}\n", "import { deserialize as deserializeArray, deserializeStream, deserializeFiltered } from \"./generic/featurecollection.js\";\n/**\n * Deserialize FlatGeobuf into generic features\n * @param input Input byte array, stream or string\n * @param fromFeature Callback that recieves generic features\n * @param rect Filter rectangle\n */\nexport function deserialize(input, fromFeature, rect) {\n if (input instanceof Uint8Array)\n return deserializeArray(input, fromFeature);\n else if (input instanceof ReadableStream)\n return deserializeStream(input, fromFeature);\n return deserializeFiltered(input, rect, fromFeature);\n}\nexport { serialize } from \"./generic/featurecollection.js\";\nexport { GeometryType } from \"./flat-geobuf/geometry-type.js\";\nexport { ColumnType } from \"./flat-geobuf/column-type.js\";\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { parseFlatGeobuf, parseFlatGeobufInBatches } from \"./lib/parse-flatgeobuf.js\";\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof \"4.3.0-beta.2\" !== 'undefined' ? \"4.3.0-beta.2\" : 'latest';\n// FGB\\3FGB\\1\nconst FGB_MAGIC_NUMBER = [0x66, 0x67, 0x62, 0x03, 0x66, 0x67, 0x62, 0x01];\n/** Load flatgeobuf on a worker */\nexport const FlatGeobufWorkerLoader = {\n dataType: null,\n batchType: null,\n id: 'flatgeobuf',\n name: 'FlatGeobuf',\n module: 'flatgeobuf',\n version: VERSION,\n worker: true,\n extensions: ['fgb'],\n mimeTypes: ['application/octet-stream'],\n category: 'geometry',\n tests: [new Uint8Array(FGB_MAGIC_NUMBER).buffer],\n options: {\n flatgeobuf: {\n shape: 'geojson-table'\n },\n gis: {\n reproject: false\n }\n }\n};\nexport const FlatGeobufLoader = {\n ...FlatGeobufWorkerLoader,\n parse: async (arrayBuffer, options = {}) => parseSync(arrayBuffer, options),\n parseSync,\n // @ts-expect-error this is a stream parser not an async iterator parser\n parseInBatchesFromStream,\n binary: true\n};\nfunction parseSync(arrayBuffer, options = {}) {\n return parseFlatGeobuf(arrayBuffer, getOptions(options));\n}\nfunction parseInBatchesFromStream(stream, options) {\n return parseFlatGeobufInBatches(stream, getOptions(options));\n}\nfunction getOptions(options) {\n options = {\n ...options,\n flatgeobuf: { ...FlatGeobufLoader.options.flatgeobuf, ...options?.flatgeobuf },\n gis: { ...FlatGeobufLoader.options.gis, ...options?.gis }\n };\n return {\n shape: options?.flatgeobuf?.shape ?? 'geojson-table',\n boundingBox: options?.flatgeobuf?.boundingBox,\n crs: options?.gis?._targetCrs || 'WGS84',\n reproject: options?.gis?.reproject || false\n };\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": ["fgbColumnType", "GeometryType", "GeometryType", "xy", "GeometryType", "flatbuffers", "ColumnType", "flatbuffers", "flatbuffers", "length", "flatbuffers", "flatbuffers", "flatbuffers", "GeometryType", "flatbuffers", "LogLevel", "bytes", "fromFeature", "slice", "deserialize", "deserializeStream", "deserializeFiltered", "deserialize", "deserializeStream", "deserializeFiltered", "deserialize", "fromFeature", "deserialize"]
7
7
  }