找到你在哪里!HTML5 地理位置 API

· · Tech. & Eng.

本作品采用 CC BY-NC-SA 4.0 授权。因为一些原因,文中出现的位置会被替换或模糊。

注意:如果你要试验地理位置 API,你的网页需要通过 HTTPS 提供

原理

“找到你在哪里”这件事自古以来就是一个问题。

固然,地址可以表示“你在哪里”,但如果你不在陆地上,该如何定位呢?

所以我们使用经纬度来确定位置。这个概念大家在地理课上一定学过,所以不再赘述。在浏览器得到的度数为十进制记法,与角分法的转换方式如下:

x\degree y' z'' = x+\dfrac{1}{60}y+\dfrac{1}{60^2}z

对于低精度,目前一般采用 IP 定位:速度快,但精确度较低。

对于高精度,一般采用 GPS 或北斗定位:原理相似,通过三颗卫星测距计算位置,精度较高,但速度慢。

API

所有接口函数都位于 navigator.geolocation 中。确保浏览器支持:

if ('geolocation' in navigator) {
  // 代码
} else {
  alert("不支持地理位置 API。")
}

点击允许就可以了。如果没有显示,打开 F12 控制台看是否出错。效果如下:

Step 2:具体到在哪里

经纬度并不能直观确定位置。我们使用 OpenStreetMap 的免费 API(注:你需要能访问洛谷国际站才可使用):

// 放到顶层
async function getAddress(lat, lon) {
  const url = `https://nominatim.openstreetmap.org/reverse?format=json&lat=${lat}&lon=${lon}`;

  try {
    const response = await fetch(url, {
      headers: { 'User-Agent': 'GeoTest/1.0 ([email protected])' } // 必须设置上你的邮箱!
    });
    const data = await response.json();
    return data.display_name; // 完整地址字符串,对象中还有更多信息。
  } catch (error) {
    console.error("Geocoding error:", error); // 出错了!
    return null;
  }
}

// 放到回调函数中
getAddress(cord.coords.latitude, cord.coords.longitude).then(address => {
  sw.innerText = address; 
});

效果:

结语

浏览器自带的 API 是非常有限的,许多功能得靠不稳定的外部 API。

值得一提的是,由于某些因素,地理位置 API 得到的坐标系(WGS-84)并不是各大国内地图软件的坐标系(火星坐标)。要实现地图功能,需要转换坐标系,但“火星坐标”规则保密,较难实现。

Ref.