Комментарии 28
Так, чисто теоретическая альтернатива:
Дано:
— КАД имеет ограниченное количество съездов/пересечений
— Расстояние до КАД является расстоянием до ближайшего съезда/пересечения
Предполагаем:
— Существует точка внутри КАД, расстояние от которой до всех съездов/пересечений одинаково и равно Х. В идеале она существует, на практике ее можно найти приблизительно. Назовем ее Центр.
Получаем:
— Расстояние от точки до КАД есть расстояние от точки то Центра минус Х. Спасибо Центру за это ))
Замечу, альтернатива скорее теоретическая, т.к. на практике будет геморрой с постоянным переопределением центра из-за изменений улиц.
Дано:
— КАД имеет ограниченное количество съездов/пересечений
— Расстояние до КАД является расстоянием до ближайшего съезда/пересечения
Предполагаем:
— Существует точка внутри КАД, расстояние от которой до всех съездов/пересечений одинаково и равно Х. В идеале она существует, на практике ее можно найти приблизительно. Назовем ее Центр.
Получаем:
— Расстояние от точки до КАД есть расстояние от точки то Центра минус Х. Спасибо Центру за это ))
Замечу, альтернатива скорее теоретическая, т.к. на практике будет геморрой с постоянным переопределением центра из-за изменений улиц.
Не понятно какое расстояние вы предлагаете рассчитать? На практике доставка внутри МКАД имеет единую стоимость, поэтому расстояние внутри не имеет смысла рассчитывать. А вот за пределами кольца стоимость зависит от удаления, поэтому нам нужно определить точку МКАД, ближайшую к требуемому адресу.
Ну собственно его родимого «Расстояние от точки до КАД есть расстояние от точки до Центра минус Х» для точки за пределами КАД.
Для точки внутри КАД это число будет отрицательным.
Для точки внутри КАД это число будет отрицательным.
Да, я вас понял. Тогда как узнать, через какую точку МКАД пройдет путь?
А зачем?
Маршрут должен строиться всегда оптимально.
А для вычисления его длинны это не важно, т.к. центр равноудален ото всех въездов.
Если все упростить и представить Москву как велосипедное колесо со спицами, то расстояние от точки до колеса всегда равно расстоянию от точки до центра колеса минус длинна спицы, и не важно какая спица там ближе.
Дальше усложняем — спицы остались одинаковыми, но стали длиннее радиуса. Утверждение не потеряло истину.
Следующий шаг — гнем колесо. Утверждение опять не потеряло истину, но колесо уже похоже на Москву ))
Маршрут должен строиться всегда оптимально.
А для вычисления его длинны это не важно, т.к. центр равноудален ото всех въездов.
Если все упростить и представить Москву как велосипедное колесо со спицами, то расстояние от точки до колеса всегда равно расстоянию от точки до центра колеса минус длинна спицы, и не важно какая спица там ближе.
Дальше усложняем — спицы остались одинаковыми, но стали длиннее радиуса. Утверждение не потеряло истину.
Следующий шаг — гнем колесо. Утверждение опять не потеряло истину, но колесо уже похоже на Москву ))
Да, я вас понял. Тогда как узнать, через какую точку МКАД пройдет путь?
А через API можно прокладывать маршрут от точки до точки? Если да, то составляете список всех съездов с МКАДА, прокладываете маршрут от каждого и берете расстояние самого короткого. Можно сделать предварительную грубую фильтрацию по прямому расстоянию от пункта назначения.
ха ха ха :) а я дописываю аналогичный сервис для инет-магазинов (встравиваемый). вот действительно идеи витают в воздухе.
Это точно! Только мой код надо дорабатывать, там есть погрешности в виду особенностей построения маршрута, если интересно, могу рассказать.
Вы не интригуйте, Вы рассказывайте!
1. Адрес за МКАД по прямой может быть ближе к одной точке (съезду) МКАД, а оптимальный маршрут строится через другой. В итоге увеличение расстояния.
2. Точка на МКАД может попасть на «встречку» при построении маршрута, смотря с какой стороны будет въезд на кольцевую. Маршрутизатор построит путь до следующего съезда и обратно. Опять увеличение расстояния.
2. Точка на МКАД может попасть на «встречку» при построении маршрута, смотря с какой стороны будет въезд на кольцевую. Маршрутизатор построит путь до следующего съезда и обратно. Опять увеличение расстояния.
Апендикс на МКАД можно убрать.
Взять построенный маршрут до мкада. Разбить его на сегменты
И дальше отсечь ту сторону которая на МКАД, проверяя её имя.
А вот что делать с первой проблемой, я пока не придумал.
Взять построенный маршрут до мкада. Разбить его на сегменты
route.getRouteSegment(currSegment);
И дальше отсечь ту сторону которая на МКАД, проверяя её имя.
if(segment.getStreet().indexOf("МКАД")>=0)
А вот что делать с первой проблемой, я пока не придумал.
ТС и многие ответчики явно немного не в теме
clubs.ya.ru/mapsapi/replies.xml?item_no=17878 от 27 апреля сегодня за авторством того же самого vaddo на который первая линка дается.
Вообще клуб полезное место, а решение на полигональной основе преподносилось (таксовиком?) года два назад на одном из субботников.
clubs.ya.ru/mapsapi/replies.xml?item_no=17878 от 27 апреля сегодня за авторством того же самого vaddo на который первая линка дается.
Вообще клуб полезное место, а решение на полигональной основе преподносилось (таксовиком?) года два назад на одном из субботников.
Извините, а вы задачу то в топике прочитали? Нужно определить расстояние от МКАД до адреса. В приведенном вами примере просто на карте указываются области доставки и все, при чем в ручную. Где там расчет?
У вас полигон Москвы вообще из воздуха появляется:) Я думаю из топика vaddo вытекает ваше решение.
Хотя на самом деле, правильным решением было бы определение развязки, и построения маршрута включительно по текстовым данным. Потому что алгоритмом можно и на встречку тыкнуть, и на мкад(в том числе тоже в сторону от рязвязки)
Хотя на самом деле, правильным решением было бы определение развязки, и построения маршрута включительно по текстовым данным. Потому что алгоритмом можно и на встречку тыкнуть, и на мкад(в том числе тоже в сторону от рязвязки)
Полигон МКАД появляется из набора координат каждого километра дороги, всего 108 точек. Согласен с определением развязки, я как раз над этим работаю. Проблема именно в попадании на «встречку». Я общался с vaddo, это руководитель группы b2b маркетинга Яндекса. Мы как раз с ним обсуждали мой алгоритм в том же клубе.
Случайно не знаете как вот это сделать? habrahabr.ru/qa/10650/
Поищите в документации к API Яндекс.Карт и в Клубе Яндекс.Карт. При построении маршрута просто нужно учитывать пробки. Вот здесь есть решение http://clubs.ya.ru/mapsapi/replies.xml?item_no=13678
Не является-ли подобное использование координат нарушением пользовательского соглашения, а именно пункта: 2.3.6.5, не уточняли?
Лучше бы яндекс сам сделал подобную функцию на своей стороне, и поддерживал бы эти координаты в точности и актуальном состоянии, чем каждый строит свой велосипед.
console.clear();
inout='hz';
xy2=[55.691197159743474, 37.143133730322454]; // точка
nearest=false;
min=10000;
xy=[55.7525644168727, 37.6223055153893]; // центр Москвы
for(mnum in mkad_km) {
curCom=mkad_km[mnum];
if(typeof curCom !='object') continue; // костыль 1
xy1=[curCom[2],curCom[1]];
dispose=Math.sqrt(Math.pow(Math.abs(xy1[0]-xy2[0]),2) + Math.pow(Math.abs(xy1[1]-xy2[1]),2));
if(typeof dispose == 'number') { // костыль 2
if(dispose<min) {
min=dispose;
nearest=xy1;
}
}
}
kmtocentr=Math.sqrt(Math.pow(Math.abs(nearest[0]-xy[0]),2) + Math.pow(Math.abs(nearest[1]-xy[1]),2));
dottocentr=Math.sqrt(Math.pow(Math.abs(xy2[0]-xy[0]),2) + Math.pow(Math.abs(xy2[1]-xy[1]),2));
if(kmtocentr>dottocentr-min) inout='IN'; else inout="OUT";
console.log(min); // расстояние до мкад
console.log(inout); // внутри или снаружи
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
API Яндекс.Карт: Адрес внутри/за МКАД, расстояние от МКАД