地理定位
一、定位基础与原理
IP
定位运营商基站定位
GPS
卫星定位
二、地理定位的实现
HTML5
提供了地理定位API
,允许用户将自己的位置暴露给web
应用程序(前提允许web
应用拥有该权限)。获取位置相关代码:
let geoloc = window.navigator.geolocation;
let success = function(data){} // 定位成功后回调
let error = function(msg){} // 定位失败后回调
let options = {} // 定位选项
geoloc.getCurrentPosition(success, [error, options]);
google chrome
从50版本开始,地理定位API
只允许提供给https
的网站。所以普通网站拿不到定位信息。但是google
提供了模拟器用于定位测试。
如果定位成功,getCurrentLocation
将会返回定位信息,格式如下:
coords: GeolocationCoordinates
accuracy: 150 精准度
altitude: null 海拔高度
altitudeAccuracy: null 海拔高度的精准度
heading: null
latitude: 39.917406 纬度
longitude: 116.397074 经度
speed: null 当前客户端的瞬时速度
timestamp: 1625820505615 时间戳 毫秒值
案例:点击按钮,获取当前的位置信息
<body>
<button id="btn">点我获取定位</button>
<script>
btn.onclick = function() {
let geoloc = window.navigator.geolocation;
// 参数:成功回调,失败回调,定位选项配置
geoloc.getCurrentPosition((successmsg) => {
console.log(successmsg);
}, (errormsg) => {
console.warn(errormsg);
}, {
timeout: 5000 // timeout: 5秒超时
})
}
</script>
</body>
1. 接入第三方位置服务平台 - 百度地图、高德地图、腾讯地图
一旦接入了这些第三方平台,就可以方便的在自已网页中嵌入地图控件。引入这些第三方位置服务的js
库后,还可以操作这些地图,访问他们提供的位置服务:查询公交线路、查询步行线路、驾车线路、地址查询、查询周边场所等等。
百度地图接入流程
进入百度地图开放平台: https://lbsyun.baidu.com/
选择开发文档 ---- JavascriptAPI
---- JavaScript API v3.0
2. 调用百度地图JS API
修改地图显示效果
利用navigator.geolocation
得到当前位置,创建一个point
对象作为中心点参数
geoloc.getCurrentPosition(
(res)=>{
let lat = res.coords.latitude; // 纬度
let long = res.coords.longitude; // 经度
console.log(`lat: ${lat} long: ${long}`)
// 创建点坐标
let point = new BMap.Point(long, lat);
// 设置中心点与缩放级别
map.centerAndZoom(point, 15);
},
(err)=>{ console.log(err); });
地图对象(Map
)除了centerAndZoom
之外还有什么属性及方法?
面向对象API
提供了什么功能就可以使用什么功能。
常用功能:
显示地图
设置地图的属性样式
为地图添加控件
为地图添加覆盖物
第三方位置服务
- 逆地址解析(通过经纬度返回地址详情字符串)
- 周边检索(通过经纬度,查询周边设施场所)
- 等等
demo:
<head>
<!-- 1. 引入baidu jsAPI -->
<script src="https://api.map.baidu.com/api?v=3.0&ak=ImUxp08DxBOdWifsi9WvqY3GkqV4eRHB"></script>
<style>
#container {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
</style>
</head>
<body>
<!-- 2. 提供容器 -->
<div id="container"></div>
<!-- 3. 编写js初始化地图 -->
<script type="text/javascript">
// 创建地图实例
var map = new BMap.Map("container");
// 获取当前位置的经纬度 然后设置地图
let geoloc = window.navigator.geolocation;
geoloc.getCurrentPosition(
(res)=>{
let lat = res.coords.latitude; // 纬度
let long = res.coords.longitude; // 经度
console.log(`lat: ${lat} long: ${long}`)
// 创建点坐标
var point = new BMap.Point(long, lat);
// 设置中心点与缩放级别
map.centerAndZoom(point, 15);
// 调用map的方法,设置地图的能力
map.enableDragging();
// 启用滚轮缩放
map.enableScrollWheelZoom();
// 添加平移缩放控件
let navCtrl = new BMap.NavigationControl();
map.addControl(navCtrl);
// 添加比例尺控件
let scaleCtrl = new BMap.ScaleControl();
map.addControl(scaleCtrl);
// 添加定位控件
let glCtrl = new BMap.GeolocationControl();
map.addControl(glCtrl);
// 添加覆盖物 Marker对象
// let point = new BMap.Point(long, lat);
let marker = new BMap.Marker(point);
map.addOverlay(marker);
// 添加事件
marker.addEventListener('click', (e)=>{
alert('marker被点击');
});
// LBS服务 逆地址解析
let geoc = new BMap.Geocoder();
geoc.getLocation(point, (res)=>{
console.log(res);
console.log(res.addressComponents.city);
});
// LBS服务 查询周边
let localSearch = new BMap.LocalSearch(
point, // 当前位置点
{ // options对象,指定搜索结束后的回调
onSearchComplete: (res)=>{
console.log(res);
}
}
);
localSearch.search('影院');
},
(err)=>{ console.log(err); });
</script>
</body>