【前端用法】html5实现地理位置定位(JS获取当前地理位置的方法)

淡淡的烟草味﹌ 2023-07-10 14:29 54阅读 0赞

目前在做公司的一个网站,有个需求是:当别人进入网站时自动定位他的地理位置,包括市区,方便给他推荐当前城市的特色信息。

其实,这也是一个非常实用的功能,在网上搜到很多,有的不能用,现将我整理的两个能用的记录一下,以便后续再使用。

地理位置(Geolocation)是 HTML5 的重要特性之一,提供了确定用户位置的功能,借助这个特性能够开发基于位置信息的应用。在下面的demo中使用的是百度提供的api接口,调用html5的geolocation方法获取客户端当前经纬度,从而获得客户端所在的地理位置,包括省市区信息,甚至有街道、门牌号等详细的地理位置信息。

值得注意的一点是,PC很多浏览器对于html5的定位技术是不太友好的,很多浏览器都是默认拒绝定位,一般只有IE是可以正常使用,但是获取到的经纬度偏差很大;相反在手机访问的时候,由于一般手机上都有GPS模块,所以定位效果会好很多,原因就在于手机上的GPS模块对geolocation特性的支持是很好的。结论是,html5的定位在手机上测试是最佳的选择,PC建议使用IE浏览器。

方案1:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  5. <!--下面我们添加一个meta标签,以便使您的页面更好的在移动平台上展示。-->
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0,user-scalable=no">
  7. <title>JS获取当前地理位置的方法</title>
  8. </head>
  9. <body>
  10. <!--可以自己定义body体内容-->
  11. </body>
  12. <!--引用百度地图API文件, 您的秘钥的获取方式是注册为百度地图的开发者,创建应用-->
  13. <script type="text/javascript" src="http://api.map.baidu.com/api?v=3.0&ak=您的密钥">
  14. //v3.0版本的引用方式:src="http://api.map.baidu.com/api?v=3.0&ak=您的密钥"
  15. </script>
  16. <script type="text/javascript">
  17. // 创建一个函数,主要功能是在调用html5的geolocation()前,先判断当前浏览器是否支持html5,(PC绝大部分浏览器不支持或者拒绝html5定位)
  18. function getLocation() {
  19. var options = {
  20. enableHighAccuracy: true,
  21. maximumAge: 1000
  22. };
  23. alert('获取位置信息开始--------->');
  24. if (navigator.geolocation) {
  25. // 走到这里说明,浏览器支持geolocation,参数里有两个回调函数,一个是定位成功后的处理操作,一个是定位失败后的处理操作,另外一个参数没有研究过
  26. navigator.geolocation.getCurrentPosition(onSuccess, onError, options);
  27. } else {
  28. // 否则浏览器不支持geolocation
  29. alert('您的浏览器不支持地理位置定位!');
  30. }
  31. }
  32. // 成功时的回调函数
  33. // 第一步获取定位成功返回的经纬度数据,然后结合百度那边提供的接口进行具体位置的转换,最后还有一个数据提交的方法,要跟自己的业务操作了
  34. function onSuccess(position) {
  35. // 返回用户位置
  36. // 经度
  37. var longitude = position.coords.longitude;
  38. // 纬度
  39. var latitude = position.coords.latitude;
  40. alert('您的当前地址的经纬度:经度' + longitude + ',纬度' + latitude);
  41. // 根据经纬度获取地理位置,不太准确,获取城市区域还是可以的
  42. var map = new BMap.Map("allmap");
  43. var point = new BMap.Point(longitude, latitude);
  44. var gc = new BMap.Geocoder();
  45. gc.getLocation(point, function (rs) {
  46. var addComp = rs.addressComponents;
  47. alert(addComp.province + ", " + addComp.city + ", " + addComp.district + ", " + addComp.street + ", " + addComp.streetNumber);
  48. });
  49. // 这里后面可以写你的后续操作了
  50. handleData(longitude, latitude);
  51. }
  52. // 失败时的回调函数
  53. // 这里是错误提示信息
  54. function onError(error) {
  55. switch (error.code) {
  56. case 1:
  57. alert("位置服务被拒绝!");
  58. break;
  59. case 2:
  60. alert("暂时获取不到位置信息!");
  61. break;
  62. case 3:
  63. alert("获取信息超时!");
  64. break;
  65. case 4:
  66. alert("未知错误!");
  67. break;
  68. }
  69. // 这里后面可以写你的后续操作了,下面的经纬度是天安门的具体位置
  70. // 经度
  71. var longitude = 39.9151;
  72. // 纬度
  73. var latitude = 116.4041;
  74. handleData(longitude, latitude);
  75. }
  76. // 页面载入时请求获取当前地理位置
  77. window.onload = function () {
  78. // html5获取地理位置
  79. getLocation();
  80. };
  81. </script>
  82. </html>

