0

Google BigQuery - Bài học 23: BigQuery GIS (Geospatial Analytics) – Kiểu dữ liệu GEOGRAPHY và bài toán định vị Logistics

Chào anh em! Qua Bài học 22, chúng ta đã biết cách "với tay" ra bên ngoài để gọi các Microservice trên Cloud Run thông qua Remote Functions. Hôm nay, chúng ta chuyển hướng sang một lĩnh vực cực kỳ thú vị và gắn liền với thực tế vận hành hệ thống của rất nhiều doanh nghiệp công nghệ (đặc biệt là bài toán giao vận, thương mại điện tử, hoặc hệ thống vận tải hành khách như Metro Line 1): BigQuery GIS (Geospatial Analytics - Phân tích không gian địa lý).

Nếu bạn đang làm việc trong các bài toán Logistics, bạn chắc chắn đã từng đau đầu với những câu hỏi kiểu như:

  • "Khách hàng này đặt đơn ở địa chỉ đó, vậy nó nằm trong phạm vi giao hàng của kho tổng số mấy?"

  • "Tài xế shipper đang đứng cách cửa hàng bao nhiêu mét?"

  • "Hãy tính tổng số lượng đơn hàng được giao thành công nằm trong bán kính 3km quanh một trạm ga Metro."

Trước đây, để giải quyết các bài toán tọa độ hình học này, các lập trình viên Backend thường phải cài đặt các extension phức tạp như PostGIS trên PostgreSQL, hoặc cắn răng viết các thuật toán hình học không gian (như Haversine formula) lồng vào code ứng dụng vì sợ Database không kham nổi.

Nhưng với BigQuery GIS, Google tích hợp sẵn một hệ thống xử lý không gian địa lý cực mạnh, cho phép bạn thao tác với hàng trăm triệu điểm tọa độ trên bề mặt Trái Đất chỉ bằng vài dòng SQL thuần túy! Hãy cùng mổ xẻ ngay nhé!

1. Kiểu dữ liệu GEOGRAPHY và Tiêu chuẩn OGC mở

Trong GoogleSQL, toàn bộ các đối tượng hình học (điểm, đường, vùng) được gom chung vào một kiểu dữ liệu nguyên bản duy nhất mang tên GEOGRAPHY.

BigQuery GIS tuân thủ tuyệt đối theo tiêu chuẩn quốc tế OGC (Open Geospatial Consortium) và sử dụng hệ quy chiếu tọa độ chuẩn toàn cầu WGS 84 (hệ tọa độ GPS mà Google Maps, điện thoại thông minh và các thiết bị định vị đang sử dụng).

Các hình thức biểu diễn không gian phổ biến trong GEOGRAPHY:

  1. POINT (Điểm): Đại diện cho một tọa độ cụ thể (Kinh độ, Vĩ độ) như vị trí nhà khách hàng, vị trí xe đang chạy.

    • Cú pháp: ST_GeogPoint(longitude, latitude) (Lưu ý: Kinh độ - Longitude đứng trước, Vĩ độ - Latitude đứng sau!)
  2. LINESTRING (Đường): Tập hợp nhiều điểm nối tiếp nhau tạo thành một đường đi (ví dụ: lộ trình di chuyển của xe tải giao hàng).

  3. POLYGON (Vùng / Đa giác): Một vùng khép kín bao bọc bởi các đường biên (ví dụ: ranh giới hành chính của một quận, hoặc vùng bán kính giao hàng 5km quanh kho).

2. Bộ công cụ hàm hình học "Thần thánh" trong BigQuery GIS

Thay vì phải tự viết code toán học phức tạp để tính khoảng cách trên mặt cầu trái đất, GoogleSQL cung cấp sẵn hàng chục hàm bắt đầu bằng tiền tố ST_ (Spatial Type / Spatial Analysis). Hãy điểm mặt những hàm quan trọng nhất:

2.1. ST_Distance(geo1, geo2) – Tính khoảng cách chính xác (mét)

Tính khoảng cách ngắn nhất giữa hai đối tượng địa lý (tính theo đường chim bay trên bề mặt hình cầu của Trái Đất), kết quả trả về tính bằng mét.

SQL

-- Tính khoảng cách giữa kho hàng (Điểm A) và nhà khách hàng (Điểm B)
SELECT 
    ST_Distance(
        ST_GeogPoint(106.660172, 10.762622), -- Tọa độ Quận 1, TP.HCM (Long, Lat)
        ST_GeogPoint(106.700981, 10.775659)  -- Tọa độ một điểm khác tại TP.HCM
    ) AS distance_in_meters;

2.2. ST_Contains(polygon, point) – Kiểm tra điểm có nằm trong vùng không (BOOLEAN)

Cực kỳ hữu ích cho bài toán phân chia khu vực giao hàng (Geofencing):

SQL

-- Kiểm tra xem tọa độ của khách hàng có nằm bên trong vùng đa giác (Polygon) của kho vận hay không
SELECT 
    ST_Contains(store_delivery_polygon, customer_location_point) AS is_in_delivery_zone
FROM `my-project.logistics.delivery_zones`;

2.3. ST_DWithin(geo1, geo2, distance) – Khoảng cách nằm trong ngưỡng cho phép

Thay vì tính toán khoảng cách ra một con số rồi mới đem đi so sánh (ST_Distance(...) <= 3000), hàm ST_DWithin được tối ưu hóa cực nhanh để kiểm tra xem hai điểm có nằm trong bán kính cho trước hay không (ví dụ: tìm tất cả tài xế trong bán kính 3km).

