118 lines
3.3 KiB
JavaScript
Executable File
118 lines
3.3 KiB
JavaScript
Executable File
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
var meta_1 = require("@turf/meta");
|
|
// Note: change RADIUS => earthRadius
|
|
var RADIUS = 6378137;
|
|
/**
|
|
* Takes one or more features and returns their area in square meters.
|
|
*
|
|
* @name area
|
|
* @param {GeoJSON} geojson input GeoJSON feature(s)
|
|
* @returns {number} area in square meters
|
|
* @example
|
|
* var polygon = turf.polygon([[[125, -15], [113, -22], [154, -27], [144, -15], [125, -15]]]);
|
|
*
|
|
* var area = turf.area(polygon);
|
|
*
|
|
* //addToMap
|
|
* var addToMap = [polygon]
|
|
* polygon.properties.area = area
|
|
*/
|
|
function area(geojson) {
|
|
return meta_1.geomReduce(geojson, function (value, geom) {
|
|
return value + calculateArea(geom);
|
|
}, 0);
|
|
}
|
|
exports.default = area;
|
|
/**
|
|
* Calculate Area
|
|
*
|
|
* @private
|
|
* @param {Geometry} geom GeoJSON Geometries
|
|
* @returns {number} area
|
|
*/
|
|
function calculateArea(geom) {
|
|
var total = 0;
|
|
var i;
|
|
switch (geom.type) {
|
|
case "Polygon":
|
|
return polygonArea(geom.coordinates);
|
|
case "MultiPolygon":
|
|
for (i = 0; i < geom.coordinates.length; i++) {
|
|
total += polygonArea(geom.coordinates[i]);
|
|
}
|
|
return total;
|
|
case "Point":
|
|
case "MultiPoint":
|
|
case "LineString":
|
|
case "MultiLineString":
|
|
return 0;
|
|
}
|
|
return 0;
|
|
}
|
|
function polygonArea(coords) {
|
|
var total = 0;
|
|
if (coords && coords.length > 0) {
|
|
total += Math.abs(ringArea(coords[0]));
|
|
for (var i = 1; i < coords.length; i++) {
|
|
total -= Math.abs(ringArea(coords[i]));
|
|
}
|
|
}
|
|
return total;
|
|
}
|
|
/**
|
|
* @private
|
|
* Calculate the approximate area of the polygon were it projected onto the earth.
|
|
* Note that this area will be positive if ring is oriented clockwise, otherwise it will be negative.
|
|
*
|
|
* Reference:
|
|
* Robert. G. Chamberlain and William H. Duquette, "Some Algorithms for Polygons on a Sphere",
|
|
* JPL Publication 07-03, Jet Propulsion
|
|
* Laboratory, Pasadena, CA, June 2007 https://trs.jpl.nasa.gov/handle/2014/40409
|
|
*
|
|
* @param {Array<Array<number>>} coords Ring Coordinates
|
|
* @returns {number} The approximate signed geodesic area of the polygon in square meters.
|
|
*/
|
|
function ringArea(coords) {
|
|
var p1;
|
|
var p2;
|
|
var p3;
|
|
var lowerIndex;
|
|
var middleIndex;
|
|
var upperIndex;
|
|
var i;
|
|
var total = 0;
|
|
var coordsLength = coords.length;
|
|
if (coordsLength > 2) {
|
|
for (i = 0; i < coordsLength; i++) {
|
|
if (i === coordsLength - 2) {
|
|
// i = N-2
|
|
lowerIndex = coordsLength - 2;
|
|
middleIndex = coordsLength - 1;
|
|
upperIndex = 0;
|
|
}
|
|
else if (i === coordsLength - 1) {
|
|
// i = N-1
|
|
lowerIndex = coordsLength - 1;
|
|
middleIndex = 0;
|
|
upperIndex = 1;
|
|
}
|
|
else {
|
|
// i = 0 to N-3
|
|
lowerIndex = i;
|
|
middleIndex = i + 1;
|
|
upperIndex = i + 2;
|
|
}
|
|
p1 = coords[lowerIndex];
|
|
p2 = coords[middleIndex];
|
|
p3 = coords[upperIndex];
|
|
total += (rad(p3[0]) - rad(p1[0])) * Math.sin(rad(p2[1]));
|
|
}
|
|
total = (total * RADIUS * RADIUS) / 2;
|
|
}
|
|
return total;
|
|
}
|
|
function rad(num) {
|
|
return (num * Math.PI) / 180;
|
|
}
|