Hướng dẫn xây dựng tính năng phân vùng giao hàng (Delivery Zones) tại Việt Nam bằng Map API
Hướng dẫn từng bước cách lập trình tính năng khoanh vùng giao hàng, tính phí ship và lọc địa chỉ theo quận huyện, phường xã tại Việt Nam.
Nếu bạn đang xây dựng một ứng dụng thương mại điện tử, app giao đồ ăn hoặc hệ thống logistics tại Việt Nam, bài toán đầu tiên bạn cần giải là: Làm sao để khoanh vùng phục vụ và tính phí giao hàng tự động?
Nhiều đội ngũ bắt đầu bằng việc tính phí theo bán kính (bán kính 2km, 5km...). Tuy nhiên, phương pháp này rất thiếu chính xác tại các đô thị lớn ở Việt Nam do sông ngòi, cầu cống, đường một chiều hoặc tình trạng kẹt xe.
Phương pháp tối ưu và thực tế nhất được các ông lớn như Grab, Shopee, hay Giaohangtietkiem áp dụng là phân vùng giao hàng theo địa giới hành chính (Quận/Huyện, Phường/Xã).
Bài viết này hướng dẫn chi tiết cách xây dựng tính năng phân vùng giao hàng bằng code thực tế, sử dụng dữ liệu ranh giới của GoGoDuk Map API và thư viện Turf.js.
Ý tưởng thiết kế hệ thống Phân vùng giao hàng
Hệ thống hoạt động qua 4 bước cơ bản:
- Định nghĩa vùng phục vụ: Bạn lấy đa giác ranh giới (boundary polygon) của các quận/huyện hoặc phường/xã muốn phục vụ.
- Chuẩn hóa địa chỉ khách hàng: Khi khách hàng nhập địa chỉ ở trang checkout, gợi ý địa chỉ tự động và phân giải nó thành một cặp tọa độ GPS (Vĩ độ - Kinh độ).
- Kiểm tra ranh giới (Point-in-Polygon): Chạy thuật toán kiểm tra xem điểm tọa độ của khách hàng nằm trong đa giác ranh giới nào.
- Tính phí: Áp dụng mức phí ship đã cấu hình cho phân vùng đó.
Bước 1: Lấy dữ liệu ranh giới hành chính Việt Nam
Thay vì phải tự mua bản quyền dữ liệu địa giới đắt đỏ, bạn có thể gọi endpoint /v1/admin-boundaries của GoGoDuk để lấy đa giác dạng GeoJSON của 63 tỉnh/thành phố và hơn 700 quận/huyện hoàn toàn miễn phí.
Ví dụ, để lấy ranh giới của Quận 1, Thành phố Hồ Chí Minh:
Response trả về sẽ chứa thông tin địa lý dạng GeoJSON:
Bước 2: Chuẩn hóa địa chỉ và lấy tọa độ GPS
Khi khách hàng gõ địa chỉ, chúng ta dùng endpoint gợi ý tự động (suggest) để giúp người dùng chọn địa chỉ chuẩn, tránh việc họ gõ sai chính tả hay gõ địa chỉ không tồn tại.
Khi khách chọn một địa điểm trong danh sách (ví dụ: placeId = "gdk_place_12345"), ta gọi endpoint resolve để lấy tọa độ lat/lng chính xác:
Bước 3: Thuật toán kiểm tra điểm nằm trong vùng giao hàng (Point-in-Polygon)
Bây giờ bạn đã có tọa độ của khách hàng là một điểm Point = [lng, lat], và bạn có dữ liệu ranh giới của Quận 1 là một Polygon. Làm thế nào để kiểm tra điểm đó có nằm trong quận hay không?
Chúng ta có thể xử lý việc này ở tầng Backend bằng database (ví dụ PostGIS sử dụng hàm ST_Contains) hoặc xử lý trực tiếp trên ứng dụng Node.js/Browser bằng thư viện mã nguồn mở Turf.js.
Cài đặt Turf.js helper:
Đoạn code JS kiểm tra điểm nằm trong đa giác:
Bước 4: Tự động hóa tính phí vận chuyển theo Quận/Huyện
Để tối ưu hóa luồng thanh toán, bạn nên định nghĩa một danh sách biểu phí trong database của mình:
| Vùng phục vụ (ID Quận) | Phí giao hàng | Thời gian dự kiến |
|---|---|---|
| Quận 1 | 15.000 VND | 15-30 phút |
| Quận Bình Thạnh | 20.000 VND | 30-45 phút |
| Quận 7 | 30.000 VND | 45-60 phút |
Quy trình checkout tự động hoàn chỉnh trên server:
Kết luận
Xây dựng tính năng phân vùng giao hàng theo ranh giới hành chính thay vì bán kính hình tròn giúp doanh nghiệp của bạn loại bỏ các tranh chấp về phí giao hàng với shipper, hạn chế hủy đơn và dự báo chính xác thời gian vận chuyển tại các khu vực đặc thù ở Việt Nam.
Với dữ liệu địa giới được cập nhật liên tục và các API gợi ý địa chỉ tối ưu tiếng Việt của GoGoDuk, bạn có thể tự tin thiết kế hệ thống giao vận chuyên nghiệp chỉ trong vài giờ.
Bắt đầu tích hợp miễn phí ngay bằng cách truy cập tài liệu hướng dẫn tại GoGoDuk Docs.
Muốn dùng GoGoDuk?
Miễn phí trọn đời — 100 request/ngày mỗi tài khoản, không cần thẻ tín dụng. Giới hạn cao hơn theo yêu cầu.
Đăng ký →