百度地图的轨迹回放和实时监控

一时失言乱红尘 2023-06-12 09:56 122阅读 0赞

最近写了两个页面,是跟百度地图有关的,本来以为是用的鹰眼的轨迹,才发现没那么麻烦,直接用的是百度地图自带的api。

1 轨迹回放

  1. <template>
  2. <div class="map">
  3. <!--面包屑-->
  4. <span class="content_span">
  5. <el-breadcrumb separator-class="el-icon-arrow-right">
  6. <el-breadcrumb-item :to="{ path: '/index' }">首页</el-breadcrumb-item>
  7. <el-breadcrumb-item>后台管理</el-breadcrumb-item>
  8. <el-breadcrumb-item>人员管理</el-breadcrumb-item>
  9. <el-breadcrumb-item>{
  10. {this.$route.meta.title}}</el-breadcrumb-item>
  11. </el-breadcrumb>
  12. </span>
  13. <div class="left">
  14. <!-- 设备信息 -->
  15. <div class="she_bei">
  16. <h5>设备信息</h5>
  17. <el-form ref="form" :model="form1" label-width="80px">
  18. <el-form-item label="所属班组:">
  19. <el-select v-model="form2.class1" placeholder="请选择" @change="change1">
  20. <el-option
  21. v-for="item in class1"
  22. :key="item.value"
  23. :label="item.value"
  24. :value="item.value">
  25. </el-option>
  26. </el-select>
  27. </el-form-item>
  28. <el-form-item label="设备编号:">
  29. <el-select v-model="form2.number" placeholder="请选择" @change="change2">
  30. <el-option
  31. v-for="item in number"
  32. :key="item.value"
  33. :label="item.label"
  34. :value="item.value">
  35. </el-option>
  36. </el-select>
  37. </el-form-item>
  38. </el-form>
  39. </div>
  40. <!-- 时间 -->
  41. <div class="time">
  42. <h5>时间</h5>
  43. <el-form ref="form" :model="form2" label-width="80px">
  44. <el-form-item label="开始时间:">
  45. <el-date-picker
  46. v-model="form2.value1"
  47. type="datetime"
  48. placeholder="开始时间">
  49. </el-date-picker>
  50. </el-form-item>
  51. <el-form-item label="结束时间:">
  52. <el-date-picker
  53. v-model="form2.value2"
  54. type="datetime"
  55. placeholder="结束时间">
  56. </el-date-picker>
  57. </el-form-item>
  58. </el-form>
  59. <el-button size="mini" style="float:right;margin-right:35px;" @click="inquiry">轨迹查询</el-button>
  60. </div>
  61. <!-- 回放控制 -->
  62. <div class="hui_fang">
  63. <h5>回放控制</h5>
  64. <el-button size="mini" @click="play">开始</el-button>
  65. <el-button size="mini" @click="pause">暂停</el-button>
  66. <el-button size="mini" @click="reset">重放</el-button>
  67. <el-button size="mini" @click="clear">清除轨迹</el-button>
  68. <strong style="font-size:12px;margin-top:8px;display:block;">播放速率:</strong>
  69. <el-slider
  70. v-model="value3"
  71. :marks="marks"
  72. style="width:90%;margin-left:5%;"
  73. :step="1">
  74. </el-slider>
  75. </div>
  76. <!-- 状态 -->
  77. <div class="status">
  78. <h5>状态</h5>
  79. <div><span>总里程数:</span>约{
  80. {totalMi}}公里</div>
  81. <!-- <div><span>终端名称:</span>{
  82. {form2.number}}</div> -->
  83. <div><span>定位类型:</span>GPS+北斗</div>
  84. <div><span>当前速度:</span>{
  85. {speed}}km/h</div>
  86. <div><span>当前时间:</span>{
  87. {date}}</div>
  88. <div><span>轨迹时间:</span>约{
  89. {hour}}时{
  90. {minute}}分{
  91. {second}}秒</div>
  92. <!-- <div><span>现里程数:</span>约{
  93. {nowMi}}公里</div>
  94. <div><span>运动时间:</span></div>
  95. <div><span>停留时间:</span></div> -->
  96. </div>
  97. </div>
  98. <!-- 地图 -->
  99. <div id="map">
  100. </div>
  101. </div>
  102. </template>
  103. <script>
  104. var _this;
  105. import axios from '../../apiconfig/index.js';
  106. import loadMap from '../../../static/js/loadBMap.js';
  107. import GeoUtils from '../../../static/js/util.js';
  108. const moment=require('moment');
  109. export default {
  110. data(){
  111. return {
  112. // 设备信息
  113. equipment:[],
  114. form1:{
  115. class1:'',
  116. number:''
  117. },
  118. //所属班组
  119. class1:[],
  120. //设备编号
  121. number:[],
  122. // 时间
  123. form2:{
  124. value1:'',
  125. value2:''
  126. },
  127. // 可以调整播放速度
  128. value3:'',
  129. //当前速度
  130. speed:0,
  131. marks: {
  132. 0: '0',
  133. 25: '25',
  134. 50: '50',
  135. 75:'75',
  136. 100:'100'
  137. },
  138. // 当前时间
  139. date:moment(new Date()).format('YYYY-MM-DD HH:mm:ss'),
  140. // 总里程数
  141. totalMi:0,
  142. // 现里程数
  143. nowMi:0,
  144. //轨迹的参数
  145. map:'',
  146. car:'',
  147. label:'',
  148. centerPoint:'',
  149. driving:'',
  150. timer:null,
  151. index:0,
  152. //轨迹时间
  153. hour:0,
  154. minute:0,
  155. second:0
  156. }
  157. },
  158. mounted(){
  159. _this=this;
  160. _this.baidu();
  161. _this.getEquipment();
  162. _this.form2.value1=moment(new Date()).format('YYYY-MM-DD 00:00:00');
  163. _this.form2.value2=moment(new Date()).format('YYYY-MM-DD 23:59:59');
  164. },
  165. methods:{
  166. //班组改变时
  167. change1(val){
  168. _this.form1.class1=val;
  169. },
  170. //设备列表改变时
  171. change2(val){
  172. _this.form1.number=val;
  173. },
  174. //获取设备列表
  175. getEquipment(){
  176. axios
  177. .get('/api/SafetyHat/GetEquipment')
  178. .then(res=>{
  179. console.log(res)
  180. if(res.ResultType==0){
  181. _this.equipment=res.Data.pu;
  182. _this.class1=_this.equipment.map((item)=>{
  183. return {
  184. value:item.LineID
  185. }
  186. })
  187. _this.number=_this.equipment.map((item)=>{
  188. return {
  189. value:item.PuID,
  190. label:item.PuName
  191. }
  192. })
  193. console.log(_this.class1)
  194. }
  195. })
  196. .catch(error=>{
  197. console.log(error)
  198. })
  199. },
  200. baidu(){
  201. // panTo()方法将让地图平滑移动至新中心点,如果移动距离超过了当前地图区域大小,则地图会直跳到该点
  202. // new BMap.DrivingRoute(map);创建驾车实例
  203. loadMap('lGct54QCT9vLZ2b4miQlr5KirsBXI1Du').then(()=>{
  204. var map = new BMap.Map("map"); // 创建Map实例
  205. var point=new BMap.Point(114.471938,38.071433);
  206. map.centerAndZoom(point, 11); // 初始化地图,设置中心点坐标和地图级别
  207. //添加地图类型控件
  208. map.addControl(new BMap.MapTypeControl({
  209. mapTypes:[
  210. BMAP_NORMAL_MAP,
  211. BMAP_HYBRID_MAP
  212. ]}));
  213. map.setCurrentCity("石家庄"); // 设置地图显示的城市 此项是必须设置的
  214. map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
  215. var marker=new BMap.Marker(point); //创建点
  216. map.addOverlay(marker);//向地图添加覆盖物
  217. })
  218. },
  219. // 开始
  220. play(){
  221. loadMap('lGct54QCT9vLZ2b4miQlr5KirsBXI1Du').then(()=>{
  222. var points = [];
  223. axios
  224. .get('/api/SafetyHat/GetTrajectory',{
  225. params:{
  226. LineID:_this.form1.class1,
  227. PuID:_this.form1.number,
  228. startTime:Date.parse(_this.form2.value1).toString().substr(0,10),
  229. endTime:Date.parse(_this.form2.value2).toString().substr(0,10)
  230. }
  231. })
  232. .then(res=>{
  233. if(res.ResultType ==0){
  234. for(var i=0;i<res.Data.length;i++){
  235. points.push(new BMap.Point(res.Data[i].Longitude,res.Data[i].Latidude))
  236. }
  237. if(_this.index < points.length) {
  238. _this.timer = window.setInterval(function(){
  239. //位置的移动
  240. _this.index++;
  241. var point = points[_this.index];
  242. _this.car.setPosition(point);
  243. _this.map.addOverlay(_this.car);
  244. //当前时间移动
  245. var arr1=[];
  246. for(var i=0;i<res.Data.length;i++){
  247. arr1.push(res.Data[i].GpsTime)
  248. arr1[i]=moment(arr1[i]*1000).format('YYYY-MM-DD HH:mm:ss')
  249. }
  250. _this.date=arr1[_this.index];
  251. // 速度移动
  252. var arr2=[];
  253. for(var i=0;i<res.Data.length;i++){
  254. arr2.push(res.Data[i].Speed)
  255. }
  256. _this.speed=arr2[_this.index];
  257. //清除定时器
  258. if(_this.index == points.length){
  259. window.clearInterval(_this.timer)
  260. _this.date=arr1[arr1.length-1];
  261. _this.speed=0;
  262. }
  263. }, 500);
  264. }
  265. }
  266. })
  267. .catch(error=>{
  268. console.log(error)
  269. })
  270. })
  271. },
  272. // 暂停
  273. pause(){
  274. if(_this.timer) {
  275. window.clearInterval(_this.timer);
  276. }
  277. },
  278. // 重放
  279. reset(){
  280. loadMap('lGct54QCT9vLZ2b4miQlr5KirsBXI1Du').then(()=>{
  281. var points = [];
  282. axios
  283. .get('/api/SafetyHat/GetTrajectory',{
  284. params:{
  285. LineID:_this.form1.class1,
  286. PuID:_this.form1.number,
  287. startTime:Date.parse(_this.form2.value1).toString().substr(0,10),
  288. endTime:Date.parse(_this.form2.value2).toString().substr(0,10)
  289. }
  290. })
  291. .then(res=>{
  292. if(res.ResultType ==0){
  293. for(var i=0;i<res.Data.length;i++){
  294. points.push(new BMap.Point(res.Data[i].Longitude,res.Data[i].Latidude))
  295. }
  296. points = _this.driving.getResults().getPlan(0).getRoute(0).getPath();
  297. if(_this.timer) {
  298. window.clearInterval(_this.timer);
  299. }
  300. _this.index = 0;
  301. _this.car.setPosition(points[0]);
  302. _this.play();
  303. _this.centerPoint = new BMap.Point((points[0].lng + points[points.length - 1].lng) / 2, (points[0].lat + points[points.length - 1].lat) / 2);
  304. _this.map.panTo(_this.centerPoint);
  305. }
  306. })
  307. .catch(error=>{
  308. console.log(error)
  309. })
  310. })
  311. },
  312. // 清除轨迹
  313. clear(){
  314. _this.map.clearOverlays();
  315. window.clearInterval(_this.timer);
  316. },
  317. // 查询
  318. inquiry(){
  319. loadMap('lGct54QCT9vLZ2b4miQlr5KirsBXI1Du').then(()=>{
  320. var points = [];
  321. axios
  322. .get('/api/SafetyHat/GetTrajectory',{
  323. params:{
  324. LineID:_this.form1.class1,
  325. PuID:_this.form1.number,
  326. startTime:Date.parse(_this.form2.value1).toString().substr(0,10),
  327. endTime:Date.parse(_this.form2.value2).toString().substr(0,10)
  328. }
  329. })
  330. .then(res=>{
  331. console.log(res)
  332. if(res.ResultType ==0){
  333. for(var i=0;i<res.Data.length;i++){
  334. points.push(new BMap.Point(res.Data[i].Longitude,res.Data[i].Latidude))
  335. }
  336. //初始化地图,选取第一个点为起始点
  337. _this.map = new BMap.Map("map");
  338. _this.map.centerAndZoom(points[0],11);
  339. _this.map.enableScrollWheelZoom();
  340. _this.map.addControl(new BMap.NavigationControl());
  341. _this.map.addControl(new BMap.ScaleControl());
  342. _this.map.addControl(new BMap.OverviewMapControl({isOpen: true}));
  343. //通过DrivingRoute获取一条路线的point
  344. _this.driving = new BMap.DrivingRoute(_this.map);
  345. _this.driving.search(new BMap.Point(points[0].lng,points[0].lat), new BMap.Point(points[points.length-1].lng,points[points.length-1].lat));
  346. _this.driving.setSearchCompleteCallback(function() {
  347. //画面移动到起点和终点的中间
  348. _this.centerPoint = new BMap.Point(points[0].lng,points[0].lat);
  349. _this.map.panTo(_this.centerPoint);
  350. //连接所有点
  351. _this.map.addOverlay(new BMap.Polyline(points, {strokeColor: "blue", strokeWeight:4, strokeOpacity: 1}));
  352. //显示安全帽
  353. _this.label = new BMap.Label("安全帽", {offset: new BMap.Size(-10, -20)});
  354. var icon = new BMap.Icon('../../../static/imgs/cap.png', new BMap.Size(25, 20), {
  355. anchor: new BMap.Size(10, 20)
  356. });
  357. _this.car = new BMap.Marker(points[0],{icon:icon});
  358. _this.car.setLabel(_this.label);
  359. _this.map.addOverlay(_this.car);
  360. });
  361. //计算总里程数
  362. var point1=new BMap.Polyline(points);//BMapLib.GeoUtils
  363. _this.totalMi=(BMapLib.GeoUtils.getPolylineDistance(points).toFixed(0)/1000).toFixed(1);
  364. console.log(points)
  365. var end=res.Data[0].GpsTime-res.Data[res.Data.length-1].GpsTime;
  366. _this.hour= parseInt((end % (60 * 60 * 24)) / ( 60 * 60));
  367. _this.minute= parseInt((end % ( 60 * 60)) / ( 60));
  368. _this.second= (end % (60));
  369. }else{
  370. _this.$message.error('获取轨迹失败!您所选时间暂时没有轨迹或者未选择班组和设备编号!');
  371. }
  372. })
  373. .catch(error=>{
  374. console.log(error)
  375. })
  376. })
  377. }
  378. }
  379. }
  380. </script>
  381. <style scoped>
  382. /* .map{
  383. width:89%;
  384. height:900px;
  385. float:right;
  386. } */
  387. #map{
  388. width:81%;
  389. height:980px;
  390. float:right;
  391. }
  392. .left{
  393. width:19%;
  394. height:980px;
  395. float:left;
  396. background: #e0eeee;
  397. padding:10px 5px;
  398. }
  399. h5{
  400. position: relative;
  401. }
  402. h5:after{
  403. position: absolute;
  404. bottom:-6px;
  405. left:0;
  406. background: #ccc;
  407. width:100%;
  408. content:'';
  409. height:1px;
  410. }
  411. .she_bei,.time{
  412. font-size:13px;
  413. }
  414. .status{
  415. margin-top: 15px;
  416. }
  417. .status div{
  418. margin-top: 10px;
  419. font-size:13px;
  420. color:#999;
  421. padding-left: 10px;
  422. box-sizing: border-box;
  423. }
  424. .status div span{
  425. color:black;
  426. margin-right: 10px;
  427. }
  428. .hui_fang{
  429. margin-top: 15px;
  430. }
  431. </style>