方案2:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <!--下面我们添加一个meta标签,以便使您的页面更好的在移动平台上展示。-->
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0,user-scalable=no">
  7. <title>html5实现地理位置定位</title>
  8. </head>
  9. <body>
  10. 您目前所在的区域为:<p></p>
  11. </body>
  12. <!--引用百度地图API文件, 您的秘钥的获取方式是注册为百度地图的开发者,创建应用-->
  13. <script type="text/javascript" src="http://api.map.baidu.com/api?v=3.0&ak=您的密钥">
  14. //v3.0版本的引用方式:src="http://api.map.baidu.com/api?v=3.0&ak=您的密钥"
  15. </script>
  16. <script>
  17. //定义一个空的位置构造函数
  18. function Location() {
  19. };
  20. //定义一个可以获得经纬度的方法
  21. Location.prototype.getLocation = function (callback) {
  22. var options = {
  23. enableHighAccuracy: true,
  24. maximumAge: 1000
  25. };
  26. this.callback = Object.prototype.toString.call(callback) == "[object Function]" ?
  27. callback :
  28. function (address) {
  29. alert(address.province + address.city);
  30. console.log("getLocation(callbackFunction) 可获得定位信息对象");
  31. };
  32. var thisSelf = this;
  33. if (navigator.geolocation) {
  34. //浏览器支持geolocation
  35. navigator.geolocation.getCurrentPosition(function (position) {
  36. //经度
  37. var longitude = position.coords.longitude;
  38. //纬度
  39. var latitude = position.coords.latitude;
  40. thisSelf.loadMapApi(longitude, latitude);
  41. }, thisSelf.onError, options);
  42. } else {
  43. //浏览器不支持geolocation
  44. alert('您的浏览器不支持地理位置定位3333');
  45. }
  46. };
  47. //定义一个可以解析经纬度的方法,调用百度的api
  48. Location.prototype.loadMapApi = function (longitude, latitude) {
  49. var thisSelf = this;
  50. var oHead = document.getElementsByTagName('HEAD').item(0);
  51. var oScript = document.createElement("script");
  52. oScript.type = "text/javascript";
  53. oScript.src = "http://api.map.baidu.com/getscript?v=2.0&ak=A396783ee700cfdb9ba1df281ce36862&services=&t=20140930184510";
  54. oHead.appendChild(oScript);
  55. oScript.onload = function (date) {
  56. var point = new BMap.Point(longitude, latitude);
  57. var gc = new BMap.Geocoder();
  58. gc.getLocation(point, function (rs) {
  59. var addComp = rs.addressComponents;
  60. thisSelf.callback(addComp);
  61. });
  62. }
  63. };
  64. //定义出现查询位置出现意外的方法
  65. Location.prototype.onError = function (error) {
  66. switch (error.code) {
  67. case 1:
  68. alert("位置服务被拒绝");
  69. break;
  70. case 2:
  71. alert("暂时获取不到位置信息");
  72. break;
  73. case 3:
  74. alert("获取信息超时");
  75. break;
  76. case 4:
  77. alert("未知错误");
  78. break;
  79. }
  80. };
  81. //调用
  82. var local = new Location();
  83. local.getLocation(function (res) {
  84. var str = "";
  85. for (i in res) {
  86. str = res[i] + str;
  87. }
  88. document.querySelector("p").innerHTML = str;
  89. })
  90. </script>
  91. </html>

【参考资料】

1、百度地图开放平台:http://lbsyun.baidu.com/index.php?title=jspopular3.0/guide/helloworld

2、用js定位当前的地理位置:https://www.cnblogs.com/zhuyupingit/p/6322204.html

3、Javascript学习总结 - html5实现定位地理位置:https://www.ucloud.cn/yun/21235.html

发表评论

表情:
评论列表 (有 0 条评论,54人围观)

还没有评论,来说两句吧...

相关阅读

    相关 html5学习(地理位置定位)

    > 我把代码部署到我本地的tomcat,然后用我笔记本电脑的火狐和IE测试了一下,都是报错,没办法测试! > > html5地理位置定位,测试比较困难和麻烦,最好把代码部署到