@loaders.gl/shapefile 3.1.0-alpha.4 → 3.1.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle.d.ts +2 -0
- package/dist/bundle.d.ts.map +1 -0
- package/dist/bundle.js +7554 -0
- package/dist/dbf-loader.d.ts +8 -0
- package/dist/dbf-loader.d.ts.map +1 -0
- package/dist/dbf-loader.js +32 -0
- package/dist/dbf-worker.js +912 -2
- package/dist/es5/bundle.js +1 -1
- package/dist/es5/bundle.js.map +1 -1
- package/dist/es5/dbf-loader.js +5 -40
- package/dist/es5/dbf-loader.js.map +1 -1
- package/dist/es5/index.js +5 -5
- package/dist/es5/lib/parsers/parse-dbf.js +86 -232
- package/dist/es5/lib/parsers/parse-dbf.js.map +1 -1
- package/dist/es5/lib/parsers/parse-shapefile.js +151 -404
- package/dist/es5/lib/parsers/parse-shapefile.js.map +1 -1
- package/dist/es5/lib/parsers/parse-shp-geometry.js +49 -96
- package/dist/es5/lib/parsers/parse-shp-geometry.js.map +1 -1
- package/dist/es5/lib/parsers/parse-shp-header.js +4 -4
- package/dist/es5/lib/parsers/parse-shp-header.js.map +1 -1
- package/dist/es5/lib/parsers/parse-shp.js +47 -165
- package/dist/es5/lib/parsers/parse-shp.js.map +1 -1
- package/dist/es5/lib/parsers/parse-shx.js +11 -11
- package/dist/es5/lib/parsers/parse-shx.js.map +1 -1
- package/dist/es5/lib/streaming/binary-chunk-reader.js +99 -172
- package/dist/es5/lib/streaming/binary-chunk-reader.js.map +1 -1
- package/dist/es5/lib/streaming/binary-reader.js +24 -35
- package/dist/es5/lib/streaming/binary-reader.js.map +1 -1
- package/dist/es5/lib/streaming/zip-batch-iterators.js +37 -96
- package/dist/es5/lib/streaming/zip-batch-iterators.js.map +1 -1
- package/dist/es5/shapefile-loader.js +3 -3
- package/dist/es5/shapefile-loader.js.map +1 -1
- package/dist/es5/shp-loader.js +6 -41
- package/dist/es5/shp-loader.js.map +1 -1
- package/dist/es5/workers/dbf-worker.js +7 -3
- package/dist/es5/workers/dbf-worker.js.map +1 -0
- package/dist/es5/workers/shp-worker.js +7 -3
- package/dist/es5/workers/shp-worker.js.map +1 -0
- package/dist/esm/dbf-loader.js +1 -1
- package/dist/esm/dbf-loader.js.map +1 -1
- package/dist/esm/lib/parsers/parse-dbf.js +4 -6
- package/dist/esm/lib/parsers/parse-dbf.js.map +1 -1
- package/dist/esm/lib/parsers/parse-shapefile.js +1 -1
- package/dist/esm/lib/parsers/parse-shapefile.js.map +1 -1
- package/dist/esm/lib/parsers/parse-shp-geometry.js +1 -1
- package/dist/esm/lib/parsers/parse-shp-geometry.js.map +1 -1
- package/dist/esm/lib/parsers/parse-shp-header.js +2 -2
- package/dist/esm/lib/parsers/parse-shp-header.js.map +1 -1
- package/dist/esm/lib/parsers/parse-shp.js +2 -2
- package/dist/esm/lib/parsers/parse-shp.js.map +1 -1
- package/dist/esm/shapefile-loader.js +1 -1
- package/dist/esm/shapefile-loader.js.map +1 -1
- package/dist/esm/shp-loader.js +1 -1
- package/dist/esm/shp-loader.js.map +1 -1
- package/dist/esm/workers/dbf-worker.js +3 -3
- package/dist/esm/workers/dbf-worker.js.map +1 -0
- package/dist/esm/workers/shp-worker.js +3 -3
- package/dist/esm/workers/shp-worker.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/lib/parsers/parse-dbf.d.ts +28 -0
- package/dist/lib/parsers/parse-dbf.d.ts.map +1 -0
- package/dist/lib/parsers/parse-dbf.js +335 -0
- package/dist/lib/parsers/parse-shapefile.d.ts +54 -0
- package/dist/lib/parsers/parse-shapefile.d.ts.map +1 -0
- package/dist/lib/parsers/parse-shapefile.js +245 -0
- package/dist/lib/parsers/parse-shp-geometry.d.ts +11 -0
- package/dist/lib/parsers/parse-shp-geometry.d.ts.map +1 -0
- package/dist/lib/parsers/parse-shp-geometry.js +287 -0
- package/dist/lib/parsers/parse-shp-header.d.ts +26 -0
- package/dist/lib/parsers/parse-shp-header.d.ts.map +1 -0
- package/dist/lib/parsers/parse-shp-header.js +43 -0
- package/dist/lib/parsers/parse-shp.d.ts +9 -0
- package/dist/lib/parsers/parse-shp.d.ts.map +1 -0
- package/dist/lib/parsers/parse-shp.js +170 -0
- package/dist/lib/parsers/parse-shx.d.ts +10 -0
- package/dist/lib/parsers/parse-shx.d.ts.map +1 -0
- package/dist/lib/parsers/parse-shx.js +28 -0
- package/dist/lib/streaming/binary-chunk-reader.d.ts +59 -0
- package/dist/lib/streaming/binary-chunk-reader.d.ts.map +1 -0
- package/dist/lib/streaming/binary-chunk-reader.js +161 -0
- package/dist/lib/streaming/binary-reader.d.ts +32 -0
- package/dist/lib/streaming/binary-reader.d.ts.map +1 -0
- package/dist/lib/streaming/binary-reader.js +52 -0
- package/dist/lib/streaming/zip-batch-iterators.d.ts +8 -0
- package/dist/lib/streaming/zip-batch-iterators.d.ts.map +1 -0
- package/dist/lib/streaming/zip-batch-iterators.js +61 -0
- package/dist/shapefile-loader.d.ts +26 -0
- package/dist/shapefile-loader.d.ts.map +1 -0
- package/dist/shapefile-loader.js +31 -0
- package/dist/shp-loader.d.ts +9 -0
- package/dist/shp-loader.d.ts.map +1 -0
- package/dist/shp-loader.js +35 -0
- package/dist/shp-worker.js +606 -2
- package/dist/workers/dbf-worker.d.ts +2 -0
- package/dist/workers/dbf-worker.d.ts.map +1 -0
- package/dist/workers/dbf-worker.js +5 -0
- package/dist/workers/shp-worker.d.ts +2 -0
- package/dist/workers/shp-worker.d.ts.map +1 -0
- package/dist/workers/shp-worker.js +5 -0
- package/package.json +10 -10
- package/src/lib/parsers/parse-dbf.ts +5 -3
- package/src/lib/parsers/parse-shp-geometry.ts +1 -1
- package/src/workers/{dbf-worker.js → dbf-worker.ts} +0 -0
- package/src/workers/{shp-worker.js → shp-worker.ts} +0 -0
- package/dist/dbf-worker.js.map +0 -1
- package/dist/dist.min.js +0 -2
- package/dist/dist.min.js.map +0 -1
- package/dist/shp-worker.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/parsers/parse-shp.ts"],"names":["BinaryChunkReader","parseSHPHeader","parseRecord","LITTLE_ENDIAN","BIG_ENDIAN","SHP_HEADER_SIZE","SHP_RECORD_HEADER_SIZE","STATE","EXPECTING_HEADER","EXPECTING_RECORD","END","ERROR","SHPParser","constructor","options","maxRewindBytes","geometries","write","arrayBuffer","binaryReader","state","parseState","result","end","error","parseSHP","shpParser","parseSHPInBatches","asyncIterator","parser","headerReturned","header","length","dataView","getDataView","progress","bytesUsed","bytesTotal","rows","currentIndex","hasAvailableBytes","recordHeaderView","recordHeader","recordNumber","getInt32","byteLength","type","rewind","invalidRecord","recordView","geometry","push","ended","message"],"mappings":";AAEA,OAAOA,iBAAP,MAA8B,kCAA9B;AACA,SAAQC,cAAR,QAA6B,oBAA7B;AACA,SAAQC,WAAR,QAA0B,sBAA1B;AAEA,MAAMC,aAAa,GAAG,IAAtB;AACA,MAAMC,UAAU,GAAG,KAAnB;AAEA,MAAMC,eAAe,GAAG,GAAxB;AAGA,MAAMC,sBAAsB,GAAG,EAA/B;AAEA,MAAMC,KAAK,GAAG;AACZC,EAAAA,gBAAgB,EAAE,CADN;AAEZC,EAAAA,gBAAgB,EAAE,CAFN;AAGZC,EAAAA,GAAG,EAAE,CAHO;AAIZC,EAAAA,KAAK,EAAE;AAJK,CAAd;;AAaA,MAAMC,SAAN,CAAgB;AAQdC,EAAAA,WAAW,CAACC,OAAD,EAA0B;AAAA,qCAPrB,EAOqB;;AAAA,0CANtB,IAAId,iBAAJ,CAAsB;AAACe,MAAAA,cAAc,EAAET;AAAjB,KAAtB,CAMsB;;AAAA,mCAL7BC,KAAK,CAACC,gBAKuB;;AAAA,oCAJjB;AAClBQ,MAAAA,UAAU,EAAE;AADM,KAIiB;;AACnC,SAAKF,OAAL,GAAeA,OAAf;AACD;;AAEDG,EAAAA,KAAK,CAACC,WAAD,EAA2B;AAC9B,SAAKC,YAAL,CAAkBF,KAAlB,CAAwBC,WAAxB;AACA,SAAKE,KAAL,GAAaC,UAAU,CAAC,KAAKD,KAAN,EAAa,KAAKE,MAAlB,EAA0B,KAAKH,YAA/B,EAA6C,KAAKL,OAAlD,CAAvB;AACD;;AAEDS,EAAAA,GAAG,GAAG;AACJ,SAAKJ,YAAL,CAAkBI,GAAlB;AACA,SAAKH,KAAL,GAAaC,UAAU,CAAC,KAAKD,KAAN,EAAa,KAAKE,MAAlB,EAA0B,KAAKH,YAA/B,EAA6C,KAAKL,OAAlD,CAAvB;;AAEA,QAAI,KAAKM,KAAL,KAAeb,KAAK,CAACG,GAAzB,EAA8B;AAC5B,WAAKU,KAAL,GAAab,KAAK,CAACI,KAAnB;AACA,WAAKW,MAAL,CAAYE,KAAZ,GAAoB,qBAApB;AACD;AACF;;AAzBa;;AA4BhB,OAAO,SAASC,QAAT,CAAkBP,WAAlB,EAA4CJ,OAA5C,EAAgF;AACrF,QAAMY,SAAS,GAAG,IAAId,SAAJ,CAAcE,OAAd,CAAlB;AACAY,EAAAA,SAAS,CAACT,KAAV,CAAgBC,WAAhB;AACAQ,EAAAA,SAAS,CAACH,GAAV;AAGA,SAAOG,SAAS,CAACJ,MAAjB;AACD;AAOD,OAAO,gBAAgBK,iBAAhB,CACLC,aADK,EAELd,OAFK,EAGmC;AACxC,QAAMe,MAAM,GAAG,IAAIjB,SAAJ,CAAcE,OAAd,CAAf;AACA,MAAIgB,cAAc,GAAG,KAArB;;AACA,aAAW,MAAMZ,WAAjB,IAAgCU,aAAhC,EAA+C;AAC7CC,IAAAA,MAAM,CAACZ,KAAP,CAAaC,WAAb;;AACA,QAAI,CAACY,cAAD,IAAmBD,MAAM,CAACP,MAAP,CAAcS,MAArC,EAA6C;AAC3CD,MAAAA,cAAc,GAAG,IAAjB;AACA,YAAMD,MAAM,CAACP,MAAP,CAAcS,MAApB;AACD;;AAED,QAAIF,MAAM,CAACP,MAAP,CAAcN,UAAd,CAAyBgB,MAAzB,GAAkC,CAAtC,EAAyC;AACvC,YAAMH,MAAM,CAACP,MAAP,CAAcN,UAApB;AACAa,MAAAA,MAAM,CAACP,MAAP,CAAcN,UAAd,GAA2B,EAA3B;AACD;AACF;;AACDa,EAAAA,MAAM,CAACN,GAAP;;AACA,MAAIM,MAAM,CAACP,MAAP,CAAcN,UAAd,CAAyBgB,MAAzB,GAAkC,CAAtC,EAAyC;AACvC,UAAMH,MAAM,CAACP,MAAP,CAAcN,UAApB;AACD;;AAED;AACD;;AAgBD,SAASK,UAAT,CACED,KADF,EAEEE,MAFF,EAGEH,YAHF,EAIEL,OAJF,EAKU;AAER,SAAO,IAAP,EAAa;AACX,QAAI;AACF,cAAQM,KAAR;AACE,aAAKb,KAAK,CAACI,KAAX;AACA,aAAKJ,KAAK,CAACG,GAAX;AACE,iBAAOU,KAAP;;AAEF,aAAKb,KAAK,CAACC,gBAAX;AAEE,gBAAMyB,QAAQ,GAAGd,YAAY,CAACe,WAAb,CAAyB7B,eAAzB,CAAjB;;AACA,cAAI,CAAC4B,QAAL,EAAe;AACb,mBAAOb,KAAP;AACD;;AAEDE,UAAAA,MAAM,CAACS,MAAP,GAAgB9B,cAAc,CAACgC,QAAD,CAA9B;AACAX,UAAAA,MAAM,CAACa,QAAP,GAAkB;AAChBC,YAAAA,SAAS,EAAE,CADK;AAEhBC,YAAAA,UAAU,EAAEf,MAAM,CAACS,MAAP,CAAcC,MAFV;AAGhBM,YAAAA,IAAI,EAAE;AAHU,WAAlB;AAMAhB,UAAAA,MAAM,CAACiB,YAAP,GAAsB,CAAtB;AACAnB,UAAAA,KAAK,GAAGb,KAAK,CAACE,gBAAd;AACA;;AAEF,aAAKF,KAAK,CAACE,gBAAX;AACE,iBAAOU,YAAY,CAACqB,iBAAb,CAA+BlC,sBAA/B,CAAP,EAA+D;AAC7D,kBAAMmC,gBAAgB,GAAGtB,YAAY,CAACe,WAAb,CAAyB5B,sBAAzB,CAAzB;AACA,kBAAMoC,YAAY,GAAG;AACnBC,cAAAA,YAAY,EAAEF,gBAAgB,CAACG,QAAjB,CAA0B,CAA1B,EAA6BxC,UAA7B,CADK;AAGnByC,cAAAA,UAAU,EAAEJ,gBAAgB,CAACG,QAAjB,CAA0B,CAA1B,EAA6BxC,UAA7B,IAA2C,CAHpC;AAKnB0C,cAAAA,IAAI,EAAEL,gBAAgB,CAACG,QAAjB,CAA0B,CAA1B,EAA6BzC,aAA7B;AALa,aAArB;;AAQA,gBAAI,CAACgB,YAAY,CAACqB,iBAAb,CAA+BE,YAAY,CAACG,UAAb,GAA0B,CAAzD,CAAL,EAAkE;AAChE1B,cAAAA,YAAY,CAAC4B,MAAb,CAAoBzC,sBAApB;AACA,qBAAOc,KAAP;AACD;;AAED,kBAAM4B,aAAa,GACjBN,YAAY,CAACG,UAAb,GAA0B,CAA1B,IACAH,YAAY,CAACI,IAAb,KAAsBxB,MAAM,CAACS,MAAP,CAAce,IADpC,IAEAJ,YAAY,CAACC,YAAb,KAA8BrB,MAAM,CAACiB,YAHvC;;AAMA,gBAAIS,aAAJ,EAAmB;AAKjB7B,cAAAA,YAAY,CAAC4B,MAAb,CAAoBzC,sBAAsB,GAAG,CAA7C;AACD,aAND,MAMO;AAGLa,cAAAA,YAAY,CAAC4B,MAAb,CAAoB,CAApB;AAEA,oBAAME,UAAU,GAAG9B,YAAY,CAACe,WAAb,CAAyBQ,YAAY,CAACG,UAAtC,CAAnB;AACA,oBAAMK,QAAQ,GAAGhD,WAAW,CAAC+C,UAAD,EAAanC,OAAb,CAA5B;AACAQ,cAAAA,MAAM,CAACN,UAAP,CAAkBmC,IAAlB,CAAuBD,QAAvB;AAEA5B,cAAAA,MAAM,CAACiB,YAAP;AACAjB,cAAAA,MAAM,CAACa,QAAP,CAAgBG,IAAhB,GAAuBhB,MAAM,CAACiB,YAAP,GAAsB,CAA7C;AACD;AACF;;AAED,cAAIpB,YAAY,CAACiC,KAAjB,EAAwB;AACtBhC,YAAAA,KAAK,GAAGb,KAAK,CAACG,GAAd;AACD;;AAED,iBAAOU,KAAP;;AAEF;AACEA,UAAAA,KAAK,GAAGb,KAAK,CAACI,KAAd;AACAW,UAAAA,MAAM,CAACE,KAAP,GAAgB,wBAAuBJ,KAAM,EAA7C;AACA,iBAAOA,KAAP;AA1EJ;AA4ED,KA7ED,CA6EE,OAAOI,KAAP,EAAc;AACdJ,MAAAA,KAAK,GAAGb,KAAK,CAACI,KAAd;AACAW,MAAAA,MAAM,CAACE,KAAP,GAAgB,uBAAuBA,KAAxB,aAAwBA,KAAxB,uBAAwBA,KAAD,CAAkB6B,OAAQ,EAAhE;AACA,aAAOjC,KAAP;AACD;AACF;AACF","sourcesContent":["import type {LoaderOptions} from '@loaders.gl/loader-utils';\nimport type {BinaryGeometry} from '@loaders.gl/schema';\nimport BinaryChunkReader from '../streaming/binary-chunk-reader';\nimport {parseSHPHeader} from './parse-shp-header';\nimport {parseRecord} from './parse-shp-geometry';\n\nconst LITTLE_ENDIAN = true;\nconst BIG_ENDIAN = false;\n\nconst SHP_HEADER_SIZE = 100;\n// According to the spec, the record header is just 8 bytes, but here we set it\n// to 12 so that we can also access the record's type\nconst SHP_RECORD_HEADER_SIZE = 12;\n\nconst STATE = {\n EXPECTING_HEADER: 0,\n EXPECTING_RECORD: 1,\n END: 2,\n ERROR: 3\n};\n\ntype SHPResult = {\n geometries: [];\n header?: {};\n error?: string;\n};\n\nclass SHPParser {\n options?: any = {};\n binaryReader = new BinaryChunkReader({maxRewindBytes: SHP_RECORD_HEADER_SIZE});\n state = STATE.EXPECTING_HEADER;\n result: SHPResult = {\n geometries: []\n };\n\n constructor(options?: LoaderOptions) {\n this.options = options;\n }\n\n write(arrayBuffer: ArrayBuffer) {\n this.binaryReader.write(arrayBuffer);\n this.state = parseState(this.state, this.result, this.binaryReader, this.options);\n }\n\n end() {\n this.binaryReader.end();\n this.state = parseState(this.state, this.result, this.binaryReader, this.options);\n // this.result.progress.bytesUsed = this.binaryReader.bytesUsed();\n if (this.state !== STATE.END) {\n this.state = STATE.ERROR;\n this.result.error = 'SHP incomplete file';\n }\n }\n}\n\nexport function parseSHP(arrayBuffer: ArrayBuffer, options?: object): BinaryGeometry[] {\n const shpParser = new SHPParser(options);\n shpParser.write(arrayBuffer);\n shpParser.end();\n\n // @ts-ignore\n return shpParser.result;\n}\n\n/**\n * @param asyncIterator\n * @param options\n * @returns\n */\nexport async function* parseSHPInBatches(\n asyncIterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>,\n options?: object\n): AsyncIterable<BinaryGeometry | object> {\n const parser = new SHPParser(options);\n let headerReturned = false;\n for await (const arrayBuffer of asyncIterator) {\n parser.write(arrayBuffer);\n if (!headerReturned && parser.result.header) {\n headerReturned = true;\n yield parser.result.header;\n }\n\n if (parser.result.geometries.length > 0) {\n yield parser.result.geometries;\n parser.result.geometries = [];\n }\n }\n parser.end();\n if (parser.result.geometries.length > 0) {\n yield parser.result.geometries;\n }\n\n return;\n}\n\n/**\n * State-machine parser for SHP data\n *\n * Note that whenever more data is needed, a `return`, not a `break`, is\n * necessary, as the `break` keeps the context within `parseState`, while\n * `return` releases context so that more data can be written into the\n * BinaryChunkReader.\n *\n * @param state Current state\n * @param result An object to hold result data\n * @param binaryReader\n * @return State at end of current parsing\n */\n/* eslint-disable complexity, max-depth */\nfunction parseState(\n state: number,\n result: {[key: string]: any},\n binaryReader: BinaryChunkReader,\n options: {shp?: any}\n): number {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n try {\n switch (state) {\n case STATE.ERROR:\n case STATE.END:\n return state;\n\n case STATE.EXPECTING_HEADER:\n // Parse initial file header\n const dataView = binaryReader.getDataView(SHP_HEADER_SIZE);\n if (!dataView) {\n return state;\n }\n\n result.header = parseSHPHeader(dataView);\n result.progress = {\n bytesUsed: 0,\n bytesTotal: result.header.length,\n rows: 0\n };\n // index numbering starts at 1\n result.currentIndex = 1;\n state = STATE.EXPECTING_RECORD;\n break;\n\n case STATE.EXPECTING_RECORD:\n while (binaryReader.hasAvailableBytes(SHP_RECORD_HEADER_SIZE)) {\n const recordHeaderView = binaryReader.getDataView(SHP_RECORD_HEADER_SIZE) as DataView;\n const recordHeader = {\n recordNumber: recordHeaderView.getInt32(0, BIG_ENDIAN),\n // 2 byte words; includes the four words of record header\n byteLength: recordHeaderView.getInt32(4, BIG_ENDIAN) * 2,\n // This is actually part of the record, not the header...\n type: recordHeaderView.getInt32(8, LITTLE_ENDIAN)\n };\n\n if (!binaryReader.hasAvailableBytes(recordHeader.byteLength - 4)) {\n binaryReader.rewind(SHP_RECORD_HEADER_SIZE);\n return state;\n }\n\n const invalidRecord =\n recordHeader.byteLength < 4 ||\n recordHeader.type !== result.header.type ||\n recordHeader.recordNumber !== result.currentIndex;\n\n // All records must have at least four bytes (for the record shape type)\n if (invalidRecord) {\n // Malformed record, try again, advancing just 4 bytes\n // Note: this is a rewind because binaryReader.getDataView above\n // moved the pointer forward 12 bytes, so rewinding 8 bytes still\n // leaves us 4 bytes ahead\n binaryReader.rewind(SHP_RECORD_HEADER_SIZE - 4);\n } else {\n // Note: type is actually part of the record, not the header, so\n // rewind 4 bytes before reading record\n binaryReader.rewind(4);\n\n const recordView = binaryReader.getDataView(recordHeader.byteLength) as DataView;\n const geometry = parseRecord(recordView, options);\n result.geometries.push(geometry);\n\n result.currentIndex++;\n result.progress.rows = result.currentIndex - 1;\n }\n }\n\n if (binaryReader.ended) {\n state = STATE.END;\n }\n\n return state;\n\n default:\n state = STATE.ERROR;\n result.error = `illegal parser state ${state}`;\n return state;\n }\n } catch (error) {\n state = STATE.ERROR;\n result.error = `SHP parsing failed: ${(error as Error)?.message}`;\n return state;\n }\n }\n}\n"],"file":"parse-shp.js"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/parsers/parse-shp.ts"],"names":["BinaryChunkReader","parseSHPHeader","parseRecord","LITTLE_ENDIAN","BIG_ENDIAN","SHP_HEADER_SIZE","SHP_RECORD_HEADER_SIZE","STATE","EXPECTING_HEADER","EXPECTING_RECORD","END","ERROR","SHPParser","constructor","options","maxRewindBytes","geometries","write","arrayBuffer","binaryReader","state","parseState","result","end","error","parseSHP","shpParser","parseSHPInBatches","asyncIterator","parser","headerReturned","header","length","dataView","getDataView","progress","bytesUsed","bytesTotal","rows","currentIndex","hasAvailableBytes","recordHeaderView","recordHeader","recordNumber","getInt32","byteLength","type","rewind","invalidRecord","recordView","geometry","push","ended","message"],"mappings":"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","sourcesContent":["import type {LoaderOptions} from '@loaders.gl/loader-utils';\nimport type {BinaryGeometry} from '@loaders.gl/schema';\nimport BinaryChunkReader from '../streaming/binary-chunk-reader';\nimport {parseSHPHeader} from './parse-shp-header';\nimport {parseRecord} from './parse-shp-geometry';\n\nconst LITTLE_ENDIAN = true;\nconst BIG_ENDIAN = false;\n\nconst SHP_HEADER_SIZE = 100;\n// According to the spec, the record header is just 8 bytes, but here we set it\n// to 12 so that we can also access the record's type\nconst SHP_RECORD_HEADER_SIZE = 12;\n\nconst STATE = {\n EXPECTING_HEADER: 0,\n EXPECTING_RECORD: 1,\n END: 2,\n ERROR: 3\n};\n\ntype SHPResult = {\n geometries: [];\n header?: {};\n error?: string;\n};\n\nclass SHPParser {\n options?: any = {};\n binaryReader = new BinaryChunkReader({maxRewindBytes: SHP_RECORD_HEADER_SIZE});\n state = STATE.EXPECTING_HEADER;\n result: SHPResult = {\n geometries: []\n };\n\n constructor(options?: LoaderOptions) {\n this.options = options;\n }\n\n write(arrayBuffer: ArrayBuffer) {\n this.binaryReader.write(arrayBuffer);\n this.state = parseState(this.state, this.result, this.binaryReader, this.options);\n }\n\n end() {\n this.binaryReader.end();\n this.state = parseState(this.state, this.result, this.binaryReader, this.options);\n // this.result.progress.bytesUsed = this.binaryReader.bytesUsed();\n if (this.state !== STATE.END) {\n this.state = STATE.ERROR;\n this.result.error = 'SHP incomplete file';\n }\n }\n}\n\nexport function parseSHP(arrayBuffer: ArrayBuffer, options?: object): BinaryGeometry[] {\n const shpParser = new SHPParser(options);\n shpParser.write(arrayBuffer);\n shpParser.end();\n\n // @ts-ignore\n return shpParser.result;\n}\n\n/**\n * @param asyncIterator\n * @param options\n * @returns\n */\nexport async function* parseSHPInBatches(\n asyncIterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>,\n options?: object\n): AsyncIterable<BinaryGeometry | object> {\n const parser = new SHPParser(options);\n let headerReturned = false;\n for await (const arrayBuffer of asyncIterator) {\n parser.write(arrayBuffer);\n if (!headerReturned && parser.result.header) {\n headerReturned = true;\n yield parser.result.header;\n }\n\n if (parser.result.geometries.length > 0) {\n yield parser.result.geometries;\n parser.result.geometries = [];\n }\n }\n parser.end();\n if (parser.result.geometries.length > 0) {\n yield parser.result.geometries;\n }\n\n return;\n}\n\n/**\n * State-machine parser for SHP data\n *\n * Note that whenever more data is needed, a `return`, not a `break`, is\n * necessary, as the `break` keeps the context within `parseState`, while\n * `return` releases context so that more data can be written into the\n * BinaryChunkReader.\n *\n * @param state Current state\n * @param result An object to hold result data\n * @param binaryReader\n * @return State at end of current parsing\n */\n/* eslint-disable complexity, max-depth */\nfunction parseState(\n state: number,\n result: {[key: string]: any},\n binaryReader: BinaryChunkReader,\n options: {shp?: any}\n): number {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n try {\n switch (state) {\n case STATE.ERROR:\n case STATE.END:\n return state;\n\n case STATE.EXPECTING_HEADER:\n // Parse initial file header\n const dataView = binaryReader.getDataView(SHP_HEADER_SIZE);\n if (!dataView) {\n return state;\n }\n\n result.header = parseSHPHeader(dataView);\n result.progress = {\n bytesUsed: 0,\n bytesTotal: result.header.length,\n rows: 0\n };\n // index numbering starts at 1\n result.currentIndex = 1;\n state = STATE.EXPECTING_RECORD;\n break;\n\n case STATE.EXPECTING_RECORD:\n while (binaryReader.hasAvailableBytes(SHP_RECORD_HEADER_SIZE)) {\n const recordHeaderView = binaryReader.getDataView(SHP_RECORD_HEADER_SIZE) as DataView;\n const recordHeader = {\n recordNumber: recordHeaderView.getInt32(0, BIG_ENDIAN),\n // 2 byte words; includes the four words of record header\n byteLength: recordHeaderView.getInt32(4, BIG_ENDIAN) * 2,\n // This is actually part of the record, not the header...\n type: recordHeaderView.getInt32(8, LITTLE_ENDIAN)\n };\n\n if (!binaryReader.hasAvailableBytes(recordHeader.byteLength - 4)) {\n binaryReader.rewind(SHP_RECORD_HEADER_SIZE);\n return state;\n }\n\n const invalidRecord =\n recordHeader.byteLength < 4 ||\n recordHeader.type !== result.header.type ||\n recordHeader.recordNumber !== result.currentIndex;\n\n // All records must have at least four bytes (for the record shape type)\n if (invalidRecord) {\n // Malformed record, try again, advancing just 4 bytes\n // Note: this is a rewind because binaryReader.getDataView above\n // moved the pointer forward 12 bytes, so rewinding 8 bytes still\n // leaves us 4 bytes ahead\n binaryReader.rewind(SHP_RECORD_HEADER_SIZE - 4);\n } else {\n // Note: type is actually part of the record, not the header, so\n // rewind 4 bytes before reading record\n binaryReader.rewind(4);\n\n const recordView = binaryReader.getDataView(recordHeader.byteLength) as DataView;\n const geometry = parseRecord(recordView, options);\n result.geometries.push(geometry);\n\n result.currentIndex++;\n result.progress.rows = result.currentIndex - 1;\n }\n }\n\n if (binaryReader.ended) {\n state = STATE.END;\n }\n\n return state;\n\n default:\n state = STATE.ERROR;\n result.error = `illegal parser state ${state}`;\n return state;\n }\n } catch (error) {\n state = STATE.ERROR;\n result.error = `SHP parsing failed: ${(error as Error)?.message}`;\n return state;\n }\n }\n}\n"],"file":"parse-shp.js"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { SHP_MAGIC_NUMBER } from './shp-loader';
|
|
2
2
|
import { parseShapefile, parseShapefileInBatches } from './lib/parsers/parse-shapefile';
|
|
3
|
-
const VERSION = typeof "3.1.0-
|
|
3
|
+
const VERSION = typeof "3.1.0-beta.3" !== 'undefined' ? "3.1.0-beta.3" : 'latest';
|
|
4
4
|
export const ShapefileLoader = {
|
|
5
5
|
name: 'Shapefile',
|
|
6
6
|
id: 'shapefile',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/shapefile-loader.ts"],"names":["SHP_MAGIC_NUMBER","parseShapefile","parseShapefileInBatches","VERSION","ShapefileLoader","name","id","module","version","category","extensions","mimeTypes","tests","Uint8Array","buffer","options","shapefile","shp","_maxDimensions","parse","parseInBatches","_typecheckShapefileLoader"],"mappings":"AACA,SAAQA,gBAAR,QAA+B,cAA/B;AACA,SAAQC,cAAR,EAAwBC,uBAAxB,QAAsD,+BAAtD;AAIA,MAAMC,OAAO,GAAG,
|
|
1
|
+
{"version":3,"sources":["../../src/shapefile-loader.ts"],"names":["SHP_MAGIC_NUMBER","parseShapefile","parseShapefileInBatches","VERSION","ShapefileLoader","name","id","module","version","category","extensions","mimeTypes","tests","Uint8Array","buffer","options","shapefile","shp","_maxDimensions","parse","parseInBatches","_typecheckShapefileLoader"],"mappings":"AACA,SAAQA,gBAAR,QAA+B,cAA/B;AACA,SAAQC,cAAR,EAAwBC,uBAAxB,QAAsD,+BAAtD;AAIA,MAAMC,OAAO,GAAG,0BAAuB,WAAvB,oBAAmD,QAAnE;AAMA,OAAO,MAAMC,eAAe,GAAG;AAC7BC,EAAAA,IAAI,EAAE,WADuB;AAE7BC,EAAAA,EAAE,EAAE,WAFyB;AAG7BC,EAAAA,MAAM,EAAE,WAHqB;AAI7BC,EAAAA,OAAO,EAAEL,OAJoB;AAK7BM,EAAAA,QAAQ,EAAE,UALmB;AAM7BC,EAAAA,UAAU,EAAE,CAAC,KAAD,CANiB;AAO7BC,EAAAA,SAAS,EAAE,CAAC,0BAAD,CAPkB;AAQ7BC,EAAAA,KAAK,EAAE,CAAC,IAAIC,UAAJ,CAAeb,gBAAf,EAAiCc,MAAlC,CARsB;AAS7BC,EAAAA,OAAO,EAAE;AACPC,IAAAA,SAAS,EAAE,EADJ;AAEPC,IAAAA,GAAG,EAAE;AACHC,MAAAA,cAAc,EAAE;AADb;AAFE,GAToB;AAe7BC,EAAAA,KAAK,EAAElB,cAfsB;AAgB7BmB,EAAAA,cAAc,EAAElB;AAhBa,CAAxB;AAmBP,OAAO,MAAMmB,yBAA2C,GAAGjB,eAApD","sourcesContent":["import type {LoaderWithParser} from '@loaders.gl/loader-utils';\nimport {SHP_MAGIC_NUMBER} from './shp-loader';\nimport {parseShapefile, parseShapefileInBatches} from './lib/parsers/parse-shapefile';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\n/**\n * Shapefile loader\n * @note Shapefile is multifile format and requires providing additional files\n */\nexport const ShapefileLoader = {\n name: 'Shapefile',\n id: 'shapefile',\n module: 'shapefile',\n version: VERSION,\n category: 'geometry',\n extensions: ['shp'],\n mimeTypes: ['application/octet-stream'],\n tests: [new Uint8Array(SHP_MAGIC_NUMBER).buffer],\n options: {\n shapefile: {},\n shp: {\n _maxDimensions: 4\n }\n },\n parse: parseShapefile,\n parseInBatches: parseShapefileInBatches\n};\n\nexport const _typecheckShapefileLoader: LoaderWithParser = ShapefileLoader;\n"],"file":"shapefile-loader.js"}
|
package/dist/esm/shp-loader.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { parseSHP, parseSHPInBatches } from './lib/parsers/parse-shp';
|
|
2
|
-
const VERSION = typeof "3.1.0-
|
|
2
|
+
const VERSION = typeof "3.1.0-beta.3" !== 'undefined' ? "3.1.0-beta.3" : 'latest';
|
|
3
3
|
export const SHP_MAGIC_NUMBER = [0x00, 0x00, 0x27, 0x0a];
|
|
4
4
|
export const SHPWorkerLoader = {
|
|
5
5
|
name: 'SHP',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/shp-loader.ts"],"names":["parseSHP","parseSHPInBatches","VERSION","SHP_MAGIC_NUMBER","SHPWorkerLoader","name","id","module","version","worker","category","extensions","mimeTypes","tests","Uint8Array","buffer","options","shp","_maxDimensions","SHPLoader","parse","arrayBuffer","parseSync","parseInBatches"],"mappings":"AACA,SAAQA,QAAR,EAAkBC,iBAAlB,QAA0C,yBAA1C;AAIA,MAAMC,OAAO,GAAG,
|
|
1
|
+
{"version":3,"sources":["../../src/shp-loader.ts"],"names":["parseSHP","parseSHPInBatches","VERSION","SHP_MAGIC_NUMBER","SHPWorkerLoader","name","id","module","version","worker","category","extensions","mimeTypes","tests","Uint8Array","buffer","options","shp","_maxDimensions","SHPLoader","parse","arrayBuffer","parseSync","parseInBatches"],"mappings":"AACA,SAAQA,QAAR,EAAkBC,iBAAlB,QAA0C,yBAA1C;AAIA,MAAMC,OAAO,GAAG,0BAAuB,WAAvB,oBAAmD,QAAnE;AAEA,OAAO,MAAMC,gBAAgB,GAAG,CAAC,IAAD,EAAO,IAAP,EAAa,IAAb,EAAmB,IAAnB,CAAzB;AAKP,OAAO,MAAMC,eAAuB,GAAG;AACrCC,EAAAA,IAAI,EAAE,KAD+B;AAErCC,EAAAA,EAAE,EAAE,KAFiC;AAGrCC,EAAAA,MAAM,EAAE,WAH6B;AAIrCC,EAAAA,OAAO,EAAEN,OAJ4B;AAKrCO,EAAAA,MAAM,EAAE,IAL6B;AAMrCC,EAAAA,QAAQ,EAAE,UAN2B;AAOrCC,EAAAA,UAAU,EAAE,CAAC,KAAD,CAPyB;AAQrCC,EAAAA,SAAS,EAAE,CAAC,0BAAD,CAR0B;AAUrCC,EAAAA,KAAK,EAAE,CAAC,IAAIC,UAAJ,CAAeX,gBAAf,EAAiCY,MAAlC,CAV8B;AAWrCC,EAAAA,OAAO,EAAE;AACPC,IAAAA,GAAG,EAAE;AACHC,MAAAA,cAAc,EAAE;AADb;AADE;AAX4B,CAAhC;AAmBP,OAAO,MAAMC,SAA2B,GAAG,EACzC,GAAGf,eADsC;AAEzCgB,EAAAA,KAAK,EAAE,OAAOC,WAAP,EAAoBL,OAApB,KAAiChB,QAAQ,CAACqB,WAAD,EAAcL,OAAd,CAFP;AAGzCM,EAAAA,SAAS,EAAEtB,QAH8B;AAIzCuB,EAAAA,cAAc,EAAEtB;AAJyB,CAApC","sourcesContent":["import type {Loader, LoaderWithParser} from '@loaders.gl/loader-utils';\nimport {parseSHP, parseSHPInBatches} from './lib/parsers/parse-shp';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nexport const SHP_MAGIC_NUMBER = [0x00, 0x00, 0x27, 0x0a];\n\n/**\n * SHP file loader\n */\nexport const SHPWorkerLoader: Loader = {\n name: 'SHP',\n id: 'shp',\n module: 'shapefile',\n version: VERSION,\n worker: true,\n category: 'geometry',\n extensions: ['shp'],\n mimeTypes: ['application/octet-stream'],\n // ISSUE: This also identifies SHX files, which are identical to SHP for the first 100 bytes...\n tests: [new Uint8Array(SHP_MAGIC_NUMBER).buffer],\n options: {\n shp: {\n _maxDimensions: 4\n }\n }\n};\n\n/** SHP file loader */\nexport const SHPLoader: LoaderWithParser = {\n ...SHPWorkerLoader,\n parse: async (arrayBuffer, options?) => parseSHP(arrayBuffer, options),\n parseSync: parseSHP,\n parseInBatches: parseSHPInBatches\n};\n"],"file":"shp-loader.js"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {DBFLoader} from '../dbf-loader';
|
|
2
|
-
import {createLoaderWorker} from '@loaders.gl/loader-utils';
|
|
3
|
-
|
|
1
|
+
import { DBFLoader } from '../dbf-loader';
|
|
2
|
+
import { createLoaderWorker } from '@loaders.gl/loader-utils';
|
|
4
3
|
createLoaderWorker(DBFLoader);
|
|
4
|
+
//# sourceMappingURL=dbf-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/workers/dbf-worker.ts"],"names":["DBFLoader","createLoaderWorker"],"mappings":"AAAA,SAAQA,SAAR,QAAwB,eAAxB;AACA,SAAQC,kBAAR,QAAiC,0BAAjC;AAEAA,kBAAkB,CAACD,SAAD,CAAlB","sourcesContent":["import {DBFLoader} from '../dbf-loader';\nimport {createLoaderWorker} from '@loaders.gl/loader-utils';\n\ncreateLoaderWorker(DBFLoader);\n"],"file":"dbf-worker.js"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {SHPLoader} from '../shp-loader';
|
|
2
|
-
import {createLoaderWorker} from '@loaders.gl/loader-utils';
|
|
3
|
-
|
|
1
|
+
import { SHPLoader } from '../shp-loader';
|
|
2
|
+
import { createLoaderWorker } from '@loaders.gl/loader-utils';
|
|
4
3
|
createLoaderWorker(SHPLoader);
|
|
4
|
+
//# sourceMappingURL=shp-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/workers/shp-worker.ts"],"names":["SHPLoader","createLoaderWorker"],"mappings":"AAAA,SAAQA,SAAR,QAAwB,eAAxB;AACA,SAAQC,kBAAR,QAAiC,0BAAjC;AAEAA,kBAAkB,CAACD,SAAD,CAAlB","sourcesContent":["import {SHPLoader} from '../shp-loader';\nimport {createLoaderWorker} from '@loaders.gl/loader-utils';\n\ncreateLoaderWorker(SHPLoader);\n"],"file":"shp-worker.js"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAC,SAAS,EAAE,eAAe,EAAC,MAAM,cAAc,CAAC;AACxD,OAAO,EAAC,SAAS,EAAE,eAAe,EAAC,MAAM,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SHPWorkerLoader = exports.SHPLoader = exports.DBFWorkerLoader = exports.DBFLoader = exports.ShapefileLoader = void 0;
|
|
4
|
+
var shapefile_loader_1 = require("./shapefile-loader");
|
|
5
|
+
Object.defineProperty(exports, "ShapefileLoader", { enumerable: true, get: function () { return shapefile_loader_1.ShapefileLoader; } });
|
|
6
|
+
var dbf_loader_1 = require("./dbf-loader");
|
|
7
|
+
Object.defineProperty(exports, "DBFLoader", { enumerable: true, get: function () { return dbf_loader_1.DBFLoader; } });
|
|
8
|
+
Object.defineProperty(exports, "DBFWorkerLoader", { enumerable: true, get: function () { return dbf_loader_1.DBFWorkerLoader; } });
|
|
9
|
+
var shp_loader_1 = require("./shp-loader");
|
|
10
|
+
Object.defineProperty(exports, "SHPLoader", { enumerable: true, get: function () { return shp_loader_1.SHPLoader; } });
|
|
11
|
+
Object.defineProperty(exports, "SHPWorkerLoader", { enumerable: true, get: function () { return shp_loader_1.SHPWorkerLoader; } });
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Schema } from '@loaders.gl/schema';
|
|
2
|
+
declare type DBFRowsOutput = object[];
|
|
3
|
+
interface DBFTableOutput {
|
|
4
|
+
schema?: Schema;
|
|
5
|
+
rows: DBFRowsOutput;
|
|
6
|
+
}
|
|
7
|
+
declare type DBFHeader = {
|
|
8
|
+
year: number;
|
|
9
|
+
month: number;
|
|
10
|
+
day: number;
|
|
11
|
+
nRecords: number;
|
|
12
|
+
headerLength: number;
|
|
13
|
+
recordLength: number;
|
|
14
|
+
languageDriver: number;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* @param arrayBuffer
|
|
18
|
+
* @param options
|
|
19
|
+
* @returns DBFTable or rows
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseDBF(arrayBuffer: ArrayBuffer, options?: any): DBFRowsOutput | DBFTableOutput;
|
|
22
|
+
/**
|
|
23
|
+
* @param asyncIterator
|
|
24
|
+
* @param options
|
|
25
|
+
*/
|
|
26
|
+
export declare function parseDBFInBatches(asyncIterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>, options?: any): AsyncIterable<DBFHeader | DBFRowsOutput | DBFTableOutput>;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=parse-dbf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-dbf.d.ts","sourceRoot":"","sources":["../../../src/lib/parsers/parse-dbf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAmD,MAAM,oBAAoB,CAAC;AAG5F,aAAK,aAAa,GAAG,MAAM,EAAE,CAAC;AAE9B,UAAU,cAAc;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,aAAK,SAAS,GAAG;IAEf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IAEZ,QAAQ,EAAE,MAAM,CAAC;IAEjB,YAAY,EAAE,MAAM,CAAC;IAErB,YAAY,EAAE,MAAM,CAAC;IAErB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAsEF;;;;GAIG;AACH,wBAAgB,QAAQ,CACtB,WAAW,EAAE,WAAW,EACxB,OAAO,GAAE,GAAQ,GAChB,aAAa,GAAG,cAAc,CAkBhC;AACD;;;GAGG;AACH,wBAAuB,iBAAiB,CACtC,aAAa,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,EACjE,OAAO,GAAE,GAAQ,GAChB,aAAa,CAAC,SAAS,GAAG,aAAa,GAAG,cAAc,CAAC,CAsB3D"}
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.parseDBFInBatches = exports.parseDBF = void 0;
|
|
7
|
+
const schema_1 = require("@loaders.gl/schema");
|
|
8
|
+
const binary_chunk_reader_1 = __importDefault(require("../streaming/binary-chunk-reader"));
|
|
9
|
+
const LITTLE_ENDIAN = true;
|
|
10
|
+
const DBF_HEADER_SIZE = 32;
|
|
11
|
+
var STATE;
|
|
12
|
+
(function (STATE) {
|
|
13
|
+
STATE[STATE["START"] = 0] = "START";
|
|
14
|
+
STATE[STATE["FIELD_DESCRIPTORS"] = 1] = "FIELD_DESCRIPTORS";
|
|
15
|
+
STATE[STATE["FIELD_PROPERTIES"] = 2] = "FIELD_PROPERTIES";
|
|
16
|
+
STATE[STATE["END"] = 3] = "END";
|
|
17
|
+
STATE[STATE["ERROR"] = 4] = "ERROR";
|
|
18
|
+
})(STATE || (STATE = {}));
|
|
19
|
+
class DBFParser {
|
|
20
|
+
constructor(options) {
|
|
21
|
+
this.binaryReader = new binary_chunk_reader_1.default();
|
|
22
|
+
this.state = STATE.START;
|
|
23
|
+
this.result = {
|
|
24
|
+
data: []
|
|
25
|
+
};
|
|
26
|
+
this.textDecoder = new TextDecoder(options.encoding);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* @param arrayBuffer
|
|
30
|
+
*/
|
|
31
|
+
write(arrayBuffer) {
|
|
32
|
+
this.binaryReader.write(arrayBuffer);
|
|
33
|
+
this.state = parseState(this.state, this.result, this.binaryReader, this.textDecoder);
|
|
34
|
+
// this.result.progress.bytesUsed = this.binaryReader.bytesUsed();
|
|
35
|
+
// important events:
|
|
36
|
+
// - schema available
|
|
37
|
+
// - first rows available
|
|
38
|
+
// - all rows available
|
|
39
|
+
}
|
|
40
|
+
end() {
|
|
41
|
+
this.binaryReader.end();
|
|
42
|
+
this.state = parseState(this.state, this.result, this.binaryReader, this.textDecoder);
|
|
43
|
+
// this.result.progress.bytesUsed = this.binaryReader.bytesUsed();
|
|
44
|
+
if (this.state !== STATE.END) {
|
|
45
|
+
this.state = STATE.ERROR;
|
|
46
|
+
this.result.error = 'DBF incomplete file';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* @param arrayBuffer
|
|
52
|
+
* @param options
|
|
53
|
+
* @returns DBFTable or rows
|
|
54
|
+
*/
|
|
55
|
+
function parseDBF(arrayBuffer, options = {}) {
|
|
56
|
+
const loaderOptions = options.dbf || {};
|
|
57
|
+
const { encoding } = loaderOptions;
|
|
58
|
+
const dbfParser = new DBFParser({ encoding });
|
|
59
|
+
dbfParser.write(arrayBuffer);
|
|
60
|
+
dbfParser.end();
|
|
61
|
+
const { data, schema } = dbfParser.result;
|
|
62
|
+
switch (options.tables && options.tables.format) {
|
|
63
|
+
case 'table':
|
|
64
|
+
// TODO - parse columns
|
|
65
|
+
return { schema, rows: data };
|
|
66
|
+
case 'rows':
|
|
67
|
+
default:
|
|
68
|
+
return data;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
exports.parseDBF = parseDBF;
|
|
72
|
+
/**
|
|
73
|
+
* @param asyncIterator
|
|
74
|
+
* @param options
|
|
75
|
+
*/
|
|
76
|
+
async function* parseDBFInBatches(asyncIterator, options = {}) {
|
|
77
|
+
const loaderOptions = options.dbf || {};
|
|
78
|
+
const { encoding } = loaderOptions;
|
|
79
|
+
const parser = new DBFParser({ encoding });
|
|
80
|
+
let headerReturned = false;
|
|
81
|
+
for await (const arrayBuffer of asyncIterator) {
|
|
82
|
+
parser.write(arrayBuffer);
|
|
83
|
+
if (!headerReturned && parser.result.dbfHeader) {
|
|
84
|
+
headerReturned = true;
|
|
85
|
+
yield parser.result.dbfHeader;
|
|
86
|
+
}
|
|
87
|
+
if (parser.result.data.length > 0) {
|
|
88
|
+
yield parser.result.data;
|
|
89
|
+
parser.result.data = [];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
parser.end();
|
|
93
|
+
if (parser.result.data.length > 0) {
|
|
94
|
+
yield parser.result.data;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exports.parseDBFInBatches = parseDBFInBatches;
|
|
98
|
+
/**
|
|
99
|
+
* https://www.dbase.com/Knowledgebase/INT/db7_file_fmt.htm
|
|
100
|
+
* @param state
|
|
101
|
+
* @param result
|
|
102
|
+
* @param binaryReader
|
|
103
|
+
* @param textDecoder
|
|
104
|
+
* @returns
|
|
105
|
+
*/
|
|
106
|
+
/* eslint-disable complexity, max-depth */
|
|
107
|
+
function parseState(state, result, binaryReader, textDecoder) {
|
|
108
|
+
// eslint-disable-next-line no-constant-condition
|
|
109
|
+
while (true) {
|
|
110
|
+
try {
|
|
111
|
+
switch (state) {
|
|
112
|
+
case STATE.ERROR:
|
|
113
|
+
case STATE.END:
|
|
114
|
+
return state;
|
|
115
|
+
case STATE.START:
|
|
116
|
+
// Parse initial file header
|
|
117
|
+
const dataView = binaryReader.getDataView(DBF_HEADER_SIZE, 'DBF header');
|
|
118
|
+
if (!dataView) {
|
|
119
|
+
return state;
|
|
120
|
+
}
|
|
121
|
+
result.dbfHeader = parseDBFHeader(dataView);
|
|
122
|
+
result.progress = {
|
|
123
|
+
bytesUsed: 0,
|
|
124
|
+
rowsTotal: result.dbfHeader.nRecords,
|
|
125
|
+
rows: 0
|
|
126
|
+
};
|
|
127
|
+
state = STATE.FIELD_DESCRIPTORS;
|
|
128
|
+
break;
|
|
129
|
+
case STATE.FIELD_DESCRIPTORS:
|
|
130
|
+
// Parse DBF field descriptors (schema)
|
|
131
|
+
const fieldDescriptorView = binaryReader.getDataView(
|
|
132
|
+
// @ts-ignore
|
|
133
|
+
result.dbfHeader.headerLength - DBF_HEADER_SIZE, 'DBF field descriptors');
|
|
134
|
+
if (!fieldDescriptorView) {
|
|
135
|
+
return state;
|
|
136
|
+
}
|
|
137
|
+
result.dbfFields = parseFieldDescriptors(fieldDescriptorView, textDecoder);
|
|
138
|
+
result.schema = new schema_1.Schema(result.dbfFields.map((dbfField) => makeField(dbfField)));
|
|
139
|
+
state = STATE.FIELD_PROPERTIES;
|
|
140
|
+
// TODO(kyle) Not exactly sure why start offset needs to be headerLength + 1?
|
|
141
|
+
// parsedbf uses ((fields.length + 1) << 5) + 2;
|
|
142
|
+
binaryReader.skip(1);
|
|
143
|
+
break;
|
|
144
|
+
case STATE.FIELD_PROPERTIES:
|
|
145
|
+
const { recordLength = 0, nRecords = 0 } = result?.dbfHeader || {};
|
|
146
|
+
while (result.data.length < nRecords) {
|
|
147
|
+
const recordView = binaryReader.getDataView(recordLength - 1);
|
|
148
|
+
if (!recordView) {
|
|
149
|
+
return state;
|
|
150
|
+
}
|
|
151
|
+
// Note: Avoid actually reading the last byte, which may not be present
|
|
152
|
+
binaryReader.skip(1);
|
|
153
|
+
// @ts-ignore
|
|
154
|
+
const row = parseRow(recordView, result.dbfFields, textDecoder);
|
|
155
|
+
result.data.push(row);
|
|
156
|
+
// @ts-ignore
|
|
157
|
+
result.progress.rows = result.data.length;
|
|
158
|
+
}
|
|
159
|
+
state = STATE.END;
|
|
160
|
+
break;
|
|
161
|
+
default:
|
|
162
|
+
state = STATE.ERROR;
|
|
163
|
+
result.error = `illegal parser state ${state}`;
|
|
164
|
+
return state;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
state = STATE.ERROR;
|
|
169
|
+
result.error = `DBF parsing failed: ${error.message}`;
|
|
170
|
+
return state;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* @param headerView
|
|
176
|
+
*/
|
|
177
|
+
function parseDBFHeader(headerView) {
|
|
178
|
+
return {
|
|
179
|
+
// Last updated date
|
|
180
|
+
year: headerView.getUint8(1) + 1900,
|
|
181
|
+
month: headerView.getUint8(2),
|
|
182
|
+
day: headerView.getUint8(3),
|
|
183
|
+
// Number of records in data file
|
|
184
|
+
nRecords: headerView.getUint32(4, LITTLE_ENDIAN),
|
|
185
|
+
// Length of header in bytes
|
|
186
|
+
headerLength: headerView.getUint16(8, LITTLE_ENDIAN),
|
|
187
|
+
// Length of each record
|
|
188
|
+
recordLength: headerView.getUint16(10, LITTLE_ENDIAN),
|
|
189
|
+
// Not sure if this is usually set
|
|
190
|
+
languageDriver: headerView.getUint8(29)
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* @param view
|
|
195
|
+
*/
|
|
196
|
+
function parseFieldDescriptors(view, textDecoder) {
|
|
197
|
+
// NOTE: this might overestimate the number of fields if the "Database
|
|
198
|
+
// Container" container exists and is included in the headerLength
|
|
199
|
+
const nFields = (view.byteLength - 1) / 32;
|
|
200
|
+
const fields = [];
|
|
201
|
+
let offset = 0;
|
|
202
|
+
for (let i = 0; i < nFields; i++) {
|
|
203
|
+
const name = textDecoder
|
|
204
|
+
.decode(new Uint8Array(view.buffer, view.byteOffset + offset, 11))
|
|
205
|
+
// eslint-disable-next-line no-control-regex
|
|
206
|
+
.replace(/\u0000/g, '');
|
|
207
|
+
fields.push({
|
|
208
|
+
name,
|
|
209
|
+
dataType: String.fromCharCode(view.getUint8(offset + 11)),
|
|
210
|
+
fieldLength: view.getUint8(offset + 16),
|
|
211
|
+
decimal: view.getUint8(offset + 17)
|
|
212
|
+
});
|
|
213
|
+
offset += 32;
|
|
214
|
+
}
|
|
215
|
+
return fields;
|
|
216
|
+
}
|
|
217
|
+
/*
|
|
218
|
+
* @param {BinaryChunkReader} binaryReader
|
|
219
|
+
function parseRows(binaryReader, fields, nRecords, recordLength, textDecoder) {
|
|
220
|
+
const rows = [];
|
|
221
|
+
for (let i = 0; i < nRecords; i++) {
|
|
222
|
+
const recordView = binaryReader.getDataView(recordLength - 1);
|
|
223
|
+
binaryReader.skip(1);
|
|
224
|
+
// @ts-ignore
|
|
225
|
+
rows.push(parseRow(recordView, fields, textDecoder));
|
|
226
|
+
}
|
|
227
|
+
return rows;
|
|
228
|
+
}
|
|
229
|
+
*/
|
|
230
|
+
/**
|
|
231
|
+
*
|
|
232
|
+
* @param view
|
|
233
|
+
* @param fields
|
|
234
|
+
* @param textDecoder
|
|
235
|
+
* @returns
|
|
236
|
+
*/
|
|
237
|
+
function parseRow(view, fields, textDecoder) {
|
|
238
|
+
const out = {};
|
|
239
|
+
let offset = 0;
|
|
240
|
+
for (const field of fields) {
|
|
241
|
+
const text = textDecoder.decode(new Uint8Array(view.buffer, view.byteOffset + offset, field.fieldLength));
|
|
242
|
+
out[field.name] = parseField(text, field.dataType);
|
|
243
|
+
offset += field.fieldLength;
|
|
244
|
+
}
|
|
245
|
+
return out;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Should NaN be coerced to null?
|
|
249
|
+
* @param text
|
|
250
|
+
* @param dataType
|
|
251
|
+
* @returns Field depends on a type of the data
|
|
252
|
+
*/
|
|
253
|
+
function parseField(text, dataType) {
|
|
254
|
+
switch (dataType) {
|
|
255
|
+
case 'B':
|
|
256
|
+
return parseNumber(text);
|
|
257
|
+
case 'C':
|
|
258
|
+
return parseCharacter(text);
|
|
259
|
+
case 'F':
|
|
260
|
+
return parseNumber(text);
|
|
261
|
+
case 'N':
|
|
262
|
+
return parseNumber(text);
|
|
263
|
+
case 'O':
|
|
264
|
+
return parseNumber(text);
|
|
265
|
+
case 'D':
|
|
266
|
+
return parseDate(text);
|
|
267
|
+
case 'L':
|
|
268
|
+
return parseBoolean(text);
|
|
269
|
+
default:
|
|
270
|
+
throw new Error('Unsupported data type');
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Parse YYYYMMDD to date in milliseconds
|
|
275
|
+
* @param str YYYYMMDD
|
|
276
|
+
* @returns new Date as a number
|
|
277
|
+
*/
|
|
278
|
+
function parseDate(str) {
|
|
279
|
+
return Date.UTC(str.slice(0, 4), parseInt(str.slice(4, 6), 10) - 1, str.slice(6, 8));
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Read boolean value
|
|
283
|
+
* any of Y, y, T, t coerce to true
|
|
284
|
+
* any of N, n, F, f coerce to false
|
|
285
|
+
* otherwise null
|
|
286
|
+
* @param value
|
|
287
|
+
* @returns boolean | null
|
|
288
|
+
*/
|
|
289
|
+
function parseBoolean(value) {
|
|
290
|
+
return /^[nf]$/i.test(value) ? false : /^[yt]$/i.test(value) ? true : null;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Return null instead of NaN
|
|
294
|
+
* @param text
|
|
295
|
+
* @returns number | null
|
|
296
|
+
*/
|
|
297
|
+
function parseNumber(text) {
|
|
298
|
+
const number = parseFloat(text);
|
|
299
|
+
return isNaN(number) ? null : number;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
*
|
|
303
|
+
* @param text
|
|
304
|
+
* @returns string | null
|
|
305
|
+
*/
|
|
306
|
+
function parseCharacter(text) {
|
|
307
|
+
return text.trim() || null;
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Create a standard Arrow-style `Field` from field descriptor.
|
|
311
|
+
* TODO - use `fieldLength` and `decimal` to generate smaller types?
|
|
312
|
+
* @param param0
|
|
313
|
+
* @returns Field
|
|
314
|
+
*/
|
|
315
|
+
// eslint-disable
|
|
316
|
+
function makeField({ name, dataType, fieldLength, decimal }) {
|
|
317
|
+
switch (dataType) {
|
|
318
|
+
case 'B':
|
|
319
|
+
return new schema_1.Field(name, new schema_1.Float64(), true);
|
|
320
|
+
case 'C':
|
|
321
|
+
return new schema_1.Field(name, new schema_1.Utf8(), true);
|
|
322
|
+
case 'F':
|
|
323
|
+
return new schema_1.Field(name, new schema_1.Float64(), true);
|
|
324
|
+
case 'N':
|
|
325
|
+
return new schema_1.Field(name, new schema_1.Float64(), true);
|
|
326
|
+
case 'O':
|
|
327
|
+
return new schema_1.Field(name, new schema_1.Float64(), true);
|
|
328
|
+
case 'D':
|
|
329
|
+
return new schema_1.Field(name, new schema_1.TimestampMillisecond(), true);
|
|
330
|
+
case 'L':
|
|
331
|
+
return new schema_1.Field(name, new schema_1.Bool(), true);
|
|
332
|
+
default:
|
|
333
|
+
throw new Error('Unsupported data type');
|
|
334
|
+
}
|
|
335
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { SHXOutput } from './parse-shx';
|
|
2
|
+
import type { SHPHeader } from './parse-shp-header';
|
|
3
|
+
import type { LoaderContext } from '@loaders.gl/loader-utils';
|
|
4
|
+
interface ShapefileOutput {
|
|
5
|
+
encoding?: string;
|
|
6
|
+
prj?: string;
|
|
7
|
+
shx?: SHXOutput;
|
|
8
|
+
header: SHPHeader;
|
|
9
|
+
data: object[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Parsing of file in batches
|
|
13
|
+
*
|
|
14
|
+
* @param asyncIterator
|
|
15
|
+
* @param options
|
|
16
|
+
* @param context
|
|
17
|
+
*/
|
|
18
|
+
export declare function parseShapefileInBatches(asyncIterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>, options?: any, context?: LoaderContext): AsyncIterable<ShapefileOutput>;
|
|
19
|
+
/**
|
|
20
|
+
* Parse shapefile
|
|
21
|
+
*
|
|
22
|
+
* @param arrayBuffer
|
|
23
|
+
* @param options
|
|
24
|
+
* @param context
|
|
25
|
+
* @returns output of shapefile
|
|
26
|
+
*/
|
|
27
|
+
export declare function parseShapefile(arrayBuffer: ArrayBuffer, options?: {
|
|
28
|
+
[key: string]: any;
|
|
29
|
+
}, context?: LoaderContext): Promise<ShapefileOutput>;
|
|
30
|
+
/**
|
|
31
|
+
*
|
|
32
|
+
* @param options
|
|
33
|
+
* @param context
|
|
34
|
+
* @returns Promise
|
|
35
|
+
*/
|
|
36
|
+
export declare function loadShapefileSidecarFiles(options?: object, context?: LoaderContext): Promise<{
|
|
37
|
+
shx?: SHXOutput;
|
|
38
|
+
cpg?: string;
|
|
39
|
+
prj?: string;
|
|
40
|
+
}>;
|
|
41
|
+
/**
|
|
42
|
+
* Replace the extension at the end of a path.
|
|
43
|
+
*
|
|
44
|
+
* Matches the case of new extension with the case of the original file extension,
|
|
45
|
+
* to increase the chance of finding files without firing off a request storm looking for various case combinations
|
|
46
|
+
*
|
|
47
|
+
* NOTE: Extensions can be both lower and uppercase
|
|
48
|
+
* per spec, extensions should be lower case, but that doesn't mean they always are. See:
|
|
49
|
+
* calvinmetcalf/shapefile-js#64, mapserver/mapserver#4712
|
|
50
|
+
* https://trac.osgeo.org/mapserver/ticket/166
|
|
51
|
+
*/
|
|
52
|
+
export declare function replaceExtension(url: string, newExtension: string): string;
|
|
53
|
+
export {};
|
|
54
|
+
//# sourceMappingURL=parse-shapefile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-shapefile.d.ts","sourceRoot":"","sources":["../../../src/lib/parsers/parse-shapefile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAU5D,UAAU,eAAe;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AACD;;;;;;GAMG;AAEH,wBAAuB,uBAAuB,CAC5C,aAAa,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,EACjE,OAAO,CAAC,EAAE,GAAG,EACb,OAAO,CAAC,EAAE,aAAa,GACtB,aAAa,CAAC,eAAe,CAAC,CAmEhC;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAC,EAC9B,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,eAAe,CAAC,CAgC1B;AAoDD;;;;;GAKG;AAEH,wBAAsB,yBAAyB,CAC7C,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC;IACT,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC,CAkCD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAQ1E"}
|