Клуб API Карт

Расчет начальных точек маршрута с удалением 10 минут от текущей

Пост в архиве.
Здравствуйте, уважаемые разработчики и участники клуба!

Не подскажите,как можно реализовать следующее:

Есть определенный объект на карте,допустим,больница(точка 2).

Необходимо найти максимально удаленные точки, от которых до этой самой больницы можно доехать за 10 минут.

Чтобы в итоге получалось примерно такое:

Я лично придумал следующую реализацию:

Насколько я понял из примеров, при передаче координат идет привязка к ближайшим дорогам,

но в цикле проверять 360 точек (для каждого градуса) с начальным удалением (радиусом) ресурсозатратно...

 

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

 

Соответственно, если при этом, время в пути составит больше 10 минут,то удаление(радиус) уменьшаем,допустим,на 200м и проверяем заново пока время в пути не составит 10 минут.

Если время в пути меньше 10 минут, то удаление(радиус) увеличиваем на 200м и проверяем заново.

 

Надо чтобы все это очень быстро обсчитывалось, потому что таких объектов 5-10.

Сейчас окружности рисуются в Гугл Мапс, но проверка объектов (находятся ли они в области отображения карты,чтобы для всех объектов не рисовать) нагружает компьютер пользователя

 

И вопрос к разработчикам:

Как реализован рассчет времени в пути?

26 комментариев

Боюсь это не разрешимая в лоб задача.

Потому что за 10 минут можно проехать пол москвы, что дает радиус поиска в 5-10 километров.

Длина дуги будет pi*R. Маршрут надо (пытаться) строить на каждые 50 метров. Это сильно больше 360 попыток.

Потом еще будет проблема с анализом результатов.

 

Проще, наверное, скачать граф дорог(openstreetmap) и приложить к нему немного математики.

Виталий Ч.
28 января 2016, 02:18

Не подскажите где можно слой дорог скачать?

Сколько на OSM не лазин-не нашел.:-(

http://gis-lab.info/projects/osm_dump/index.html + osmosis с фильтром(accept-ways tag=hightway) на экспорт.

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

Виталий Ч.
28 января 2016, 02:18

Темный лес для меня,конечно,но все равно спасибо!

Постараюсь разобраться

Виталий Ч.
28 января 2016, 02:18

что-то не нахожу где включать эти самые фильтры((

 

Виталий Ч.
28 января 2016, 02:18

спасибо.так понятней

Виталий Ч.
28 января 2016, 02:18

Антон,не подскажите,а что с этим файлом теперь делать?

Он почти 4ГБ.Пробовал окрыть полюбоваться-оперативки не хватило ))

 

С каким именно?

Из осмоса много чего выходит. Лично я преврашаю его в sql дамп, и в базу

Виталий Ч.
28 января 2016, 02:18

С output.osm

А что в базе в таком случае хранится? Описание объектов с их хар-ками?

 

osm кушают только средства osm

Надо было в sql - на странице детального использования есть ряд плагинов которые умеют sql дамп делать

Виталий Ч.
28 января 2016, 02:18

Я,видимо, не совсем замысел понял.Как этот дамп поможет в решении вышепоставленной задачи?

Сечас попробую на sql-сервер залить

 

У вас будет геометрия дорог. В том числе будут повороты.

Кстати - в наборе инструментов osm есть и маршрутизаторы, которые можно поставить себе и хоть миллион запросов в секунду делать.

Виталий Ч.
28 января 2016, 02:18

MS SQL не поддерживает что ли?

Нашел только PostGIS и MySQL :-(

 

MySql в плане данных(инсертов те) полностью совместим со всем

Виталий Ч.
28 января 2016, 02:18

osmosis ругается на отсутствие команды

 скрин 

http://kashey.ru/maps/ways.sql.gz - дамп дорог по всей России.

В начале смотрим в таблицу way_bounds и выбираем от туда все дороги в нужной области (можно конечно через ноды искать, но там ключей на координаты нет)

Далее как-то выбираем дорогу от которой начинаем.

Далее работаем хитрее -

берем все дороги которые имеют в заданой общие ноды

SELECT wayId,nodeid FROM ways_nodes as wn LEFT JOIN ways_nodes as wn2 ON wn.nodeId=wn2.nodeId WHERE wn2.wayId=$MYWAY$ and wn.wayId!=$MYWAY$ GROUP BY wayId

Те находим все варианты свернуть с дороги. Далее пошли расширяться и в рекурсию.

Одновременно надо запоминать откуда пришли(чтобы не вернуться обратно) и саму линию. По превышению длины - останавливаться.

Время по эмпирической формуле 60км/ч + штраф за повороты.

Либо - http://wiki.openstreetmap.org/wiki/Routing/online_routers

Виталий Ч.
28 января 2016, 02:18

Я уже наверно достал,но архив битый.

Пробовал 7-zip и winRAR. В первом "файл испорчен",во втором-ошибка CRC

перезалил - http://kashey.ru/maps/ways.sql.zip

 gzip - он, как не странно, разный бывает.

Виталий Ч.
28 января 2016, 02:18

Видимо,не судьба-ошибка осталась.WinRAR восстанавливать архив отказался.Хотя умеет zip и rar

Попробуйте 7z - им делал

правильная ссылка - http://kashey.ru/maps/ways.sql.7z :)

Виталий Ч.
28 января 2016, 02:18

:-D с 3 раза компьютер-таки согласился это разархивировать.

Огромное спасибо за мучения))

Теперь буду думать как 1,5ГБ файл скормить серверу,когда на компе оперативки 1,9ГБ...

 

Виталий Ч.
28 января 2016, 02:18

Наконец-то мне перекинули базу на сервер.

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

В таблице nodes по координатам?

или в таблице way_bounds они записаны в виде координат 2х точек отрезка?

Или каким-то другим образом?

Если way_bounds не пуста - от туда можно получить номера дорог в заданом квадрате поиска (быстро)

Там хранится "MBR" улицы, те левый-нижный/правый-верхний угол этой улицы. Прямоугольник.

Через way_nodes узнать какие точки какой дороге принадлежат(и в каком порядке)

Ну и в nodes - координаты точек.

 

 

В вашей задаче требуется найти список точек вокруг больницы с минимальным или максимальным sequence в way_nodes - начало/конец дорог или перекрестки.

Из этих точек дернуть роутер. Радиус надо подбирать так чтобы время было больше 10 минут. Возможно в разные стороны радиус будет разным.

По данным маршрутного листа можно понять начиная с какого момента маршрута время будет в допустимых пределах.

 

Ну или сделать класический A* - находим ноду около больницы, находим все дороги которые ее включают, находим все дороги которые имеют общие ноды с нодами дорог из пункта 2.

Получаем граф, считаем растояние, добавляем штрафы за повороты, и так далее.

Потом формируем тензорное пространство доступности различных зданий своего города, зашищаем докторскую, членство в РАН,....
Виталий Ч.
28 января 2016, 02:18

--находим ближайшую точку на дороге от объекта

select top 1 id,lon,lat from dbo.nodes with (nolock)

where lat-45.07143356206626 between -0.5 and 0.5 and lon-39.00430566834299 between -0.5 and 0.5

order by abs(lat-45.07143356206626)+abs(lon-39.00430566834299)

Получили id 1999293207

 

select * from dbo.ways_nodes w

left join dbo.nodes n on n.id=w.nodeid

where nodeid in(

select nodeid from dbo.ways_nodes where wayid in( 

select wayid from dbo.ways_nodes

where nodeid=1999293207))

order by nodeid,sequence

 

ну и потом разность координат между 2 точками?