123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- "use strict";
- var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- var invariant_1 = require("@turf/invariant");
- var meta_1 = require("@turf/meta");
- var point_to_line_distance_1 = __importDefault(require("@turf/point-to-line-distance"));
- var object_assign_1 = __importDefault(require("object-assign"));
- /**
- * Returns the closest {@link Point|point}, of a {@link FeatureCollection|collection} of points,
- * to a {@link LineString|line}. The returned point has a `dist` property indicating its distance to the line.
- *
- * @name nearestPointToLine
- * @param {FeatureCollection|GeometryCollection<Point>} points Point Collection
- * @param {Feature|Geometry<LineString>} line Line Feature
- * @param {Object} [options] Optional parameters
- * @param {string} [options.units='kilometers'] unit of the output distance property
- * (eg: degrees, radians, miles, or kilometers)
- * @param {Object} [options.properties={}] Translate Properties to Point
- * @returns {Feature<Point>} the closest point
- * @example
- * var pt1 = turf.point([0, 0]);
- * var pt2 = turf.point([0.5, 0.5]);
- * var points = turf.featureCollection([pt1, pt2]);
- * var line = turf.lineString([[1,1], [-1,1]]);
- *
- * var nearest = turf.nearestPointToLine(points, line);
- *
- * //addToMap
- * var addToMap = [nearest, line];
- */
- function nearestPointToLine(points, line, options) {
- if (options === void 0) { options = {}; }
- var units = options.units;
- var properties = options.properties || {};
- // validation
- var pts = normalize(points);
- if (!pts.features.length) {
- throw new Error("points must contain features");
- }
- if (!line) {
- throw new Error("line is required");
- }
- if (invariant_1.getType(line) !== "LineString") {
- throw new Error("line must be a LineString");
- }
- var dist = Infinity;
- var pt = null;
- meta_1.featureEach(pts, function (point) {
- var d = point_to_line_distance_1.default(point, line, { units: units });
- if (d < dist) {
- dist = d;
- pt = point;
- }
- });
- /**
- * Translate Properties to final Point, priorities:
- * 1. options.properties
- * 2. inherent Point properties
- * 3. dist custom properties created by NearestPointToLine
- */
- if (pt) {
- pt.properties = object_assign_1.default({ dist: dist }, pt.properties, properties);
- }
- // if (pt) { pt.properties = objectAssign({dist}, pt.properties, properties); }
- return pt;
- }
- /**
- * Convert Collection to FeatureCollection
- *
- * @private
- * @param {FeatureCollection|GeometryCollection} points Points
- * @returns {FeatureCollection<Point>} points
- */
- function normalize(points) {
- var features = [];
- var type = points.geometry ? points.geometry.type : points.type;
- switch (type) {
- case "GeometryCollection":
- meta_1.geomEach(points, function (geom) {
- if (geom.type === "Point") {
- features.push({ type: "Feature", properties: {}, geometry: geom });
- }
- });
- return { type: "FeatureCollection", features: features };
- case "FeatureCollection":
- points.features = points.features.filter(function (feature) {
- return feature.geometry.type === "Point";
- });
- return points;
- default:
- throw new Error("points must be a Point Collection");
- }
- }
- exports.default = nearestPointToLine;
|