{"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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"}