Terraformer Core

March 8, 2021 ยท View on GitHub

Terraformer.Primitive

Terraformer Primitives are JavaScript objects that map directly to their GeoJSON couterparts. Converting a GeoJSON object into a Terraformer Primitive will allow you use convenience methods like point.within(polygon).

Every Primitive inherits from the Terraformer.Primitive base class, thus all other Primitives share the Terraformer.Primitive methods.

There is a Primitive for every type of GeoJSON object, plus a Circle Primitive which represents a circle as a polygon.

Constructor

You create a new Terraformer.Primitive object by passing it a valid GeoJSON Object. This will return a Terraformer.Primitive with the same type as your GeoJSON object.

var point = new Terraformer.Primitive({
  type: "Point",
  coordinates: [1, 2],
});

point instanceof Terraformer.Point; //-> true
point instanceof Terraformer.Primitive; //-> true

point.within(polygon); //-> true or false

Methods

MethodReturnsDescription
toMercator()thisConverts this GeoJSON object's coordinates to the web mercator spatial reference.
toGeographic()thisConverts this GeoJSON object's coordinates to geographic coordinates.
envelope()EnvelopeReturns an object with x, y, w and h suitable for passing to most indexes.
bbox()BBoxReturns the GeoJSON Bounding Box for this primitive.
convexHull()Polygon or nullReturns the convex hull of this primitive as a Polygon. Will return null if the convex hull cannot be calculated or a valid Polygon cannot be created.
contains(<Geometry> geometry)BooleanReturns true if the passed GeoJSON Geometry object is completely contained inside this primitive.
within(<Geometry> geometry)BooleanReturns true if the passed GeoJSON Geometry object is completely within this primitive.
intersects(<Geometry> geometry)BooleanReturns true if the passed GeoJSON Geometry intersects this primitive.

Terraformer.Point

A JavaScript object representing a GeoJSON Point.

Constructor

Terraformer.Point can be created by passing a GeoJSON Coordinate Pair like [longitude, latitude], with plain x,y, or a valid GeoJSON Point.

var point1 = new Terraformer.Point({
  type: "Point",
  coordinates: [1, 2],
});

var point2 = new Terraformer.Point(1, 2);

var point3 = new Terraformer.Point([1, 2]);

Terraformer.MultiPoint

A JavaScript object representing a GeoJSON MultiPoint.

Constructor

Terraformer.MultiPoint can be created by passing in a valid GeoJSON MultiPoint, or an array of GeoJSON Coordinates.

var multipoint1 = new Terraformer.MultiPoint({
  type: "MultiPoint",
  coordinates: [
    [1, 2],
    [2, 1],
  ],
});

var multipoint2 = new Terraformer.MultiPoint([
  [1, 2],
  [2, 1],
]);

Methods

MethodReturnsDescription
forEach(<Function> function)nullIterates over each point. Equivalent to multipoint.coordinates.forEach(function). The function will be called with point, index and coordinates.
get(<Integer> index)PointReturns a Terraformer.Point for the point at index in the coordinate array.
addPoint(<Coordinate> coordinate)thisAdds a new coordinate to the end of the coordinate array. Equivalent to multipoint.coordinates.push([3,4]).
insertPoint(<Coordinate> coordinate, index)thisInserts the passed point at the passed index. Equivalent to multipoint.coordinates.splice(index, 0, point)
removePoint(<Integer> index or <Coordinate> coordinate)thisRemoves the point at index or the passed Coordinate depending on the type of object passed in.

Terraformer.LineString

A JavaScript object representing a GeoJSON LineString.

Constructor

Terraformer.LineString can be created by passing in a valid GeoJSON LineString, or an array of GeoJSON Coordinates like [longitude, latitude].

var linestring = new Terraformer.LineString({
  type: "LineString",
  coordinates: [
    [1, 2],
    [2, 1],
  ],
});

var linestring = new Terraformer.LineString([
  [1, 2],
  [2, 1],
]);

Methods

MethodReturnsDescription
addVertex(<Coordinate> coordinate)thisAdds a new coordinate to the end of the coordinate array. Equivalent to linestring.coordinates.push([3,4]).
insertVertex(<Coordinate> coordinate, <Integer> index)thisInserts the passed coordinate at the passed index. Equivalent to linestring.coordinates.splice(index, 0, point)
removeVertex(<Integer> index)thisRemoves the coordinate at index. Equivalent to calling linestring.coordinates.splice(remove, 1)

