UNPKG

@loaders.gl/shapefile

Version:

Loader for the Shapefile Format

65 lines (60 loc) 1.84 kB
// loaders.gl // SPDX-License-Identifier: MIT // Copyright (c) vis.gl contributors export interface SHPHeader { /** SHP Magic number */ magic: number; /** Number of bytes in file */ length: number; version: number; type: number; bbox: { minX: number; minY: number; minZ: number; minM: number; maxX: number; maxY: number; maxZ: number; maxM: number; }; } const LITTLE_ENDIAN = true; const BIG_ENDIAN = false; const SHP_MAGIC_NUMBER = 0x0000270a; /** * Extract the binary header * Note: Also used by SHX * @param headerView * @returns SHPHeader */ export function parseSHPHeader(headerView: DataView): SHPHeader { // Note: The SHP format switches endianness between fields! // https://www.esri.com/library/whitepapers/pdfs/shapefile.pdf const header = { magic: headerView.getInt32(0, BIG_ENDIAN), // Length is stored as # of 2-byte words; multiply by 2 to get # of bytes length: headerView.getInt32(24, BIG_ENDIAN) * 2, version: headerView.getInt32(28, LITTLE_ENDIAN), type: headerView.getInt32(32, LITTLE_ENDIAN), bbox: { minX: headerView.getFloat64(36, LITTLE_ENDIAN), minY: headerView.getFloat64(44, LITTLE_ENDIAN), minZ: headerView.getFloat64(68, LITTLE_ENDIAN), minM: headerView.getFloat64(84, LITTLE_ENDIAN), maxX: headerView.getFloat64(52, LITTLE_ENDIAN), maxY: headerView.getFloat64(60, LITTLE_ENDIAN), maxZ: headerView.getFloat64(76, LITTLE_ENDIAN), maxM: headerView.getFloat64(92, LITTLE_ENDIAN) } }; if (header.magic !== SHP_MAGIC_NUMBER) { // eslint-disable-next-line console.error(`SHP file: bad magic number ${header.magic}`); } if (header.version !== 1000) { // eslint-disable-next-line console.error(`SHP file: bad version ${header.version}`); } return header; }