@mapbox/mapbox-gl-draw
Version:
A drawing component for Mapbox GL JS
49 lines (37 loc) • 1.39 kB
JavaScript
import sortFeatures from './sort_features.js';
import mapEventToBoundingBox from './map_event_to_bounding_box.js';
import * as Constants from '../constants.js';
import StringSet from './string_set.js';
const META_TYPES = [
Constants.meta.FEATURE,
Constants.meta.MIDPOINT,
Constants.meta.VERTEX
];
// Requires either event or bbox
export default {
click: featuresAtClick,
touch: featuresAtTouch
};
function featuresAtClick(event, bbox, ctx) {
return featuresAt(event, bbox, ctx, ctx.options.clickBuffer);
}
function featuresAtTouch(event, bbox, ctx) {
return featuresAt(event, bbox, ctx, ctx.options.touchBuffer);
}
function featuresAt(event, bbox, ctx, buffer) {
if (ctx.map === null) return [];
const box = (event) ? mapEventToBoundingBox(event, buffer) : bbox;
const queryParams = {};
if (ctx.options.styles) queryParams.layers = ctx.options.styles.map(s => s.id).filter(id => ctx.map.getLayer(id) != null);
const features = ctx.map.queryRenderedFeatures(box, queryParams)
.filter(feature => META_TYPES.indexOf(feature.properties.meta) !== -1);
const featureIds = new StringSet();
const uniqueFeatures = [];
features.forEach((feature) => {
const featureId = feature.properties.id;
if (featureIds.has(featureId)) return;
featureIds.add(featureId);
uniqueFeatures.push(feature);
});
return sortFeatures(uniqueFeatures);
}