Tính quãng đường vận chuyển bằng hàm API của Google Map

Ngày tạo 04/04/2021

 -  5.463 Lượt xem

Là một Logistics Procurement (người mua dịch vụ vận chuyển, hậu cần cho công ty), tôi rất quan tâm đến sự chính xác về quảng đường vận chuyển trước khi quan tâm đến giá chào dịch vụ.

Bài viết này, tôi sẽ hướng dẫn bạn cách tính km giữa 2 hoặc nhiều địa chỉ nhận hàng, giao hàng cùng 1 lúc (đặc biệt là chỉ trong 1 nốt nhạc).

Nào ta cùng bắt đầu nhé!

Trước hết, chúng ta cùng đồng ý với nhau là việc tính km giữa 02 điểm hay nhiều điểm bất kỳ trên Google Map (miễn là bạn có địa chỉ chính xác và phương thức vận tải phù hợp - tức không đi xe tải ra đảo là được) sẽ thực hiện rất dễ dàng thông qua Google Maps được cung cấp sẵn và miễn phí. Tuy nhiên, bài toán hôm nay tôi đặt ra là bạn cần tìm số km của khoảng 300 quãng đường cùng lúc. Vậy bạn sẽ mất thời gian là bao lâu để vừa lên website vừa nhập liệu, vừa đo lường và vừa ghi nhận lại. Chắc hẳn sẽ tốn khá nhiều thời gian (mà thực ra nhiều người thậm chí nhiều Công ty cung cấp dịch vụ Logistics vẫn làm như vậy hàng ngày).

Liệu có cách làm nào khác hơn không? Chắc chắn là có nhé, bạn hãy theo dõi các bước mà tôi tư duy và tiến hành.

  • Số km được tính trên Google Map mà bạn thấy chính là nhờ 1 hàm API (tạm gọi là hàm "Distance" - khoảng cách) dựa trên địa chỉ mà bạn nhập vào từ đó nó sẽ tính ra kinh độ, vĩ độ và đo lường các điểm với nhau. Nếu vậy ta chỉ cần có hàm API Distance là làm được. Thât may mắn, bạn có thể tìm thấy các API này khi đăng ký tài khoản Console với Google.

    • Bạn phải có tài khoản ngân hàng có giao dịch quốc tế (tôi dùng thẻ VISA) để đăng ký tài khoản với Google thì mới mua được API.

  • Excel và VBA là một bộ đôi hoàn hảo để thực hiện việc xử lý từ địa chỉ nhập vào đến việc tính toán số km (dựa trên địa chỉ) thông qua hàm API Distance vừa đề cập ở trên.

    • Tôi không đề cập cách thiết lập VBA cũng như giúp bạn hiểu VBA tại bài viết này. Bạn có thể tìm trên Google nhé hoặc đọc bài viết khác trên website của chúng tôi.

  • Dùng 1 file Excel có VBA kết hợp với hàm API bạn sẽ có 1 "tool" lấy được số km (và cả thời gian di chuyển) từ nhiều địa chỉ khác nhau một cách nhanh chóng.

Nào bắt đầu việc thiết lập file Excel và hàm API thôi các bạn!

Trước hết, bạn cần mở VBE của 1 file Excel bất kỳ và copy & paste code sau vào 1 module, sau đó lưu file dưới dạn ".xlsm" hoặc ".xlsb" (để macro hoạt động).

Có 03 code (mỗi code bạn paste vào 1 module), ứng với từng mục đích khác nhau:

Code1 - tính km và thời gian di chuyển

Public Function get_dis_and_time2(origin_address As String, destination_address As String)
    Dim surl                As String
    Dim oXH                 As Object
    Dim bodytxt             As String
    Dim tim_e               As String
    Dim distanc_e           As String
    Dim APIkey              As String
    APIkey = "xxx" 'https://developers.google.com/maps/documentation/javascript/get-api-key
    surl = "https://maps.googleapis.com/maps/api/distancematrix/xml?origins=" & _
    Replace(Replace(Replace(origin_address, " ", "+"), ",", "+"), "++", "+") & _
    "&destinations=" & _
    Replace(Replace(Replace(destination_address, " ", "+"), ",", "+"), "++", "+") & _
    "&mode=driving&sensor=false&units=metric&key=" & APIkey
    Set oXH = CreateObject("msxml2.xmlhttp")
        With oXH
            .Open "get", surl, False
            .send
            bodytxt = .responseText
        End With
    bodytxt = Right(bodytxt, Len(bodytxt) - InStr(1, bodytxt, "<value>") - 6)
    tim_e = Left(bodytxt, InStr(1, bodytxt, "</value>") - 1)
    bodytxt = Right(bodytxt, Len(bodytxt) - InStr(1, bodytxt, "<value>") - 6)
    distanc_e = Left(bodytxt, InStr(1, bodytxt, "</value>") - 1)
    get_dis_and_time2 = tim_e & " | " & distanc_e
    Set oXH = Nothing