3. Thực chiến: Giải quyết bài toán Logistics "Tìm kho hàng gần nhất cho đơn hàng"

Hãy giả lập một bài toán thực tế: Bạn có một bảng chứa danh sách các Kho hàng (warehouses) và một bảng chứa danh sách Đơn hàng mới (new_orders) kèm theo tọa độ địa lý của khách hàng. Bạn muốn tự động gán mỗi đơn hàng về kho hàng ở gần vị trí của khách nhất để tối ưu chi phí vận chuyển.

Với sức mạnh của BigQuery GIS, bạn có thể thực hiện việc này bằng một câu lệnh kết hợp Spatial JOIN cực kỳ thanh lịch:

SQL

SELECT 
    o.order_id,
    o.customer_address,
    w.warehouse_name,
    -- Tính khoảng cách thực tế từ nhà khách đến kho được gán (tính bằng km)
    ROUND(ST_Distance(o.customer_location, w.warehouse_location) / 1000, 2) AS distance_km
FROM (
    -- Danh sách đơn hàng mới hôm nay
    SELECT order_id, customer_address, customer_location 
    FROM `my-project.logistics.new_orders`
    WHERE DATE(created_at) = '2026-10-18'
) AS o
CROSS JOIN (
    -- Danh sách các kho hàng hiện có
    SELECT warehouse_id, warehouse_name, warehouse_location 
    FROM `my-project.logistics.warehouses`
) AS w
-- Sử dụng kỹ thuật QUALIFY kết hợp ROW_NUMBER để chọn ra kho có khoảng cách ngắn nhất cho từng đơn hàng
QUALIFY ROW_NUMBER() OVER(PARTITION BY o.order_id ORDER BY ST_Distance(o.customer_location, w.warehouse_location) ASC) = 1;

  • Sức mạnh hiển hiện: Dremel và cụm tính toán không gian của BigQuery xử lý hàng triệu tọa độ GPS, thực hiện phép tính hình học cầu trái đất và chọn ra kho gần nhất chỉ trong vài giây mà không cần nhờ đến bất kỳ hệ thống GIS chuyên dụng nào bên ngoài.

4. Tối ưu hiệu năng: Kỹ thuật "Spatial Indexing" với Geohash / H3

Khi dữ liệu vị trí (GPS logs từ hàng chục ngàn xe tải hoặc tài xế giao hàng liên tục gửi về mỗi giây) phình to lên đến hàng tỷ bản ghi, việc bắt Dremel tính toán khoảng cách hình học (ST_Distance) trực tiếp trên mọi điểm sẽ tiêu tốn rất nhiều tài nguyên CPU.

Để tối ưu hóa các hệ thống bản đồ quy mô lớn (Large-scale Geospatial Systems), các kỹ sư thường sử dụng kỹ thuật Spatial Indexing thông qua các hệ thống mã hóa lưới ô vuông toàn cầu như Google S2 hoặc Uber H3 Index.

Sử dụng hàm mã hóa lưới S2 trong BigQuery:

BigQuery tích hợp sẵn các hàm chuyển đổi tọa độ thành các mã lưới S2 Cell ID:

SQL

-- Chuyển đổi một tọa độ GPS thành mã S2 Cell ở cấp độ chi tiết (Level 15)
SELECT 
    ST_GeogPoint(106.660172, 10.762622) AS my_point,
    ST_AsText(ST_GeogPoint(106.660172, 10.762622)) AS wkt_point,
    -- Tạo mã S2 Cell đại diện cho ô vuông chứa tọa độ này
    S2_CellId(ST_GeogPoint(106.660172, 10.762622), 15) AS s2_token

  • Ứng dụng thực tế: Thay vì tính khoảng cách hình học phức tạp giữa các điểm, bạn có thể nhóm dữ liệu (GROUP BY) theo mã s2_token hoặc h3_index để đếm số lượng tài xế đang có mặt trong cùng một ô vuông bản đồ với tốc độ cực kỳ chớp nhoáng!

Tổng kết Bài học 23

BigQuery GIS mang đến khả năng phân tích không gian địa lý chuẩn xác ngay bên trong Data Warehouse:

  1. Kiểu dữ liệu GEOGRAPHY: Hỗ trợ chuẩn OGC toàn cầu (POINT, LINESTRING, POLYGON) dựa trên hệ quy chiếu WGS 84.

  2. Hàm không gian ST_: Dễ dàng tính toán khoảng cách (ST_Distance), kiểm tra vùng bao phủ (ST_Contains, ST_DWithin) mà không cần cài đặt thêm extension phức tạp.

  3. Ứng dụng Logistics: Giải quyết mượt mà các bài toán gán kho hàng gần nhất, định vị vùng giao hàng và tối ưu hóa tuyến đường.

Nhưng trong quá trình vận hành hệ thống dữ liệu, tai nạn là điều luôn có thể xảy ra: Một lập trình viên sơ suất chạy nhầm câu lệnh UPDATE hoặc DELETE làm bay màu dữ liệu của cả một bảng triệu dòng vào lúc nửa đêm. Làm thế nào để "quay ngược thời gian" cứu dữ liệu mà không cần tốn công khôi phục từ bản backup cũ?

Hẹn gặp lại anh em ở Bài học 24: Time Travel & Fail-safe – Cách "quay ngược thời gian" cứu dữ liệu bị xóa nhầm hoặc UPDATE sai trong vòng 7 ngày!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí