diff --git a/index.js b/index.js index 4aba334..0e310fb 100644 --- a/index.js +++ b/index.js @@ -1,40 +1,51 @@ -var wgs84 = require('wgs84'); +'use strict'; + +const wgs84 = require('wgs84'); module.exports.geometry = geometry; module.exports.ring = ringArea; - function geometry(_) { - var area = 0, i; - switch (_.type) { - case 'Polygon': - return polygonArea(_.coordinates); - case 'MultiPolygon': - for (i = 0; i < _.coordinates.length; i++) { - area += polygonArea(_.coordinates[i]); - } - return area; - case 'Point': - case 'MultiPoint': - case 'LineString': - case 'MultiLineString': - return 0; - case 'GeometryCollection': - for (i = 0; i < _.geometries.length; i++) { - area += geometry(_.geometries[i]); - } - return area; - } + let area = 0, + i; + switch (_.type) { + case 'Polygon': + return polygonArea(_.coordinates); + case 'MultiPolygon': + for (i = 0; i < _.coordinates.length; i++) { + area += polygonArea(_.coordinates[i]); + } + return area; + case 'Point': + case 'MultiPoint': + case 'LineString': + case 'MultiLineString': + return 0; + case 'GeometryCollection': + for (i = 0; i < _.geometries.length; i++) { + area += geometry(_.geometries[i]); + } + return area; + case 'Feature': + return geometry(_.geometry); + case 'FeatureCollection': + for (i = 0; i < _.features.length; i++) { + area += geometry(_.features[i]); + } + return area; + default: + return 0; + } } function polygonArea(coords) { - var area = 0; - if (coords && coords.length > 0) { - area += Math.abs(ringArea(coords[0])); - for (var i = 1; i < coords.length; i++) { - area -= Math.abs(ringArea(coords[i])); - } + let area = 0; + if (coords && coords.length > 0) { + area += Math.abs(ringArea(coords[0])); + for (let i = 1; i < coords.length; i++) { + area -= Math.abs(ringArea(coords[i])); } - return area; + } + return area; } /** @@ -53,37 +64,46 @@ function polygonArea(coords) { */ function ringArea(coords) { - var p1, p2, p3, lowerIndex, middleIndex, upperIndex, i, - area = 0, - coordsLength = coords.length; + let p1, + p2, + p3, + lowerIndex, + middleIndex, + upperIndex, + i, + area = 0; + const 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]; - area += ( rad(p3[0]) - rad(p1[0]) ) * Math.sin( rad(p2[1])); - } - - area = area * wgs84.RADIUS * wgs84.RADIUS / 2; + 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]; + area += (rad(p3[0]) - rad(p1[0])) * Math.sin(rad(p2[1])); } - return area; + area = (area * wgs84.RADIUS * wgs84.RADIUS) / 2; + } + + return area; } function rad(_) { - return _ * Math.PI / 180; -} \ No newline at end of file + return (_ * Math.PI) / 180; +}