(高德地图)marker定位 bug 解决总结
项目背景:
一个项目bug,项目中用到高德地图,默认打开页面会生成一个marker(下图红色icon),然后用户拖动marker到想要的位置,并且保存。
用户反映定位不准确,在当前页面编辑的位置,到后台打开位置就会有偏移。
因为后台打开时候是根据经纬度生成的marker,经过检查最终确定是前台页面,拖动marker定位 获取经纬度 那里出的问题。
这里不得不说下个人情况,此项目是他人开发,而开发人员已经不在公司,bug转发给我了。自己之前也没怎么使用过高德,主要使用的是谷歌地图和mapbox。
在修改这个bug的时候,思绪会受谷歌api一些影响,因为一直觉得他们的api都差不多。
现在我打开自己的页面,然后拖动marker,拖动结束我会打印一下经纬度,然后把这个经纬度复制下来,并在高德的官方地图上去搜索获取到的这个经纬度。
结果确实一直都是有偏差的,而且还偏差值每次都不同。
第一个想法:
看了下代码,发现在 生成 marker 的时候, 并没有对自定义的 icon(红色图标)设置偏移,为什么要设置偏移呢,因为我们在用这个 图标 定位的时候,
是认为这个 图标的底部箭头 指向的位置 是我们要的位置。如下图——
如果是用高德自带的 图标 ,图标的箭头就是指向的当前位置。而如果用自定义图标的话,默认位置是定义在图片画布的左上角 也就是left:0;top:0;如下图——
所以必须要为自定义图标设置偏移值,上图的 图标 大小是 宽36px 高 42px, 箭头的位置是left:18px;top:38px,所以下面设置offset偏移是-18,-38
var marker = new AMap.Marker({
icon: new AMap.Icon({
size:new AMap.Size(36,42),//图标大小
image:"/img/loc.png"
}),
//这里用/img/loc.png图片的left:18;top:38指向坐标
offset: new AMap.Pixel(-18,-38),
position: map.gaode.map.getCenter(),
draggable:true //点标记可拖拽
});
这样, 当前的经纬度位置就是箭头位置。 顺便这里说下谷歌地图,谷歌如果用自定义图片,定位会在图片中间最底部,如下图:
// 以下是谷歌的描述: By default, the anchor is located along the center point of the bottom of the image 总之,根据图片不同,还是要考虑设置偏移值 不管是谷歌还是高德。 偏移值设置了后,发现仍然还有偏差。然后继续思考。 第二个想法:
其实最后发现问题很简单, 在谷歌地图上,不管怎么移动 获取到的经纬度 都是我的箭头指向的位置, 而高德不一样,当我marker拖拽结束后 触发的“拖拽结束”事件(dragend),获取的是鼠标位置的经纬度。
高德文档———— 拖拽 我们的 marker 的时候,鼠标的位置是在 marker 上,但是并不一定在箭头上, 所以不管箭头指向哪里,获取到的永远是鼠标指向
位置的经纬度,所以会有偏差。 解决方法如下:
AMap.event.addListener(marker, 'dragging', function(e){
var lat = e.lnglat.lat,
lng = e.lnglat.lng;
marker.setPosition(new AMap.LngLat(lng,lat)); });
拖动过程中,获取当前鼠标的位置,然后把marker定位到鼠标的位置。
这样就解决了这个bug。
结论:
不同的地图,确实是有一些不容易发现的差异,有时候看文档,也会容易漏掉什么。
改他人bug,确实要比改自己bug麻烦一点。
(高德地图)marker定位 bug 解决总结的更多相关文章
- Android Studio之高德地图实现定位和3D地图显示
在应用开发中,地图开发是经常需要使用的“组件”,国内比较出名的是就是百度地图和高德地图. 此博客讲的是高德地图实现定位和3D地图显示,并标注相应位置,话不多说,先看看效果,在上代码. 效果如图: 首先 ...
- vue2使用高德地图vue-amap定位以及AMapUI标注
前言 最近在vue里使用了高德地图vue-amap以及AMapUI,我在这里就说下如何在vue2里引入vue-amap和AmapUI以及使用定位 (在这里默认你已经安装了vue-cli) 安装 npm ...
- [OC][地图] 高德地图之定位初探(一)
使用前的说明 高德地图开放平台的iOS定位模块网址-->http://lbs.amap.com/api/ios-location-sdk/summary/ 高德地图有Web端.android平台 ...
- objective-c高德地图时时定位
这篇随笔是对上一遍servlet接口的实现. 一.项目集成高德地图 应为我这个项目使用了cocopods这个第三方库管理工具,所以只需要很简单的步骤,就能将高德地图集成到项目中,如果你没使用过这工具, ...
- 【高德地图API】如何解决坐标转换,坐标偏移?
http://bbs.amap.com/thread-18617-1-1.html#rd?sukey=cbbc36a2500a2e6c2b0b19115118ace519002ff3a52731f13 ...
- Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作
刚进公司给安排的任务就是Unity接入高德地图,算是踩了不少坑总算做出来了,抽点时间写个博客记录一下 废话不多说 先上效果图 获取定位并根据手机朝向显示周边信息 使用的Unity ...
- iOS高德地图SDK定位和搜索附近信息的具体使用
1.显示地图.定位.显示当前位置. 导入你需要的功能的头文件,申明全局变量,代理方法等等. 初始化地图,在控制器即将显示额时候打开定位和跟踪用户,这里对参数不懂的话康忙进去都有注释. 对了.i ...
- 高德地图marker事件监听-高德地图marker绑定事件就执行了[解决立即执行]
官方的demo是这样的:地址:[http://lbs.amap.com/api/javascript-api/example/infowindow/add-infowindows-to-multipl ...
- js高德地图手机定位
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...
随机推荐
- 解决ie8(及其以下)不支持getElementsByClassName的问题
这篇技术笔记与大家分享的是:解决IE8(及以下)不支持getElementsByClassName的方法.如果有说错的地方,麻烦留言告诉我,我及时更正,一来是更新一下我的认知,二来也是不要误导的他人, ...
- Linux内核--网络栈实现分析(十一)--驱动程序层(下)
本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7555870 更多请查看专栏,地 ...
- [leetcode 27]Implement strStr()
1 题目: Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if ...
- AWIT DBackup 0.0.20 发布,备份系统
AWIT DBackup 0.0.20 修复了几个小 bug. AllWorldIT DBackup 是一个备份系统,为每个目录创建一个独立的压缩包,这更便于搜索. 特点: 使用 xz, bzip2, ...
- Windows Server 2008更改远程桌面端口号
windows 2008远程桌面端口默认是用的是3389端口,但是由于安全考虑,经常我们安装好系统后一般都会考虑把原来的3389端口更改为另外的端口. 更改过程: 打开注册表: 运行regedit 找 ...
- 用JQ仿造百度书籍预售页面的单屏滚页效果
今天的项目需要做到一个介绍页面,我主动提出走单屏滚页的风格,毕竟交互性好,逼格也高,具体效果可以参照百度知道书籍预售页面. 其实现效果就大概是这样的: 还是老样子,所有步骤文件可以从我的Github上 ...
- Java设计模式10:观察者模式
观察者模式 观察者模式也叫作发布-订阅模式,也就是事件监听机制.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态上发生变化时,会通知所有观察者对象,使他 ...
- 【读书笔记】Programming Entity Framework CodeFirst -- 初步认识
以下是书<Programming Entity Framework Code First>的学习整理,主要是一个整体梳理. 一.模型属性映射约定 1.通过 System.Component ...
- [.net 面向对象编程基础] (9) 类和类的实例
[.net 面向对象编程基础] (9) 类和类的实例 类 ,顾名思义就是分类.类别的意思.我们要面向对象编程,就需要对不同的事物进行分类.类可以说是.net面向对象的核心. 类:就是具有相同的属性和功 ...
- Windows UDP socket recvfrom返回10054错误的解决办法
现象: 在Windows 7系统上,A使用UDP socket,调用sendto函数向一个目标地址B发送数据,但是目标地址B没有接收数据,如果A此时立即调用recvfrom试图接收目标地址B发回的数据 ...