| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 | "use strict";Object.defineProperty(exports, "__esModule", { value: true });var meta_1 = require("@turf/meta");// Note: change RADIUS => earthRadiusvar 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;}
 |