Как стать автором
Обновить

Комментарии 28

Так, чисто теоретическая альтернатива:

Дано:
— КАД имеет ограниченное количество съездов/пересечений
— Расстояние до КАД является расстоянием до ближайшего съезда/пересечения

Предполагаем:
— Существует точка внутри КАД, расстояние от которой до всех съездов/пересечений одинаково и равно Х. В идеале она существует, на практике ее можно найти приблизительно. Назовем ее Центр.

Получаем:
— Расстояние от точки до КАД есть расстояние от точки то Центра минус Х. Спасибо Центру за это ))

Замечу, альтернатива скорее теоретическая, т.к. на практике будет геморрой с постоянным переопределением центра из-за изменений улиц.
Не понятно какое расстояние вы предлагаете рассчитать? На практике доставка внутри МКАД имеет единую стоимость, поэтому расстояние внутри не имеет смысла рассчитывать. А вот за пределами кольца стоимость зависит от удаления, поэтому нам нужно определить точку МКАД, ближайшую к требуемому адресу.
Ну собственно его родимого «Расстояние от точки до КАД есть расстояние от точки до Центра минус Х» для точки за пределами КАД.

Для точки внутри КАД это число будет отрицательным.
Да, я вас понял. Тогда как узнать, через какую точку МКАД пройдет путь?
А зачем?

Маршрут должен строиться всегда оптимально.

А для вычисления его длинны это не важно, т.к. центр равноудален ото всех въездов.

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

Дальше усложняем — спицы остались одинаковыми, но стали длиннее радиуса. Утверждение не потеряло истину.

Следующий шаг — гнем колесо. Утверждение опять не потеряло истину, но колесо уже похоже на Москву ))
Ну так то, конечно, да. Но МКАД далеко не колесо :-)
Да, я вас понял. Тогда как узнать, через какую точку МКАД пройдет путь?
А через API можно прокладывать маршрут от точки до точки? Если да, то составляете список всех съездов с МКАДА, прокладываете маршрут от каждого и берете расстояние самого короткого. Можно сделать предварительную грубую фильтрацию по прямому расстоянию от пункта назначения.
Это очень не оптимально. Представляете до каждого съезда проложить маршрут?! Это значит столько запросов на Яндекс отправить и обратно!
Ну каждому это будет перебор, а к парочке — почему бы и нет?
Ну а как парочку то выделить? Съезды достаточно плотно друг к другу находятся. К тому же, как определять точку внутри МКАД?
ха ха ха :) а я дописываю аналогичный сервис для инет-магазинов (встравиваемый). вот действительно идеи витают в воздухе.
Это точно! Только мой код надо дорабатывать, там есть погрешности в виду особенностей построения маршрута, если интересно, могу рассказать.
Вы не интригуйте, Вы рассказывайте!
1. Адрес за МКАД по прямой может быть ближе к одной точке (съезду) МКАД, а оптимальный маршрут строится через другой. В итоге увеличение расстояния.
2. Точка на МКАД может попасть на «встречку» при построении маршрута, смотря с какой стороны будет въезд на кольцевую. Маршрутизатор построит путь до следующего съезда и обратно. Опять увеличение расстояния.
Апендикс на МКАД можно убрать.
Взять построенный маршрут до мкада. Разбить его на сегменты

route.getRouteSegment(currSegment);


И дальше отсечь ту сторону которая на МКАД, проверяя её имя.

if(segment.getStreet().indexOf("МКАД")>=0)


А вот что делать с первой проблемой, я пока не придумал.
А это не увеличивает время работы скрипта?
ТС и многие ответчики явно немного не в теме
clubs.ya.ru/mapsapi/replies.xml?item_no=17878 от 27 апреля сегодня за авторством того же самого vaddo на который первая линка дается.

Вообще клуб полезное место, а решение на полигональной основе преподносилось (таксовиком?) года два назад на одном из субботников.
Извините, а вы задачу то в топике прочитали? Нужно определить расстояние от МКАД до адреса. В приведенном вами примере просто на карте указываются области доставки и все, при чем в ручную. Где там расчет?
У вас полигон Москвы вообще из воздуха появляется:) Я думаю из топика vaddo вытекает ваше решение.
Хотя на самом деле, правильным решением было бы определение развязки, и построения маршрута включительно по текстовым данным. Потому что алгоритмом можно и на встречку тыкнуть, и на мкад(в том числе тоже в сторону от рязвязки)
Полигон МКАД появляется из набора координат каждого километра дороги, всего 108 точек. Согласен с определением развязки, я как раз над этим работаю. Проблема именно в попадании на «встречку». Я общался с vaddo, это руководитель группы b2b маркетинга Яндекса. Мы как раз с ним обсуждали мой алгоритм в том же клубе.
Поищите в документации к API Яндекс.Карт и в Клубе Яндекс.Карт. При построении маршрута просто нужно учитывать пробки. Вот здесь есть решение http://clubs.ya.ru/mapsapi/replies.xml?item_no=13678
Спасибо!
Не является-ли подобное использование координат нарушением пользовательского соглашения, а именно пункта: 2.3.6.5, не уточняли?
Не является. Решение одобрено разработчиками Яндекс.Карт и находится в примерах применения API.
Лучше бы яндекс сам сделал подобную функцию на своей стороне, и поддерживал бы эти координаты в точности и актуальном состоянии, чем каждый строит свой велосипед.
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); // внутри или снаружи


Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации