Фильтрация объектов на карте по различным признакам
С помощью класса GeoQueryResult можно формировать набор меток на карте из JSON-описаний их геометрий.
Метод search позволяет фильтровать объекты выборки по различным признакам. Например выбирать объекты с определенным значением полей данных или выбирать объекты по типу геометрии.
В данном примере показано, как осуществлять выборку геообъектов по нескольким признакам, делать объединение или пересечение выборок.
index.html
geoobjects_menu.js
<!DOCTYPE html>
<html>
<head>
<title>Фильтрация объектов на карте по различным признакам</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!--
Укажите свой API-ключ. Тестовый ключ НЕ БУДЕТ работать на других сайтах.
Получить ключ можно в Кабинете разработчика: https://developer.tech.yandex.ru/keys/
-->
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU&apikey=<ваш API-ключ>" type="text/javascript"></script>
<script type="text/javascript" src="https://yandex.st/jquery/2.2.3/jquery.js"></script>
<script src="geoobjects_menu.js" type="text/javascript"></script>
<style>
body, html {
font-family: Arial;
font-size: 11pt;
padding: 0;
margin: 0;
width: 100%;
height: 100%;
}
#map {
width: 100%;
height: 60%;
}
</style>
</head>
<body>
<div id="map"></div>
<div style="padding: 5px;">
<div>
Фильтр по цветам <br>
<input type='checkbox' id='red' checked=true>Красные</input><br>
<input type='checkbox' id='green' checked=true>Зеленые</input><br>
<input type='checkbox' id='yellow' checked=true>Желтые</input>
</div>
<div>
Фильтр по геометриям <br>
<input type='checkbox' id='point' checked=true>Точки</input><br>
<input type='checkbox' id='polygon' checked=true>Многоугольники</input><br>
<input type='checkbox' id='circle' checked=true>Круги</input>
</div>
</div>
</body>
</html>
ymaps.ready(init);
function init() {
var myMap = new ymaps.Map(
"map",
{
center: [55.30954, 37.721587],
zoom: 8,
},
{
searchControlProvider: "yandex#search",
}
);
// Функция, которая по состоянию чекбоксов в меню
// показывает или скрывает геообъекты из выборки.
function checkState() {
var shownObjects,
byColor = new ymaps.GeoQueryResult(),
byShape = new ymaps.GeoQueryResult();
// Отберем объекты по цвету.
if ($("#red").prop("checked")) {
// Будем искать по двум параметрам:
// - для точечных объектов по полю preset;
// - для контурных объектов по цвету заливки.
byColor = myObjects
.search('options.fillColor = "#ff1000"')
.add(
myObjects.search('options.preset = "islands#redIcon"')
);
}
if ($("#green").prop("checked")) {
byColor = myObjects
.search('options.fillColor = "#00ff00"')
.add(
myObjects.search('options.preset = "islands#greenIcon"')
)
// После того, как мы нашли все зеленые объекты, добавим к ним
// объекты, найденные на предыдущей итерации.
.add(byColor);
}
if ($("#yellow").prop("checked")) {
byColor = myObjects
.search('options.fillColor = "#ffcc00"')
.add(
myObjects.search(
'options.preset = "islands#yellowIcon"'
)
)
.add(byColor);
}
// Отберем объекты по форме.
if ($("#point").prop("checked")) {
byShape = myObjects.search('geometry.type = "Point"');
}
if ($("#polygon").prop("checked")) {
byShape = myObjects
.search('geometry.type = "Polygon"')
.add(byShape);
}
if ($("#circle").prop("checked")) {
byShape = myObjects
.search('geometry.type = "Circle"')
.add(byShape);
}
// Мы отобрали объекты по цвету и по форме. Покажем на карте объекты,
// которые совмещают нужные признаки.
shownObjects = byColor.intersect(byShape).addToMap(myMap);
// Объекты, которые не попали в выборку, нужно убрать с карты.
myObjects.remove(shownObjects).removeFromMap(myMap);
}
$("#red").click(checkState);
$("#green").click(checkState);
$("#yellow").click(checkState);
$("#point").click(checkState);
$("#polygon").click(checkState);
$("#circle").click(checkState);
// Создадим объекты из их JSON-описания и добавим их на карту.
window.myObjects = ymaps
.geoQuery({
type: "FeatureCollection",
features: [
{
type: "Feature",
geometry: {
type: "Point",
coordinates: [55.34954, 37.721587],
},
options: {
preset: "islands#yellowIcon",
},
},
{
type: "Feature",
geometry: {
type: "Circle",
coordinates: [55.24954, 37.5],
radius: 20000,
},
options: {
fillColor: "#ffcc00",
},
},
{
type: "Feature",
geometry: {
type: "Polygon",
coordinates: [
[
[55.33954, 37.7],
[55.43954, 37.7],
[55.33954, 38.7],
[55.33954, 37.7],
],
],
},
options: {
fillColor: "#ffcc00",
},
},
{
type: "Feature",
geometry: {
type: "Point",
coordinates: [55.24954, 37.4],
},
options: {
preset: "islands#greenIcon",
},
},
{
type: "Feature",
geometry: {
type: "Circle",
coordinates: [55.14954, 37.61587],
radius: 10000,
},
options: {
fillColor: "#00ff00",
},
},
{
type: "Feature",
geometry: {
type: "Point",
coordinates: [55.14954, 37.61587],
radius: 10000,
},
options: {
preset: "islands#redIcon",
},
},
],
})
.addToMap(myMap);
}