Bỏ qua

Tính phí cầu đường cho xe tải, container

Phí cầu đường phụ thuộc vào hạng xe. Trong ví dụ của Route v4, trạm Km 479+200 trên cao tốc Diễn Châu – Bãi Vọt có ba mức giá 59.000đ, 96.000đ và 140.000đ tuỳ hạng xe. Báo giá cước và đối soát chi phí cho xe tải, container cần đúng hạng xe và đúng các trạm trên tuyến.

Route v4 trả phí theo từng trạm thu phí trên tuyến, tính cho đúng loại xe trong request.

Tính phí bằng Route v4

Gọi Route v4 với điểm đi, điểm đến, loại xe (vehicle) và annotations=toll. Với vehicle=truck, gửi thêm capacity là tổng trọng lượng xe tính bằng kg; tham số này bắt buộc với xe tải. Với vehicle=container, có thể gửi thêm container_feet là chiều dài container tính bằng feet. Các loại xe khác: car, motorcycle.

https://maps.vietmap.vn/api/route/v4?apikey={your-apikey}&point=18.7338,105.6209&point=17.75697,106.12351&vehicle=truck&capacity=2000&annotations=toll

Mỗi tuyến trong paths có thêm hai trường:

"toll_cost": 59000,
"tolls": [
  {
    "id": 528,
    "name": "Trạm Thu Phí Nút Giao Quốc Lộ 46B",
    "address": "Cao Tốc Diễn Châu Bãi Vọt",
    "type": "entry",
    "price": 0
  },
  {
    "id": 544,
    "name": "Trạm Thu Phí Km 479+200",
    "address": "Cao Tốc Diễn Châu Bãi Vọt",
    "type": "exit",
    "price": 59000,
    "prices": { "523": 140000, "524": 96000, "528": 59000 }
  }
]
  • toll_cost: tổng phí của tuyến, tính bằng VND, cho loại xe đã gửi.
  • tolls: các trạm trên tuyến. type là entry ở trạm xe đi vào và exit ở trạm xe đi ra, nơi thu tiền. price là giá cho loại xe đã gửi; prices là giá theo từng hạng xe, nếu có.

Khuyến nghị:

  • Tính phí theo từng chặng. Mỗi lần gọi gửi 2 point. Với chuyến nhiều điểm dừng, gọi từng chặng rồi cộng toll_cost.
  • Gửi giờ xuất phát time (ISO-8601, UTC), ví dụ time=2025-08-01T12:01:00Z, để Route v4 né đường cấm theo vùng cho đúng loại xe.
  • Một request 2 điểm tính 1 transaction. Công thức đầy đủ ở Cách tính tiền.

Ví dụ: phí cầu đường của một chuyến

Đoạn mã dưới đây tính phí cầu đường cho xe tải tổng trọng lượng 15 tấn, cộng phí theo từng chặng của chuyến.

// Node.js 18+. Gọi từ server để không lộ API key.
const KEY = process.env.VIETMAP_API_KEY;

// Phí cầu đường một chặng. from, to: "lat,lng"
async function legTolls(from, to) {
  const params = new URLSearchParams([
    ["apikey", KEY],
    ["point", from],
    ["point", to],
    ["vehicle", "truck"],
    ["capacity", "15000"],
    ["annotations", "toll"],
  ]);
  const res = await fetch(`https://maps.vietmap.vn/api/route/v4?${params}`);
  if (!res.ok) throw new Error(`Route v4: HTTP ${res.status}`);
  const data = await res.json();
  if (data.code !== "OK") throw new Error(`Route v4: ${data.code}`);
  const path = data.paths[0];
  return { total: path.toll_cost ?? 0, stations: path.tolls ?? [] };
}

// Phí cả chuyến: cộng phí từng chặng. points: ["lat,lng", ...]
async function tripTolls(points) {
  const legs = [];
  for (let i = 0; i + 1 < points.length; i++) {
    legs.push(await legTolls(points[i], points[i + 1]));
  }
  return {
    total: legs.reduce((sum, leg) => sum + leg.total, 0),
    stations: legs.flatMap((leg) => leg.stations),
  };
}

const trip = await tripTolls(["18.7338,105.6209", "17.75697,106.12351"]);
console.log("Tổng phí:", trip.total, "VND");
import os

import requests

KEY = os.environ["VIETMAP_API_KEY"]


def leg_tolls(origin, destination):
    """Phí cầu đường một chặng. origin, destination: "lat,lng"."""
    params = [
        ("apikey", KEY),
        ("point", origin),
        ("point", destination),
        ("vehicle", "truck"),
        ("capacity", "15000"),
        ("annotations", "toll"),
    ]
    resp = requests.get("https://maps.vietmap.vn/api/route/v4", params=params, timeout=30)
    resp.raise_for_status()
    data = resp.json()
    if data["code"] != "OK":
        raise RuntimeError(f"Route v4: {data['code']}")
    path = data["paths"][0]
    return path.get("toll_cost", 0), path.get("tolls", [])


def trip_tolls(points):
    """Phí cả chuyến: cộng phí từng chặng. points: ["lat,lng", ...]."""
    legs = [leg_tolls(a, b) for a, b in zip(points, points[1:])]
    return sum(total for total, _ in legs), [s for _, stations in legs for s in stations]


total, stations = trip_tolls(["18.7338,105.6209", "17.75697,106.12351"])
print("Tổng phí:", total, "VND")
Tích hợp tính phí cầu đường của VIETMAP vào dự án của tôi, cho xe tải và container, bằng Route v4.

GET https://maps.vietmap.vn/api/route/v4
  point=18.7338,105.6209
  point=17.75697,106.12351
  vehicle=truck
  capacity=15000
  annotations=toll
Đọc paths[0].toll_cost (tổng phí, VND) và paths[0].tolls (từng trạm).

Yêu cầu:
- Gọi API từ server. Đọc API key từ biến môi trường VIETMAP_API_KEY và truyền qua `apikey`, không ghi cứng trong code.
- Viết hàm tính phí theo điểm đi, điểm đến; kiểm tra mã HTTP và trả về tổng phí cùng danh sách trạm.
- Mỗi lần gọi gửi 2 point; chuyến nhiều điểm dừng thì gọi từng chặng rồi cộng lại.
- Đọc tài liệu bên dưới trước. Chỉ dùng tham số và trường dữ liệu có trong tài liệu.

Tài liệu:
- https://maps.vietmap.vn/docs/vi/map-api/toll-cost/index.txt
- https://maps.vietmap.vn/docs/vi/map-api/route-version/route-v4/index.txt
- https://maps.vietmap.vn/docs/assets/agents/routing.txt

API liên quan

Hotline
Tổng đài hỗ trợ
089.616.4567
Messenger Chat Facebook zalo Chat Zalo