Расчет дорожного расстояния с использованием широт и долгот в таблицах excel / google - PullRequest
0 голосов
/ 03 сентября 2018

Я ищу расстояние между двумя адресами. У меня есть почтовый индекс и широта и долгота каждого адреса.

Я выложил его в сетке (см. Изображение в приложении), так как есть 500 адресов, между которыми мне нужны расстояния, и я не могу найти лучший способ сделать это.

see image attached

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

Я новичок в отношении кодирования, и я медленно учил себя, но мне нужен способ, чтобы он просматривал каждый набор и заполнял соответствующую / соответствующую клетку.

Я знаю о API Google, но не совсем уверен, как он работает, или как мне реализовать что-то подобное в моих скриптах.

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Google API-матрица расстояний предоставляет данные о путешествии, расстоянии и времени для матрицы мест отправления и назначения. API возвращает информацию на основе рекомендованного маршрута между начальной и конечной точками, рассчитанного API Карт Google, и состоит из строк, содержащих значения продолжительности и расстояния для каждой пары точек.

Набор API Карт Google, позволяющий совершать несколько бесплатных звонков в день, но недавно они изменили свою структуру выставления счетов, поэтому вам нужно будет настроить платежную учетную запись. Вот новые цены на API для Матрицы расстояний (если вам не удалось получить бесплатную пробную версию). В основном, от 5 до 10 долларов США за каждые 1000 вызовов API.

Есть несколько конкретных примеров здесь того, как вызывать API через веб-браузер или программно.


Использование формулы листа Excel для создания ссылок

Это создаст ссылки на страницу с указаниями маршрута поездки в Картах Google (которая включает расстояние) и ускорит процесс (если у вас есть хотя бы базовые знания Excel).

  1. Введите свои наборы координат в таблицу Excel, по два набора координат на строку в ячейках от A до D, начиная со строки 2, в порядке Origin Latitude, Origin Longitude, Destination Latitude, Destination Longitude. См. Изображение ниже .

  2. Вставьте эту формулу в ячейку E2:
    =HYPERLINK("https://www.google.ca/maps/dir/'" & A2 & "," &B2&"'/'" & C2 & "," &D2&"'/@"&AVERAGE(A2,C2)&","&AVERAGE(B2,D2) &",12z/")

  3. «Заполнить» или скопировать / вставить формулу , чтобы она была во всех строках с координатами.

  4. Нажмите каждую ссылку , чтобы загрузить Карты Google для этой поездки, и вручную запишите расстояние проезда для каждого набора координат.
    (Обратите внимание, что в каждой поездке может быть несколько вариантов в зависимости от того, по какому маршруту вы путешествовали.)

Нажмите на изображение, чтобы увеличить.

image

Результат в браузере:

image

С приличным подключением к Интернету я полагаю, что каждая из них занимает 10-15 секунд, так что вы смотрите примерно на час.

(Я предлагаю разбить его вместо того, чтобы пытаться делать их все за один раз. Еще лучше, заплатить ребенку или завести нескольких детей и сделать из него игру ...) ?


Функция с использованием Google Maps API

Я вспомнил функцию, которую я спрятал, что , кажется, по-прежнему работает бесплатно ... но, основываясь на новых правилах ценообразования, я не удивлюсь, если это сработает только для нескольких вызовов. день (для «тестирования»).

  1. Этот метод использует исходные и конечные местоположения в двух ячейках (вместо четырех), но более гибок при вводе местоположений. Пример:

    img

  2. В 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
  1. В приведенном выше примере вы должны ввести в ячейку 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

image Сферический треугольник, решаемый по закону Haversines

0 голосов
/ 03 сентября 2018

Я бы сделал это с помощью arcgis: Вы строите две точки У вас должен быть некоторый шейп-файл дороги, содержащий дорогу, которую вы хотите вычислить, расстояние, которое вы обрезаете, чтобы увидеть точки, а затем вы измеряете обрезанный полилин

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...