js地理位置api(调用百度地图API)

1. JS地理位置api介绍

2. JS具体实现

3. 使用百度地图

<br />

1. JS地理位置api介绍

<br />

navigator.geolocation对象是js中获取位置的对象,它有三个常用方法:

navigator.geolocation.getCurrentPosition(displayLocation,displayError, options);
        //该方法获取当前位置
watchId = navigator.geolocation.watchPosition(displaylocation, displayError, options);
        //该方法重复一直获取当前位置,返回一个ID;
navigator.geolocation.clearWatch(watchId);
        //结束重重复一直获取当前位置,传入watchPosition方法返回的ID

关于getCurrentPosition方法与watchPosition中的参数解释:
这里提供了三个参数,这三个参数其实都是方法用来表示getCurrentPosition方法与watchPosition调用的状态(成功或失败,第三个参数除外,它是配置对象):

第一个参数displayLocation (必选)

处理成功获取到位置信息时回调这个方法并传入一个Position对象包括两个属性coordstimestamp

  • coords的属性有:
属性 解释
latitude 表示纬度
longitude 表示经度
accuracy 精度(单位米)
altitude 高度
altitudeAccuracy 高度精度
heading 朝向
speed 速度
  • timestamp表示获取地理位置的时间。

<br />

第二个参数displayError(可选)

处理失败时回调这个方法并传入一个error对象包括两个属性codemessage

  • code包含一个数字0到3表示对应的错误信息:
0: "Unknown error",            //这是“全包型”错误,如果其他错误都不合适就会使用这个错误,查看error.message属性来了解更多信息
1: "Permission denied",        //这表示用户拒绝了使用位置信息的请求
2: "Position is not available",//这说明浏览器尝试过,但是没能得到你的位置,同样的,查看error.message来得到更多信息
3: "Request timeout"           //地理定位有一个内部超时设置,如果超出了这个时限但还没确定位置,就会导致这个错误
  • message 表示具体的错误内容。

<br />

第三个参数options(可选)

可以使用这个参数调整地理定位的行为

//配置获取地理位置的类
function option(enableHighAccuracy,timeout,maximumAge)
{
    this.enableHighAccuracy = false;
    this.timeout = Infinity;
    this.maximumAge = 0;
}
//没有对象吗,程序员就new一个^_^
var options = new option(true,1000,0);

//以下是默认值与说明
enableHighAccuracy:false //启用高精度
timeout:Infinity         //控制浏览器确定位置的时间,默认表示可以用所需的使用
                           任意时间来得到以,单位是毫秒10秒=10000毫秒
MaximumAge:0             //表示应用程序读取多少时间内的缓存而不是重新获取

2. JS具体实现

html代码

<!DOCTYPE html>
<html>
<head>
    
<title>地理位置</title>

<script src="位置.js"></script>
    <link rel="stylesheet" href="位置.css">
</head>
<body>
    <form>
        <input type="button" id="watch" value="Watch me">
        <input type="button" id="clearWatch" value="Clear watch">
    </form>
  <div id="location">
  这里显示我的坐标
  </div>
    <div id="distance">
       这里显示与指定坐标位置的距离 
    </div>

    <div id="map">

    </div>

</body>
</html>

js代码

// JavaScript Document
window.onload = getMyLocation;
//文档加载完成调用getMyLocation方法
var watchId = null;
//重复获取地理位置返回的值,全局变量做记录用

var options = new option(false, Infinity, 0);

//配置获取地理位置的类
function option(enableHighAccuracy,timeout,maximumAge)
{
    this.enableHighAccuracy = false;
    this.timeout = Infinity;
    this.maximumAge = 0;
}
function getMyLocation() {
    
    if (navigator.geolocation) {
        //判断浏览器是否支持位置信息
      // navigator.geolocation.getCurrentPosition(displayLocation, displayError, options);
      //该方法获取当前位置
      // watchId = navigator.geolocation.watchPosition(displaylocation, displayError, options);
      //该方法重复一直获取当前位置,返回一个ID;
      // navigator.geolocation.clearWatch(watchId);
      //结束重重复一直获取当前位置,传入watchPosition方法返回的ID

          var watchButton = document.getElementById("watch");
          watchButton.onclick = watchLocation;
        //开始重复
       
        var clearWatchButton = document.getElementById("clearWatch");
        clearWatchButton.onclick = clearwatch;
        //结束重复 注意结束后设备耗电会减少很多
    
   } else {
   alert("浏览器不支持地理定位");
   }
}

//watch按钮调用的方法,开始重复获取地理位置
function watchLocation() {

      watchId = navigator.geolocation.watchPosition(displayLocation, displayError);
}
//clearWatch按钮调用的方法,结束重复获取地理位置
function clearwatch() {

    if(watchId)
    {
        navigator.geolocation.clearWatch(watchId);
        watchId = null;
    }
}

