Lạc Trôi Cùng Open Location Code: Gói Gọn Tọa Độ Trái Đất Trong 10 Ký Tự
Hôm nay, mình sẽ rẽ sang một chủ đề cực kỳ thú vị thuộc mảng Geospatial (Dữ liệu không gian địa lý). Nếu bạn từng làm Backend cho các ứng dụng giao hàng, gọi xe (như Grab, Gojek) hay bản đồ, bài toán lưu trữ và tìm kiếm vị trí là một thử thách rất "khoai".
Địa chỉ thông thường thì quá lộn xộn ("Hẻm 123/45/6, đối diện cây cột điện, thấy chó sủa thì rẽ phải"). Tọa độ Latitude/Longitude (VD: 10.762622, 106.660172) thì chính xác tuyệt đối, nhưng lại quá dài để con người đọc, nhớ hoặc chia sẻ. Chưa kể, query tìm kiếm những điểm "gần nhau" bằng tọa độ trong Database cực kỳ tốn CPU nếu không có Index chuyên dụng.
Đó là lúc Google giới thiệu một thuật toán cực kỳ thanh lịch: Open Location Code (OLC), hay còn gọi là Plus Codes. Dưới đây là bài viết mổ xẻ về nó!
Nếu bạn mở Google Maps, ghim một vị trí bất kỳ ở giữa sa mạc hoặc giữa đại dương, kéo xuống dưới cùng, bạn sẽ thấy một đoạn mã kỳ lạ trông như thế này: 7P28WVGX+XG.
Nó ngắn bằng số điện thoại, gõ lên thanh tìm kiếm của Google Maps là ra đúng vị trí đó. Không cần tên đường, không cần số nhà. Đó chính là Open Location Code (OLC).
Tại sao một Vibe Coder lại phải quan tâm đến cái mã này thay vì dùng thẳng Tọa độ (Lat/Long)?
1. Bản chất: Một mã OLC không phải là "Một Điểm", nó là "Một Cái Hộp"
Tọa độ Lat/Long 10.762622, 106.660172 đại diện cho một ĐIỂM (Point) có diện tích bằng 0.
Trong khi đó, mã OLC đại diện cho một Khu vực (Bounding Box). Trái đất được chia thành một tấm lưới khổng lồ. Mỗi ô trong lưới lại được chia nhỏ làm 400 ô con (20x20). Cứ tiếp tục chia nhỏ như vậy.
- Mã càng ngắn, cái hộp càng to (ví dụ 7P28 che phủ cả miền Nam Việt Nam).
- Mã càng dài, cái hộp càng nhỏ. Một mã tiêu chuẩn gồm 10 ký tự (có dấu
+ở giữa) như7P28WVGX+XGđại diện cho một cái hộp có kích thước khoảng 14m x 14m (Vừa bằng một căn nhà).
2. Thuật toán Offline thuần túy: Không cần gọi API!
Đây là điểm "ăn tiền" nhất của OLC. Nếu bạn dùng Google Geocoding API để biến Tọa độ thành Tên đường, bạn phải có mạng Internet, và bạn phải trả tiền cho Google (rất đắt!).
OLC là một thuật toán mã hóa toán học mã nguồn mở (Open Source). Bạn chỉ cần cài thư viện open-location-code vào Node.js hoặc PHP, ném Lat/Long vào, nó thực hiện vài phép chia và phép cộng, bùm, ra chuỗi 10 ký tự.
- Quá trình này diễn ra Offline 100%.
- Nhanh tương đương với việc băm chuỗi Hash, không độ trễ mạng (0ms network latency).
Bảng chữ cái Base20 thông minh:
OLC không dùng bảng chữ cái thông thường. Nó dùng Base20 với tập ký tự: 23456789CFGHJMPQRVWX.
Tại sao thiếu nhiều chữ vậy? Vì kỹ sư Google đã cố tình loại bỏ các chữ cái dễ gây nhầm lẫn khi đọc bằng mắt: 0 (Số không) giống O (chữ O), 1 giống I hoặc l. Thiết kế hệ thống đỉnh cao là lường trước cả sự "mắt nhắm mắt mở" của con người!
3. Vũ Khí Bí Mật Cho Backend: Tìm Kiếm Theo Tiền Tố (Prefix Matching)
Làm sao để tìm tất cả các quán Cafe nằm trong bán kính 2km quanh bạn?
Nếu dùng Lat/Long thuần, bạn phải dùng Công thức Haversine để tính khoảng cách cung tròn của Trái đất. Câu lệnh SQL của bạn sẽ chứa hàng tá hàm SIN(), COS(), SQRT(), CPU server sẽ chạy bốc khói để duyệt qua hàng triệu bản ghi.
Nếu bạn lưu thêm 1 cột olc_code trong Database, mọi thứ dễ như ăn kẹo!
Bởi vì OLC là sự chia nhỏ của lưới, nên những địa điểm nằm gần nhau sẽ có chung một phần Tiền tố (Prefix).
Ví dụ:
- Quán Cafe A:
7P28WVGX+XG - Quán Cafe B:
7P28WVGX+2A
Nhìn bằng mắt, ta thấy 8 ký tự đầu (7P28WVGX) y hệt nhau. Điều này có nghĩa toán học là: Chúng chắc chắn nằm chung trong một khu vực grid (cỡ 400m x 400m).
Lúc này, thay vì tính toán Haversine nặng nề, câu lệnh SQL của bạn chỉ đơn giản là:
SELECT * FROM cafes WHERE olc_code LIKE '7P28WVGX%'
Chỉ với một toán tử LIKE kèm ký tự % ở cuối, nó kích hoạt B-Tree Index cực nhanh (như bài Exact Match mình đã nói), giải quyết bài toán Geo-search trong chớp mắt mà không cần đến các Database chuyên dụng!
Lời kết
Vibe Coder không phải lúc nào cũng đâm đầu vào những công nghệ "đao to búa lớn". Đôi khi, một thuật toán mã hóa chuỗi thông minh từ những năm 2014 như Open Location Code lại có thể thay thế hoàn toàn một cụm Database Geospatial đắt đỏ, chỉ bằng cách lợi dụng toán tử LIKE và B-Tree Index.
Gọn gàng, chạy Offline, thân thiện với con người và tối ưu cho máy móc. Đó chính là vẻ đẹp của System Design.
Chủ đề tiếp theo: Đụng Độ Quái Vật - Xử Lý Geospatial Chuyên Sâu Bằng PostGIS
OLC rất tuyệt vời để biểu diễn điểm và tìm kiếm khu vực hình vuông. Nhưng đời không như mơ. Nếu bạn làm ứng dụng giao hàng, bạn cần tính Khoảng cách theo đường đi thực tế (Routing), xem xét đường một chiều, hoặc xem một điểm có nằm trong một Polygon (Đa giác - ví dụ: Quận 1) vẽ ngoằn ngoèo hay không. Lúc này OLC hoàn toàn bó tay.
Bạn sẽ cần đến những vũ khí hạng nặng thực sự. Ở bài viết tới, chúng ta sẽ đàm đạo về PostGIS - một Extension biến Database PostgreSQL hiền lành thành một con quái vật nhai nuốt dữ liệu không gian thực thụ. Anh em nhớ follow nhé!
All rights reserved