Клуб API Карт

Дополнение линии маршрута обычной линией

backhood
26 июля 2012, 19:27

Приветсвую!

На этот раз задача будет действительно сложной (но т.к. мне уже здесь не раз помогали, надеюсь что и в этот раз не обойдете помощью :) )

В общем ситуация: Задаем точки для маршрута. Но точки находятся не на проезжей части, а, например , на клумбе:

и получается вот такое косяк в виде отсутствия линии. Это мне не подходит, однако есть задача использовать именно маршруты. Ну решил поступить так: нашел пример где берутся сегменты и приспособил его под себя:

 


<html xmlns="http://www.w3.org/1999/xhtml"><head>
    <title>Карта.</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script src="http://yandex.st/jquery/1.6.4/jquery.min.js" type="text/javascript"></script>
    <script src="http://api-maps.yandex.ru/2.0/?load=package.full&amp;lang=ru-RU" type="text/javascript"></script>
<script type="text/javascript">
        // Как только будет загружен API и готов DOM, выполняем инициализацию
        ymaps.ready(init);
        function init () {
            var myMap = new ymaps.Map("map", {
                center:[57.931311, 34.576128],
                zoom:6
            });
            // Добавим на карту схему проезда от станции метро "Крылатское" до "Молодежная" и затем до станции "Кунцевская".
            // Полный маршрут делится на два:
            // Крылатское - Молодежная и Молодежная - Кунцевская.
            // Построим простейший маршрутный лист, помогающий проехать
            // по первому маршруту.
            //Построим полный маршрут и затем добавим его на карту.
            ymaps.route(['Москва, метро Крылатское', 'Москва, метро Молодежная', 'Москва, метро Кунцевская'], {
                mapStateAutoApply:true
            }).then(function (route) {
                  myMap.geoObjects.add(route);
                  // Получаем первый маршрут (от метро "Крылатское" до "Молодежная").
                  var way = route.getPaths().get(0),
                      // Маршрут состоит из сегментов. Сегмент - участок маршрута, который нужно проехать
                      // до следующего изменения направления движения.
                      segments = way.getSegments(),
                      moveList = 'Трогаемся,</br>';
                  for (var i = 0; i < segments.length; i++) {
                      var street = segments[i].getCoordinates();
 var streetlen = segments[i].getCoordinates().length;
                      moveList += (streetlen + 'Едем ' + segments[i].getHumanAction() + (street ? ' на ' + street[0] : '') + ', проезжаем ' + segments[i].getLength() + ' м.,' + [i]);
                      moveList += '</br>'
   var geometry12 = [street[0], [55.756842, 37.408139]],
    properties12 = {
        hintContent: "Ломаная линия"
    },
    options12 = {
        strokeColor: '#000000',
        strokeWidth: 4,
        strokeStyle: '1 5'
    },
    polyline12 = new ymaps.Polyline(geometry12, properties12, options12);
myMap.geoObjects.add(polyline12);
                  }
                  moveList += 'Останавливаемся.';
                  // Выводим маршрутный лист
                  $('#list').append(moveList);
            }, function (error) {
                alert('Возникла ошибка: ' + error.message);
            });
        }
    </script>
    </head>
        <body>
<table style="border: solid; border-color: #423189;">
    <tbody><tr>
        <td style="border: solid; border-color: #423189;">
            <div id="map" style="width: 600px; height: 400px"></div>
        </td>
        <td style="padding-left: 10px; padding-top: 10px" valign="top">
            <div id="list"></div>
        </td>
    </tr>
</tbody></table>
        </body>
</html>

  

Что делал: брал сегмент, находил его координаты первой точки и подставлял в координаты точки для линии. Второй точкой линии было начало маршрута (ну или его координаты)

Получилось много линий (ну это понятно я же обрабатывал точки и линии в for. И тут я понял, что зашел в тупик и не знаю что делать дальше, чтобы все такие косяки заменялись линиями... Может быть как - нибудь сделать, например когда точка начала / конца сегмента != точке начала / конца маршрута, то рисовалось бы линия от конечной точки этого сегмента до точки начала / конца маршрута... Или же когда длина сегмента вовсе = 0, то соседние точки соединять линией...В общем идей много, а в силу своего нубизма в апи карт попрбовать не имеется возможным =(

Помогите, пожалуйста довести до ума идею, уверен, что впоследствии она пригодится не только мне 

P.S. Извиняйте, если написал непонятно, если что - то совсем не усваивается, распишу подробнее ...

5 комментариев
Подписаться на комментарии к посту

если нужно чтобы точки были на улице, можно прогнать адреса через геокодер, а затем через реверс-геокодер с параметром kind=street

Если нужно просто дорисовать линию до точки - еще проще берете координату точки и если она != координате первой точки первого сегмента, рисуете прямую между ними.

Для последней точки тоже самое

Ну это еще как - то я представлял, а вот, например, если есть 2 точки маршрута и между ними вообще нет линии маршрута? Нужно дорисовать обычню линию, но как? Проблема в том, что маршрут заранее не известен, он строится из бд, и вот мне и нужно как - то определять где надо что - то дорисовывать, а где не надо...

строится из БД, а к клиенту как попадает?

Через массив: сначала строится массив с помощью while php и потом уже обрабатывается js

ну добавьте в этот массив 2 точки - начала маршрута в 0-й индекс

и конца маршрута в последний индекс

и всё вроде?