2 实时监控

  1. <template>
  2. <div class="monitor">
  3. <!--面包屑-->
  4. <span class="content_span">
  5. <el-breadcrumb separator-class="el-icon-arrow-right">
  6. <el-breadcrumb-item :to="{ path: '/index' }">首页</el-breadcrumb-item>
  7. <el-breadcrumb-item>后台管理</el-breadcrumb-item>
  8. <el-breadcrumb-item>人员管理</el-breadcrumb-item>
  9. <el-breadcrumb-item>{
  10. {this.$route.meta.title}}</el-breadcrumb-item>
  11. </el-breadcrumb>
  12. </span>
  13. <!-- 左侧信息 -->
  14. <div class="left">
  15. <el-tree
  16. :data="data"
  17. :props="defaultProps"
  18. show-checkbox
  19. @check-change="handleCheckChange">
  20. <span class="custom-tree-node" slot-scope="{ node, data }">
  21. <span>
  22. <i :class="node.icon"></i>{
  23. { node.label }}
  24. </span>
  25. </span>
  26. </el-tree>
  27. </div>
  28. <!-- 地图 -->
  29. <div id="map">
  30. </div>
  31. <!-- 下面的展示区域 -->
  32. <div class="bottom">
  33. <el-table
  34. :data="tableData"
  35. style="width: 100%">
  36. <el-table-column
  37. prop="Name"
  38. label="设备名称"
  39. width="200">
  40. </el-table-column>
  41. <el-table-column
  42. prop="Address"
  43. label="地理位置">
  44. </el-table-column>
  45. <el-table-column
  46. prop="Speed"
  47. label="速度"
  48. width="200">
  49. </el-table-column>
  50. <el-table-column
  51. prop="Time"
  52. label="上报时间"
  53. width="300">
  54. </el-table-column>
  55. <el-table-column
  56. prop="IsStatus"
  57. label="是否在线"
  58. width="200">
  59. </el-table-column>
  60. </el-table>
  61. </div>
  62. </div>
  63. </template>
  64. <script>
  65. var _this;
  66. import axios from '../../apiconfig/index.js';
  67. import loadMap from '../../../static/js/loadBMap';
  68. const moment=require('moment');
  69. export default {
  70. data(){
  71. return {
  72. data:[{
  73. label: '设备列表',
  74. children: [{
  75. label: 'HBWS',
  76. children: [{
  77. label:"1095001"
  78. }]
  79. }]
  80. }],
  81. defaultProps: {
  82. children: 'children',
  83. label: 'label'
  84. },
  85. map:'',
  86. point:'',
  87. marker:'',
  88. label:'',
  89. icon:'',
  90. timer:null,
  91. description:{
  92. type:String,
  93. default:'天安门'
  94. },
  95. pu:[],
  96. tableData:[]
  97. }
  98. },
  99. mounted(){
  100. _this=this;
  101. _this.getPuName();
  102. window.localStorage.removeItem('PuID');
  103. _this.baidu();
  104. },
  105. beforeDestroy(){
  106. clearInterval(_this.timer);
  107. },
  108. methods:{
  109. //获取getPuName
  110. getPuName(){
  111. axios
  112. .get('/api/SafetyHat/GetEquipment')
  113. .then(res=>{
  114. console.log(res)
  115. if(res.ResultType==0){
  116. _this.pu=res.Data.pu;
  117. _this.data[0].children[0].children=res.Data.pu.map((item)=>{
  118. return {
  119. label:item.PuName
  120. }
  121. })
  122. }
  123. })
  124. .catch(error=>{
  125. console.log(error)
  126. })
  127. },
  128. //设置定时器
  129. setDing(){
  130. if(localStorage.getItem('PuID') != undefined && localStorage.getItem('PuID') != null){
  131. //封装函数
  132. function move(){
  133. console.log('666')
  134. _this.map.removeOverlay(_this.marker);
  135. axios
  136. .get('/api/SafetyHat/Monitor',{
  137. params:{
  138. PuID:localStorage.getItem('PuID') || ''
  139. }
  140. })
  141. .then(res=>{
  142. console.log(res)
  143. var PuName=_this.pu.find(itm=>{return itm.PuID==localStorage.getItem('PuID')}).PuName
  144. if(res.ResultType==0){
  145. _this.point=new BMap.Point(res.Data[0].Longitude,res.Data[0].Latidude);
  146. if(res.Data[0].State == 1){
  147. _this.icon=new BMap.Icon('../../../static/imgs/map1.png', new BMap.Size(25, 20), {
  148. anchor: new BMap.Size(10, 20)
  149. });
  150. }else{
  151. _this.icon=new BMap.Icon('../../../static/imgs/cap.png', new BMap.Size(25, 20), {
  152. anchor: new BMap.Size(10, 20)
  153. });
  154. }
  155. _this.map.centerAndZoom(_this.point, 17);
  156. _this.label = new BMap.Label(PuName, {offset: new BMap.Size(-10, 25)});
  157. _this.marker=new BMap.Marker(_this.point,{icon:_this.icon});
  158. _this.marker.setLabel(_this.label)
  159. _this.map.addOverlay(_this.marker);
  160. //点击出现框框
  161. var opts ={
  162. width :250,
  163. height:200,
  164. title :"地址:",
  165. }
  166. var infoWindow =new BMap.InfoWindow('aaaaa',opts);// 创建信息窗口对象
  167. _this.marker.addEventListener("click",function(){
  168. _this.map.openInfoWindow(infoWindow,_this.point);
  169. });
  170. //根据经纬度获取地址
  171. var geolocation = new BMap.Geolocation();
  172. var gc = new BMap.Geocoder();
  173. var pointAdd = new BMap.Point(res.Data[0].Longitude, res.Data[0].Latidude);
  174. gc.getLocation(pointAdd, function(rs){
  175. //console.log(rs.address)
  176. //点击给底部赋值
  177. _this.tableData=res.Data.map((item)=>{
  178. return {
  179. Name:PuName,
  180. Address:rs.address,
  181. Speed:item.Speed+'km/h',
  182. Time:moment(item.GpsTime*1000).format('YYYY-MM-DD HH:mm:ss'),
  183. IsStatus:item.State == 0 ? '在线':'不在线'
  184. }
  185. })
  186. })
  187. }
  188. })
  189. .catch(error=>{
  190. console.log(error)
  191. })
  192. }
  193. move();
  194. //调用定时器
  195. _this.timer=setInterval(move,20000);
  196. }
  197. },
  198. baidu(){
  199. // panTo()方法将让地图平滑移动至新中心点,如果移动距离超过了当前地图区域大小,则地图会直跳到该点
  200. // new BMap.DrivingRoute(map);创建驾车实例
  201. loadMap('lGct54QCT9vLZ2b4miQlr5KirsBXI1Du').then(()=>{
  202. _this.map = new BMap.Map("map"); // 创建Map实例
  203. _this.point=new BMap.Point(114.471938,38.071433);
  204. _this.map.centerAndZoom(_this.point, 15); // 初始化地图,设置中心点坐标和地图级别
  205. //添加地图类型控件
  206. _this.map.addControl(new BMap.MapTypeControl({
  207. mapTypes:[
  208. BMAP_NORMAL_MAP,
  209. BMAP_HYBRID_MAP
  210. ]}));
  211. _this.map.setCurrentCity("石家庄"); // 设置地图显示的城市 此项是必须设置的
  212. _this.map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
  213. //调用定时器
  214. _this.setDing();
  215. })
  216. },
  217. //多选框点击时
  218. handleCheckChange(data, checked, indeterminate) {
  219. if(checked==true){
  220. var PuID=_this.pu.find(itm=>{return itm.PuName==data.label}).PuID;
  221. window.localStorage.setItem('PuID',PuID);
  222. axios
  223. .get('/api/SafetyHat/Monitor',{
  224. params:{
  225. PuID:localStorage.getItem('PuID') || ''
  226. }
  227. })
  228. .then(res=>{
  229. console.log(res)
  230. if(res.ResultType==0){
  231. _this.setDing();
  232. }
  233. })
  234. .catch(error=>{
  235. console.log(error)
  236. })
  237. }else{
  238. window.localStorage.removeItem('PuID')
  239. clearInterval(_this.timer);
  240. _this.map.removeOverlay(_this.marker);
  241. }
  242. },
  243. }
  244. }
  245. </script>
  246. <style scoped>
  247. /* .monitor{
  248. width:89%;
  249. height:900px;
  250. float:right;
  251. } */
  252. .left{
  253. width:15%;
  254. height:980px;
  255. float:left;
  256. background: #e0eeee;
  257. padding:10px 5px;
  258. }
  259. #map{
  260. width:85%;
  261. height:980px;
  262. float:right;
  263. }
  264. .el-tree{
  265. background: #e0eeee;
  266. font-size:13px;
  267. }
  268. .bottom{
  269. width:89%;
  270. height:100px;
  271. position: absolute;
  272. left:11%;
  273. bottom:0;
  274. }
  275. .bottom .el-table{
  276. background: #eee;
  277. }
  278. </style>

这里边包含了轨迹回放和实时监控。轨迹回访里包括查询轨迹,开始,暂停,重放和清除轨迹;实时监控里包括了设备的实时查看监控。

写的备注有点不是很多,但是都是百度地图的api,还有一些js逻辑,没有别的东西。

发表评论

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

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

相关阅读

    相关 使用教程

    内容介绍 1.了解地图的使用场景 2.百度地图介绍 3.显示公司地址案例 4.展示到公司路线案例 一、使用场景 地图的使用场景非常广泛。地图定位可以更直观