Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> HTML

Định vị địa lý (Geolocation) trong HTML

API Geolocation trong HTML5 cho phép trang web lấy **vị trí địa lý thực tế** của người dùng (vĩ độ, kinh độ) — **chỉ khi người dùng cho phép**. Đây là cơ sở cho các ứng dụng: bản đồ, tìm đường, thời tiết địa phương, tìm cửa hàng gần đó, check-in, v.v.

Lưu ý bảo mật: Kể từ Chrome 50+, Geolocation **chỉ hoạt động trên HTTPS** (localhost được coi là an toàn). Trên HTTP, yêu cầu bị bỏ qua.

Cú pháp cơ bản

navigator.geolocation.getCurrentPosition(successCallback, errorCallback, options)

Đối tượng Position (trả về trong successCallback)

Thuộc tính Kiểu Mô tả
coords.latitude Number Vĩ độ (số thập phân, -90 đến 90)
coords.longitude Number Kinh độ (số thập phân, -180 đến 180)
coords.accuracy Number Độ chính xác vị trí (mét)
coords.altitude Number|null Độ cao so với mực nước biển (mét)
coords.altitudeAccuracy Number|null Độ chính xác độ cao (mét)
coords.heading Number|null Hướng di chuyển (độ, 0=Bắc, theo chiều kim đồng hồ)
coords.speed Number|null Tốc độ (m/s)
timestamp DOMTimeStamp Thời điểm lấy vị trí

Ví dụ hoàn chỉnh: Lấy vị trí, hiển thị lỗi, mở Google Maps

<!DOCTYPE html>
<html>
<head>
  <title>HTML Geolocation Demo</title>
  <style>
    * { padding: 2px; margin: 5px; }
    form { width: 70%; margin: 0 auto; text-align: center; }
    input[type="button"] { border-radius: 10px; }
    #mapLink { color: #0066cc; text-decoration: underline; cursor: pointer; }
  </style>
</head>
<body>
  <form>
    <fieldset>
      <legend>Định vị địa lý</legend>
      <button type="button" onclick="getLocation()">Cập nhật vị trí</button>
      <button type="button" onclick="openMap()" id="mapBtn" disabled>Mở Google Maps</button>
      <div id="status">Chưa lấy vị trí</div>
      <div>
        <span id="lat">Vĩ độ: --</span> |
        <span id="lng">Kinh độ: --</span>
      </div>
      <div>Độ chính xác: <span id="acc">--</span> mét</div>
    </fieldset>
  </form>
  <script>
    var latEl = document.getElementById("lat");
    var lngEl = document.getElementById("lng");
    var accEl = document.getElementById("acc");
    var status = document.getElementById("status");
    var mapBtn = document.getElementById("mapBtn");
    var currentPos = null;

    function getLocation() {
      status.textContent = "Đang xác định vị trí...";
      if (!navigator.geolocation) {
        status.textContent = "Trình duyệt không hỗ trợ Geolocation";
        return;
      }
      navigator.geolocation.getCurrentPosition(onSuccess, onError, {
        enableHighAccuracy: true,
        timeout: 10000,
        maximumAge: 0
      });
    }

    function onSuccess(pos) {
      currentPos = pos;
      latEl.textContent = "Vĩ độ: " + pos.coords.latitude.toFixed(6);
      lngEl.textContent = "Kinh độ: " + pos.coords.longitude.toFixed(6);
      accEl.textContent = pos.coords.accuracy.toFixed(1);
      status.textContent = "✓ Đã cập nhật vị trí";
      mapBtn.disabled = false;
    }

    function onError(err) {
      switch (err.code) {
        case err.PERMISSION_DENIED:
          status.textContent = "✗ Bạn đã từ chối chia sẻ vị trí";
          break;
        case err.POSITION_UNAVAILABLE:
          status.textContent = "✗ Không thể xác định vị trí";
          break;
        case err.TIMEOUT:
          status.textContent = "✗ Hết thời gian chờ";
          break;
        default:
          status.textContent = "✗ Lỗi không xác định: " + err.message;
      }
      mapBtn.disabled = true;
    }

    function openMap() {
      if (!currentPos) return;
      var lat = currentPos.coords.latitude;
      var lng = currentPos.coords.longitude;
      var url = "https://www.google.com/maps/@" + lat + "," + lng + ",15z";
      window.open(url, "_blank");
    }
  </script>
</body>
</html>

Các tùy chọn (options) quan trọng

  • enableHighAccuracy: true: Yêu cầu độ chính xác cao (GPS), tiêu tốn pin nhiều hơn, chậm hơn.
  • timeout: 10000: Thời gian chờ tối đa (ms).
  • maximumAge: 0: Không dùng vị trí cache, buộc lấy mới.

Phương thức khác: watchPosition()

Theo dõi vị trí liên tục (ví dụ: dẫn đường):

var watchId = navigator.geolocation.watchPosition(onSuccess, onError, options);
// Để dừng:
navigator.geolocation.clearWatch(watchId);

Xử lý từ chối quyền

Nếu người dùng chọn "Block" (chặn) vĩnh viễn, trình duyệt nhớ quyết định. Cần hướng dẫn người dùng vào cài đặt trình duyệt (biểu tượng khóa/globe bên thanh địa chỉ) để bật lại quyền.