高德地图 百度地图 腾讯地图使用
本文最后更新于:2023年10月4日 晚上
地理定位
定位基础与原理
IP
定位- 移动运营商基站定位
GPS
卫星定位
定位的获取
地理定位API
允许用户向web
应用程序提供他们的位置,但这个操作需要用户授权。获取客户端位置相关代码如下:
1 |
|
getCurrentPosition
方法将会通过回调返回封装位置信息的result
,这个result
是GeolocationPosition
对象,主要包含以下属性:
coords
:GeolocationCoordinates
accuracy
: 150 定位准确度altitude
: 海拔高度altitudeAccuracy
: 海拔准确度latitude
: 31.230416 纬度longitude
: 121.473701 经度speed
: 速度
timestamp
: 1623142281023 定位的时间戳
接入第三方位置服务平台
一旦接入了这些第三方位置服务平台,可以方便的在自己的网页中嵌入地图控件。引入这些第三方位置服务的js
库后,还可以方便的操作这些地图。显示地图内容、在地图中添加大头针、通过位置web
服务实现公交路线查询、驾车路线查询、地址解析、逆地址解析等等功能。
百度地图JSAPI
百度地图jsAPI
是一套基于Javascript
开发的应用程序接口。支持PC
、小程序、移动端地图开发。
基本使用方法
登录百度地图开放平台,创建应用,申请秘钥。
创建应用,申请开发者秘钥。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Hello, World</title>
<style type="text/css">
body {
margin: 0px;
padding: 0px;
}
#container {
height: 400px;
width: 400px;
margin: 100px auto;
}
</style>
<script
type="text/javascript"
src="https://api.map.baidu.com/api?v=3.0&ak=w5VlGDoizEBhueAzOymyI44bcydyh1Tf"
></script>
</head>
<body>
<div id="container"></div>
<script type="text/javascript">
var map = new BMap.Map("container");
// 创建地图实例
var point = new BMap.Point(116.404, 39.915);
// 创建点坐标
// 初始化地图,设置中心点坐标和地图级别
map.enableScrollWheelZoom(true);
//开启鼠标滚轮
// map.addEventListener("click", function () {
// alert("您点击了地图。");
// });
//点击地图事件
let p1 = new BMap.Point(106.52546, 29.521285); //测试谢家湾广场A坐
let p2 = new BMap.Point(106.361294, 29.400541); //测试九龙西苑
console.log(map.getDistance(p1, p2)); //算出2个点的距离
let ctrl = new BMap.NavigationControl({
enableGeolocation: true, //显示导航控件
});
let geoc = new BMap.Geocoder(); //创建地址解析对象
//解析出地址
geoc.getLocation(p1, (result) => {
// console.log(result);
});
//解析出经度,纬度
geoc.getPoint("重庆市大渡口区幸福华庭", (result) => {
console.log(result);
let lat = result.lat;
let lng = result.lng;
let p3 = new BMap.Point(lng, lat); //创造一个Point对象
map.centerAndZoom(p3, 15); //设置当前的位置
let marker = new BMap.Marker(p3, {
// enableDragging: true, //是启用拖拽
});
map.addOverlay(marker);
});
//添加控件
map.addControl(ctrl);
</script>
</body>
</html>
拖放
拖放是将对象从一个位置拖拽到另外一个位置的操作。任何HTML
元素都可以进行拖放操作。但为了保证兼容性,建议在拖放的对象上添加属性:draggable=true
,一旦包含这个属性,当前元素将支持拖放操作。
1 |
|
拖拽相关事件 - DragEvent
DragEvent
指拖拽事件,其继承自MouseEvent
和Event
接口。
拖拽事件涉及到的事件源有两大类:源对象(当前拖拽的对象)、目标对象(目标容器对象)。那么在拖拽的过程中针对源对象与目标对象都会触发相关的拖拽事件,只需要捕获这些事件,在事件处理函数中编写业务逻辑即可。
源对象事件
dragstart
开始拖拽时执行
drag
拖拽过程中不断执行
dragend
结束拖拽时执行
目标对象事件
dragenter
当拖拽源对象进入目标对象时触发
dragover
当拖拽源对象悬停在目标对象上时触发
dragleave
当拖拽源对象离开目标对象时触发
drop
当在目标对象中事件源对象时触发
注意:
在
dragover
事件处理函数中需要加入:event.preventDefault()
阻止浏览器的默认事件处理方式,否则不会触发目标对象的drop
事件。
firefox
浏览器针对图像与a
有浏览器默认处理方式(重新打开一个新的tab
页面),需要阻止该浏览器默认事件,所以需要在drop
事件处理函数中:
1
2
event.preventDefault();
event.stopPropagation();
拖拽过程中的数据传输
在拖拽过程中,经常性的需要在开始拖拽的时候存一些数据,等到drop
的时候获取这些数据,通过这些实时的参数执行后续业务。
步骤 1:在开始拖拽时,存入数据:
1 |
|
步骤 2:在drop
时,取出当时存的数据:
1 |
|
实现拖拽上传文件
文件上传流程与协议规范
文件上传流程
- 客户端选择要上传的文件,点击上传,开始建立连接,准备上传。
- 服务端接收连接请求,完成连接的建立,接收上传文件(遵守通信协议)
- 服务端把接收到的文件数据,存入服务器文件系统(
d:/xxx.mp4
)- 传输结束,保存完后即上传成功。
- 客户端可以通过一个特殊的链接地址,访问以前上传过的数据。
上传通信协议规范(http
)
- 要求客户端上传文件请求方式必须是
post
。- 发送请求时必须携带消息头:
Content-Type:multipart/form-data
- 客户端将读取本地文件,并且把文件内容以字节流的方式写给服务端。
- 服务端将会接收请求数据,解析文件,存储到服务器文件系统。
具体实现步骤
客户端:
准备好一个网页,编写
div
,接收拖拽进来的文件数据。
1
2
drop:
let files = event.dataTransfer.files遵守上传文件的协议规范,发送
http
请求,将文件数据发给服务器。
1
2
3
4
5
let formData = new Formdata(); // 用于封装表单参数
formData.append("name", "zs");
formData.append("pwd", "1234");
formData.append("uploadFile", filelist[0]);
axios.post("http://localhost:3000/upload", formData);服务端返回响应数据后,接收返回回来的结果,执行后续业务。
服务端: uploadserver
解压,并启动
uploadserver
服务:node index.js
如何访问上传的资源
最基础访问方法:
服务端直接把
upload
文件夹设置为静态托管目录。客户端发送请求,可以直接访问静态资源:
1
http://ip:port/52345-23452345-234523-452342-345235.jpg
如何在用户上传了头像后,可以在用户登录的时候看到用户上传的头像?
一旦头像上传成功,把生成的头像路径存入数据库,与当前用户绑定在一起:
1
2
3
id name age pwd avatar
1 zs 11 1234 null
2 ls 12 1234 435234-523452345-3245.jpg当下次
ls
登录时,获取服务端存储的用户的详细信息(包括头像),直接通过upload
文件夹访问该静态资源即可。
百度地图JSAPI
百度地图jsAPI
是一套基于Javascript
开发的应用程序接口。支持PC
、小程序、移动端地图开发。
基本使用方法
登录百度地图开放平台,创建应用,申请秘钥。
创建应用,申请开发者秘钥。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Hello, World</title>
<style type="text/css">
body {
margin: 0px;
padding: 0px;
}
#container {
height: 400px;
width: 400px;
margin: 100px auto;
}
</style>
<script
type="text/javascript"
src="https://api.map.baidu.com/api?v=3.0&ak=w5VlGDoizEBhueAzOymyI44bcydyh1Tf"
></script>
</head>
<body>
<div id="container"></div>
<script type="text/javascript">
var map = new BMap.Map("container");
// 创建地图实例
var point = new BMap.Point(116.404, 39.915);
// 创建点坐标
// 初始化地图,设置中心点坐标和地图级别
map.enableScrollWheelZoom(true);
//开启鼠标滚轮
// map.addEventListener("click", function () {
// alert("您点击了地图。");
// });
//点击地图事件
let p1 = new BMap.Point(106.52546, 29.521285); //测试谢家湾广场A坐
let p2 = new BMap.Point(106.361294, 29.400541); //测试九龙西苑
console.log(map.getDistance(p1, p2)); //算出2个点的距离
let ctrl = new BMap.NavigationControl({
enableGeolocation: true, //显示导航控件
});
let geoc = new BMap.Geocoder(); //创建地址解析对象
//解析出地址
geoc.getLocation(p1, (result) => {
// console.log(result);
});
//解析出经度,纬度
geoc.getPoint("重庆市大渡口区幸福华庭", (result) => {
console.log(result);
let lat = result.lat;
let lng = result.lng;
let p3 = new BMap.Point(lng, lat); //创造一个Point对象
map.centerAndZoom(p3, 15); //设置当前的位置
let marker = new BMap.Marker(p3, {
// enableDragging: true, //是启用拖拽
});
map.addOverlay(marker);
});
//添加控件
map.addControl(ctrl);
</script>
</body>
</html>
异步加载百度地图
bdmap.js
1 |
|
BdMap.vue
1 |
|
html
1 |
|
js
1 |
|