Geocode địa chỉ Việt Nam: đổi địa chỉ thành tọa độ bằng API

Trả lời nhanh: gọi GET https://map.vapp.vn/api/v1/geocode?q=<địa chỉ>. API tách địa chỉ thành số nhà, đường, phường/xã, quận/huyện, tỉnh, tìm đúng con đường trong đúng tỉnh, rồi đặt số nhà lên đường đó. Địa chỉ ghi theo kiểu mới (sau 01/07/2025, không có quận) và kiểu cũ (có quận, huyện) đều dùng được. Kết quả tốt nhất là results[0], với lat, lng và mức tin cậy confidence.

Vì sao địa chỉ Việt Nam khó geocode

Bước 1 — Gọi API geocode

curl -G "https://map.vapp.vn/api/v1/geocode" \
  --data-urlencode "q=54 Nguyễn Huệ, phường Sài Gòn, TP.HCM" \
  --data-urlencode "limit=1"

parsed là địa chỉ đã tách (viết thường, không dấu); results[0] là kết quả tốt nhất, có lat, lng.

Tham sốÝ nghĩa
qĐịa chỉ hoặc tên địa điểm, có dấu hoặc không dấu.
limitSố kết quả tối đa, từ 1 đến 25, mặc định 8. Khi geocode hàng loạt, dùng limit=1.

Gửi khóa trong header x-api-key như mọi API khác (xem hướng dẫn chuyển từ Google Maps).

Bước 2 — Đọc kết quả

TrườngÝ nghĩa
lat, lngTọa độ (WGS 84), ở cấp trên cùng của mỗi kết quả.
name, kindTên đường hoặc địa điểm đã khớp, và loại của nó (đường, địa danh, cửa hàng…).
provinceTỉnh, thành phố chứa tọa độ, theo ranh giới hành chính trên OpenStreetMap.
districtĐơn vị hành chính cấp dưới tỉnh chứa tọa độ, theo cùng ranh giới. Ranh giới hiện tại là phường, xã mới, nên trường này thường là tên phường, xã mới (ví dụ "Phường Sài Gòn"), dù tên trường vẫn là district.
precisioninterpolated: số nhà được nội suy dọc đường. Không có trường này: tọa độ là điểm đã lưu của đường hoặc địa điểm đó.
place_idMã ổn định của kết quả (vm_…), dùng để lưu và so sánh.
parsedỞ cấp trên cùng của phản hồi: địa chỉ bạn gửi đã tách thành house, street, ward, district, province (viết thường, không dấu). Xem trường này trước tiên khi kết quả sai.
confidenceÝ nghĩa
exactTên khớp tốt (đường, địa danh hoặc đơn vị hành chính)
streetĐúng đường; số nhà được nội suy dọc đường, hoặc chỉ khớp tên đường
districtChỉ khớp một đơn vị hành chính
approximateGần đúng: kiểm tra lại
fuzzyMơ hồ: không nên dùng tự động

confidence nói tên đã khớp tốt đến đâu, không bảo đảm tọa độ đúng tỉnh. Hãy luôn so province của kết quả với tỉnh trong địa chỉ của bạn.

Bước 3 — Địa chỉ cũ và địa chỉ mới

Không cần đổi địa chỉ cũ sang địa chỉ mới trước khi geocode. Lệnh gọi dưới đây ghi địa chỉ ở Bước 1 theo kiểu cũ, và cho cùng tọa độ:

curl -G "https://map.vapp.vn/api/v1/geocode" \
  --data-urlencode "q=54 Nguyễn Huệ, quận 1, TP.HCM" \
  --data-urlencode "limit=1"

Không cần đổi địa chỉ cũ sang địa chỉ mới trước khi geocode: quận cũ được dùng để chọn đúng đường. Phường số cũ cũng dùng được, ví dụ "phường 4, quận 8". Nếu bạn cần cả địa chỉ mới để lưu, đổi bằng API address/convert trong hướng dẫn chuẩn hoá địa chỉ sau sáp nhập.

Bước 4 — Số nhà và hẻm

Khi địa chỉ có số nhà, API tìm con đường rồi đặt số nhà dọc theo đường đó, dựa trên các hẻm và địa điểm đã biết số nhà trên cùng đường. Với số nhà nhiều cấp như 749/45/16, API dùng số đầu tiên (đầu hẻm 749 trên đường chính). Kết quả loại này có precision: "interpolated" và confidence: "street".

Tọa độ nội suy nằm trên tim đường, không phải trên mái nhà. Muốn giao hàng tới tận cửa trong hẻm sâu, hãy cho người nhận chỉnh lại vị trí trên bản đồ, hoặc gọi API đổi tọa độ thành địa chỉ (/api/v1/reverse) để họ xác nhận.

Bước 5 — Địa danh, không dấu, gõ sai

curl -G "https://map.vapp.vn/api/v1/geocode" \
  --data-urlencode "q=cho ben thanh" \
  --data-urlencode "limit=3"

Tên được so khớp cả khi không dấu và khi gõ sai nhẹ. Kết quả trả về tên có dấu. Khi người dùng đang gõ, dùng API gợi ý /api/v1/autocomplete thay cho geocode: mỗi gợi ý đã có tọa độ.

Bước 6 — Geocode hàng loạt

  1. Ghép mỗi địa chỉ thành một chuỗi đủ phần: số nhà, đường, phường/xã, (quận/huyện nếu là địa chỉ cũ), tỉnh/thành phố.
  2. Ghi tên tỉnh, thành phố đầy đủ hoặc theo dạng thường dùng ("TP.HCM", "Hồ Chí Minh", "Đà Nẵng"). Khi không có tỉnh, một tên đường phổ biến có thể khớp với đường cùng tên ở tỉnh khác.
  3. Gọi với limit=1; lưu lat, lng, place_id, confidence và precision cạnh địa chỉ gốc.
  4. Đánh dấu để kiểm tra riêng các dòng có province khác tỉnh trong địa chỉ, có confidence là approximate hoặc fuzzy, hoặc không có kết quả.
  5. Lưu kết quả lại: cùng một địa chỉ không cần geocode lại mỗi lần dùng.

Mỗi địa chỉ là một lượt gọi API, tính vào hạn mức của gói (xem bảng giá).

Giới hạn cần biết

Ví dụ API trên được kiểm tra tự động với API thật trước mỗi lần cập nhật trang, kể cả tỉnh mà kết quả đầu tiên phải nằm trong.