well-known-parser
Version:
A WKT/WKB/EWKT/EWKB/TWKB/GeoJSON parser and serializer
1 lines • 8.3 kB
Source Map (JSON)
{"version":3,"file":"well-known-parser6.cjs","sources":["../src/polygon.ts"],"sourcesContent":["import { Geometry } from './geometry';\nimport type { Coordinates, GeometryOptions } from './types';\nimport { GEOMETRY_TYPES } from './constants';\nimport { Point } from './point';\nimport { BinaryWriter } from './binarywriter';\nimport type { Polygon as GeoJSONPolygon } from 'geojson';\n\nexport class Polygon extends Geometry {\n exteriorRing: Point[];\n interiorRings: Point[][];\n\n constructor(exteriorRing?: Point[], interiorRings?: Point[][], srid?: number) {\n super();\n\n this.exteriorRing = exteriorRing || [];\n this.interiorRings = interiorRings || [];\n this.srid = srid;\n\n if (this.exteriorRing.length > 0) {\n this.hasZ = this.exteriorRing[0].hasZ;\n this.hasM = this.exteriorRing[0].hasM;\n }\n }\n\n static Z(exteriorRing?: Point[], interiorRings?: Point[][], srid?: number): Polygon {\n const polygon = new Polygon(exteriorRing, interiorRings, srid);\n polygon.hasZ = true;\n return polygon;\n }\n\n static M(exteriorRing?: Point[], interiorRings?: Point[][], srid?: number): Polygon {\n const polygon = new Polygon(exteriorRing, interiorRings, srid);\n polygon.hasM = true;\n return polygon;\n }\n\n static ZM(exteriorRing?: Point[], interiorRings?: Point[][], srid?: number): Polygon {\n const polygon = new Polygon(exteriorRing, interiorRings, srid);\n polygon.hasZ = true;\n polygon.hasM = true;\n return polygon;\n }\n\n toWkt(isNested: boolean = false): string {\n if (isNested) return this.toInnerWkt();\n\n if (this.exteriorRing.length === 0) {\n return this.getWktType(GEOMETRY_TYPES.Polygon.wkt, true);\n }\n\n return this.getWktType(GEOMETRY_TYPES.Polygon.wkt, false) + this.toInnerWkt();\n }\n\n private toInnerWkt(): string {\n let innerWkt = '((';\n\n for (const point of this.exteriorRing) {\n innerWkt += point.toWkt(true) + ',';\n }\n\n innerWkt = innerWkt.slice(0, -1);\n innerWkt += ')';\n\n for (const ring of this.interiorRings) {\n innerWkt += ',(';\n\n for (const point of ring) {\n innerWkt += point.toWkt(true) + ',';\n }\n\n innerWkt = innerWkt.slice(0, -1);\n innerWkt += ')';\n }\n\n innerWkt += ')';\n\n return innerWkt;\n }\n\n toWkb(parentOptions?: GeometryOptions): Buffer {\n const wkb = new BinaryWriter(this.getWkbSize());\n\n wkb.writeInt8(1);\n this.writeWkbType(wkb, GEOMETRY_TYPES.Polygon.wkb, parentOptions);\n\n if (this.exteriorRing.length > 0) {\n wkb.writeUInt32LE(1 + this.interiorRings.length);\n wkb.writeUInt32LE(this.exteriorRing.length);\n } else {\n wkb.writeUInt32LE(0);\n }\n\n for (const p of this.exteriorRing) {\n wkb.writeBuffer(p.toWkb(parentOptions, true));\n }\n\n for (const ring of this.interiorRings) {\n wkb.writeUInt32LE(ring.length);\n for (const p of ring) {\n wkb.writeBuffer(p.toWkb(parentOptions, true));\n }\n }\n\n return wkb.buffer;\n }\n\n toTwkb(previousPoint: Point = new Point(0, 0, 0, 0), isNested: boolean = false): Buffer {\n const twkb = new BinaryWriter(0, true);\n\n const precision = Geometry.getTwkbPrecision(5, 0, 0);\n const isEmpty = this.exteriorRing.length === 0;\n\n if (!isNested) {\n this.writeTwkbHeader(twkb, GEOMETRY_TYPES.Polygon.wkb, precision, isEmpty);\n }\n\n if (this.exteriorRing.length > 0) {\n twkb.writeVarInt(1 + this.interiorRings.length);\n twkb.writeVarInt(this.exteriorRing.length);\n\n for (const p of this.exteriorRing) {\n twkb.writeBuffer(p.toTwkb(previousPoint, true));\n }\n\n for (const ring of this.interiorRings) {\n twkb.writeVarInt(ring.length);\n for (const p of ring) {\n twkb.writeBuffer(p.toTwkb(previousPoint, true));\n }\n }\n }\n\n return twkb.buffer;\n }\n\n getWkbSize(): number {\n let coordinateSize = 16;\n\n if (this.hasZ) {\n coordinateSize += 8;\n }\n if (this.hasM) {\n coordinateSize += 8;\n }\n\n let size = 1 + 4 + 4;\n\n if (this.exteriorRing.length > 0) {\n size += 4 + this.exteriorRing.length * coordinateSize;\n }\n\n for (let i = 0; i < this.interiorRings.length; i++) {\n size += 4 + this.interiorRings[i].length * coordinateSize;\n }\n\n return size;\n }\n\n toGeoJSON(): GeoJSONPolygon;\n toGeoJSON(isNested: true): Coordinates<GeoJSONPolygon>;\n toGeoJSON(isNested: boolean = false): GeoJSONPolygon | Coordinates<GeoJSONPolygon> {\n const coordinates: Coordinates<GeoJSONPolygon> = [];\n\n if (this.exteriorRing.length > 0) {\n const exteriorRing: number[][] = [];\n\n for (const point of this.exteriorRing) {\n exteriorRing.push(point.toGeoJSON(true));\n }\n\n coordinates.push(exteriorRing);\n }\n\n for (const ring of this.interiorRings) {\n const interiorRing: number[][] = [];\n\n for (const point of ring) {\n interiorRing.push(point.toGeoJSON(true));\n }\n coordinates.push(interiorRing);\n }\n\n if (isNested) return coordinates;\n\n return {\n type: GEOMETRY_TYPES.Polygon.geoJSON,\n coordinates,\n };\n }\n}\n"],"names":["Polygon","Geometry","exteriorRing","interiorRings","srid","polygon","isNested","GEOMETRY_TYPES","innerWkt","point","ring","parentOptions","wkb","BinaryWriter","p","previousPoint","Point","twkb","precision","isEmpty","coordinateSize","size","i","coordinates","interiorRing"],"mappings":"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"}