index.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import clone from "@turf/clone";
  2. import distance from "@turf/distance";
  3. import { featureEach } from "@turf/meta";
  4. /**
  5. * Takes a reference {@link Point|point} and a FeatureCollection of Features
  6. * with Point geometries and returns the
  7. * point from the FeatureCollection closest to the reference. This calculation
  8. * is geodesic.
  9. *
  10. * @name nearestPoint
  11. * @param {Coord} targetPoint the reference point
  12. * @param {FeatureCollection<Point>} points against input point set
  13. * @returns {Feature<Point>} the closest point in the set to the reference point
  14. * @example
  15. * var targetPoint = turf.point([28.965797, 41.010086], {"marker-color": "#0F0"});
  16. * var points = turf.featureCollection([
  17. * turf.point([28.973865, 41.011122]),
  18. * turf.point([28.948459, 41.024204]),
  19. * turf.point([28.938674, 41.013324])
  20. * ]);
  21. *
  22. * var nearest = turf.nearestPoint(targetPoint, points);
  23. *
  24. * //addToMap
  25. * var addToMap = [targetPoint, points, nearest];
  26. * nearest.properties['marker-color'] = '#F00';
  27. */
  28. function nearestPoint(targetPoint, points) {
  29. // Input validation
  30. if (!targetPoint)
  31. throw new Error("targetPoint is required");
  32. if (!points)
  33. throw new Error("points is required");
  34. var nearest;
  35. var minDist = Infinity;
  36. var bestFeatureIndex = 0;
  37. featureEach(points, function (pt, featureIndex) {
  38. var distanceToPoint = distance(targetPoint, pt);
  39. if (distanceToPoint < minDist) {
  40. bestFeatureIndex = featureIndex;
  41. minDist = distanceToPoint;
  42. }
  43. });
  44. nearest = clone(points.features[bestFeatureIndex]);
  45. nearest.properties.featureIndex = bestFeatureIndex;
  46. nearest.properties.distanceToPoint = minDist;
  47. return nearest;
  48. }
  49. export default nearestPoint;