Tiện ích địa lý (khoảng cách, geohash…) API
Khoảng cách (haversine, Vincenty), hướng, điểm đích, geohash, polyline Google, điểm trong đa giác, diện tích, đơn giản hoá đường và tìm điểm gần nhất.
Chọn thao tác bằng op. distance (from, to) cho khoảng cách theo vòng tròn lớn (haversine) và khoảng cách trên ellipsoid WGS 84 (Vincenty, chính xác tới milimét) theo mét, kilômét, dặm và hải lý, kèm hướng xuất phát, hướng tới, hướng la bàn và trung điểm. destination cho điểm tới được khi đi distance mét từ from theo bearing. geohash mã hoá một point (độ chính xác 1-12) hoặc giải mã geohash ra tâm, khung bao, kích thước ô và 8 ô lân cận. polyline mã hoá points thành polyline mã hoá của Google hoặc giải mã polyline (độ chính xác 5, hoặc 6 cho OSRM / Valhalla), kèm độ dài.
contains cho biết một point hoặc danh sách points có nằm trong polygon GeoJSON không (Polygon có lỗ, MultiPolygon, Feature hoặc FeatureCollection, trả về các feature chứa điểm). measure tính diện tích (m², km², ha), chu vi, độ dài đường, khung bao và tâm của GeoJSON bất kỳ. simplify giảm số điểm của đường hoặc đa giác bằng Douglas-Peucker với tolerance tính bằng mét. nearest sắp xếp tối đa 10.000 points theo khoảng cách tới from (có limit và max_distance).
Điểm viết dạng "lat,lng", [lat, lng] hoặc {"lat", "lng"} theo độ WGS 84; GeoJSON giữ thứ tự [lng, lat] của chuẩn (RFC 7946). Tính toán thuần, không lưu dữ liệu; không tìm đường hay geocode (xem /v1/vn-geo cho đơn vị hành chính Việt Nam).
Tham số
| Tên | Vị trí | Kiểu | Bắt buộc | Mặc định | |
|---|---|---|---|---|---|
op | query|body | string | có | distance, destination, geohash, polyline, contains, measure, simplify hoặc nearest. | |
from | query|body | string | không | distance / destination / nearest: điểm xuất phát "lat,lng". | |
to | query|body | string | không | distance: điểm đến "lat,lng". | |
bearing | query|body | number | không | destination: góc theo độ, chiều kim đồng hồ từ hướng bắc. | |
distance | query|body | number | không | destination: khoảng cách theo mét. | |
point | query|body | string | không | geohash (mã hoá) / contains: một điểm "lat,lng". | |
geohash | query|body | string | không | geohash: chuỗi geohash cần giải mã. | |
precision | query|body | number | không | geohash: độ dài 1-12 (mặc định 9); polyline: 5 (mặc định) hoặc 6. | |
polyline | query|body | string | không | polyline: chuỗi polyline cần giải mã. | |
points | body|query | array | không | polyline (mã hoá) / contains / simplify / nearest: [[lat, lng], …] hoặc "lat,lng;lat,lng". | |
polygon | body | object | không | contains: GeoJSON Polygon / MultiPolygon / Feature / FeatureCollection. | |
geojson | body | object | không | measure / simplify: hình học GeoJSON, Feature hoặc FeatureCollection bất kỳ. | |
tolerance | query|body | number | không | 10 | simplify: dung sai theo mét. |
limit | query|body | number | không | 10 | nearest: số điểm trả về. |
max_distance | query|body | number | không | nearest: chỉ lấy các điểm trong phạm vi bấy nhiêu mét. |
Ví dụ
curl "https://apibox.io.vn/v1/geo-tools?op=distance&from=21.0285,105.8542&to=10.7769,106.7009" \
-H "Authorization: Bearer YOUR_API_KEY"const res = await fetch('https://apibox.io.vn/v1/geo-tools?op=distance&from=21.0285,105.8542&to=10.7769,106.7009', {
method: 'GET',
headers: {
Authorization: 'Bearer YOUR_API_KEY',
},
});
const data = await res.json();
console.log(data);import requests
res = requests.get(
"https://apibox.io.vn/v1/geo-tools?op=distance&from=21.0285,105.8542&to=10.7769,106.7009",
headers={"Authorization": "Bearer YOUR_API_KEY"},
timeout=30,
)
print(res.json())<?php
$ch = curl_init('https://apibox.io.vn/v1/geo-tools?op=distance&from=21.0285,105.8542&to=10.7769,106.7009');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY'],
]);
$response = curl_exec($ch);
print_r(json_decode($response, true));Kết quả trả về
{
"op": "distance",
"from": [
21.0285,
105.8542
],
"to": [
10.7769,
106.7009
],
"haversine": {
"meters": 1143505.99,
"kilometers": 1143.50599,
"miles": 710.54168,
"nautical_miles": 617.443839
},
"vincenty": {
"meters": 1138049.892,
"kilometers": 1138.049892,
"miles": 707.151418,
"nautical_miles": 614.497782
},
"initial_bearing": 175.3078,
"final_bearing": 175.5408,
"compass": "S",
"midpoint": [
15.903112,
106.28837
],
"method": "haversine on a sphere of radius 6371008.8 m; Vincenty inverse formula on the WGS 84 ellipsoid (bearings from Vincenty)",
"note": "Points are [lat, lng] in WGS 84 degrees; GeoJSON positions are [lng, lat] as in RFC 7946."
}
Ứng dụng
- Tính quãng đường giao hàng, sắp xếp cửa hàng hay tài xế theo độ gần
- Kiểm tra chấm công GPS có nằm trong vùng đa giác cho phép không
- Giải mã polyline tuyến đường từ Google, OSRM, Valhalla
- Lưu và truy vấn vị trí theo tiền tố geohash
Hỏi đáp
Nên dùng haversine hay Vincenty?
Haversine coi Trái Đất là hình cầu, sai số có thể tới khoảng 0,5%; Vincenty dùng ellipsoid WGS 84, chính xác tới milimét. API trả cả hai.
Thứ tự toạ độ là gì?
Điểm viết lat, lng (như trên điện thoại, bản đồ); GeoJSON đầu vào và đầu ra dùng lng, lat theo đúng chuẩn.
Diện tích được tính thế nào?
Bằng công thức diện tích trên mặt cầu như turf.js (bán kính 6378137 m), trừ phần lỗ; đủ chính xác cho thửa đất, phường xã và vùng giao hàng.
API liên quan
Kiểm tra JSON
Kiểm tra cú pháp JSON, báo đúng dòng và cột bị lỗi, và validate dữ liệu theo JSON Schema (draft 4, 7, 2019-09 hoặc 2020-12).
{ }Định dạng JSON
Làm đẹp JSON với thụt lề 0-8 dấu cách hoặc tab, rút gọn (minify) hoặc sắp xếp key theo bảng chữ cái. Báo lỗi cú pháp kèm dòng và cột.
CSVCSV sang JSON
Chuyển CSV thành mảng object JSON theo dòng tiêu đề, tự nhận dấu phân cách, tự chuyển số và boolean, báo lỗi từng dòng.