腾讯地图使用心得

使用方式:(这里是在vue中使用的方式)

1.在index.html文件中引入

<script type="text/javascript" src="https://3gimg.qq.com/lightmap/components/geolocation/geolocation.min.js"></script>

<script charset="utf-8" src="https://map.qq.com/api/js?v=2.exp&key=you key"></script>

这里的key是在腾讯api官方申请的!!

2. 在要使用的组件中使用new qq.maps.LatLng(39.916527, 116.397128);这个方法创建地图;

const myLatlng = new qq.maps.LatLng(39.916527, 116.397128);//中心坐标点

//这个对象中是对地图样式的设置

const myOptions = {

  zoom: 15,              //设置地图缩放级别

  center: myLatlng,    //设置中心点样式

  mapTypeId: qq.maps.MapTypeId.ROADMAP,  //设置地图样式详情参见MapType

  zoomControl:false,

  panControl: false,

  mapTypeControl: false,

};

//获取dom元素添加地图信息

this.map = new qq.maps.Map(document.getElementById("类名"), myOptions);

3.const qqMapPosition = new qq.maps.Geolocation('you key','myName');

qqMapPosition.getLocation(this.sucCallback, this.showErr, options);//开启定位

这个方法是腾讯地图提供的定位方法!!

在这里腾讯地图有个坑,腾讯地图会自动做缓存是为了节省用户流量,所以即使已经退出组件或者退出程序还是会被缓存。

解决办法:1.杀死微信重新进入

      2.清理微信缓存

*************************************************************************************************

当然这不是最好的解决办法,为了解决每次进来可能使用的是腾讯地图上次的缓存,所有最后使用了腾讯地图提供的监视方法

qqMapPosition.watchPosition(this.showwatchPosition);//开启监控

qqMapPosition.clearWatch();//关闭监控

这个方法是腾讯地图提供的监视方法!!

***************************************************************************************************

这里说明:

定位方法会有两个回调函数:

1.成功的回调(this.sucCallback)这个方法返回的是用户当前位置的经纬度

和地址名称等信息

//定位成功回调

sucCallback(position){

    this.latitude = position.lat;  //纬度

  this.longitude = position.lng; //经度

this.city = position.city;

this.seat = position.city + position.addr; //名称

    this.setMap();  //这个方法是重新绘制地图标注等信息的

},

2.失败的回调(this.showErr)

//定位失败的回调

showErr() {

console.log("定位失败,请检查是否打开定位")

},

监视的方法只有一个回调:

成功的回调(this.showwatchPosition)这个方法返回的是用户当前位置的经

维度和地址名称等信息

//监视位置是否变化

showwatchPosition(position) { 

this.GetDistance这个方法是计算上次位置和这次的位置差的,目地是因为监视这个方法调用的非常频繁,为了避免频繁的重绘重排导致卡顿,所以设置大于10米在换。

const number = parseInt(this.GetDistance(this.latitude,this.longitude,position.lat,position.lng)*1000)    

  //距离上次位置大于10米就重新绘制标注

  if (number > 10 ) {

    console.log('距离上次位置'+number+'米');

    this.latitude = position.lat;

  this.longitude = position.lng;

    this.city = position.city;

    this.seat = position.city + position.addr;

this.setMap();  //这个方法是重新绘制地图标注等信息的

  }

}

计算位置的方法:

//计算两点之间的距离

GetDistance( lat1,  lng1,  lat2,  lng2){

  var radLat1 = lat1*Math.PI / 180.0;

  var radLat2 = lat2*Math.PI / 180.0;

  var a = radLat1 - radLat2;

  var  b = lng1*Math.PI / 180.0 - lng2*Math.PI / 180.0;

  var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) +

    Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));

  s = s *6378.137 ;// EARTH_RADIUS;

  s = Math.round(s * 10000) / 10000;

  return s;

},

这个方法计算的值是千米(KM)!!

说明一下四个参数是什么意思:

1:起点的维度

2:起点的经度

3:结束点的维度

4:结束点的经度

绘制地图标注等信息的:

//改变地图上的标注,圈,线

