Как использовать выражение in в Mapbox GL map.setFilter - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь отфильтровать географический Json слой (называемый «местами назначения») на основе набора условий. Мой слой "назначения" имеет свойство под названием uniqueID строки типа, которое в большинстве случаев имеет только один идентификатор numeri c, но иногда имеет более одного. Я хотел бы отфильтровать этот слой (используя map.setFilter) на основе массива идентификаторов. Фильтр должен делать что-то вроде этого: если какое-либо из значений uniqueID в "целевом" слое обнаружено в массиве идентификаторов, то отфильтруйте эту функцию.

Вот фрагмент моих "пунктов назначения" "слой:

{ "type": "Feature", "properties": { "destinationLon": -74.20716879, "destinationLat": 40.69097357, "uniqueID": "2029" }, "geometry": { "type": "Point", "coordinates": [ -74.20716879, 40.69097357 ] } },
{ "type": "Feature", "properties": { "destinationLon": -74.20670807, "destinationLat": 40.69137214, "uniqueID": "984,985" }, "geometry": { "type": "Point", "coordinates": [ -74.20670807, 40.69137214 ] } },
{ "type": "Feature", "properties": { "destinationLon": -74.20651489, "destinationLat": 40.71887889, "uniqueID": "1393" }, "geometry": { "type": "Point", "coordinates": [ -74.20651489, 40.71887889 ] } }

А вот образец массива идентификаторов, который я мог бы использовать: [2000, 984, 1393]

Я пробовал использовать фильтр с выражением in (документация здесь ) вот так:

let thisFilter = ["any"].concat(uniqueIDs.map(id => ["in", id, ["get", "uniqueID"]]));
map.setFilter("destinations", thisFilter);

Но я продолжаю получать это сообщение об ошибке:

Error: "layers.destinations.filter[0][2]: string, number, or boolean expected, array found"

Однако в документации указано следующее:

["in",
    keyword: InputType (boolean, string, or number),
    input: InputType (array or string)
]: boolean

Третий аргумент в выражении должен быть массивом. Почему тогда я получаю эту ошибку?

Есть идеи? Спасибо!

1 Ответ

0 голосов
/ 21 июня 2020

Думаю, ваша ошибка не связана с in. Вы можете обнаружить это, упростив свое выражение и отделив any от отдельных in частей.

Ваша ошибка в том, что any принимает переменное количество параметров:

['any', ['in', ...], ['in', ...]]

В то время как вы передаете массив:

['any', [['in', ...], ['in', ...]]]

Я бы переписал ваше выражение следующим образом:

let thisFilter = ["any", ...uniqueIDs.map(id => ["in", id, ["get", "uniqueID"]])];
...