Updated GeoJSON type definitions

Updated to match RFC 7946 (https://tools.ietf.org/html/rfc7946).
* Removed coordinate reference system types due to their removal from the standard. (https://tools.ietf.org/html/rfc7946#appendix-B.1)
* Position arrays are now restricted to either two or three positions. (https://tools.ietf.org/html/rfc7946#section-3.1.1)
* Feature and feature collection types are no longer generic.
* Added support for foreign members. (https://tools.ietf.org/html/rfc7946#section-6.1)
This commit is contained in:
Jeff Jacobson
2017-11-16 15:11:39 -08:00
parent 6142dd9625
commit 89667eb5cb
2 changed files with 154 additions and 105 deletions
+54 -39
View File
@@ -1,4 +1,9 @@
let featureCollection: GeoJSON.FeatureCollection<any> = {
import {
Feature, FeatureCollection, GeometryCollection, LineString,
MultiLineString, MultiPoint, MultiPolygon, Point, Polygon
} from "geojson";
let featureCollection: FeatureCollection = {
type: "FeatureCollection",
features: [
{
@@ -34,7 +39,7 @@ let featureCollection: GeoJSON.FeatureCollection<any> = {
geometry: {
type: "Polygon",
coordinates: [
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ]
[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]]
]
},
properties: {
@@ -45,6 +50,9 @@ let featureCollection: GeoJSON.FeatureCollection<any> = {
}
}
],
// Coordinate Systems no longer supported in GeoJSON as of RFC 7946.
// This will still work due to the standard's allowance for
// "foregin members", however.
crs: {
type: "link",
properties: {
@@ -54,7 +62,7 @@ let featureCollection: GeoJSON.FeatureCollection<any> = {
}
};
let featureWithPolygon: GeoJSON.Feature<GeoJSON.Polygon> = {
const featureWithPolygon: Feature = {
type: "Feature",
bbox: [-180.0, -90.0, 180.0, 90.0],
geometry: {
@@ -66,57 +74,57 @@ let featureWithPolygon: GeoJSON.Feature<GeoJSON.Polygon> = {
properties: null
};
let point: GeoJSON.Point = {
const point: Point = {
type: "Point",
coordinates: [100.0, 0.0]
};
// This type is commonly used in the turf package
let pointCoordinates: number[] = point.coordinates;
const pointCoordinates: number[] = point.coordinates;
let lineString: GeoJSON.LineString = {
const lineString: LineString = {
type: "LineString",
coordinates: [ [100.0, 0.0], [101.0, 1.0] ]
coordinates: [[100.0, 0.0], [101.0, 1.0]]
};
let polygon: GeoJSON.Polygon = {
const polygon: Polygon = {
type: "Polygon",
coordinates: [
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ]
[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]]
]
};
let polygonWithHole: GeoJSON.Polygon = {
const polygonWithHole: Polygon = {
type: "Polygon",
coordinates: [
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ],
[ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2] ]
[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
[[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]
]
};
let multiPoint: GeoJSON.MultiPoint = {
const multiPoint: MultiPoint = {
type: "MultiPoint",
coordinates: [ [100.0, 0.0], [101.0, 1.0] ]
coordinates: [[100.0, 0.0], [101.0, 1.0]]
};
let multiLineString: GeoJSON.MultiLineString = {
const multiLineString: MultiLineString = {
type: "MultiLineString",
coordinates: [
[ [100.0, 0.0], [101.0, 1.0] ],
[ [102.0, 2.0], [103.0, 3.0] ]
[[100.0, 0.0], [101.0, 1.0]],
[[102.0, 2.0], [103.0, 3.0]]
]
};
let multiPolygon: GeoJSON.MultiPolygon = {
const multiPolygon: 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]],
[[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]]
[[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]]
]
};
let geometryCollection: GeoJSON.GeometryCollection = {
const geometryCollection: GeometryCollection = {
type: "GeometryCollection",
geometries: [
{
@@ -125,12 +133,12 @@ let geometryCollection: GeoJSON.GeometryCollection = {
},
{
type: "LineString",
coordinates: [ [101.0, 0.0], [102.0, 1.0] ]
coordinates: [[101.0, 0.0], [102.0, 1.0]]
}
]
};
let feature: GeoJSON.Feature<GeoJSON.GeometryObject> = {
let feature: Feature = {
type: "Feature",
geometry: lineString,
properties: null
@@ -172,31 +180,31 @@ featureCollection = {
{
type: "Feature",
geometry: lineString,
properties: {test: "OK"}
properties: { test: "OK" }
}, {
type: "Feature",
geometry: polygon,
properties: {test: "OK"}
properties: { test: "OK" }
}, {
type: "Feature",
geometry: polygonWithHole,
properties: {test: "OK"}
properties: { test: "OK" }
}, {
type: "Feature",
geometry: multiPoint,
properties: {test: "OK"}
properties: { test: "OK" }
}, {
type: "Feature",
geometry: multiLineString,
properties: {test: "OK"}
properties: { test: "OK" }
}, {
type: "Feature",
geometry: multiPolygon,
properties: {test: "OK"}
properties: { test: "OK" }
}, {
type: "Feature",
geometry: geometryCollection,
properties: {test: "OK"}
properties: { test: "OK" }
}
],
crs: {
@@ -209,7 +217,7 @@ featureCollection = {
};
// Allow access to custom properties
const pt: GeoJSON.Feature<GeoJSON.Point> = {
const pt: Feature = {
type: "Feature",
properties: {
foo: "bar",
@@ -221,9 +229,14 @@ const pt: GeoJSON.Feature<GeoJSON.Point> = {
coordinates: [0, 0]
}
};
pt.properties.foo;
pt.properties.hello;
pt.properties[1];
if (pt.properties) {
if (pt.properties.foo == null || pt.properties.hello == null || pt.properties[1] == null) {
throw TypeError("Properties should not be null or undefined.");
}
} else {
throw TypeError("Feature should have a 'properties' property.");
}
// Optional generic for properties
@@ -232,19 +245,21 @@ interface TestProperty {
hello: string;
}
const typedPropertiesFeature: GeoJSON.Feature<GeoJSON.Point, TestProperty> = {
const testProps: TestProperty = {
foo: "bar",
hello: "world"
};
const typedPropertiesFeature: Feature = {
type: "Feature",
properties: {
foo: "bar",
hello: "world",
},
properties: testProps,
geometry: {
type: "Point",
coordinates: [0, 0]
}
};
const typedPropertiesFeatureCollection: GeoJSON.FeatureCollection<GeoJSON.Point, TestProperty> = {
const typedPropertiesFeatureCollection: FeatureCollection = {
type: "FeatureCollection",
features: [typedPropertiesFeature]
};
+100 -66
View File
@@ -1,123 +1,157 @@
// Type definitions for GeoJSON Format Specification Revision 1.0
// Project: http://geojson.org/
// Type definitions for geojson 7946.0
// Project: https://geojson.org/
// Definitions by: Jacob Bruun <https://github.com/cobster>
// Arne Schubert <https://github.com/atd-schubert>
// Jeff Jacobson <https://github.com/JeffJacobson>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
// TypeScript Version: 2.3
// Note: as of the RFC 7946 version of GeoJSON, Coordinate Reference Systems
// are no longer supported. (See https://tools.ietf.org/html/rfc7946#appendix-B)}
export as namespace GeoJSON;
/***
* http://geojson.org/geojson-spec.html#geojson-objects
/**
* The valid values for the "type" property of GeoJSON geometry objects.
* https://tools.ietf.org/html/rfc7946#section-1.4
*/
export type GeoJsonGeometryTypeNames = "Point" | "LineString" | "MultiPoint" | "Polygon" | "MultiLineString" |
"MultiPolygon" | "GeometryCollection";
/**
* The value values for the "type" property of GeoJSON Objects.
* https://tools.ietf.org/html/rfc7946#section-1.4
*/
export type GeoJsonTypeNames = "FeatureCollection" | "Feature" | GeoJsonGeometryTypeNames;
/**
* Bounding box
* https://tools.ietf.org/html/rfc7946#section-5
*/
export type BoundingBox = [number, number, number, number] | [number, number, number, number, number];
/**
* A Position is an array of coordinates.
* https://tools.ietf.org/html/rfc7946#section-3.1.1
*/
export type Position = [number, number] | [number, number, number];
/**
* The base GeoJSON object.
* https://tools.ietf.org/html/rfc7946#section-3
*/
export interface GeoJsonObject {
type: string;
bbox?: number[];
crs?: CoordinateReferenceSystem;
/**
* Allow foreign members as specified in https://tools.ietf.org/html/rfc7946#section-6.1
*/
[key: string]: any;
/**
* Specifies the type of GeoJSON object.
*/
type: GeoJsonTypeNames;
/**
* Bounding box of the coordinate range of the object's Geometries, Features, or Feature Collections.
* https://tools.ietf.org/html/rfc7946#section-5
*/
bbox?: BoundingBox;
}
/***
* http://geojson.org/geojson-spec.html#positions
*/
export type Position = number[];
/***
* http://geojson.org/geojson-spec.html#geometry-objects
*/
export interface DirectGeometryObject extends GeoJsonObject {
coordinates: Position[][][] | Position[][] | Position[] | Position;
}
/**
* GeometryObject supports geometry collection as well
* A geometry object.
* https://tools.ietf.org/html/rfc7946#section-3
*/
export type GeometryObject = DirectGeometryObject | GeometryCollection;
export interface GeometryObject extends GeoJsonObject {
type: GeoJsonGeometryTypeNames;
}
/***
* http://geojson.org/geojson-spec.html#point
/**
* Point geometry object.
* https://tools.ietf.org/html/rfc7946#section-3.1.2
*/
export interface Point extends DirectGeometryObject {
export interface Point extends GeometryObject {
type: "Point";
coordinates: Position;
}
/***
* http://geojson.org/geojson-spec.html#multipoint
/**
* MultiPoint geometry object.
* https://tools.ietf.org/html/rfc7946#section-3.1.3
*/
export interface MultiPoint extends DirectGeometryObject {
export interface MultiPoint extends GeometryObject {
type: "MultiPoint";
coordinates: Position[];
}
/***
* http://geojson.org/geojson-spec.html#linestring
/**
* LineString geometry object.
* https://tools.ietf.org/html/rfc7946#section-3.1.4
*/
export interface LineString extends DirectGeometryObject {
export interface LineString extends GeometryObject {
type: "LineString";
coordinates: Position[];
}
/***
* http://geojson.org/geojson-spec.html#multilinestring
/**
* MultiLineString geometry object.
* https://tools.ietf.org/html/rfc7946#section-3.1.5
*/
export interface MultiLineString extends DirectGeometryObject {
export interface MultiLineString extends GeometryObject {
type: "MultiLineString";
coordinates: Position[][];
}
/***
* http://geojson.org/geojson-spec.html#polygon
/**
* Polygon geometry object.
* https://tools.ietf.org/html/rfc7946#section-3.1.6
*/
export interface Polygon extends DirectGeometryObject {
export interface Polygon extends GeometryObject {
type: "Polygon";
coordinates: Position[][];
}
/***
* http://geojson.org/geojson-spec.html#multipolygon
/**
* MultiPolygon geometry object.
* https://tools.ietf.org/html/rfc7946#section-3.1.7
*/
export interface MultiPolygon extends DirectGeometryObject {
export interface MultiPolygon extends GeometryObject {
type: "MultiPolygon";
coordinates: Position[][][];
}
/***
* http://geojson.org/geojson-spec.html#geometry-collection
/**
* Geometry Collection
* https://tools.ietf.org/html/rfc7946#section-3.1.8
*/
export interface GeometryCollection extends GeoJsonObject {
export interface GeometryCollection extends GeometryObject {
type: "GeometryCollection";
geometries: GeometryObject[];
}
/***
/**
* A feature object which contains a geometry and associated properties.
* https://tools.ietf.org/html/rfc7946#section-3.2
*/
export interface Feature<G extends GeometryObject, P = any> extends GeoJsonObject {
export interface Feature extends GeoJsonObject {
type: "Feature";
geometry: G;
properties: P;
/**
* The feature's geometry
*/
geometry: GeometryObject | null;
/**
* A value that uniquely identifies this feature in a
* https://tools.ietf.org/html/rfc7946#section-3.2.
*/
id?: string | number;
/**
* Properties associated with this feature.
*/
properties: { [name: string]: any; } | null;
}
/***
* http://geojson.org/geojson-spec.html#feature-collection-objects
/**
* A collection of feature objects.
* https://tools.ietf.org/html/rfc7946#section-3.3
*/
export interface FeatureCollection<G extends GeometryObject, P = any> extends GeoJsonObject {
type: "FeatureCollection";
features: Array<Feature<G, P>>;
}
/***
* http://geojson.org/geojson-spec.html#coordinate-reference-system-objects
*/
export interface CoordinateReferenceSystem {
type: string;
properties: any;
}
export interface NamedCoordinateReferenceSystem extends CoordinateReferenceSystem {
properties: { name: string };
}
export interface LinkedCoordinateReferenceSystem extends CoordinateReferenceSystem {
properties: { href: string; type: string };
export interface FeatureCollection extends GeoJsonObject {
features: Feature[];
}