Клуб API Карт

Как правильно сделать подобное?

fatruseccy
28 ноября 2016, 19:12

Привет всем! Знатоки, подскажите пожалуйста как сделать подобное? А именно - Показывать только обьекты по маршруту в радиусе 100м. на протяжении маршрута. Данные берутся из БД. Заранее благодарен.

12 комментариев
Задача сводится к двум моментам
1. Обрисовать линию маршрута полигоном-буфером на определенном расстоянии (выпуклый многоугольник)
Берем готовые геолибы типа GEOS, которые много всего умеют в том числе строить буфер вокруг ломаной.
Либо берем какие-нибудь мат. либы типа CGAL которые много всего умеют в том числе рассчитывать сумму минковского для координат в пиксельной проекции

2. Выбрать объекты из БД, попадающие внутрь этого полигона
это просто, почти все БД сегодня это умеют
Обновлено 29 ноября 2016, 14:53
dimik,
как все жестко. Я как то думал, что есть решения стандартные от самого Яши.
Обновлено 28 ноября 2016, 20:25
Может предложит кто готовое решение или поможет с такими наворотами??? Очень нужно =(
fatruseccy,
Готовое решение будет на стороне сервера и будет зависеть от используемых вами технологий. Тема данного клуба – клиентское программирование.
На сервере технологический стек у всех пользователей клуба разный, лучше задавать вопросы на специальных форумах о технологиях, что у вас используются
Решений готовых полно
например это
https://geophp.net/geos.html
dimik,
это я находил =) только вот не шпрехаю по "ангельский" =)  Искал примеры, как то четно все.
А как-то вот так:
====
var polyline=null;
var Route=null;

ymaps.route(<тут точки маршрута>, {mapStateAutoApply: true, avoidTrafficJams: true}).then(
function (route){
var op=0.5; Route=route; ymm.geoObjects.add(Route);
var gk=[];
var f=Route.getPaths();
for(var i = 0, l = f.getLength(); i < l; i++) {
var ff=f.get(i).getSegments();
for(var ii = 0, ll = ff.length; ii < ll; ii++) {
var fff=ff[ii].getCoordinates();
for (var iii = 0, lll = fff.length; iii<lll; iii++) {
gk.push(fff[iii]); //координаты точек для построения ломаной, совпадающей с маршрутом

};
};
};
polyline = new ymaps.Polyline(gk, {}, {strokeWidth: 4, opacity: op});
ymm.geoObjects.add(self.polyline);
polyline.properties.set('hintContent', 'PathHint...');
ymm.geoObjects.remove(self.Route); //удалим, если не нужен... :)

Route=null;}, function(){});


а потом в цикле по нашим точкам (координаты точки в pptcrd), определяя расстояние до ломаной:
ret= ymaps.coordSystem.geo.getDistance(pptcrd, polyline.geometry.getClosest(pptcrd).position);


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


Простите за сумбурное изложение...


drugov.andrey2017,
спасибо!!! Протестирую, хоть и не силен. Но есть какая то надежда  =) 
drugov.andrey2017,
можете проконсультировать как правильно сделать? У самого не получилось почему то. =( Буду очень благодарен!


Самое главное здесь:   
Представим, что в переменной Route - построенный маршрут, а в переменной ymm - экземпляр яндекс-карты...


//это получение массива геокоординат для построения ломаной линии:
//================

var gk=[];
var f=Route.getPaths();
for(var i = 0, l = f.getLength(); i < l; i++) {
 var ff=f.get(i).getSegments();
 for(var ii = 0, ll = ff.length; ii < ll; ii++) {
 var fff=ff[ii].getCoordinates();
 for (var iii = 0, lll = fff.length; iii<lll; iii++) {
 gk.push(fff[iii]); //координаты точек для построения ломаной, совпадающей с маршрутом
  };
 };
};

//================
//потом отобразим на карте эту ломаную:
//================

var polyline = new ymaps.Polyline(gk, {}, {strokeWidth: 4, opacity: 0.5});
ymm.geoObjects.add(polyline);
//================
//После этого маршрут с карты можно удалить уже...
//================

ymm.geoObjects.remove(Route);
//================

//А потом ваши действия с точками, определяющие, помещать их на карту или нет,
// используя в параметре pptcrd геокоординаты вашей точки, и получая в ret кратчайшее //расстояние от этой точки до ломаной... Сравнивайте его с требуемым, и если оно меньше,
//отображайте точку, или ещё что с ней делайте :)

ret= ymaps.coordSystem.geo.getDistance(pptcrd, polyline.geometry.getClosest(pptcrd).position);



drugov.andrey2017,
к сожалению не получилось. Можем связаться и получить консультацию, чего я не так делаю?
Приветствую.


Пришлите то, что у вас есть (код + html), желательно с комментариями, на адрес adrugov@rprg.ru,
попробую вам помочь.