Google API-матрица расстояний предоставляет данные о путешествии, расстоянии и времени для матрицы мест отправления и назначения. API возвращает информацию на основе рекомендованного маршрута между начальной и конечной точками, рассчитанного API Карт Google, и состоит из строк, содержащих значения продолжительности и расстояния для каждой пары точек.
Набор API Карт Google, позволяющий совершать несколько бесплатных звонков в день, но недавно они изменили свою структуру выставления счетов, поэтому вам нужно будет настроить платежную учетную запись. Вот новые цены на API для Матрицы расстояний (если вам не удалось получить бесплатную пробную версию). В основном, от 5 до 10 долларов США за каждые 1000 вызовов API.
Есть несколько конкретных примеров здесь того, как вызывать API через веб-браузер или программно.
Использование формулы листа Excel для создания ссылок
Это создаст ссылки на страницу с указаниями маршрута поездки в Картах Google (которая включает расстояние) и ускорит процесс (если у вас есть хотя бы базовые знания Excel).
Введите свои наборы координат в таблицу Excel, по два набора координат на строку в ячейках от A
до D
, начиная со строки 2, в порядке Origin Latitude, Origin Longitude, Destination Latitude, Destination Longitude
. См. Изображение ниже .
Вставьте эту формулу в ячейку E2
:
=HYPERLINK("https://www.google.ca/maps/dir/'" & A2 & "," &B2&"'/'" & C2 & "," &D2&"'/@"&AVERAGE(A2,C2)&","&AVERAGE(B2,D2) &",12z/")
«Заполнить» или скопировать / вставить формулу , чтобы она была во всех строках с координатами.
Нажмите каждую ссылку , чтобы загрузить Карты Google для этой поездки, и вручную запишите расстояние проезда для каждого набора координат.
(Обратите внимание, что в каждой поездке может быть несколько вариантов в зависимости от того, по какому маршруту вы путешествовали.)
Нажмите на изображение, чтобы увеличить.
Результат в браузере:
С приличным подключением к Интернету я полагаю, что каждая из них занимает 10-15 секунд, так что вы смотрите примерно на час.
(Я предлагаю разбить его вместо того, чтобы пытаться делать их все за один раз. Еще лучше, заплатить ребенку или завести нескольких детей и сделать из него игру ...) ?
Функция с использованием Google Maps API
Я вспомнил функцию, которую я спрятал, что , кажется, по-прежнему работает бесплатно ... но, основываясь на новых правилах ценообразования, я не удивлюсь, если это сработает только для нескольких вызовов. день (для «тестирования»).
Этот метод использует исходные и конечные местоположения в двух ячейках (вместо четырех), но более гибок при вводе местоположений. Пример:
В Excel вставьте этот код в новый (стандартный) модуль. ( Вот как. )
Public Function GetDistance(start As String, dest As String)
'Returns Google Maps driving distance between two points in kilometres
Dim url As String, html As String, regEx As Object, matches As Object
url = "http://maps.googleapis.com/maps/api/distancematrix/json?" & _
"origins=" & Replace(start, " ", "+") & "&destinations=" & _
Replace(dest, " ", "+")
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", url, False
.Send: html = StrConv(.responseBody, vbUnicode)
Set regEx = CreateObject("VBScript.RegExp")
regEx.Pattern = """value"".*?([0-9]+)": regEx.Global = False
Set matches = regEx.Execute(html)
If matches.Count > 0 Then
GetDistance = CDbl(Replace(matches(0).SubMatches(0), ".", _
Application.International(xlListSeparator))) / 1000
Else: GetDistance = -1: End If 'there was a problem.
End With
End Function
В приведенном выше примере вы должны ввести в ячейку C2
:
=GetDistance(A2,B2)
... чтобы узнать расстояние в километрах.
Метод Хаверсин
Для полноты картины я включу метод Haversine , который математически вычисляет расстояние по "прямой линии" (без вызовов API).
Это , а не расстояние вождения. В моем тесте относительно прямого расстояния между городами этот метод отличался примерно на 15%, однако это подходит (и быстрее) для других целей, не связанных с вождением.
Excel
Public Function Distance(lat1 As Double, lon1 As Double, _
lat2 As Double, lon2 As Double) As Double
'Excel: Returns kilometres distance in a straight line Haversine)
On Error GoTo dErr
Dim dist As Double, theta As Double: theta = lon1 - lon2
dist = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) + _
Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * _
Math.Cos(deg2rad(theta))
dist = rad2deg(WorksheetFunction.Acos(dist))
Distance = dist * 60 * 1.1515 * 1.609344
Exit Function
dErr:
Distance2 = -1
End Function
Function deg2rad(ByVal deg As Double) As Double
deg2rad = (deg * WorksheetFunction.Pi / 180#)
End Function
Function rad2deg(ByVal rad As Double) As Double
rad2deg = rad / WorksheetFunction.Pi * 180#
End Function
MS Access:
Доступ немного отличается из-за отсутствия математических функций Excel, поэтому я мог бы также включить его:
Const pi = 3.14159265358979
Public Function Distance(lat1 As Double, lon1 As Double, lat2 As Double, lon2 As Double) As Double
'MS Access: Returns kilometres distance in a straight line Haversine)
Dim dist As Double, theta As Double: theta = lon1 - lon2
dist = Sin(deg2rad(lat1)) * Sin(deg2rad(lat2)) + Cos(deg2rad(lat1)) * Cos(deg2rad(lat2)) * Cos(deg2rad(theta))
Distance = rad2deg(ACos(dist)) * 60 * 1.1515 * 1.609344
End Function
Function ACos(N As Double) As Double: ACos = pi / 2 - ASin(N): End Function
Function deg2rad(ByVal deg As Double) As Double: deg2rad = (deg * pi / 180#): End Function
Function rad2deg(ByVal rad As Double) As Double: rad2deg = rad / pi * 180#: End Function
Public Function ASin(N As Double) As Double: ASin = 2 * Atn(N / (1 + Sqr(1 - (N * N)))): End Function
Сферический треугольник, решаемый по закону Haversines