Tuần này trên Hacker News có một project được hơn 1500 điểm: Local Wikipedia . Nó chỉ hiện các bài Wikipedia về những địa điểm cách bạn khoảng nửa tiếng đi bộ. Ý tưởng nghe thì đơn giản, nhưng làm thử mới thấy đây là bài toán geospatial kinh điển mà dev Việt mình gặp suốt: app giao đồ ăn tìm quán gần, app bất động sản lọc căn hộ quanh trường học, app du lịch gợi ý điểm tham quan quanh khách sạn.
Mình từng thấy nhiều team làm kiểu này: lấy lat/lng ra, tính khoảng cách bằng công thức Haversine trong code, rồi sort. Với 500 record thì vẫn chạy. Lên 5 triệu record thì server bắt đầu kêu. Bài này mình chia sẻ cách làm đúng ngay từ đầu, gồm 3 tầng: lấy dữ liệu (Wikipedia GeoSearch API), lưu và query nhanh (PostGIS), và tính đúng "30 phút đi bộ" thay vì "bán kính 2.4km" (dùng isochrone với Valhalla).
Kiến trúc tổng quan
flowchart LR A[Wikipedia GeoSearch API] -->|crawl theo grid| B[Python ingest script] B --> C[(PostgreSQL 16 + PostGIS 3.4)] U[User: lat, lng] --> D[API backend] D -->|1.…