Клуб API Карт

Не получается проверить находится ли точка в созданном полигоне.

a.pishulev@up-advert.ru
23 ноября 2016, 15:02

Пролистал много разных тем с похожей проблемой, но решения для себя так и не нашёл.

Создаю полигон:

var url = "http://nominatim.openstreetmap.org/search";
		var regionName = "Ленинский район, Пермь";
         $.getJSON(url, {q: regionName, format: "json", polygon_geojson: 1})
        .then(function (data) {
            $.each(data, function(ix, place) {
                if ("relation" == place.osm_type) {
                    var p = new ymaps.Polygon(place.geojson.coordinates);
					p.options.set('visible', false);
					map.geoObjects.add(p);
                }
            });
        }, function (err) {
            console.log(err);
});

Ну и код проверки наличия в полигоне точки:

console.log(coords[0],coords[1]);
if (p.geometry.contains(new YMaps.GeoPoint(coords[0],coords[1]))){
console.log('true');}else{console.log('false');}

Вывод в консоли

Но самое странное, что у меня не срабатывает даже условие esle...хотя походу я просто не понимаю вообще как работает этот contains..
 

6 комментариев
Подписаться на комментарии к посту
Вам поможет пример: https://tech.yandex.ru/maps/jsbox/2.1/placemarks_in_circle
Можете все же уточнить, после того как получил objectsInsideCircle, как полученному результату определить попадает точка в область или нет?
На резонный вопрос: «Можете все же уточнить, после того как получил objectsInsideCircle, как полученному результату определить попадает точка в область или нет?»


в ответ тишина.... и только мертвые с комами вдоль дорог...
а по итогу получится код японский - если не знаешь ника мне догадаешься. Вообще эти коды яндексовские только по примерам можно делать. Все ссылки на документацию ну без толку. Все не так ( 
Промучившись не один день я нашел точку в полигоне :), может поможет
var myGeocoder = ymaps.geocode(addr);
myGeocoder.then(
    function (res) {
        myMap.geoObjects.add(res.geoObjects);
        var result = ymaps.geoQuery(myGeocoder).searchInside(myPolygon);

        result.then(function () {
            if(result.getLength() == 1){//попал в полигон

            else//не попал в полигон

    });

}); 

Спасибо )
Я тоже щас помудохался и по примерам нашел работающий код который многие хотят. Модифицируем пример в песочнице «Попадание точек в окружность» https://tech.yandex.ru/maps/jsbox/2.1/placemarks_in_circle таким образом, чтобы тупо просто отображать только те точки (или объекты), которые находятся внутри круга с заданным радиусом (ну или вместо круга circle можно использовать любую другую геометрическую фигуру типа квадрат и т.п.). Ловите код:


ymaps.ready(init);
function init() {
var myMap = new ymaps.Map("map", {
center: [55.43, 37.75],
zoom: 8
}, {
searchControlProvider: 'yandex#search'
}),
objects = ymaps.geoQuery([
{
type: 'Point',
coordinates: [55.73, 37.75]
},
{
type: 'Point',
coordinates: [55.10, 37.45]
},
{
type: 'Point',
coordinates: [55.25, 37.35]
}]);

circle = new ymaps.Circle([[55.43, 37.7], 30000], null);
myMap.geoObjects.add(circle);

// Найдем объекты (у нас выше в массиве objects заданы 3 точки),  которые попадают в область внутри круга circle, и добавим их на карту  
objects.searchInside(circle).addToMap(myMap);

}


P.S. // чтобы увидеть изменения после просмотра меняем радиус с 30000 на 50000 и увидим что уже все 3 точки отобразятся.
Чтобы происходило все тоже самое но без рисования круга наверное его нужно сделать невидимым (как не знаю), либо использовать другой код типа contains. Имейте ввиду, если убрать круг с карты (убрать строку кода myMap.geoObjects.add(circle);) то работать не будет (.
Всем удачи )
Дополнение как закрасить круг или сделать его прозрачным насколько надо:


circle = new ymaps.Circle([[55.43, 37.7], 30000], null, {
// Задаем опции круга:
draggable: true, // Включаем возможность перетаскивания круга.
fillColor: "#DB709377", // Цвет заливки
fillOpacity: 0.3, // Прозрачность заливки
strokeColor: "#990066", // Цвет обводки.
strokeOpacity: 0.8, // Прозрачность обводки.
strokeWidth: 2 // Ширина обводки в пикселях.
});