contains.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import {default as polygonContains} from "./polygonContains";
  2. import {default as distance} from "./distance";
  3. import {epsilon, radians} from "./math";
  4. var containsObjectType = {
  5. Feature: function(object, point) {
  6. return containsGeometry(object.geometry, point);
  7. },
  8. FeatureCollection: function(object, point) {
  9. var features = object.features, i = -1, n = features.length;
  10. while (++i < n) if (containsGeometry(features[i].geometry, point)) return true;
  11. return false;
  12. }
  13. };
  14. var containsGeometryType = {
  15. Sphere: function() {
  16. return true;
  17. },
  18. Point: function(object, point) {
  19. return containsPoint(object.coordinates, point);
  20. },
  21. MultiPoint: function(object, point) {
  22. var coordinates = object.coordinates, i = -1, n = coordinates.length;
  23. while (++i < n) if (containsPoint(coordinates[i], point)) return true;
  24. return false;
  25. },
  26. LineString: function(object, point) {
  27. return containsLine(object.coordinates, point);
  28. },
  29. MultiLineString: function(object, point) {
  30. var coordinates = object.coordinates, i = -1, n = coordinates.length;
  31. while (++i < n) if (containsLine(coordinates[i], point)) return true;
  32. return false;
  33. },
  34. Polygon: function(object, point) {
  35. return containsPolygon(object.coordinates, point);
  36. },
  37. MultiPolygon: function(object, point) {
  38. var coordinates = object.coordinates, i = -1, n = coordinates.length;
  39. while (++i < n) if (containsPolygon(coordinates[i], point)) return true;
  40. return false;
  41. },
  42. GeometryCollection: function(object, point) {
  43. var geometries = object.geometries, i = -1, n = geometries.length;
  44. while (++i < n) if (containsGeometry(geometries[i], point)) return true;
  45. return false;
  46. }
  47. };
  48. function containsGeometry(geometry, point) {
  49. return geometry && containsGeometryType.hasOwnProperty(geometry.type)
  50. ? containsGeometryType[geometry.type](geometry, point)
  51. : false;
  52. }
  53. function containsPoint(coordinates, point) {
  54. return distance(coordinates, point) === 0;
  55. }
  56. function containsLine(coordinates, point) {
  57. var ab = distance(coordinates[0], coordinates[1]),
  58. ao = distance(coordinates[0], point),
  59. ob = distance(point, coordinates[1]);
  60. return ao + ob <= ab + epsilon;
  61. }
  62. function containsPolygon(coordinates, point) {
  63. return !!polygonContains(coordinates.map(ringRadians), pointRadians(point));
  64. }
  65. function ringRadians(ring) {
  66. return ring = ring.map(pointRadians), ring.pop(), ring;
  67. }
  68. function pointRadians(point) {
  69. return [point[0] * radians, point[1] * radians];
  70. }
  71. export default function(object, point) {
  72. return (object && containsObjectType.hasOwnProperty(object.type)
  73. ? containsObjectType[object.type]
  74. : containsGeometry)(object, point);
  75. }