地理定位插件

上个任务是个手机端编辑个人信息页面,需要选址得到地理定位信息(经纬度)。设计说这个功能可以参考盒马生鲜APP中选择收货地址的功能。后面功能是实现了,美观不足,O(∩_∩)O哈哈~,毕竟我是一个审美观有点欠缺的前端啊!

229418621.jpg

我把这个插件的功能分成了两个部分:搜索选址和拖拽地图选址。

初始化

  • 首先去百度地图API注册登录,获取密钥,引用百度地图API文件。
<script type="text/javascript" src="http://api.map.baidu.com/api?v=3.0&ak=您的密钥"></script>
  • 初始化地图
<div id="map"></div>
const map = new BMap.Map('map') 
  • 设置地图初始位置
    • 如果知道经纬度,直接创建地理坐标点,设置地图位置和地图级别
    • 如果没有经纬度数据,先请求获取当前位置再设置
    • 请求当前位置是需要授权确认的,如果授权取消,就拿不到当前位置信息了。退而求其次请求当前城市位置,得到的地理坐标点再设置。像上海市就是定位到市政府大楼。
  if (lng && lat) {
    const newPoint = new BMap.Point(lng, lat)
    map.centerAndZoom(newPoint, 18)
  } else {
    const geolocation = new BMap.Geolocation()
    geolocation.enableSDKLocation()
    geolocation.getCurrentPosition((result) => {
      if (geolocation.getStatus() === BMAP_STATUS_SUCCESS) {
        map.centerAndZoom(result.point, 18)
      } else {
        new BMap.LocalCity().get((result) => {
          map.centerAndZoom(result.center, 18)
        })
      }
    })
  }
  • 添加地图组件
    在这里我加入了定位组件和地图缩放组件,没有加参数,感觉保持他们的默认状态就还算能用了。定位组件我赋值给了一个变量,为稍后给它加入事件提供方便。
  map.addControl(new BMap.NavigationControl())
  const geolocationControl = new BMap.GeolocationControl()
  map.addControl(geolocationControl)

地图的的部分就显示出来了,现在它就只是一个地图,接下来要给它加入可以选址的功能

搜索选址

搜索选址使用关键字提示输入,输入关键字后在输入框下方会有相应地址列表提供选择,选中其中一项可以拿到对应位置信息。

  • 建立一个自动完成的对象
<input id="suggestId">
const ac = new BMap.Autocomplete({ 'input': 'suggestId', 'location': map })
  • 加入点击列表项事件
    事件对象处理一下得到地址字符串,可惜不能直接拿到坐标点,需要通过逆地址解析后获得。
  ac.addEventListener('onconfirm', (e) => {
    const value = e.item.value
    vm.value.address = value.province + value.city + value.district + value.street + value.business
    geoc.getPoint(vm.value.address, (point) => {
      vm.value.point = point
    })
  })

地图选址

  • 地图中心固定大头针
    拖动地图,刷新地图中心点附近地址列表,这就需要在中心点处固定一个参考物。本来是想用地图的标注实现的,但是标注是固定在地图一个坐标点上的,移动地图时标注的位置也会发生改变,如果边移动地图边改变标注位置,标注移动时候看起来很卡,不太适用。后面问设计抠了一个有透明背景的大头针图片来,用CSS固定在了地图中心点。
  • 获取地图中心点附近地址列表
    在地图对象绑定的dragend事件中触发getSurroundingPois方法,得到列表数据,在地址列表中显示每一项的titleaddress
const geoc = new BMap.Geocoder()

const getSurroundingPois = (vm) => {
  geoc.getLocation(map.getCenter(), (result) => {
    vm.result = result
  })
}
  • 给列表项加入点击事件,点击时直接可以索引到vm.result中的一项数据,就ok了

注意点

  • 除了地图拖动结束,地图初始化位置,点击定位组件定位成功(locationSuccess事件),也需要获取或者刷新地图中心点附近地址列表
  • 搜索输入框,地图和地图中心附近地址列表是用flex纵向排列的,地图和附近地址列表的高度是可变动的,地图高度变化后地图中心点坐标也变化了,我感觉这样不太好,所以监听了地图resize事件,把地图中心点设置成地图大小变化之前的中心点。
  map.addEventListener('resize', () => {
    map.setCenter(vm.result.point)
  })

还有一些细节就不说了,总之,磕磕盼盼完成之后,心里有种不写点东西出来纪念下,就憋得慌的感觉。这算是我的第一篇技术分享了。不喜勿喷,欢迎提意见!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 178,291评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,441评论 19 139
  • 来到这,想必你正在为情所困。人在困惑的时候,容易想偏,容易病急乱投医,死马当活马医。但感情毕竟不是一块橡皮泥,能任...
    杵臼凉薄yo阅读 1,079评论 0 4
  • 去年春节的事情历历在目,好似昨天,而昨天做了些什么事情,却想不起来了。 今天从佛山回来,貌似是第一次坐大型飞机,正...
    大叔早安阅读 150评论 0 0
  • 第五章 他的真面貌 楼柒是被一阵清脆的鸟鸣叫醒的。 刚开始她有点儿迷迷糊糊不知今夕何夕,还以为自己在臭老道的道观里...
    a63df4c3d8c0阅读 887评论 1 1

友情链接更多精彩内容