Затраченное время 6 часов 47 минут


Курьер нашего клиента в Москве и Санкт-Петербурге доставляет заказы бесплатно в пределах кольцевых автодорог (МКАД в Москве и КАД в Санкт-Петербурге). Доставка считалась в зависимости от конкретного района города, однако кольцевые автодороги не являются границами этих районов, что приводило к ошибкам, которые выливались в недовольство клиентов и финансовые потери на доставке за свой счёт.

Варианты решений

Мы начали с поиска решений в API Яндекс и Google карт — но в них оказалось невозможно посчитать расстояние от границы автодорог и вычислить находится ли точка внутри кольцевой автодороги или снаружи.

Географические сервисы типа Дадаты тоже не могли нам в этом помочь.

Однако, мы не первые столкнулись с подобной проблемой, и в блоге Клуба API Яндекс карт было описано хорошее решение для проблемы МКАДа.

Особенности реализации

Мы реализовали предложенное решение для МКАДа — использовали предложенные координаты для формирования фигуры-полигона, границами которого является МКАД. А посчитать, находится ли адрес внутри этого полигона или снаружи — дело техники.

Из статьи выше использовали только координаты. Код написали свой, ибо API Яндекс карт с того времени сильно изменился.

А вот с КАД в Санкт-Петербурге пришлось поработать немного больше: либо до нас никто не решал с ним подобную проблему, либо просто не выкладывали в открытый доступ координаты для полигона.

Выделение_279.png

Но задача была понятной и через пару дней мы выложили на тестовом сервере и обновление для Санкт-Петербурга. Вот координаты полигона:

Развернуть координаты

array(1, 30.510039, 59.982128),
array(2, 30.526568, 59.978816),
array(3, 30.537769, 59.975375),
array(4, 30.546223, 59.972277),
array(5, 30.553605, 59.965737),
array(6, 30.552060, 59.958507),
array(7, 30.543477, 59.949553),
array(8, 30.539655, 59.941297),
array(9, 30.537767, 59.933549),
array(10, 30.531244, 59.925967),
array(11, 30.526094, 59.917952),
array(12, 30.526438, 59.907608),
array(13, 30.526094, 59.900704),
array(14, 30.524034, 59.891476),
array(15, 30.525618, 59.885168),
array(16, 30.529051, 59.879301),
array(17, 30.531798, 59.872138),
array(18, 30.529566, 59.866959),
array(19, 30.522013, 59.862470),
array(20, 30.513430, 59.858239),
array(21, 30.504847, 59.854872),
array(22, 30.493345, 59.853922),
array(23, 30.479441, 59.853490),
array(24, 30.468951, 59.850774),
array(25, 30.459167, 59.846542),
array(26, 30.454017, 59.839717),
array(27, 30.446893, 59.834028),
array(28, 30.436765, 59.826423),
array(29, 30.424792, 59.823107),
array(30, 30.404536, 59.818612),
array(31, 30.389258, 59.816797),
array(32, 30.372092, 59.815068),
array(33, 30.358016, 59.815154),
array(34, 30.343425, 59.811782),
array(35, 30.330893, 59.810226),
array(36, 30.318362, 59.812906),
array(37, 30.310466, 59.816970),
array(38, 30.302569, 59.820860),
array(39, 30.292784, 59.825787),
array(40, 30.286433, 59.830626),
array(41, 30.279523, 59.834241),
array(42, 30.281068, 59.838086),
array(43, 30.282699, 59.841067),
array(44, 30.285446, 59.844911),
array(45, 30.287849, 59.847502),
array(46, 30.290715, 59.852237),
array(47, 30.291659, 59.857893),
array(48, 30.292603, 59.863462),
array(49, 30.293643, 59.867181),
array(50, 30.295567, 59.872528),
array(51, 30.293163, 59.878655),
array(52, 30.282005, 59.881503),
array(53, 30.268101, 59.884350),
array(54, 30.254539, 59.887887),
array(55, 30.247673, 59.893063),
array(56, 30.230958, 59.897322),
array(57, 30.216539, 59.902324),
array(58, 30.206926, 59.907497),
array(59, 30.210016, 59.914911),
array(60, 30.211551, 59.922588),
array(61, 30.211207, 59.931032),
array(62, 30.207774, 59.939216),
array(63, 30.204169, 59.944383),
array(64, 30.205199, 59.950153),
array(65, 30.209491, 59.956180),
array(66, 30.215913, 59.961745),
array(67, 30.215913, 59.969147),
array(68, 30.213853, 59.976030),
array(69, 30.224609, 59.980476),
array(70, 30.230445, 59.986240),
array(71, 30.231647, 59.992346),
array(72, 30.232505, 60.001030),
array(73, 30.233535, 60.008337),
array(74, 30.227012, 60.014955),
array(75, 30.220489, 60.020540),
array(76, 30.207786, 60.026039),
array(77, 30.194596, 60.031612),
array(78, 30.179834, 60.037023),
array(79, 30.159234, 60.040114),
array(80, 30.151338, 60.045953),
array(81, 30.146703, 60.053937),
array(82, 30.143625, 60.058935),
array(83, 30.157276, 60.061743),
array(84, 30.168614, 60.066550),
array(85, 30.177883, 60.072899),
array(86, 30.185608, 60.077960),
array(87, 30.191923, 60.080429),
array(88, 30.204970, 60.083173),
array(89, 30.219046, 60.084460),
array(90, 30.232950, 60.087289),
array(91, 30.244238, 60.091698),
array(92, 30.255911, 60.095641),
array(93, 30.270607, 60.098765),
array(94, 30.286744, 60.099280),
array(95, 30.301335, 60.097651),
array(96, 30.314209, 60.095937),
array(97, 30.329487, 60.095079),
array(98, 30.343907, 60.094736),
array(99, 30.360858, 60.093451),
array(100, 30.371416, 60.090064),
array(101, 30.376046, 60.087046),
array(102, 30.379050, 60.082587),
array(103, 30.380938, 60.076497),
array(104, 30.382826, 60.071264),
array(105, 30.384393, 60.067453),
array(106, 30.386882, 60.062605),
array(107, 30.391860, 60.057757),
array(108, 30.402184, 60.053022),
array(109, 30.411969, 60.050618,),
array(110, 30.420895, 60.048472),
array(111, 30.428534, 60.046326),
array(112, 30.438879, 60.040219),
array(113, 30.442827, 60.033005),
array(114, 30.448024, 60.027580),
array(115, 30.453603, 60.021996),
array(116, 30.460383, 60.017700),
array(117, 30.470940, 60.013317),
array(118, 30.474974, 60.009492),
array(119, 30.476519, 60.003217),
array(120, 30.476262, 60.000647),
array(121, 30.477892, 59.995875),
array(122, 30.482441, 59.991017),
array(123, 30.490939, 59.986157),
array(124, 30.500809, 59.983018)

Эффект от проведенных работ

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

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



Есть вопросы?