End Function

Code2 - Chỉ tính km

Public Function get_dis(origin_address As String, destination_address As String)
    Dim surl                As String
    Dim oXH                 As Object
    Dim bodytxt             As String
    Dim tim_e               As String
    Dim distanc_e           As String
    Dim APIkey              As String
    APIkey = "xxx" 'https://developers.google.com/maps/documentation/javascript/get-api-key
    surl = "https://maps.googleapis.com/maps/api/distancematrix/xml?origins=" & _
    Replace(Replace(Replace(origin_address, " ", "+"), ",", "+"), "++", "+") & _
    "&destinations=" & _
    Replace(Replace(Replace(destination_address, " ", "+"), ",", "+"), "++", "+") & _
    "&mode=driving&sensor=false&units=metric&key=" & APIkey
    Set oXH = CreateObject("msxml2.xmlhttp")
        With oXH
            .Open "get", surl, False
            .send
            bodytxt = .responseText
        End With
    bodytxt = Right(bodytxt, Len(bodytxt) - InStr(1, bodytxt, "<value>") - 6)
    tim_e = Left(bodytxt, InStr(1, bodytxt, "</value>") - 1)
    bodytxt = Right(bodytxt, Len(bodytxt) - InStr(1, bodytxt, "<value>") - 6)
    distanc_e = Left(bodytxt, InStr(1, bodytxt, "</value>") - 1)
    get_dis = distanc_e / 1000
    Set oXH = Nothing
End Function

Code3 - Chỉ tính thời gian

Public Function get_time(origin_address As String, destination_address As String)
    Dim surl                As String
    Dim oXH                 As Object
    Dim bodytxt             As String
    Dim tim_e               As String
    Dim distanc_e           As String
    Dim APIkey              As String
    APIkey = "xxx"        'https://developers.google.com/maps/documentation/javascript/get-api-key
    surl = "https://maps.googleapis.com/maps/api/distancematrix/xml?origins=" & _
    Replace(Replace(Replace(origin_address, " ", "+"), ",", "+"), "++", "+") & _
    "&destinations=" & _
    Replace(Replace(Replace(destination_address, " ", "+"), ",", "+"), "++", "+") & _
    "&mode=driving&sensor=false&units=metric&key=" & APIkey
    Set oXH = CreateObject("msxml2.xmlhttp")
        With oXH
            .Open "get", surl, False
            .send
            bodytxt = .responseText
        End With
    bodytxt = Right(bodytxt, Len(bodytxt) - InStr(1, bodytxt, "<value>") - 6)
    tim_e = Left(bodytxt, InStr(1, bodytxt, "</value>") - 1)
    get_time = tim_e / 86400
    Set oXH = Nothing
End Function

Lưu ý APIkey = "xxx" ==> xxx chính là hàm API mà bạn phải mua từ Google.

 

Đây là dạng "hàm người dùng tự tạo", bạn có thể tham khảo cách sử dụng trên Google (từ khóa: user defined function)

 

Đến đây thì việc còn lại là mua 1 hàm API Distance. Nào chúng ta cùng xem cách mua như sau:

 

- Truy cập vào trang https://developers.google.com/maps/documentation/javascript/get-api-key Bạn cần đăng ký 1 tài khoản Cloud Console và 1 tài khoản ngân hàng có thanh toán quốc tế.

- Đăng ký xong tài khoản Cloud Console thì vào đăng ký API như sau:

 

 

 

Và cuối cùng là tạo được 1 API như sau:

 

Bạn cần chọn vào "Restrict Key" - tìm hiểu thêm trên Google nhé (bước này giúp bạn giới hạn quyền truy vấn của API, tránh bị lạm dụng tài nguyên...). Thú thực người viết cũng không hoàn toàn hiểu hết API của Google nên bạn tự tìm hiểu giúp nhé.

Và bây giờ chúng ta có 1 API được active như sau:

 

 

Thế là xong! Bạn có thể vào file Excel để thử đưa 2 địa chỉ vào 2 ô rồi dùng các hàm tự tạo nêu trên để lấy thông tin. Kết quả chắc chắn sẽ rất nhanh và chính xác nhé (bạn có thể tự kiểm chứng lại bằng cách nhập vào Google Map).

Lưu ý: với hàm API Distance và code VBA mình đang cung cấp là dùng cho Mode "Driving" - tức xe hơi/xe tải nhé. Hàm sẽ ưu tiên chọn đường "chính thống" nhất (cũng có thể sẽ là đường dài nhất) ví dụ như đi qua Quốc Lộ 1A hơn là đi theo đường núi....

Minh họa tính từ Excel:

 

Minh họa tính từ Google Map

 

 

 

Nguồn phát hành: ERX.VN
Nguyễn Minh Ngọc

 
 
Gọi (028) 3514 2046