Effect Schema for GeoJSON types - comprehensive validation and parsing library
npm install effect-schema-geojson


A comprehensive Effect Schema library for validating and parsing GeoJSON data types according to RFC 7946.
``bash`
npm install effect-schema-geojson effector
pnpm add effect-schema-geojson effector
yarn add effect-schema-geojson effect
> Note: This library requires effect as a peer dependency.
- ✅ Complete GeoJSON specification support (RFC 7946)
- ✅ All geometry types: Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon, GeometryCollection
- ✅ Feature and FeatureCollection support
- ✅ Bounding box validation
- ✅ LinearRing closure validation (first and last positions must match)
- ✅ Type-safe parsing and validation
- ✅ Built with Effect Schema for powerful composition and error handling
`typescript
import { Effect, Schema } from "effect";
import { parseGeoJSON, isValidGeoJSON, Point } from "effect-schema-geojson";
// Validate any GeoJSON object
const someData = {
type: "Point",
coordinates: [102.0, 0.5]
};
// Type guard validation
if (isValidGeoJSON(someData)) {
console.log("Valid GeoJSON!", someData);
}
// Effect-based parsing with detailed error handling
const parseResult = await Effect.runPromise(parseGeoJSON(someData));
console.log("Parsed GeoJSON:", parseResult);
// Create a Point schema directly
const pointData = {
type: "Point",
coordinates: [102.0, 0.5]
};
const pointResult = await Effect.runPromise(
Schema.decodeUnknown(Point)(pointData)
);
`
#### Point
`typescript
import { Point, parsePoint } from "effect-schema-geojson";
const point = {
type: "Point",
coordinates: [102.0, 0.5]
};
const result = await Effect.runPromise(parsePoint(point));
`
#### MultiPoint
`typescript
import { MultiPoint } from "effect-schema-geojson";
const multiPoint = {
type: "MultiPoint",
coordinates: [
[102.0, 0.5],
[103.0, 1.0]
]
};
`
#### LineString
`typescript
import { LineString } from "effect-schema-geojson";
const lineString = {
type: "LineString",
coordinates: [
[102.0, 0.0],
[103.0, 1.0],
[104.0, 0.0],
[105.0, 1.0]
]
};
`
#### MultiLineString
`typescript
import { MultiLineString } from "effect-schema-geojson";
const multiLineString = {
type: "MultiLineString",
coordinates: [
[
[102.0, 0.0],
[103.0, 1.0]
],
[
[104.0, 0.0],
[105.0, 1.0]
]
]
};
`
#### Polygon
`typescript
import { Polygon } from "effect-schema-geojson";
const polygon = {
type: "Polygon",
coordinates: [
[
[100.0, 0.0],
[101.0, 0.0],
[101.0, 1.0],
[100.0, 1.0],
[100.0, 0.0]
]
]
};
`
#### MultiPolygon
`typescript
import { MultiPolygon } from "effect-schema-geojson";
const multiPolygon = {
type: "MultiPolygon",
coordinates: [
[
[
[102.0, 2.0],
[103.0, 2.0],
[103.0, 3.0],
[102.0, 3.0],
[102.0, 2.0]
]
],
[
[
[100.0, 0.0],
[101.0, 0.0],
[101.0, 1.0],
[100.0, 1.0],
[100.0, 0.0]
]
]
]
};
`
#### GeometryCollection
`typescript
import { GeometryCollection } from "effect-schema-geojson";
const geometryCollection = {
type: "GeometryCollection",
geometries: [
{
type: "Point",
coordinates: [102.0, 0.5]
},
{
type: "LineString",
coordinates: [
[102.0, 0.0],
[103.0, 1.0]
]
}
]
};
`
#### Feature
`typescript
import { Feature } from "effect-schema-geojson";
const feature = {
type: "Feature",
geometry: {
type: "Point",
coordinates: [102.0, 0.5]
},
properties: {
name: "Sample Point",
category: "landmark"
},
id: "point-001"
};
`
#### FeatureCollection
`typescript
import { FeatureCollection } from "effect-schema-geojson";
const featureCollection = {
type: "FeatureCollection",
features: [
{
type: "Feature",
geometry: {
type: "Point",
coordinates: [102.0, 0.5]
},
properties: {
name: "Point 1"
}
},
{
type: "Feature",
geometry: {
type: "Point",
coordinates: [103.0, 1.5]
},
properties: {
name: "Point 2"
}
}
]
};
`
#### Parsing Functions
All parsing functions return Effect for robust error handling:
- parseGeoJSON(input: unknown) - Parse any GeoJSON objectparseGeometry(input: unknown)
- - Parse any geometryparseFeature(input: unknown)
- - Parse a featureparseFeatureCollection(input: unknown)
- - Parse a feature collectionparseGeometryCollection(input: unknown)
- - Parse a geometry collectionparsePoint(input: unknown)
- - Parse a point geometryparseMultiPoint(input: unknown)
- - Parse a multipoint geometryparseLineString(input: unknown)
- - Parse a linestring geometryparseMultiLineString(input: unknown)
- - Parse a multilinestring geometryparsePolygon(input: unknown)
- - Parse a polygon geometryparseMultiPolygon(input: unknown)
- - Parse a multipolygon geometry
#### Validation Functions
Type guard functions that return boolean:
- isValidGeoJSON(input: unknown) - Check if input is valid GeoJSONisValidGeometry(input: unknown)
- - Check if input is valid geometryisValidFeature(input: unknown)
- - Check if input is valid featureisValidFeatureCollection(input: unknown)
- - Check if input is valid feature collectionisValidGeometryCollection(input: unknown)
- - Check if input is valid geometry collectionisValidPoint(input: unknown)
- - Check if input is valid pointisValidMultiPoint(input: unknown)
- - Check if input is valid multipointisValidLineString(input: unknown)
- - Check if input is valid linestringisValidMultiLineString(input: unknown)
- - Check if input is valid multilinestringisValidPolygon(input: unknown)
- - Check if input is valid polygonisValidMultiPolygon(input: unknown)
- - Check if input is valid multipolygon
#### Encoding Functions
For serialization back to unknown/JSON:
- encodeGeoJSON(input: GeoJSON) - Encode GeoJSON to unknownencodeGeometry(input: Geometry)
- - Encode geometry to unknownencodeFeature(input: Feature)
- - Encode feature to unknownencodeFeatureCollection(input: FeatureCollection)
- - Encode feature collection to unknownencodeGeometryCollection(input: GeometryCollection)
- - Encode geometry collection to unknownencodePoint(input: Point)
- - Encode point to unknownencodeMultiPoint(input: MultiPoint)
- - Encode multipoint to unknownencodeLineString(input: LineString)
- - Encode linestring to unknownencodeMultiLineString(input: MultiLineString)
- - Encode multilinestring to unknownencodePolygon(input: Polygon)
- - Encode polygon to unknownencodeMultiPolygon(input: MultiPolygon)
- - Encode multipolygon to unknown
`typescript
import { Effect } from "effect";
import { parseGeoJSON } from "effect-schema-geojson";
const invalidData = { type: "InvalidType" };
const program = parseGeoJSON(invalidData).pipe(
Effect.catchAll((error) => {
console.error("Parsing failed:", error);
return Effect.succeed(null);
})
);
const result = await Effect.runPromise(program);
`
Since this library is built on Effect Schema, you can compose these schemas with other Effect Schema types and take advantage of all Effect Schema features like transformations, refinements, and more detailed error handling.
`typescript
import { Schema } from "effect";
import { Point } from "effect-schema-geojson";
// Compose with other schemas
const LocationData = Schema.Struct({
id: Schema.String,
name: Schema.String,
coordinates: Point,
metadata: Schema.Record({ key: Schema.String, value: Schema.Unknown })
});
`
All geometry types support optional bounding boxes:
`typescript`
const pointWithBbox = {
type: "Point",
coordinates: [102.0, 0.5],
bbox: [102.0, 0.5, 102.0, 0.5] // [west, south, east, north]
};
The library exports TypeScript types for all GeoJSON objects:
`typescript`
import type {
GeoJSON,
Geometry,
BasicGeometry,
Point,
MultiPoint,
LineString,
MultiLineString,
Polygon,
MultiPolygon,
GeometryCollection,
Feature,
FeatureCollection,
Position,
BoundingBox,
LinearRing
} from "effect-schema-geojson";
This library is built on Effect Schema, which means you can compose these schemas with other Effect Schema types:
`typescript
import { Schema } from "effect";
import { Point } from "effect-schema-geojson";
const MyDataSchema = Schema.Struct({
id: Schema.String,
location: Point,
metadata: Schema.Record({ key: Schema.String, value: Schema.String })
});
``
Contributions are welcome! Please feel free to submit issues and pull requests on GitHub.
MIT License - see LICENSE file for details.
- Effect - The Effect ecosystem
- GeoJSON Specification (RFC 7946)
- @types/geojson - TypeScript definitions for GeoJSON