You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.7 KiB
84 lines
2.7 KiB
import {default as polygonContains} from "./polygonContains"; |
|
import {default as distance} from "./distance"; |
|
import {epsilon, radians} from "./math"; |
|
|
|
var containsObjectType = { |
|
Feature: function(object, point) { |
|
return containsGeometry(object.geometry, point); |
|
}, |
|
FeatureCollection: function(object, point) { |
|
var features = object.features, i = -1, n = features.length; |
|
while (++i < n) if (containsGeometry(features[i].geometry, point)) return true; |
|
return false; |
|
} |
|
}; |
|
|
|
var containsGeometryType = { |
|
Sphere: function() { |
|
return true; |
|
}, |
|
Point: function(object, point) { |
|
return containsPoint(object.coordinates, point); |
|
}, |
|
MultiPoint: function(object, point) { |
|
var coordinates = object.coordinates, i = -1, n = coordinates.length; |
|
while (++i < n) if (containsPoint(coordinates[i], point)) return true; |
|
return false; |
|
}, |
|
LineString: function(object, point) { |
|
return containsLine(object.coordinates, point); |
|
}, |
|
MultiLineString: function(object, point) { |
|
var coordinates = object.coordinates, i = -1, n = coordinates.length; |
|
while (++i < n) if (containsLine(coordinates[i], point)) return true; |
|
return false; |
|
}, |
|
Polygon: function(object, point) { |
|
return containsPolygon(object.coordinates, point); |
|
}, |
|
MultiPolygon: function(object, point) { |
|
var coordinates = object.coordinates, i = -1, n = coordinates.length; |
|
while (++i < n) if (containsPolygon(coordinates[i], point)) return true; |
|
return false; |
|
}, |
|
GeometryCollection: function(object, point) { |
|
var geometries = object.geometries, i = -1, n = geometries.length; |
|
while (++i < n) if (containsGeometry(geometries[i], point)) return true; |
|
return false; |
|
} |
|
}; |
|
|
|
function containsGeometry(geometry, point) { |
|
return geometry && containsGeometryType.hasOwnProperty(geometry.type) |
|
? containsGeometryType[geometry.type](geometry, point) |
|
: false; |
|
} |
|
|
|
function containsPoint(coordinates, point) { |
|
return distance(coordinates, point) === 0; |
|
} |
|
|
|
function containsLine(coordinates, point) { |
|
var ab = distance(coordinates[0], coordinates[1]), |
|
ao = distance(coordinates[0], point), |
|
ob = distance(point, coordinates[1]); |
|
return ao + ob <= ab + epsilon; |
|
} |
|
|
|
function containsPolygon(coordinates, point) { |
|
return !!polygonContains(coordinates.map(ringRadians), pointRadians(point)); |
|
} |
|
|
|
function ringRadians(ring) { |
|
return ring = ring.map(pointRadians), ring.pop(), ring; |
|
} |
|
|
|
function pointRadians(point) { |
|
return [point[0] * radians, point[1] * radians]; |
|
} |
|
|
|
export default function(object, point) { |
|
return (object && containsObjectType.hasOwnProperty(object.type) |
|
? containsObjectType[object.type] |
|
: containsGeometry)(object, point); |
|
}
|
|
|