Клуб API Карт

Метка в области

Пост в архиве.

День добрый

Битый час бьюсь над FAQ-ой по сути уже задачей.

Задача:

1. вывести круг

2. вывести только точки которые попадают в этот круг.

 

вроде бы просто, но смущает что во всех примерах которые были найдены и здесь и в сети, почему используются формулы косинусы/синусы и прочая матчасть.

 

неужели нет метода или функции чтобы это автоматом производилось?

использую api 2.

попробовал в лоб сделать с примером который в песочнице (замена цвета у меток попадающих при перемещении на окружность).

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

 

прошу помощи в корректном решении

7 комментариев
Владислав Турман
28 января 2016, 00:07

Если я не ошибаюсь: http://api.yandex.ru/maps/doc/jsapi/2.0/ref/reference/geometry.Circle.xml

метод: contains 

Или что то не так делаю, или ...

ymaps.ready(init);

function init () {
    var myMap = new ymaps.Map("map", {
            center: [43.6983866981,39.5868837559],
            zoom: 13
        }) ;
/*проверяем точку*/   
var myCircle = new ymaps.geometry.base.Circle([43.6983866981,39.5868837559], 10);
alert(myCircle.contains([43.6883866981,39.5868837559])) ;
    // возвращает true,
    // хотя ниже явно видно что они находятся на значительном расстоянии

    var myCircle1 = new ymaps.Circle([
       
        [43.6983866981,39.5868837559],
       
        100
    ], {}, {
      
        draggable: true,
        fillColor: "#DDDDDD77",
        strokeColor: "#990066",
        strokeOpacity: 0.4,
        strokeWidth: 5
    }) ;

    myMap.geoObjects.add(myCircle1);
   
   
    var myCircle2 = new ymaps.Circle([
        [43.6883866981,39.5868837559],
        10
    ], {
        balloonContent: "Радиус круга - 10 км"
    }, {
        draggable: true,
        fillColor: "#000000",
        strokeColor: "#FF0000",
        strokeOpacity: 0.4,
        strokeWidth: 1
    }) ;
   myMap.geoObjects.add(myCircle2);
}

Для быстрого теста "экспериментировал" здесь

http://api.yandex.ru/maps/jsbox/2.1/placemark просто в js если вставить видна картинка...

Просьба подсказать что же не так делаю то?

 

Не надо использовать базовые геометрии

ymaps.geometry.base.Circle -> ymaps.geometry.Circle

если проверяете contains через геометрию ей надо еще установить карту и родительские опции

Геометрию напрямую нужно использовать в случае если круг НЕ НАДО отображать на карте.

Если круг НАДО отображать надо использовать геометрию через оверлей

 

Итого:

Только геометрия:

var circleGeometry = new ymaps.geometry.Circle([_lat_, _lon_], _radius_);

circleGeometry.options.setParent(myMap.options);

circleGeometry.setMap(myMap);

circleGeometry.contains([_lat_, _lon_]);

 

Через оверлей (с отображением на карте)

var circle = new ymaps.Circle([_lat_, _lon_], _radius_, _data_, _options_);

myMap.geoObjects.add(circle);

circle.geometry.contains([_lat_, _lon_]);

 

спасибо, попробовал, но опять что-то то ли не так делаю, но не попадает в радиус (хотя напрямую если вставить в песочнице то работает), но с моими данными не проходит работа.

По логике вроде бы все верно, но не отрабатывается как надо...

Для быстрого теста "экспериментировал" здесь

http://api.yandex.ru/maps/jsbox/2.1/placemark просто в js если вставить видна картинка...

 

ymaps.ready(init);
        var groups = [
                                
                   {
                    name: "Снять жилье",
                    pic:"/include/icons/default.png",
                    style: "twirl#redIcon",
                    
                    items: [
                         {
                            koord: [43.458695701673,39.900448951004],
                            name: "Гостевой дом " TEST"",
                            img:"/include/icons/default.png",
                            txt:"Гостевой дом " TEST" расположен в живописном месте Курортного городка Адлера.",
                            startcoords:"43.4951820787,39.8943183438",
                            href:""
                        }
                    ]},
                                   
                               
                   {
                    name: "Дом, коттедж",
                    pic:"/include/icons/house.png",
                    style: "twirl#redIcon",
                    
                    items: [
                           {
                            koord: [43.4951820787,39.8943183438],
                            name: ""ОТЕЛЬ"",
                            img:"/include/icons/house.png",
                            txt:"Находится в центре п. Кудепста, ",
                            startcoords:"43.4951820787,39.8943183438",
                            href:""
                        }]
                    }
                                   
                           ];


        function init() {
            var myMap = new ymaps.Map('map', {center: [43.4951820787,39.8943183438],zoom: 12});
            for (var i = 0, l = groups.length; i < l; i++) {
                group=groups[i];
                  var collection = new ymaps.GeoObjectCollection(null, { preset: group.style });
                    
                myMap.geoObjects.add(collection);
                
                for (var j = 0, m = group.items.length; j < m; j++) {
                    createSubMenu(group.items[j], collection);
                }
            }

            

            function createSubMenu (item, collection) {
                var circleGeometry = new ymaps.geometry.Circle([item.startcoords], 10000);

                circleGeometry.options.setParent(myMap.options);

                circleGeometry.setMap(myMap);

                if(circleGeometry.contains([item.koord])) {
                    console.log(item.startcoords+"===>"+item.koord+"==>Y");
                }else {
                    console.log(item.startcoords+"===>"+item.koord+"==>+N");
                }


                var  placemark = new ymaps.Placemark(
                            item.koord,
                            {
                                balloonContentHeader:item.name,
                                balloonContent: item.txt
                                +'http://www.odnoklassniki.ru/dk?st.cmd=addShare&st.s=1&st._surl='+item.href+'\', \'_blank\', \'scrollbars=0, resizable=1, menubar=0, left=100, top=100, width=550, height=440, toolbar=0, status=0\');return false" data-count="odkl" href="#" style="display:inline-block;vertical-align:bottom;width:32px;height:32px;margin:0 6px 6px 0;padding:0;outline:none;background:url(/include/lib/share42/icons.png) -32px 0 no-repeat" rel="nofollow">'
                                +''
                            },
                            {
                                /*используются свои иконки*/
                               preset: 'islands#circleIcon',
                                iconColor: '#3caa3c'
                           }
                    );
                collection.add(placemark);
            }
            myMap.setBounds(myMap.geoObjects.getBounds());
        }

 

 

                var circleGeometry = new ymaps.geometry.Circle([item.startcoords], 10000);

у вас в item.startcoords лежит срока. конструктор круга принимает массив из 2-х чисел а не из одной строчки

знаете заработало, как то не подумал даже что не правильно данные передаются, спасибо большое.

Посмотрите примеры с geoQuery