HTML 基础
HTML 高级教程
HTML5 特征
HTML5 示例
HTML5 参考手册

HTML5 地理位置

在本教程中,您将学习如何使用 HTML5 地理定位功能来检测用户的位置。

什么是地理位置?

HTML5 地理定位功能可让您找出网站访问者当前位置的地理坐标(纬度和经度数字)。

此功能有助于为网站访问者提供更好的浏览体验。 例如,您可以返回物理上靠近用户位置的搜索结果。

查找访客坐标

使用 HTML5 地理定位 API 获取站点访问者的位置信息相当简单。 它利用打包到 navigator.geolocation 对象中的三种方法 — getCurrentPosition(), watchPosition()clearWatch()

以下是显示您当前位置的简单地理定位示例。 但是,首先你需要同意让浏览器告诉网络服务器你的位置。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Get Current Position</title>
<script>
    function showPosition() {
        if(navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(function(position) {
                var positionInfo = "Your current position is (" + "Latitude: " + position.coords.latitude + ", " + "Longitude: " + position.coords.longitude + ")";
                document.getElementById("result").innerHTML = positionInfo;
            });
        } else {
            alert("Sorry, your browser does not support HTML5 geolocation.");
        }
    }
</script>
</head>
<body>
    <div id="result">
        <!--Position information will be inserted here-->
    </div>
    <button type="button" onclick="showPosition();">Show Position</button>
</body>
</html>

注意: 除非访问者明确许可,否则网络浏览器不会与网页共享访问者位置。 地理定位标准规定,为每个需要位置数据的网站获取用户许可是一项官方规则。


处理错误和拒绝

可能存在用户不想与您共享其位置数据的情况。 为了应对这种情况,您可以在调用 getCurrentLocation() 函数时提供两个函数。

如果您的地理定位尝试成功,则调用第一个函数,如果您的地理定位尝试以失败告终,则调用第二个函数。 让我们看一个例子:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Handling Geolocation Errors</title>
<script>
    // 设置全局变量
    var result;
    
    function showPosition() {
        // 存储页面显示结果的元素
        result = document.getElementById("result");
        
        // 如果地理位置可用,请尝试获取访问者的位置
        if(navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(successCallback, errorCallback);
            result.innerHTML = "Getting the position information...";
        } else {
            alert("Sorry, your browser does not support HTML5 geolocation.");
        }
    };
    
    // 定义成功尝试的回调函数
    function successCallback(position) {
        result.innerHTML = "Your current position is (" + "Latitude: " + position.coords.latitude + ", " + "Longitude: " + position.coords.longitude + ")";
    }
    
    // 定义失败尝试的回调函数
    function errorCallback(error) {
        if(error.code == 1) {
            result.innerHTML = "You've decided not to share your position, but it's OK. We won't ask you again.";
        } else if(error.code == 2) {
            result.innerHTML = "The network is down or the positioning service can't be reached.";
        } else if(error.code == 3) {
            result.innerHTML = "The attempt timed out before it could get the location data.";
        } else {
            result.innerHTML = "Geolocation failed due to unknown error.";
        }
    }
</script>
</head>
<body>
    <div id="result">
        <!--位置信息将在此处插入-->
    </div>
    <button type="button" onclick="showPosition();">Show Position</button>
</body>
</html>

在谷歌地图上显示位置

您可以使用地理位置数据做一些非常有趣的事情,例如在 Google 地图上显示用户位置。 以下示例将根据通过 HTML5 地理定位功能检索到的纬度和经度数据显示您在 Google 地图上的当前位置。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Using the Google Maps</title>
<script>
    function showPosition() {
        navigator.geolocation.getCurrentPosition(showMap);
    }
    
    function showMap(position) {
        // 获取位置数据
        var latlong = position.coords.latitude + "," + position.coords.longitude;
        
        // 设置谷歌地图源地址
        var mapLink = "https://maps.googleapis.com/maps/api/staticmap?center="+latlong+"&zoom=16&size=400x300&output=embed";
        
        // 创建和插入谷歌地图
        document.getElementById("embedMap").innerHTML = "<img alt='Map Holder' src='"+ mapLink +"'>";
    }
