Javascript 简明教程
JavaScript - Geolocation API
Geolocation API
Geolocation API 是一种 Web API,提供 JavaScript 接口以访问用户地理位置数据。Geolocation API 包含可在你的网站上用于访问用户位置的各种方法和属性。
使用设备的 GPS 检测用户所在位置。位置的准确性取决于 GPS 设备的准确性。
由于位置信息会危害用户的隐私,因此它在访问位置之前会要求获得许可。如果用户授予许可,网站就可以访问纬度、经度等信息。
有时,开发人员需要在网站上获取用户的位置。例如,如果你正在创建类似 Ola 和 Uber 的应用程序,则需要了解用户的位置,以便接送他们乘坐。
Geolocation API 允许用户与特定网站共享位置。
Real-time use cases of the Geolocation API
以下是 Geolocation API 的实时用例。
-
获取用户的位置坐标,在地图上显示它们。
-
在照片上标记用户的位置。
-
向用户推荐附近的商店、美食广场、加油站等。
-
获取产品或食品配送的当前位置。
-
从他们的当前位置接送用户乘车。
Using the Geolocation API
若要使用地理位置 API,可以使用窗口对象的“navigator”属性。Navigator 对象包含“geolocation”属性,该属性包含各种属性和用于操作用户位置的方法。
Syntax
按照以下语法使用地理位置 API。
var geolocation = window.navigator.geolocation;
OR
var geolocation = navigator.geolocation;
在此,地理位置对象可让你访问位置坐标。
Example: Checking the browser support
使用 navigator,你可以检查用户的浏览器是否支持 Geolocation.geolocation 属性。
下面的代码会根据地理位置是否得到支持来对应地打印消息。
首先,我们将数据转换为 JSON 格式。然后,我们将数据转换为字符串并在网页上打印。
<html>
<body>
<div id = "output"> </div>
<script>
const output = document.getElementById("output");
if (navigator.geolocation) {
output.innerHTML += "Geolocation is supported by your browser."
} else {
output.innerHTML += "Geolocation is not supported by your browser."
}
</script>
</body>
</html>
Geolocation is supported by your browser.
Geolocation Methods
以下是地理位置 API 的方法。
Method |
Description |
getCurrentPosition() |
用于获取网站用户的当前地理位置。 |
watchPosition() |
用于持续更新用户的实时位置。 |
clearWatch() |
若要使用 watchPosition() 方法清除持续监视用户的定位,请执行此操作。 |
The Location Properties
getCurrentPosition() 方法会执行你作为参数传递的回调函数。该回调函数取对象作为一个参数。参数对象包含有关用户位置信息的不同属性。
在此,我们在下表中列出了位置对象的所有属性。
Property |
Type |
Description |
coords |
objects |
它是作为 getCurrentPosition() 方法回调函数的参数所获得的对象。它包含以下属性。 |
coords.latitude |
Number |
它包含当前纬度,以十进制度为单位。数值范围为 [-90.00,+90.00]。 |
coords.longitude |
Number |
它包含当前经度,以十进制度为单位。数值范围为 [-180.00,+180.00]。 |
coords.altitude |
Number |
它是可选属性,且以高于 WGS 84 椭圆体的高度(以米为单位)指定高度估计值。 |
coords.accuracy |
Number |
它也是可选属性,且包含纬度和经度估计值的精度(以米为单位)。 |
coords.altitudeAccuracy |
Number |
【可选】它包含高度估计值的精度(以米为单位)。 |
coords.heading |
Number |
【可选】它包含设备当前顺时针相对于真北的运动方向信息(以度为单位)。 |
coords.speed |
Number |
[可选]。它包含以米/秒为单位的设备当前的地速。 |
timestamp |
date |
它包含在检索位置信息和创建 Position 对象时的信息。 |
Getting User’s Location
您可以使用 getCurrentPosition() 方法获取用户的当前位置。
Syntax
用户可以遵循以下语法以使用 getCurrentPosition() 方法获取用户的当前位置。
navigator.geolocation.getCurrentPosition(successCallback, errorCallback, options);
Parameters
getCurrentPosition() 对象采用 3 个参数。
-
successCallback − 在该方法成功检索到用户位置时会调用此函数。
-
errorCallback − 在该方法在访问用户位置时抛出错误时会调用此函数。
-
Options − 它是一个可选参数。它是一个包含超时时间、最大年龄等属性的对象。
Permitting the website to access your location
每当任何网站尝试访问您的位置时,浏览器都会弹出权限警报框。如果您单击“允许”,它可以获取您的位置详细信息。否则,它会抛出错误。
您可以在下图中看到权限弹出窗口。
Example
在以下代码中,我们使用 getCurrentPosition() 方法以获取用户的位置。该方法调用getCords() 函数以获取当前位置。
在getCords() 函数中,我们打印cords 对象各种属性的值。
首先,我们将数据转换为 JSON 格式。然后,我们将数据转换为字符串并在网页上打印。
<html>
<body>
<h3> Location Information </h3>
<button onclick = "findLocation()"> Find Location </button>
<p id = "output"> </p>
<script>
const output = document.getElementById("output");
function findLocation() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(getCords); //
}
else {
output.innerHTML += "Geo Location is not supported by this browser!";
}
}
// Callback function
function getCords(coords) {
output.innerHTML += "The current position is: <br>";
output.innerHTML += "Latitude: " + coords.coords.latitude + "<br>";
output.innerHTML += "Longitude: " + coords.coords.longitude + "<br>";
output.innerHTML += "Accuracy: " + coords.coords.accuracy + "<br>";
output.innerHTML += "Altitude: " + coords.coords.altitude + "<br>";
}
</script>
</body>
</html>
Geolocation Errors
getCurrentPosition() 方法将回调函数作为第二个参数以处理错误。回调函数可以将错误对象作为参数。
在以下情况下,可能会发生错误。
-
当用户拒绝访问位置时。
-
当位置信息不可用时。
-
当用于位置的请求超时时。
-
它还可以生成任何随机错误。
以下是错误对象属性的列表。
Property |
Type |
Description |
code |
Number |
它包含错误代码。 |
message |
String |
它包含错误消息。 |
以下是不同错误代码的列表。
Code |
Constant |
Description |
0 |
UNKNOWN_ERROR |
当地址对象的方法无法获取地址时,它返回 0 码表示未知错误。 |
1 |
PERMISSION_DENIED |
当用户已拒绝访问地址的权限。 |
2 |
POSITION_UNAVAILABLE |
当它无法查找设备的地址。 |
3 |
TIMEOUT |
当地址对象的方法无法查找用户的地址。 |
Example: Error Handling
我们在下面的代码中使用 findLocation() 函数中的 getCurrentPosition() 方法。我们已将 errorCallback() 函数传递为 getCurrentPosition() 方法的第二个参数,以处理错误。
在 errorCallback() 函数中,我们使用 switch case 语句,根据错误代码打印不同的错误消息。
当您单击找出位置按钮时,它将向您显示一个弹出框,要求访问地址的权限。如果您单击“阻止”,它将向您显示一个错误。
首先,我们将数据转换为 JSON 格式。然后,我们将数据转换为字符串并在网页上打印。
<html>
<body>
<div id = "output"> </div>
<button onclick = "findLocation()"> Find Location </button>
<script>
const output = document.getElementById("output");
function findLocation() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(getCords, errorCallback); //
}
else {
output.innerHTML += "Geo Location is not supported by this browser!";
}
}
// Callback function
function getCords(coords) {
output.innerHTML += "The current position is: <br>";
output.innerHTML += "Latitude: " + coords.coords.latitude + "<br>";
output.innerHTML += "Longitude: " + coords.coords.longitude + "<br>";
}
// Function to handle error
function errorCallback(err) {
switch (err.code) {
case err.PERMISSION_DENIED:
output.innerHTML += "You have denied to access your device's location";
break;
case err.POSITION_UNAVAILABLE:
output.innerHTML += "Your position is not available.";
break;
case err.TIMEOUT:
output.innerHTML += "Request timed out while fetching your location.";
break;
case err.UNKNOWN_ERROR:
output.innerHTML += "Unknown error occurred while fetching your location.";
break;
}
}
</script>
</body>
</html>
Geolocation Options
getCurrentPosition() 方法将包含选项的对象作为一个第三参数。
以下是您可以传递给选项对象的键形式的选项的列表。
Property |
Type |
Description |
enableHighAccuracy |
Boolean |
它表示您是否希望获取最准确的地址。 |
timeout |
Number |
它将毫秒数作为值,表示您要等待获取位置数据的时间。 |
maximumAge |
Number |
它将毫秒数作为值,指定缓存地址的最大过时时间。 |
Example
下面的代码将查找最准确的地址。此外,我们已将毫秒数设置为 options 对象的最大年龄和超时属性。
首先,我们将数据转换为 JSON 格式。然后,我们将数据转换为字符串并在网页上打印。
<html>
<body>
<div id = "output"> </div>
<button onclick = "findLocation()"> Find Location </button>
<script>
const output = document.getElementById("output");
function findLocation() {
if (navigator.geolocation) {
// Options for geolocation
const options = {
enableHighAccuracy: true,
timeout: 5000,
maximumAge: 0
};
navigator.geolocation.getCurrentPosition(getCords, errorfunc, options);
}
else {
output.innerHTML += "Geo Location is not supported by this browser!";
}
}
// Callback function
function getCords(coords) {
output.innerHTML += "The current position is: <br>";
output.innerHTML += "Latitude: " + coords.coords.latitude + "<br>";
output.innerHTML += "Longitude: " + coords.coords.longitude + "<br>";
}
function errorfunc(err) {
output.innerHTML += "The error message is - " + err.message + "<br>";
}
</script>
</body>
</html>
Watching the Current Location of the User
watchPosition() 方法允许您跟踪用户的实时地址。它返回一个 ID,我们可以在您想停止跟踪用户时使用 clearWatch() 方法。
Syntax
按照以下语法,使用 watchPosition() 方法来跟踪用户的实时地址。
var id = navigator.geolocation.watchPosition(successCallback, errorCallback, options)
errorCallback 和 options 是可选参数。
如果您想要停止追踪用户,您可以按照以下指令执行。
navigator.geolocation.clearWatch(id);
clearWatch() 方法将 watchPosition() 方法返回的 ID 作为其参数。
Example
在下面的代码中,我们使用地理位置对象的 watchPosition () 方法来获取用户的连续位置。
我们使用 getCords() 函数作为 watchPosition() 方法的回调,在这里打印用户位置的经度和维度。
在 findLocation() 方法中,我们使用 setTimeOut() 方法在 30 秒后停止追踪。
在输出中,您可以看到代码多次打印用户的的位置。
首先,我们将数据转换为 JSON 格式。然后,我们将数据转换为字符串并在网页上打印。
<html>
<body>
<button onclick = "findLocation()"> Find Location </button>
<div id = "output"> </div>
<script>
let output = document.getElementById("output");
function findLocation() {
if (navigator.geolocation) {
let id = navigator.geolocation.watchPosition(getCoords);
setTimeout(function () {
navigator.geolocation.clearWatch(id);
output.innerHTML += "<br>Tracking stopped!";
}, 30000); // Stop tracking after 30 seconds.
} else {
output.innerHTML += "<br>Geo Location is not supported by this browser!";
}
}
// Callback function
function getCoords(location) {
let latitude = location.coords.latitude;
let longitude = location.coords.longitude;
output.innerHTML += `<br> Latitude: ${latitude}, Longitude: ${longitude}`;
}
</script>
</body>
</html>