Страницы: 1
RSS
Нахождение оптимального маршрута при помощи Google API
 

Здравствуйте.

Решаю для себя вот такую задачу.

Сервис гугл мапс, при помощи api directions, позволяет найти оптимальный маршрут до 23 промежуточных точек.

В сети, и на этом форуме я нашел подобное решение для api  distancematrix, которое находит дистанцию между двумя населенными пунктами. Доработал эту функцию под свою задачу, но так как в VBA вообще не бум-бум, то не понимаю, как сделать, чтобы в запрос можно было добавлять промежуточные точки. На данном этапе путем добавления еще одной переменной у меня получилось добавить только одну промежуточную точку.

А как сделать так, чтобы их, промежуточных точек,  можно было добавлять множество?

Ну и сам код:

Код
Public Function Маршрут(start As String, dest As String, wpoint As String)
    Dim firstVal As String, secondVal As String, wpointVal As String, lastVal As String
    firstVal = "http://maps.googleapis.com/maps/api/directions/json?origin="
    secondVal = "&destination="
    wpointVal = "&waypoints=optimize:true|"
    lastVal = "&avoid=ferries&mode=car&language=ru"
    Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
    URL = firstVal & Replace(start, " ", "+") & secondVal & Replace(dest, " ", "+") & wpointVal & Replace(wpoint, " ", "+") & lastVal
    objHTTP.Open "GET", URL, False
    objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
    objHTTP.send ("")
    If InStr(objHTTP.responseText, """overview_polyline"" : {") = 0 Then GoTo ErrorHandl
    Set regex = CreateObject("VBScript.RegExp"): regex.Pattern = """waypoint_order"".*?([0-9]+)": regex.Global = False
    Set matches = regex.Execute(objHTTP.responseText)
    tmpVal = Replace(matches(0).SubMatches(0), ".", Application.International(xlListSeparator))
    Маршрут = CDbl(tmpVal)
    Exit Function
ErrorHandl:
    Маршрут = -1
End Function   

Изменено: Weter - 16.08.2017 14:27:33 (добавил решение)
 
Доброе время суток
Цитата
Weter написал:
В сети, и на этом форуме я нашел подобное решение для api  distancematrix
А почему бы ещё с самим API не познакомиться?
Цитата
Weter написал:
у меня получилось добавить только одну промежуточную точку.
Да, вроде всё предельно прозрачно Промежуточные точки
 
Цитата
Андрей VG написал:
А почему бы ещё с  самим API  не познакомиться?Цитата Weter  написал:
у меня получилось добавить только одну промежуточную точку. Да, вроде всё предельно прозрачно  Промежуточные точки
Добрый день. С API я познакомился и как задаются промежуточные точки понял.
У меня вопрос немного в другом - как создать в VBA, url адрес с промежуточными точками.
У меня сейчас вот что получается:
Ячейка C4 с начальным пунктом в http://maps.googleapis.com/maps/api/directions/json?origin=
+ ячейка C5  с конечным пунктом в  &destination=
+ включаем в апи оптимизацию маршрута и добавляем ячейку C6 с промежуточным пунктом в &waypoints=optimize:true|
и в конце адреса добавляем ограничения и т.д. &avoid=ferries&mode=car&language=ru
Таким образом запрос выглядит следующим образом
http://maps.googleapis.com/maps/api/directions/json?origin=Москва&destination=Москва&waypoints=optimize:true|Тула&avoid=ferries&mode=car&language=ru
Моя же проблема заключается в следующем, как кроме Тулы C6 (как в моём примере), средствами VBA добавить в запрос еще промежуточные точки C7, C8, C9 с промежуточным знаком "|" между ними?
Естественно, если в самом коде написать запрос, то все работает
http://maps.googleapis.com/maps/api/directions/json?origin=Москва&destination=Москва&amp... Посад|Смоленск&avoid=ferries&mode=car&language=ru
вот этот запрос даёт ответ "waypoint_order" : [ 3, 1, 2, 4, 0 ].

Здесь же я столкнулся с еще одной проблемой по этой теме.
Как составить шаблон для regex.Pattern = """waypoint_order"".*?([0-9]+)" Пока как не кручу он возвращает только одно значение waypoint_order, т.е. либо 3, либо 1.
 
А эта статья не поможет?
 
Возможно и помогла бы, если бы хоть чуть-чуть разбирался в программировании и в частности в VBA, а так смотрю и ничего не понимаю.
Был бы благодарен, если бы на моём примере, мне кто-нибудь помог бы составить url.
Ну и не знаю второй ли это вопрос или нет, так как тема та же, статья эта мне точно не поможет составить правильный regex.Pattern =, чтобы из waypoint_order возвращалось значение 3, 1, 2, 4, 0  
 
Решил через костыли )) Применил функцию сцепить для всех промежуточных точек и уже на эту ячейку ссылаюсь из макроса.
Обновил файл в первом сообщение, может кому будет интересно.
Кстати если промежуточных точек более 8-ми, то вам понадобится apikey от гугл. Он бесплатен, так что кому нужно тот найдет.
Код теперь такой:
Код
Public Function Маршрут(start As String, dest As String, wpoint As String, key As String)
    Dim firstVal As String, secondVal As String, wpointVal As String, lastVal As String
    firstVal = "https://maps.googleapis.com/maps/api/directions/json?origin="
    secondVal = "&destination="
    wpointVal = "&waypoints=optimize:true|"
    lastVal = "&avoid=ferries&mode=car&language=ru"
    keyVal = "&"
    Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
    URL = firstVal & Replace(start, " ", "+") & secondVal & Replace(dest, " ", "+") & wpointVal & Replace(wpoint, " ", "+") & lastVal & keyVal & Replace(key, " ", "+")
    objHTTP.Open "GET", URL, False
    objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
    objHTTP.send ("")
    If InStr(objHTTP.responseText, """overview_polyline"" : {") = 0 Then GoTo ErrorHandl
    Set regex = CreateObject("VBScript.RegExp"): regex.Pattern = """waypoint_order"".*?([\d\,\s]{2,150})": regex.Global = False
    Set matches = regex.Execute(objHTTP.responseText)
    tmpVal = Replace(matches(0).SubMatches(0), ".", Application.International(xlListSeparator))
    Маршрут = tmpVal
    Exit Function
ErrorHandl:
    Маршрут = -1
End Function
Страницы: 1
Читают тему
Наверх