UNPKG

well-known-parser

Version:

A WKT/WKB/EWKT/EWKB/TWKB/GeoJSON parser and serializer

1 lines 6.53 kB
{"version":3,"file":"well-known-parser18.cjs","sources":["../src/parsers/polygon.ts"],"sourcesContent":["import type { BinaryReader } from '../binaryreader';\nimport type { WktParser } from '../wktparser';\nimport type { GeometryOptions } from '../types';\nimport { Polygon } from '../polygon';\nimport { Point } from '../point';\nimport { parsePointGeoJSON, parsePointWkb, parseRelativePointTwkb } from './point';\nimport type { Polygon as GeoJSONPolygon } from 'geojson';\n\nexport function parsePolygonWkt(value: WktParser, options: GeometryOptions): Polygon {\n const polygon = new Polygon();\n polygon.srid = options.srid;\n polygon.hasZ = options.hasZ ?? false;\n polygon.hasM = options.hasM ?? false;\n\n if (value.isMatch(['EMPTY'])) {\n return polygon;\n }\n\n value.expectGroupStart();\n\n value.expectGroupStart();\n const exteriorCoords = value.matchCoordinates(options);\n for (const coord of exteriorCoords) {\n polygon.exteriorRing.push(coord);\n }\n value.expectGroupEnd();\n\n while (value.isMatch([','])) {\n value.expectGroupStart();\n const interiorCoords = value.matchCoordinates(options);\n const ring = [];\n for (const coord of interiorCoords) {\n ring.push(coord);\n }\n polygon.interiorRings.push(ring);\n value.expectGroupEnd();\n }\n\n value.expectGroupEnd();\n\n return polygon;\n}\n\nexport function parsePolygonWkb(value: BinaryReader, options: GeometryOptions): Polygon {\n const polygon = new Polygon();\n polygon.srid = options.srid;\n polygon.hasZ = options.hasZ ?? false;\n polygon.hasM = options.hasM ?? false;\n\n const ringCount = value.readUInt32();\n const childOptions: GeometryOptions = {\n ...options,\n srid: undefined,\n };\n\n if (ringCount > 0) {\n const exteriorRingCount = value.readUInt32();\n\n for (let i = 0; i < exteriorRingCount; i++) {\n polygon.exteriorRing.push(parsePointWkb(value, childOptions));\n }\n\n for (let i = 1; i < ringCount; i++) {\n const interiorRing: Point[] = [];\n const interiorRingCount = value.readUInt32();\n\n for (let j = 0; j < interiorRingCount; j++) {\n interiorRing.push(parsePointWkb(value, childOptions));\n }\n\n polygon.interiorRings.push(interiorRing);\n }\n }\n\n return polygon;\n}\n\nexport function parsePolygonTwkb(value: BinaryReader, options: GeometryOptions): Polygon {\n const polygon = new Polygon();\n polygon.hasZ = options.hasZ ?? false;\n polygon.hasM = options.hasM ?? false;\n\n if (options.isEmpty) {\n return polygon;\n }\n\n const previousPoint = new Point(0, 0, options.hasZ ? 0 : undefined, options.hasM ? 0 : undefined);\n\n const ringCount = value.readVarInt();\n const exteriorRingCount = value.readVarInt();\n\n for (let i = 0; i < exteriorRingCount; i++) {\n polygon.exteriorRing.push(parseRelativePointTwkb(value, options, previousPoint));\n }\n\n for (let i = 1; i < ringCount; i++) {\n const interiorRing: Point[] = [];\n const interiorRingCount = value.readVarInt();\n\n for (let j = 0; j < interiorRingCount; j++) {\n interiorRing.push(parseRelativePointTwkb(value, options, previousPoint));\n }\n\n polygon.interiorRings.push(interiorRing);\n }\n\n return polygon;\n}\n\nexport function parsePolygonGeoJSON(value: Pick<GeoJSONPolygon, 'coordinates'>): Polygon {\n const polygon = new Polygon();\n\n if (value.coordinates.length > 0 && value.coordinates[0].length > 0) {\n polygon.hasZ = value.coordinates[0][0].length > 2;\n }\n\n for (let i = 0; i < value.coordinates.length; i++) {\n if (i > 0) {\n polygon.interiorRings.push([]);\n }\n\n for (let j = 0; j < value.coordinates[i].length; j++) {\n const pointData = parsePointGeoJSON(value.coordinates[i][j]);\n if (i === 0) {\n polygon.exteriorRing.push(pointData);\n } else {\n polygon.interiorRings[i - 1].push(pointData);\n }\n }\n }\n\n return polygon;\n}\n"],"names":["parsePolygonWkt","value","options","polygon","Polygon","exteriorCoords","coord","interiorCoords","ring","parsePolygonWkb","ringCount","childOptions","exteriorRingCount","i","parsePointWkb","interiorRing","interiorRingCount","j","parsePolygonTwkb","previousPoint","Point","parseRelativePointTwkb","parsePolygonGeoJSON","pointData","parsePointGeoJSON"],"mappings":"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"}