setMap() {

这三个判断是把之前创建的标注等信息给清除不然会一直叠加!!

if (this.marker) {

  this.marker.setMap(null);

}

  if (this.circle) {

    this.circle.setMap(null);

  }

  if (this.polyline) {

    this.polyline.setMap(null);

  }

  //设置地图中心点

  const myLatlng = new qq.maps.LatLng(this.latitude,this.longitude);

  this.map.panTo(myLatlng); //每次拿到新的经纬度直接移动到对应的位置

  //设置标注的参数

  const anchor = new qq.maps.Point(10, 30),

    size = new qq.maps.Size(42, 68),

    origin = new qq.maps.Point(0, 0),

  设置图标的样式

      icon = new qq.maps.MarkerImage(

  markers,//图标的路径,在外面已经引用好了,可以不给使用原生

      size,

      origin,

      anchor

    );

  //给定位的位置添加图片标注

  this.marker = new qq.maps.Marker({

    position: myLatlng,//把标注放的位置

    map: this.map,//把标注给到地图

    visible: true,

  });

  this.marker.setIcon(icon);  //加上会使用自己定义的图标,不加用原生的

//判断用户是否有打卡地点

  if (this.center.lng) {

    const center = new qq.maps.LatLng(this.center.lat,this.center.lng);

    const radius = this.center.radius;

  //绘制圆圈

    this.circle =new qq.maps.Circle({

      map: this.map,

      center: center,

      radius: radius,

      fillColor:  new qq.maps.Color(164,233,187, 0.7),

      strokeColor: "#a4e9bb",

      strokeWeight: 1

  });

    //绘制线

    const path = [

      myLatlng,//起点位置

      center //终点位置

    ];

    this.polyline = new qq.maps.Polyline({

      //折线是否可点击

      clickable: false,

      //折线是否可编辑

      editable: false,

      map: this.map,

      //折线的路径

      path: path,

      //折线的颜色

      strokeColor: '#5A74DB',

      //折线的样式

      strokeDashStyle: 'solid',

      //折线的宽度

      strokeWeight: 5,

      //折线末端线帽的样式

      strokeLinecap: 'square',

      //折线是否可见

    visible: true,

      //折线的zIndex

      zIndex: -100

  });

  }

}

最后记录一下我遇到的坑,被困了很久才找到原因。

虽然每次进入都会开启监视但是因为监视这个方法是在new之后调用,(个人感觉是因为页面加载完成之后没有执行腾讯地图内部的js)导致第一次进入是无效的,所以

我最后把new qq.maps.Geolocation('you key','myName');这个方法挂在Vue的实例上,做到提前加载,这样每次使用的时候就不会出现第一次执行不成功。

我在腾讯地图提供的dom上亲测(想试一下的可以直接复制下面的代码替换到script):

var geolocation = new qq.maps.Geolocation("WJTBZ-C4AEX-N2X4U-TFBBX-TAU37-XXXXXX", "xxxxxxxxxxx");

document.getElementById("pos-area").style.height = (document.body.clientHeight - 110) + 'px';

/*

*

* 直接调用showWatchPosition();这个方法第一次是不会继续监视的

*

*/

window.onload = function () {

    showWatchPosition();

}

var positionNum = 0;

var options = {timeout: 8000};

function showPosition(position) {

    console.log('定位成功')

    positionNum ++;

    document.getElementById("demo").innerHTML += "序号:" + positionNum;

    document.getElementById("demo").appendChild(document.createElement('pre')).innerHTML = JSON.stringify(position, null, 4);

    document.getElementById("pos-area").scrollTop = document.getElementById("pos-area").scrollHeight;

};

function showErr() {

    positionNum ++;

    document.getElementById("demo").innerHTML += "序号:" + positionNum;

    document.getElementById("demo").appendChild(document.createElement('p')).innerHTML = "定位失败!";

    document.getElementById("pos-area").scrollTop = document.getElementById("pos-area").scrollHeight;

};

function showWatchPosition() {

    console.log('开始监听位置!')

    document.getElementById("demo").innerHTML += "开始监听位置!<br /><br />";

    geolocation.watchPosition(showPosition);

    document.getElementById("pos-area").scrollTop = document.getElementById("pos-area").scrollHeight;

};

function showClearWatch() {

    geolocation.clearWatch();

    document.getElementById("demo").innerHTML += "停止监听位置!<br /><br />";

    document.getElementById("pos-area").scrollTop = document.getElementById("pos-area").scrollHeight;

};

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