//获取成功时回调的方法,并传入一个包含地理位置信息的参数
function displayLocation(position)   
{
    var latitude = position.coords.latitude;  //纬度
    var longitude = position.coords.longitude;//经度
    var div = document.getElementById("location");
    var ourCoords = {
        latitude: 47.624851,
        longitude: -122.52099
    };
    //创建一个包含一个位置的对象

    div.innerHTML = "纬度是:" + latitude + "  经度是:" + longitude;

    var km = computeDistance(position.coords, ourCoords);
    //computeDistance 这个方法会返回两个坐标点之间的距离,单位是千米
    var distance = document.getElementById("distance");
    distance.innerHTML = "你与纬度为:" + ourCoords.latitude + "经度为:" + ourCoords.longitude + "的距离是" + km + "km";
    distance.innerHTML += "你的位置精度为:" + position.coords.accuracy + "单位米";

}
//调用地理位置失败时,回调的方法,并传入一个参数error
function displayError(error) {   //error是地理定位api向它传入的一个错误,包含一个0-3的数
    var errorTypes = {           //创建一个对象关联错误信息
        0: "Unknown error",                 //这是“全包型”错误,如果其他错误都不合适就会使用这个错误,查看error.message属性来了解更多信息
        1: "Permission denied",             //这表示用户拒绝了使用位置信息的请求
        2: "Position is not available",     //这说明浏览器尝试过,但是没能得到你的位置,同样的,查看error.message来得到更多信息
        3: "Request timeout"               //地理定位有一个内部超时设置,如果超出了这个时限但还没确定位置,就会导致这个错误
    };
    var errorMessage = errorTypes[error.code];        //使用error.code属性,将一个错误消息值赋给新变量
    if (error.code == 0 || error.code == 2) {         //对于错误0和2,有时error.message属性中会有一些额外的信息,所以把这些信息增加到字符串中
        errorMessage = errorMessage + " " + error.message;
    }
    var div = document.getElementById("location");
    div.innerHTML = errorMessage;
}



//这个方法取两个坐标,一个起点坐标和一个终点坐标,并返回二者之间的距离 (单位为千米)
function computeDistance(startCoords, destCoords) {   
    var startLatRads = degreesToRadians(startCoords.latitude);
    var startLongRads = degreesToRadians(startCoords.longitude);
    var destLatRads = degreesToRadians(destCoords.latitude);
    var destLongRads = degreesToRadians(destCoords.longitude);

    var Radius = 6371; // radius of the Earth in km
    var distance = Math.acos(Math.sin(startLatRads) * Math.sin(destLatRads) +
                    Math.cos(startLatRads) * Math.cos(destLatRads) *
                    Math.cos(startLongRads - destLongRads)) * Radius;

    return distance;
}
function degreesToRadians(degrees) {
    radians = (degrees * Math.PI) / 180;
    return radians;
}

运行结果,单击watch me按钮后


Paste_Image.png

3. 使用百度地图

以下代码是调用百度api显示本地地址位置:
html代码

<!DOCTYPE html>
<html>
<head>
    
<title>百度地图地理位置</title>
 <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> 
    <!--让页面以正常比例进行显示并且禁止用户缩放页面的操作。-->
    <script src="location.js"></script>
    <link rel="stylesheet" href="location.css">
</head>
<body>
  
    <div id="location">
        这里显示我的坐标
    </div>
    <div id="map">
        
    </div>

</body>
</html>

js代码

// JavaScript Document
window.onload = getMyLocation;
//文档加载完成调用getMyLocation方法
var latitude = "";  //纬度
var longitude = "";//经度
function getMyLocation() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(displayLocation);
    } else {
        alert("浏览器不支持地理定位");
    }
}
//获取成功时回调的方法,并传入一个包含地理位置信息的参数
function displayLocation(position) {
    latitude = position.coords.latitude;  //纬度
    longitude = position.coords.longitude;//经度
    var div = document.getElementById("location");
    div.innerHTML = "纬度是:" + latitude + "  经度是:" + longitude;
    loadScript();
    //调用此方法异步调用百度地图api
}

function initialize() {
    //创建地图实例  
    var map = new BMap.Map('map');
    //创建一个坐标
    var point = new BMap.Point(longitude, latitude);
    //地图初始化,设置中心点坐标和地图级别  
    map.centerAndZoom(point, 15);
    map.addControl(new BMap.MapTypeControl());
    var infoWindow = new BMap.InfoWindow("I am here");    // 创建信息窗口对象
    map.openInfoWindow(infoWindow, point);                 //开启信息窗口
}
function loadScript() {
    var script = document.createElement("script");
    // &callback=initialize地址后面加了这个表示在当脚本加载完成后callback函数会被立刻调用
    script.src = "http://api.map.baidu.com/api?v=2.0&ak=255b0a41e091ecf12a0790305ddc816b&callback=initialize";
    document.body.appendChild(script);
}


<br /><br /><br />

单词 解释翻译
navigator 导航器
geolocation 地理位置
watch
Position 位置
latitude 纬度
longitude 经度
ourCoords our(我们的)Coords(坐标)
enableHighAccuracy enable(可用)High(高)Accuracy(精度)
timeout 超时
maximumAge 读取缓存时间
callback 回调
createElement 创建元素
appendChild 添加末尾
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容