contains.js 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import {default as polygonContains} from "./polygonContains.js";
  2. import {default as distance} from "./distance.js";
  3. import {epsilon2, radians} from "./math.js";
  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 ao, bo, ab;
  58. for (var i = 0, n = coordinates.length; i < n; i++) {
  59. bo = distance(coordinates[i], point);
  60. if (bo === 0) return true;
  61. if (i > 0) {
  62. ab = distance(coordinates[i], coordinates[i - 1]);
  63. if (
  64. ab > 0 &&
  65. ao <= ab &&
  66. bo <= ab &&
  67. (ao + bo - ab) * (1 - Math.pow((ao - bo) / ab, 2)) < epsilon2 * ab
  68. )
  69. return true;
  70. }
  71. ao = bo;
  72. }
  73. return false;
  74. }
  75. function containsPolygon(coordinates, point) {
  76. return !!polygonContains(coordinates.map(ringRadians), pointRadians(point));
  77. }
  78. function ringRadians(ring) {
  79. return ring = ring.map(pointRadians), ring.pop(), ring;
  80. }
  81. function pointRadians(point) {
  82. return [point[0] * radians, point[1] * radians];
  83. }
  84. export default function(object, point) {
  85. return (object && containsObjectType.hasOwnProperty(object.type)
  86. ? containsObjectType[object.type]
  87. : containsGeometry)(object, point);
  88. }