Truy vấn số km giữa 2 địa điểm bất kỳ bằng "Ma trận vuông"

Ngày tạo 05/04/2021

 -  2.106 Lượt xem

Ở chủ đề "Tính quãng đường vận chuyển bằng hàm API của Google Map", chúng ta đã biết các lấy dữ liệu km và thời gian vận chuyển giữa 2 điểm (địa chỉ). Việc lấy dữ liệu này sẽ tốn phí vì dùng hàm API của Google, vậy câu hỏi đặt ra liệu chúng ta có nên tạo và lưu trữ 1 database gồm các điểm đã queries (truy vấn thông tin) và dùng nó cho các lần tiếp theo để tiết kiệm thời gian và chi phí không?

 

Bài viết này, tôi sẽ giúp các bạn làm được 1 "ma trận vuông" trong đó chứa dữ liệu km của các điểm với nhau (dữ liệu thời gian bạn làm tương tự). Trong thực tế, bạn sẽ tạo được 1 database có thông tin km toàn bộ các tỉnh, thành phố hoặc huyện của nước Việt Nam với nhau, quả thật là thú vị và chắc chắn có giá trị trong quá trình vận hành Logistics hoặc đơn giản là dùng để sourcing dịch vụ logistics.

 

Nào các bạn đã sẵn sàng chưa?

Trước hết, tôi muốn giới thiệu "nguồn gốc" của "ma trận vuông" về km giữa các điểm đó là: tôi thấy nó khắp nơi ở trên Google. Bạn có thể search với cú pháp "khoảng cách giữa các tỉnh ở Việt Nam", ngay lặp tức có đến 30,700,000 kết quả chỉ trong 0.66 giây! Bạn thật may mắn vì nó có sẵn, vậy chỉ cần dùng thôi chứ viết công cụ làm gì nhỉ?

Thực tế không phải như vậy, tôi mời bạn xem 1 bản có sẵn trên mạng như sau:

Bạn sẽ thấy thật dễ dàng để tra cứu, nhưng để tìm file excel gốc của hình trên cũng không phải dễ dàng. May mắn thay, tôi có sẵn nếu bạn cần hãy liên hệ nhé!

Opps! Nhưng tôi đang nói rằng nó (bảng km nêu trên) không chính xác mà! Vì sao vậy? Với bản trên, tôi đoán chừng tác giả đã lấy Tp HCM làm chuẩn, sau đó từ Tp HCM tính số km đến các tỉnh, rồi dùng công thức excel để nội suy các ô còn lại (một phương pháp rất thông minh và tiết kiệm thời gian). Tuy nhiên, hoàn toàn sai! Vì theo logic này thì các tỉnh sẽ sắp xếp thẳng hàng trong khi nước ta là hình chữ S (mà thực ra hiếm có nước nào mà các tỉnh sẽ "thẳng băng" như vậy cả! Hơn nữa số km cũng không chính xác vì chỉ tính đến "rìa" của tỉnh (ví dụ Biên Hòa đi HCM mà chỉ có 22km). Nếu bạn có trong tay file excel này, bạn dò thử từ Binh Dương đi Đồng Nai bạn sẽ thấy thú vị vi nó cực kỳ gần nhau (thậm chí nó sẽ bằng zero vì 2 tỉnh này theo vị trí đang tạo ra 1 hình tam giác cân với Tp HCM).

Tôi sẽ không dùng bảng nêu trên mà dùng hàm API để tính các điểm bên trong bảng đó, lúc này sẽ đảm bảo sự chính xác (như đã nói ở chủ đề "Tính quãng đường vận chuyển bằng hàm API của Google Map").

Tiếp theo là làm sao tôi có thể truy vấn ra nhanh nhất số km của 2 điểm tương quan trên "ma trận vuông" này? Thực ra có rất nhiều cách, ở bài này tôi hướng dẫn bạn 1 cách đơn giản nhất đó là dùng hàm Offset kết hợp với hàm Match (bạn có thể tìm trên Google về công dụng của 2 hàm này nhé).

Ví dụ ta có ma trận như sau:

 

Cột A: chứa thông tin liên quan tên của từng vị trí vận chuyển (thường trong Logistics sẽ là Sold_to hoặc Ship_to): ABC, DEF và XYZ (dĩ nhiên là còn nhiều nữa nhé).

Cột B: chứa thông tin địa chỉ của từng điểm

Dòng 1: chứa thông tin liên quan tên của từng vị trí vận chuyển (thường trong Logistics sẽ là Sold_to hoặc Ship_to): ABC, DEF và XYZ (dĩ nhiên là còn nhiều nữa nhé).

Dòng 2: chứa thông tin địa chỉ của từng điểm

Nhiệm vụ là ta sẽ input vào 2 ô với thông số của 2 điểm giao và hàm Offet + Match sẽ cho chúng ta 1 giao điểm giữa cột và dòng, đó chính là số km giữa 2 điểm đó.

Ta xét công thức tại ô D75 như hình bên dưới. Hàm Offet sẽ lấy ô tham chiếu là ô có chưa số km đầu tiên của ma trận vuông (ô C3) và ô này sẽ dịch chuyển theo chiều dọc (rows) và chiều ngang (cols) ứng với thông số được tính toán bởi hàm Match.

Và kết quả của hàm này sẽ là "41.125" đó chính là giao điểm của dòng 3 và cột E.

Nếu bạn có 1 ma trận rất lớn (như ma trận tôi đã tạo cho toàn thể các quận, huyện của Việt Nam (lên đến hơn 640k điểm) thì để truy xuất nhanh bạn cần học thêm VBA để tạo ra mảng dữ liệu (phần chuyên sâu này tôi hẹn bạn ở 1 topic khác nhé).

Chúc các bạn thành công!

 

Nguyễn Minh Ngọc

TIN NỔI BẬT

Không tìm thấy dữ liệu
loading_ring_50.svg

 
 
Gọi (028) 3514 2046