Terraformer.MultiLineString

A JavaScript object representing a GeoJSON MultiLineString.

Constructor

Terraformer.LineString can be created by passing in a valid GeoJSON MultiLineString, or a GeoJSON MultiLineString coordinate array.

var multilinestring = new Terraformer.MultiLineString({
  type: "LineString",
  coordinates: [
    [1, 2],
    [2, 1],
  ],
});

var multilinestring = new Terraformer.MultiLineString([
  [
    [1, 1],
    [2, 2],
    [3, 4],
  ],
  [
    [0, 1],
    [0, 2],
    [0, 3],
  ],
]);

Methods

MethodReturnsDescription
forEach(<Function> function)nullIterates over each LineString. Equivalent to multilinestring.coordinates.forEach(function). The function will be called with linestring, index and coordinates.
get(<Integer> index)LineStringReturns a Terraformer.LineString for the LineString at index in the coordinates array.

Terraformer.Polygon

A JavaScript object representing a GeoJSON Polygon.

Constructor

Terraformer.Polygon can be created by passing in a valid GeoJSON Polygon, or GeoJSON Polygon coordinate array.

var polygon1 = new Terraformer.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],
    ],
  ],
});

var polygon2 = new Terraformer.Polygon([
  [
    [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],
  ],
]);

Methods

MethodReturnsDescription
addVertex(<Coordinate> coordinate)thisAdds a new coordinate just before the closing coordinate of the linear ring.
insertVertex(<Coordinate> coordinate, index)thisInserts the passed coordinate at the passed index. Equivalent to polygon.coordinates.splice(index, 0, point)
removeVertex(<Integer> index)thisRemoves the coordinate at index. Equivalent to calling polygon.coordinates.splice(remove, 1)
close()thisEnsures that the first and last vertex of the polygon are equal to each other.
hasHoles()BooleanTrue if this polygon has holes.
holes()Array <Polygon>Returns an Array of Polygon objects made from each hole in this polygon.

Terraformer.MultiPolygon

A JavaScript object representing a GeoJSON MultiPolygon.

Constructor

Terraformer.MultiPolygon can be created by passing in a valid GeoJSON MultiPolygon, or an array that is a valid coordinate array for GeoJSON MultiPolygon.

var multipolygon1 = new Terraformer.MultiPolygon({
  type: "MultiPolygon",
  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],
      ],
    ],
  ],
});

var multipolygon2 = new Terraformer.MultiPolygon([
  [
    [
      [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],
    ],
  ],
]);

Methods

MethodReturnsDescription
forEach(<Function> function)nullIterates over each LineString. Equivalent to multipolygon.coordinates.forEach(function). The function will be called with polygon, index and coordinates.
get(<Integer> index)PolygonReturns a Terraformer.Polygon for the Polygon at index in the coordinate array.

Terraformer.Feature

A JavaScript object representing a GeoJSON Feature.

Constructor

Terraformer.Feature can be created by passing in a valid GeoJSON Feature or GeoJSON Geometry.

var feature1 = new Terraformer.Feature({
  type: "Feature",
  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.2, 0.2],
        [100.8, 0.2],
        [100.8, 0.8],
        [100.2, 0.8],
        [100.2, 0.2],
      ],
    ],
  },
});

var feature2 = new Terraformer.Feature({
  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],
    ],
  ],
});

Terraformer.FeatureCollection

A JavaScript object representing a GeoJSON FeatureCollection.

Constructor

Terraformer.FeatureCollection can be created by passing a valid GeoJSON Feature Collection or an array of GeoJSON Features.

var featurecollection1 = new Terraformer.FeatureCollection(
  "type": "FeatureCollection",
  "features": [feature1, feature2]
});

var featurecollection2 = new Terraformer.FeatureCollection([feature1, feature2]);

Methods

MethodReturnsDescription
forEach(<Function> function)nullIterates over each Feature. Equivalent to featurecollection.features.forEach(function). The function will be called with feature, index and coordinates.
get(<Integer> index)FeatureReturns a Terraformer.Feature for the Feature at index in the features array.

Terraformer.GeometryCollection

A JavaScript object representing a GeoJSON Geometry Collection.

Constructor

Terraformer.GeometryCollection can be created by passing a valid GeoJSON Geometry Collection or an array of GeoJSON Geometries.

var geometrycollection1 = new Terraformer.GeometryCollection(
  "type": "FeatureCollection",
  "features": [geometry1, geometry2]
});

