well-known-parser
Version:
A WKT/WKB/EWKT/EWKB/TWKB/GeoJSON parser and serializer
1 lines • 20.5 kB
Source Map (JSON)
{"version":3,"file":"well-known-parser11.cjs","sources":["../src/parsers/index.ts"],"sourcesContent":["import { GEOMETRY_TYPES } from '../constants';\nimport { BinaryReader } from '../binaryreader';\nimport { WktParser } from '../wktparser';\nimport type { GeoJSONGeometry, GeometryOptions } from '../types';\nimport type { Geometry } from '../geometry';\nimport * as ZigZag from '../zigzag';\nimport type { GeometryCollection as GeoJSONGeometryCollection } from 'geojson';\n\n// Import geometry-specific parsers\nimport { parsePointGeoJSON, parsePointTwkb, parsePointWkb, parsePointWkt } from './point';\nimport {\n parseLineStringGeoJSON,\n parseLineStringTwkb,\n parseLineStringWkb,\n parseLineStringWkt,\n} from './linestring';\nimport { parsePolygonGeoJSON, parsePolygonTwkb, parsePolygonWkb, parsePolygonWkt } from './polygon';\nimport {\n parseMultiPointGeoJSON,\n parseMultiPointTwkb,\n parseMultiPointWkb,\n parseMultiPointWkt,\n} from './multipoint';\nimport {\n parseMultiLineStringGeoJSON,\n parseMultiLineStringTwkb,\n parseMultiLineStringWkb,\n parseMultiLineStringWkt,\n} from './multilinestring';\nimport {\n parseMultiPolygonGeoJSON,\n parseMultiPolygonTwkb,\n parseMultiPolygonWkb,\n parseMultiPolygonWkt,\n} from './multipolygon';\nimport { GeometryCollection } from '../geometrycollection';\n\nexport function parse(\n value: string | Buffer | WktParser | BinaryReader,\n options?: GeometryOptions\n): Geometry {\n if (typeof value === 'string' || value instanceof WktParser) {\n return parseWkt(value, options);\n } else if (Buffer.isBuffer(value) || value instanceof BinaryReader) {\n return parseWkb(value, options);\n } else {\n throw new Error('first argument must be a string or Buffer');\n }\n}\n\n/**\n * Helper function to parse WKT format\n */\nexport function parseWkt(value: string | WktParser, inputOptions?: GeometryOptions): Geometry {\n let wktParser: WktParser;\n let srid: number | undefined;\n\n if (value instanceof WktParser) {\n wktParser = value;\n } else {\n wktParser = new WktParser(value);\n }\n\n const match = wktParser.matchRegex([/^SRID=(\\d+);/]);\n if (match) {\n srid = parseInt(match[1], 10);\n }\n\n const geometryType = wktParser.matchType();\n const dimension = wktParser.matchDimension();\n\n const options: GeometryOptions = {\n ...(inputOptions || {}),\n srid,\n hasZ: dimension.hasZ,\n hasM: dimension.hasM,\n };\n\n switch (geometryType) {\n case GEOMETRY_TYPES.Point.wkt:\n return parsePointWkt(wktParser, options);\n case GEOMETRY_TYPES.LineString.wkt:\n return parseLineStringWkt(wktParser, options);\n case GEOMETRY_TYPES.Polygon.wkt:\n return parsePolygonWkt(wktParser, options);\n case GEOMETRY_TYPES.MultiPoint.wkt:\n return parseMultiPointWkt(wktParser, options);\n case GEOMETRY_TYPES.MultiLineString.wkt:\n return parseMultiLineStringWkt(wktParser, options);\n case GEOMETRY_TYPES.MultiPolygon.wkt:\n return parseMultiPolygonWkt(wktParser, options);\n case GEOMETRY_TYPES.GeometryCollection.wkt:\n return parseGeometryCollectionWkt(wktParser, options);\n default:\n throw new Error(`GeometryType ${geometryType} not supported`);\n }\n}\n\n/**\n * Helper function to parse WKB format\n */\nexport function parseWkb(value: Buffer | BinaryReader, parentOptions?: GeometryOptions): Geometry {\n let binaryReader: BinaryReader;\n let geometryType: number;\n const options: GeometryOptions = {};\n\n if (value instanceof BinaryReader) {\n binaryReader = value;\n } else {\n binaryReader = new BinaryReader(value);\n }\n\n binaryReader.isBigEndian = !binaryReader.readInt8();\n const wkbType = binaryReader.readUInt32();\n\n options.hasSrid = (wkbType & 0x20000000) === 0x20000000;\n options.isEwkb = Boolean(wkbType & 0x20000000 || wkbType & 0x40000000 || wkbType & 0x80000000);\n\n if (options.hasSrid) {\n options.srid = binaryReader.readUInt32();\n }\n\n options.hasZ = false;\n options.hasM = false;\n\n if (!options.isEwkb && (!parentOptions || !parentOptions.isEwkb)) {\n if (wkbType >= 1000 && wkbType < 2000) {\n options.hasZ = true;\n geometryType = wkbType - 1000;\n } else if (wkbType >= 2000 && wkbType < 3000) {\n options.hasM = true;\n geometryType = wkbType - 2000;\n } else if (wkbType >= 3000 && wkbType < 4000) {\n options.hasZ = true;\n options.hasM = true;\n geometryType = wkbType - 3000;\n } else {\n geometryType = wkbType;\n }\n } else {\n if (wkbType & 0x80000000) {\n options.hasZ = true;\n }\n if (wkbType & 0x40000000) {\n options.hasM = true;\n }\n\n geometryType = wkbType & 0xf;\n }\n\n switch (geometryType) {\n case GEOMETRY_TYPES.Point.wkb:\n return parsePointWkb(binaryReader, options);\n case GEOMETRY_TYPES.LineString.wkb:\n return parseLineStringWkb(binaryReader, options);\n case GEOMETRY_TYPES.Polygon.wkb:\n return parsePolygonWkb(binaryReader, options);\n case GEOMETRY_TYPES.MultiPoint.wkb:\n return parseMultiPointWkb(binaryReader, options);\n case GEOMETRY_TYPES.MultiLineString.wkb:\n return parseMultiLineStringWkb(binaryReader, options);\n case GEOMETRY_TYPES.MultiPolygon.wkb:\n return parseMultiPolygonWkb(binaryReader, options);\n case GEOMETRY_TYPES.GeometryCollection.wkb:\n return parseGeometryCollectionWkb(binaryReader, options);\n default:\n throw new Error(`GeometryType ${geometryType} not supported`);\n }\n}\n\n/**\n * Helper function to parse TWKB format\n */\nexport function parseTwkb(value: Buffer | BinaryReader, inputOptions?: GeometryOptions): Geometry {\n let binaryReader: BinaryReader;\n const options: GeometryOptions = { ...(inputOptions || {}) };\n\n if (value instanceof BinaryReader) {\n binaryReader = value;\n } else {\n binaryReader = new BinaryReader(value);\n }\n\n const type = binaryReader.readUInt8();\n const metadataHeader = binaryReader.readUInt8();\n\n const geometryType = type & 0x0f;\n options.precision = ZigZag.decode(type >> 4);\n options.precisionFactor = Math.pow(10, options.precision);\n\n options.hasBoundingBox = Boolean((metadataHeader >> 0) & 1);\n options.hasSizeAttribute = Boolean((metadataHeader >> 1) & 1);\n options.hasIdList = Boolean((metadataHeader >> 2) & 1);\n options.hasExtendedPrecision = Boolean((metadataHeader >> 3) & 1);\n options.isEmpty = Boolean((metadataHeader >> 4) & 1);\n\n if (options.hasExtendedPrecision) {\n const extendedPrecision = binaryReader.readUInt8();\n options.hasZ = (extendedPrecision & 0x01) === 0x01;\n options.hasM = (extendedPrecision & 0x02) === 0x02;\n\n options.zPrecision = ZigZag.decode((extendedPrecision & 0x1c) >> 2);\n options.zPrecisionFactor = Math.pow(10, options.zPrecision);\n\n options.mPrecision = ZigZag.decode((extendedPrecision & 0xe0) >> 5);\n options.mPrecisionFactor = Math.pow(10, options.mPrecision);\n } else {\n options.hasZ = false;\n options.hasM = false;\n }\n\n if (options.hasSizeAttribute) {\n binaryReader.readVarInt();\n }\n\n if (options.hasBoundingBox) {\n let dimensions = 2;\n\n if (options.hasZ) {\n dimensions++;\n }\n if (options.hasM) {\n dimensions++;\n }\n\n for (let i = 0; i < dimensions; i++) {\n binaryReader.readVarInt();\n binaryReader.readVarInt();\n }\n }\n\n switch (geometryType) {\n case GEOMETRY_TYPES.Point.wkb:\n return parsePointTwkb(binaryReader, options);\n case GEOMETRY_TYPES.LineString.wkb:\n return parseLineStringTwkb(binaryReader, options);\n case GEOMETRY_TYPES.Polygon.wkb:\n return parsePolygonTwkb(binaryReader, options);\n case GEOMETRY_TYPES.MultiPoint.wkb:\n return parseMultiPointTwkb(binaryReader, options);\n case GEOMETRY_TYPES.MultiLineString.wkb:\n return parseMultiLineStringTwkb(binaryReader, options);\n case GEOMETRY_TYPES.MultiPolygon.wkb:\n return parseMultiPolygonTwkb(binaryReader, options);\n case GEOMETRY_TYPES.GeometryCollection.wkb:\n return parseGeometryCollectionTwkb(binaryReader, options);\n default:\n throw new Error(`GeometryType ${geometryType} not supported`);\n }\n}\n\n/**\n * Helper function to parse GeoJSON\n */\nexport function parseGeoJSON(value: GeoJSONGeometry, isSubGeometry = false): Geometry {\n let geometry: Geometry;\n\n switch (value.type) {\n case GEOMETRY_TYPES.Point.geoJSON:\n geometry = parsePointGeoJSON(value.coordinates);\n break;\n case GEOMETRY_TYPES.LineString.geoJSON:\n geometry = parseLineStringGeoJSON(value);\n break;\n case GEOMETRY_TYPES.Polygon.geoJSON:\n geometry = parsePolygonGeoJSON(value);\n break;\n case GEOMETRY_TYPES.MultiPoint.geoJSON:\n geometry = parseMultiPointGeoJSON(value);\n break;\n case GEOMETRY_TYPES.MultiLineString.geoJSON:\n geometry = parseMultiLineStringGeoJSON(value);\n break;\n case GEOMETRY_TYPES.MultiPolygon.geoJSON:\n geometry = parseMultiPolygonGeoJSON(value);\n break;\n case GEOMETRY_TYPES.GeometryCollection.geoJSON:\n geometry = parseGeometryCollectionGeoJSON(value);\n break;\n default:\n // @ts-expect-error -- fallback for invalid data\n throw new Error(`GeometryType ${value.type} not supported`);\n }\n\n if (!isSubGeometry) {\n geometry.srid = 4326;\n }\n\n return geometry;\n}\n\nexport function parseGeometryCollectionWkt(\n value: WktParser,\n options: GeometryOptions\n): GeometryCollection {\n const geometryCollection = new GeometryCollection();\n geometryCollection.srid = options.srid;\n geometryCollection.hasZ = options.hasZ ?? false;\n geometryCollection.hasM = options.hasM ?? false;\n\n if (value.isMatch(['EMPTY'])) {\n return geometryCollection;\n }\n\n value.expectGroupStart();\n\n do {\n const geometryType = value.matchType();\n const dimension = value.matchDimension();\n\n const childOptions: GeometryOptions = {\n ...options,\n srid: undefined,\n hasZ: dimension.hasZ,\n hasM: dimension.hasM,\n };\n\n switch (geometryType) {\n case GEOMETRY_TYPES.Point.wkt:\n geometryCollection.geometries.push(parsePointWkt(value, childOptions));\n break;\n case GEOMETRY_TYPES.LineString.wkt:\n geometryCollection.geometries.push(parseLineStringWkt(value, childOptions));\n break;\n case GEOMETRY_TYPES.Polygon.wkt:\n geometryCollection.geometries.push(parsePolygonWkt(value, childOptions));\n break;\n case GEOMETRY_TYPES.MultiPoint.wkt:\n geometryCollection.geometries.push(parseMultiPointWkt(value, childOptions));\n break;\n case GEOMETRY_TYPES.MultiLineString.wkt:\n geometryCollection.geometries.push(parseMultiLineStringWkt(value, childOptions));\n break;\n case GEOMETRY_TYPES.MultiPolygon.wkt:\n geometryCollection.geometries.push(parseMultiPolygonWkt(value, childOptions));\n break;\n case GEOMETRY_TYPES.GeometryCollection.wkt:\n geometryCollection.geometries.push(parseGeometryCollectionWkt(value, childOptions));\n break;\n default:\n throw new Error(`GeometryType ${geometryType} not supported`);\n }\n } while (value.isMatch([',']));\n\n value.expectGroupEnd();\n\n return geometryCollection;\n}\n\nexport function parseGeometryCollectionWkb(\n value: BinaryReader,\n options: GeometryOptions\n): GeometryCollection {\n const geometryCollection = new GeometryCollection();\n geometryCollection.srid = options.srid;\n geometryCollection.hasZ = options.hasZ ?? false;\n geometryCollection.hasM = options.hasM ?? false;\n\n const geometryCount = value.readUInt32();\n\n for (let i = 0; i < geometryCount; i++) {\n geometryCollection.geometries.push(parseWkb(value, options));\n }\n\n return geometryCollection;\n}\n\nexport function parseGeometryCollectionTwkb(\n value: BinaryReader,\n options: GeometryOptions\n): GeometryCollection {\n const geometryCollection = new GeometryCollection();\n geometryCollection.hasZ = options.hasZ ?? false;\n geometryCollection.hasM = options.hasM ?? false;\n\n if (options.isEmpty) {\n return geometryCollection;\n }\n\n const geometryCount = value.readVarInt();\n\n for (let i = 0; i < geometryCount; i++) {\n geometryCollection.geometries.push(parseTwkb(value, options));\n }\n\n return geometryCollection;\n}\n\nexport function parseGeometryCollectionGeoJSON(\n value: Pick<GeoJSONGeometryCollection, 'geometries'>\n): GeometryCollection {\n const geometryCollection = new GeometryCollection();\n\n for (let i = 0; i < value.geometries.length; i++) {\n geometryCollection.geometries.push(parseGeoJSON(value.geometries[i], true));\n }\n\n if (geometryCollection.geometries.length > 0) {\n geometryCollection.hasZ = geometryCollection.geometries[0].hasZ;\n }\n\n return geometryCollection;\n}\n"],"names":["parse","value","options","WktParser","parseWkt","BinaryReader","parseWkb","inputOptions","wktParser","srid","match","geometryType","dimension","GEOMETRY_TYPES","parsePointWkt","parseLineStringWkt","parsePolygonWkt","parseMultiPointWkt","parseMultiLineStringWkt","parseMultiPolygonWkt","parseGeometryCollectionWkt","parentOptions","binaryReader","wkbType","parsePointWkb","parseLineStringWkb","parsePolygonWkb","parseMultiPointWkb","parseMultiLineStringWkb","parseMultiPolygonWkb","parseGeometryCollectionWkb","parseTwkb","type","metadataHeader","ZigZag.decode","extendedPrecision","dimensions","i","parsePointTwkb","parseLineStringTwkb","parsePolygonTwkb","parseMultiPointTwkb","parseMultiLineStringTwkb","parseMultiPolygonTwkb","parseGeometryCollectionTwkb","parseGeoJSON","isSubGeometry","geometry","parsePointGeoJSON","parseLineStringGeoJSON","parsePolygonGeoJSON","parseMultiPointGeoJSON","parseMultiLineStringGeoJSON","parseMultiPolygonGeoJSON","parseGeometryCollectionGeoJSON","geometryCollection","GeometryCollection","childOptions","geometryCount"],"mappings":"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"}