</script>
</head>
<body>
    <button type="button" onclick="showPosition();">Show My Position on Google Map</button>
    <div id="embedMap">
        <!--谷歌地图将嵌入此处-->
    </div>
</body>
</html>

上面的示例将使用静态图像简单地显示 Google 地图上的位置。 但是,您也可以通过拖动、放大/缩小和您在现实生活中遇到的其他功能创建交互式 Google 地图。 让我们看一下下面的例子:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Using the Google Maps</title>
<script src="https://maps.google.com/maps/api/js?sensor=false"></script>
<script>
function showPosition() {
    if(navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(showMap, showError);
    } else {
        alert("Sorry, your browser does not support HTML5 geolocation.");
    }
}
 
// 定义成功尝试的回调函数
function showMap(position) {
    // 获取位置数据
    lat = position.coords.latitude;
    long = position.coords.longitude;
    var latlong = new google.maps.LatLng(lat, long);
    
    var myOptions = {
        center: latlong,
        zoom: 16,
        mapTypeControl: true,
        navigationControlOptions: {
            style:google.maps.NavigationControlStyle.SMALL
        }
    }
    
    var map = new google.maps.Map(document.getElementById("embedMap"), myOptions);
    var marker = new google.maps.Marker({ position:latlong, map:map, title:"You are here!" });
}
 
// 定义失败尝试的回调函数
function showError(error) {
    if(error.code == 1) {
        result.innerHTML = "You've decided not to share your position, but it's OK. We won't ask you again.";
    } else if(error.code == 2) {
        result.innerHTML = "The network is down or the positioning service can't be reached.";
    } else if(error.code == 3) {
        result.innerHTML = "The attempt timed out before it could get the location data.";
    } else {
        result.innerHTML = "Geolocation failed due to unknown error.";
    }
}
</script>
</head>
<body>
    <button type="button" onclick="showPosition();">Show My Position on Google Map</button>
    <div id="embedMap" style="width: 400px; height: 300px;">
        <!--Google map will be embedded here-->
    </div>
</body>
</html>

请查看以下 URL 以了解有关 Google Maps Javascript API 的更多信息: https://developers.google.com/maps/documentation/javascript/reference


监控访客的动向

到目前为止,我们使用的所有示例都依赖于 getCurrentPosition() 方法。 然而,geolocation 对象有另一个方法 watchPosition() 允许您通过在位置变化时返回更新的位置来跟踪访问者的移动。

watchPosition() 具有与 getCurrentPosition() 相同的输入参数。 但是watchPosition()可能会多次触发success函数 — 当它第一次获得位置时,再次,每当它检测到新位置时。 让我们看看这是如何工作的:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Watching Position</title>
<script>
    // 设置全局变量
    var watchID;

    function showPosition() {
        if(navigator.geolocation) {
            watchID = navigator.geolocation.watchPosition(successCallback);
        } else {
            alert("Sorry, your browser does not support HTML5 geolocation.");
        }
    }

    function successCallback(position) {
        toggleWatchBtn.innerHTML = "Stop Watching";
        
        // 在做任何事情之前检查位置是否已更改
        if(prevLat != position.coords.latitude || prevLong != position.coords.longitude){
            
            // 设置以前的位置
            var prevLat = position.coords.latitude;
            var prevLong = position.coords.longitude;
            
            // 获取当前位置
            var positionInfo = "Your current position is (" + "Latitude: " + position.coords.latitude + ", " + "Longitude: " + position.coords.longitude + ")";
            document.getElementById("result").innerHTML = positionInfo;
            
        }
        
    }

    function startWatch() {
        var result = document.getElementById("result");
        
        var toggleWatchBtn = document.getElementById("toggleWatchBtn");
        
        toggleWatchBtn.onclick = function() {
            if(watchID) {
                toggleWatchBtn.innerHTML = "Start Watching";
                navigator.geolocation.clearWatch(watchID);
                watchID = false;
            } else {
                toggleWatchBtn.innerHTML = "Aquiring Geo Location...";
                showPosition();
            }
        }
    }
    
    // 初始化整个系统(上图)
    window.onload = startWatch;
</script>
</head>
<body>
    <button type="button" id="toggleWatchBtn">Start Watching</button>
    <div id="result">
        <!--位置信息将在此处插入-->
    </div>   
</body>
</html>
Advertisements