shp.ts 🗺️
TypeScript package for loading Esri Shapefiles, primary developed for for WebGL applications
- ✅ returns a geojson-like representation
- ✅ supports all shape types (including MultiPatch) per Esri Shapefile specification
- ✅ supports X, Y, Z, and M coordinates
- ✅ uses vitest 🧪 for testing
- ✅ includes mapbox's earcut triangulation
Install from npm
npm install shpts
Branch | |
---|
Release |  |
Dev |  |
Usage
import { FeatureReader } from 'shpts';
const shp = 'testdata/featureclass.shp';
const shx = 'testdata/featureclass.shx';
const dbf = 'testdata/featureclass.dbf';
const cpg = 'testdata/featureclass.cpg';
const reader = await FeatureReader.fromFiles(shp, shx, dbf, cpg);
const features = await reader.readFeatureCollection();
const geojson = features.toGeoJson();
or you can read only the geoemtry:
import { ShapeReader } from 'shpts';
const shp = 'testdata/featureclass.shp';
const shx = 'testdata/featureclass.shx';
const reader = await ShapeReader.fromFiles(shp, shx);
const index = 0;
const shape = reader.readGeom(index);
const geojson = shape.toGeoJson();
or you can read only the properties:
import { DbfReader } from 'shpts';
const dbf = 'testdata/featureclass.dbf';
const cpg = 'testdata/featureclass.cpg';
const reader = await DbfReader.fromFiles(dbf, cpg);
const index = 0;
const properties = reader.readRecord(index);
console.log(properties);
triangulate a polygon (expects a set of rings, where the first one is the outer ring and the rest are holes):
import { triangulate, Ring } from 'shpts';
const input: Ring[] = [
[
[0, 0],
[1, 0],
[1, 1],
[0, 1],
],
];
const output = triangulate(input, CoordType.XY);
Credits