var geometrycollection2 = new Terraformer.GeometryCollection([geometry1, geometry2]);

Methods

MethodReturnsDescription
forEach(<Function> function)nullIterates over each LineString. Equivalent to geometrycollection.coordinates.forEach(function). The function will be called with geometry, index and coordinates.
get(<Integer> index)PrimitiveReturns a Terraformer.Primitive for the Geometry at index in the coordinate array.

Terraformer.Circle

The GeoJSON spec does not provide a way to visualize circles. Terraformer.Circle is actual a GeoJSON Feature object that contains a Polygon representing a circle with a certain number of sides.

Constructor

Terraformer.Circle is created with a center, radius, and steps.

OptionTypeDefaultDescription
centerCoordinatenullRequired A GeoJSON Coordinate in [x,y] format.
radiusInteger250The radius of the circle in meters.
stepsInteger32How many steps will be used to create the polygon that represents the circle.
circle = new Terraformer.Circle([-122.27, 45.65], 500, 64);

circle.contains(point);

Methods

MethodReturnsDescription
recalculate()thisRecalculates the circle
steps(<Integer optional> steps)IntegerReturns the number of steps to produce the polygon representing the circle. If the steps parameter is passed the circle will be recalculated witht he new step count before returning.
radius(<Integer optional> radius)IntegerReturns the radius circle. If the radius parameter is passed the circle will be recalculated witht he new radius before returning.
center(<Coordinate optional> center)CoordinatesReturns the center of the circle. If the center parameter is passed the circle will be recalculated with the new center before returning.

Terraformer.Tools

Terraformer also has numerous helper methods for working with GeoJSON and geographic data. These tools work with a mix of lower level GeoJSON constructs like Coordinates, Coordinate Arrays and GeoJSON objects and Terraformer Primitives

Spatial Reference Conversions

MethodReturnsDescription
toMercator(<GeoJSON> geojson)GeoJSONConverts this GeoJSON object's coordinates to the web mercator spatial reference. This is an in-place modification of the passed object.
toGeographic(<GeoJSON> geojson)GeoJSONConverts this GeoJSON object's coordinates to geographic coordinates. This is an in-place modification of the passed object.
applyConverter(<GeoJSON> geojson), function)GeoJSONRuns the passed functionagainst every Coordinate in the geojson object. Your function will be passed a Coordinate and will be expected to return a Coordinate.
positionToMercator(<Coordinate> coordinate)CoordinateConverts the passed Coordinate to web mercator spatial reference.
positionToGeographic(<Coordinate> coordinate)CoordinateConverts the passed Coordinate to geographic coordinates.

Calculations

MethodReturnsDescription
calculateBounds(<GeoJSON> geojson)BBoxReturns a GeoJSON bounding box for the passed geoJSON.
calculateEnvelope(<GeoJSON> geojson)EnvelopeReturns an object with x, y, w, h. Suitable for passing to most indexes.
convexHull(<GeoJSON> geojson)CoordinatesReturns an array of coordinates representing the convex hull the the passed geoJSON.

Comparisons

MethodReturnsDescription
coordinatesContainPoint(<[Coordinates]> coordinates, <Coordinate> coordinate)BooleanAccepts an array of coordinates and a coordinate and returns true if the point falls within the coordinate array.
polygonContainsPoint(<Polygon> polygon, <Coordinate> coordinate)BooleanAccepts the geometry of a polygon and a coordinate and returns true if the point falls within the polygon.
arrayIntersectsArray(<[Coordinates]> coordinates, <[Coordinates]> coordinates)BooleanAccepts two arrays of coordinates and returns true if they cross each other at any point.
coordinatesEqual(<Coordinate> coordinate, <Coordinate> coordinate)BooleanAccepts two individual coordinate pairs and returns true if the passed coordinate pairs are equal to each other.
var pt = [0, 0];
var pt2 = [-111.873779, 40.647303];

var polygon = {
  type: "Polygon",
  coordinates: [
    [
      [-112.074279, 40.52215],
      [-112.074279, 40.853293],
      [-111.610107, 40.853293],
      [-111.610107, 40.52215],
      [-112.074279, 40.52215],
    ],
  ],
};

var polygonGeometry = polygon.coordinates;

Terraformer.Tools.polygonContainsPoint(polygonGeometry, pt);
// returns false
Terraformer.Tools.polygonContainsPoint(polygonGeometry, pt2);
// returns true