{"version":3,"file":"well-known-parser21.cjs","sources":["../src/parsers/multipolygon.ts"],"sourcesContent":["import type { BinaryReader } from '../binaryreader';\nimport type { WktParser } from '../wktparser';\nimport type { GeometryOptions } from '../types';\nimport { MultiPolygon } from '../multipolygon';\nimport { Polygon } from '../polygon';\nimport { Point } from '../point';\nimport { parsePolygonGeoJSON } from './polygon';\nimport { parseRelativePointTwkb } from './point';\nimport { parseWkb } from './index';\nimport type { MultiPolygon as GeoJSONMultiPoint } from 'geojson';\n\nexport function parseMultiPolygonWkt(value: WktParser, options: GeometryOptions): MultiPolygon {\n  const multiPolygon = new MultiPolygon();\n  multiPolygon.srid = options.srid;\n  multiPolygon.hasZ = options.hasZ ?? false;\n  multiPolygon.hasM = options.hasM ?? false;\n\n  if (value.isMatch(['EMPTY'])) {\n    return multiPolygon;\n  }\n\n  value.expectGroupStart();\n\n  do {\n    value.expectGroupStart();\n\n    const exteriorRing: Point[] = [];\n    const interiorRings: Point[][] = [];\n\n    value.expectGroupStart();\n    const exteriorCoords = value.matchCoordinates(options);\n    for (const coord of exteriorCoords) {\n      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      interiorRings.push(ring);\n      value.expectGroupEnd();\n    }\n\n    multiPolygon.polygons.push(new Polygon(exteriorRing, interiorRings));\n\n    value.expectGroupEnd();\n  } while (value.isMatch([',']));\n\n  value.expectGroupEnd();\n\n  return multiPolygon;\n}\n\nexport function parseMultiPolygonWkb(value: BinaryReader, options: GeometryOptions): MultiPolygon {\n  const multiPolygon = new MultiPolygon();\n  multiPolygon.srid = options.srid;\n  multiPolygon.hasZ = options.hasZ ?? false;\n  multiPolygon.hasM = options.hasM ?? false;\n\n  const polygonCount = value.readUInt32();\n\n  for (let i = 0; i < polygonCount; i++) {\n    // This can only return a Polygon, but we need to call parseWkb in order to make sure wkb headers are read\n    multiPolygon.polygons.push(parseWkb(value, options) as Polygon);\n  }\n\n  return multiPolygon;\n}\n\nexport function parseMultiPolygonTwkb(value: BinaryReader, options: GeometryOptions): MultiPolygon {\n  const multiPolygon = new MultiPolygon();\n  multiPolygon.hasZ = options.hasZ ?? false;\n  multiPolygon.hasM = options.hasM ?? false;\n\n  if (options.isEmpty) {\n    return multiPolygon;\n  }\n\n  const previousPoint = new Point(0, 0, options.hasZ ? 0 : undefined, options.hasM ? 0 : undefined);\n\n  const polygonCount = value.readVarInt();\n\n  for (let i = 0; i < polygonCount; i++) {\n    const polygon = new Polygon();\n    polygon.hasZ = options.hasZ ?? false;\n    polygon.hasM = options.hasM ?? false;\n\n    const ringCount = value.readVarInt();\n    const exteriorRingCount = value.readVarInt();\n\n    for (let j = 0; j < exteriorRingCount; j++) {\n      polygon.exteriorRing.push(parseRelativePointTwkb(value, options, previousPoint));\n    }\n\n    for (let j = 1; j < ringCount; j++) {\n      const interiorRing: Point[] = [];\n      const interiorRingCount = value.readVarInt();\n\n      for (let k = 0; k < interiorRingCount; k++) {\n        interiorRing.push(parseRelativePointTwkb(value, options, previousPoint));\n      }\n\n      polygon.interiorRings.push(interiorRing);\n    }\n\n    multiPolygon.polygons.push(polygon);\n  }\n\n  return multiPolygon;\n}\n\nexport function parseMultiPolygonGeoJSON(\n  value: Pick<GeoJSONMultiPoint, 'coordinates'>\n): MultiPolygon {\n  const multiPolygon = new MultiPolygon();\n\n  if (\n    value.coordinates.length > 0 &&\n    value.coordinates[0].length > 0 &&\n    value.coordinates[0][0].length > 0\n  ) {\n    multiPolygon.hasZ = value.coordinates[0][0][0].length > 2;\n  }\n\n  for (let i = 0; i < value.coordinates.length; i++) {\n    multiPolygon.polygons.push(parsePolygonGeoJSON({ coordinates: value.coordinates[i] }));\n  }\n\n  return multiPolygon;\n}\n"],"names":["parseMultiPolygonWkt","value","options","multiPolygon","MultiPolygon","exteriorRing","interiorRings","exteriorCoords","coord","interiorCoords","ring","Polygon","parseMultiPolygonWkb","polygonCount","i","parseWkb","parseMultiPolygonTwkb","previousPoint","Point","polygon","ringCount","exteriorRingCount","j","parseRelativePointTwkb","interiorRing","interiorRingCount","k","parseMultiPolygonGeoJSON","parsePolygonGeoJSON"],"mappings":"6TAWO,SAASA,EAAqBC,EAAkBC,EAAwC,CAC7F,MAAMC,EAAe,IAAIC,eAKzB,GAJAD,EAAa,KAAOD,EAAQ,KAC5BC,EAAa,KAAOD,EAAQ,MAAQ,GACpCC,EAAa,KAAOD,EAAQ,MAAQ,GAEhCD,EAAM,QAAQ,CAAC,OAAO,CAAC,EACzB,OAAOE,EAGTF,EAAM,iBAAA,EAEN,EAAG,CACDA,EAAM,iBAAA,EAEN,MAAMI,EAAwB,CAAA,EACxBC,EAA2B,CAAA,EAEjCL,EAAM,iBAAA,EACN,MAAMM,EAAiBN,EAAM,iBAAiBC,CAAO,EACrD,UAAWM,KAASD,EAClBF,EAAa,KAAKG,CAAK,EAIzB,IAFAP,EAAM,eAAA,EAECA,EAAM,QAAQ,CAAC,GAAG,CAAC,GAAG,CAC3BA,EAAM,iBAAA,EACN,MAAMQ,EAAiBR,EAAM,iBAAiBC,CAAO,EAC/CQ,EAAO,CAAA,EACb,UAAWF,KAASC,EAClBC,EAAK,KAAKF,CAAK,EAEjBF,EAAc,KAAKI,CAAI,EACvBT,EAAM,eAAA,CACR,CAEAE,EAAa,SAAS,KAAK,IAAIQ,EAAAA,QAAQN,EAAcC,CAAa,CAAC,EAEnEL,EAAM,eAAA,CACR,OAASA,EAAM,QAAQ,CAAC,GAAG,CAAC,GAE5B,OAAAA,EAAM,eAAA,EAECE,CACT,CAEO,SAASS,EAAqBX,EAAqBC,EAAwC,CAChG,MAAMC,EAAe,IAAIC,eACzBD,EAAa,KAAOD,EAAQ,KAC5BC,EAAa,KAAOD,EAAQ,MAAQ,GACpCC,EAAa,KAAOD,EAAQ,MAAQ,GAEpC,MAAMW,EAAeZ,EAAM,WAAA,EAE3B,QAASa,EAAI,EAAGA,EAAID,EAAcC,IAEhCX,EAAa,SAAS,KAAKY,EAAAA,SAASd,EAAOC,CAAO,CAAY,EAGhE,OAAOC,CACT,CAEO,SAASa,EAAsBf,EAAqBC,EAAwC,CACjG,MAAMC,EAAe,IAAIC,eAIzB,GAHAD,EAAa,KAAOD,EAAQ,MAAQ,GACpCC,EAAa,KAAOD,EAAQ,MAAQ,GAEhCA,EAAQ,QACV,OAAOC,EAGT,MAAMc,EAAgB,IAAIC,EAAAA,MAAM,EAAG,EAAGhB,EAAQ,KAAO,EAAI,OAAWA,EAAQ,KAAO,EAAI,MAAS,EAE1FW,EAAeZ,EAAM,WAAA,EAE3B,QAASa,EAAI,EAAGA,EAAID,EAAcC,IAAK,CACrC,MAAMK,EAAU,IAAIR,UACpBQ,EAAQ,KAAOjB,EAAQ,MAAQ,GAC/BiB,EAAQ,KAAOjB,EAAQ,MAAQ,GAE/B,MAAMkB,EAAYnB,EAAM,WAAA,EAClBoB,EAAoBpB,EAAM,WAAA,EAEhC,QAASqB,EAAI,EAAGA,EAAID,EAAmBC,IACrCH,EAAQ,aAAa,KAAKI,EAAAA,uBAAuBtB,EAAOC,EAASe,CAAa,CAAC,EAGjF,QAASK,EAAI,EAAGA,EAAIF,EAAWE,IAAK,CAClC,MAAME,EAAwB,CAAA,EACxBC,EAAoBxB,EAAM,WAAA,EAEhC,QAASyB,EAAI,EAAGA,EAAID,EAAmBC,IACrCF,EAAa,KAAKD,EAAAA,uBAAuBtB,EAAOC,EAASe,CAAa,CAAC,EAGzEE,EAAQ,cAAc,KAAKK,CAAY,CACzC,CAEArB,EAAa,SAAS,KAAKgB,CAAO,CACpC,CAEA,OAAOhB,CACT,CAEO,SAASwB,EACd1B,EACc,CACd,MAAME,EAAe,IAAIC,eAGvBH,EAAM,YAAY,OAAS,GAC3BA,EAAM,YAAY,CAAC,EAAE,OAAS,GAC9BA,EAAM,YAAY,CAAC,EAAE,CAAC,EAAE,OAAS,IAEjCE,EAAa,KAAOF,EAAM,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAS,GAG1D,QAASa,EAAI,EAAGA,EAAIb,EAAM,YAAY,OAAQa,IAC5CX,EAAa,SAAS,KAAKyB,sBAAoB,CAAE,YAAa3B,EAAM,YAAYa,CAAC,CAAA,CAAG,CAAC,EAGvF,OAAOX,CACT"}