ionic使用百度地图实时定位并导入标记

最近遇到前端需要实现地图的功能,其实调用地图的例子网上有好多,这边介绍一下我们如何通过ionic框架在前端调用百度地图。

 

首先我们需要在src目录下的index.html文件中引入百度地图,在这之前请申请百度地图密钥(密钥在百度地图官网申请)

 <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=你所申请的密钥"></script>

 

其次我们需要调用geolocation插件来进行定位,在终端中输入以下命令行进行安装

ionic cordova plugin add cordova-plugin-geolocation
npm install --save @ionic-native/geolocation
(若使用淘宝镜像,请将nmp改为cnmp)
//npm淘宝镜像,之后就可以采用cnpm代替npm命令加快之后plugin下载速度
//npm install -g cnpm --registry=https://registry.npm.taobao.org

 

接着我们在html中加入map,并写好样式,例如

//html文件
<div #map id="map_container"></div>

//scss文件
  #map_container{
    width: 100%;
    height: 100%;
  }

 

最后我们进行ts文件的编写,具体是通过geolocation插件提供的getcurrentlocation来获取当前位置,但是这个方法只会获取一次,因此我们这边用的是watchposition方法来获取实时位置,关于这两个函数的具体用法可以在ionic官方文档上查看。接着我们会从后端获取需要在地图上显示的标记的经纬度(只需要实现实时定位功能的话可以忽略),然后在地图上标记出来。具体代码如下所示

import { Component,ViewChild,ElementRef } from '@angular/core';
import { IonicPage,NavController, NavParams } from 'ionic-angular';
//导入geolocation
import { Geolocation } from '@ionic-native/geolocation';
//这边我们写了一个合httpservice用来get或者post后端数据,进而从后端获取要在地图上显示的标记的经纬度
import { HttpService } from "../../services/HttpService";
import { AppConfig } from "../../app/app.config";
//申明百度地图类库
declare var BMap;


@IonicPage()
@Component({
  selector: 'page-BaiduMap',

  templateUrl: 'BaiduMap.html'
})
export class HomePage {
  @ViewChild('map') map_container: ElementRef; //创建视图
  map: any; //地图对象
  marker: any; //标记
  markIcon:any; //标记图标
  locationIcon:any; //实时位置图标
  url = AppConfig.getUrl(); //获取服务器url,这边要提前在config中写好服务器的url,以便获取标记的经纬度
  markOrder:any; //从后端获取的标记顺序
  subscription: any; //用来控制watchposition,以便在退出页面的时候关闭

  constructor(public navCtrl: NavController,
               private geolocation: Geolocation,
               private settings: SettingProvider,
               private httpService:HttpService) {
    this.markIcon = new BMap.Icon("assets/icon/mark.ico", new BMap.Size(50, 50));
    this.locationIcon = new BMap.Icon("assets/icon/currentlocation.ico", new BMap.Size(30, 30));

  }

//在进入页面的时候触发

  ionViewDidEnter() {

    let map = this.map = new BMap.Map(this.map_container.nativeElement, { enableMapClick: true });  //创建地图实例
    map.addControl(new BMap.MapTypeControl()); //添加地图类型


    this.httpService.get(this.url + "你的action") //调用相关action
      .then(res=>{
        //判断是否认证成功
       for(this.markOrder=0;;this.markOrder++){
          let point = new BMap.Point(res[this.markOrder].ccLongitudeBaidu, res[this.markOrder].ccLatitudeBaidu); //标记位置显示
           let marker = new BMap.Marker(point,{ icon: this.markIcon });  //设置标记图标
          this.map.addOverlay(marker);  //加入地图中
        
      }}).catch((err:any) => {
      console.log(err);
    });


    let sizeMap = new BMap.Size(10, 80); //地图大小
    // map.addControl(new BMap.NavigationControl());//添加平移缩放控件

    //获取当前位置(只调用一次)
    this.geolocation.getCurrentPosition().then((resp) => {
      let point = new BMap.Point(resp.coords.longitude, resp.coords.latitude);
      map.centerAndZoom(point, 18);  //设置中心和地图显示级别
    });


    let previousMarker = null; //记录实时定位时保存先前一个marker点,以便更新时删除前一个marker点
    //采用watchPosition()实时更新定位
    this.subscription = this.geolocation.watchPosition()
      .filter((p) => p.coords !== undefined) //Filter Out Errors
      .subscribe(position => {
        let point = new BMap.Point(position.coords.longitude, position.coords.latitude);

        let convertor = new BMap.Convertor();  //定义转换器
        let pointArr = [];  //定义位置点数组
        pointArr.push(point);  //放入当前位置点
        convertor.translate(pointArr, 1, 5, (data) => {
          if (data.status === 0) {
            //如果已经记录过一次当前位置,则删除上一次的位置图标
            if(previousMarker != null){
              this.map.removeOverlay(previousMarker);
            }
            //设置图标并加入到地图中
            let marker = this.marker = new BMap.Marker(data.points[0], { icon: this.locationIcon });
            this.map.panTo(data.points[0]);
            marker.setPosition(data.points[0]);
            this.map.addOverlay(marker);
            previousMarker = marker;  //记录当前marker以便下次刷新位置时删除
          }
        })
      });


    map.enableScrollWheelZoom(true);  //启动滚轮放大缩小,默认禁用
    map.enableContinuousZoom(true);   //连续缩放效果,默认禁用
  }


  //跳转至城市选择页面
  goCitySelect(){
    this.navCtrl.push('CitySelectPage')
  }


  ionViewDidLeave(){
    //离开页面时关闭实时更新当前位置
    this.subscription.unsubscribe();
  }

}

 

参考资料

https://ionicframework.com/docs/native/geolocation/     ionic官方文档中geolocation的使用

https://www.cnblogs.com/caiyaming/p/9233315.html       ionic调用百度地图

https://blog.csdn.net/u011537073/article/details/62060294     使用ionic接入报读地图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值