Tính khoảng cách giữa 2 điểm trên Google Map API
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.
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, " tim_e = Left(bodytxt, InStr(1, bodytxt, "") - 1) bodytxt = Right(bodytxt, Len(bodytxt) - InStr(1, bodytxt, " distanc_e = Left(bodytxt, InStr(1, bodytxt, "") - 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, " tim_e = Left(bodytxt, InStr(1, bodytxt, "") - 1) bodytxt = Right(bodytxt, Len(bodytxt) - InStr(1, bodytxt, " distanc_e = Left(bodytxt, InStr(1, bodytxt, "") - 1) get_dis = distanc_e / 1000 Set oXH = Nothing End Function Code3 - Chỉ tính thời gian
bodytxt = Right(bodytxt, Len(bodytxt) - InStr(1, bodytxt, " tim_e = Left(bodytxt, InStr(1, bodytxt, "") - 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
|