前言

最近碰到一个需求,就是将我们系统中要导出一系列的工作数据,这里面有一个需求就是根据工作人员的经纬度去获取他可能的位置。说到这里大家肯定能想到用地图API了,我这里用的是百度地图的API(详情可参考)。然后这里就涉及到一个问题,工作数据是很多条的,但是这里的API很明显就只能一条一条的去请求,那么我们怎么封装能够达到我们的目的呢。

获取百度AK

首先呢,我们想要使用百度地图相关的API的话,肯定是要去注册申请相关的使用资格的,详细的账号申请流程呢,请戳这里,这里面详细介绍了如何注册并申请百度AK,只有拿到了AK,我们在使用相关的API时才会有效,否则是不生效的话,所以大家一定要保证有AK并且是有效的哈。

两种逆地址解析的方法

申请好了AK之后呢,这里有两种使用方法:

一种是直接通过url来进行请求,像是下边这种

http://api.map.baidu.com/geocoder?location=39.910093,116.403945&output=json&key=你的百度AK

复制代码

这种方法使用的话,大家可以直接把这个url放到axios或者ajax里面,然后他的回调里面返回的就是我们想要的地址等相关信息了。另一种方法就是官网里面介绍的方法:

// 初始化地图,这里的window可能需要从父组件传过来,原理还没弄清楚

var map = new window.BMap.Map("allmap");

// 创建地理编码实例

var myGeo = new window.BMap.Geocoder();

// 根据坐标得到地址描述

myGeo.getLocation(new window.BMap.Point(116.404, 39.915), function(result){

if (result){

console.log('这就是解析之后的地址了',resule.address)

}

})

复制代码注意:用第二种方法的话,我们需要在index.html里面引用我们上面的AK,如下

复制代码

上面的两种方法,都可以达到我们获取地址信息的目的哈。我这里选用的是第二种方法,然后后面我们批量请求的话,也是针对第二种方式来进行改装的。

问题分析

刚开始我的思路是想着,既然这种方法只能够一条一条请求的话,那我就将经纬度构建成一个数组,通过循环调用的方法来给这个数组中的值赋值,代码如下

gpsDatas.forEach((gpsItem)=>{

var map = new window.BMap.Map("allmap");

// 创建地理编码实例

var myGeo = new window.BMap.Geocoder();

// 根据坐标得到地址描述,将每一项的经纬度传入

myGeo.getLocation(new window.BMap.Point(gpsItem.longitude, gpsItem.latitude), function(result:any){

if (result){

// 将返回的值赋给该字段

gpsItem.maybePosition = result.address

}

})

})

// 返回我们要输出的数据

console.log('gpsDatas',gpsDatas)

console.log('gpsDatas[0]',gpsDatas[0].maybePosition)

let a = gpsDatas[0].maybePosition

return gpsDatas

复制代码

如果大家执行到了这里的话,我们就会发现一个很经典的问题,也是我们经常可能会碰到的问题,就是我们可以看到第一个打印出来的gpsDatas数组里面是能够看到我们拿到了我们想要的值,但是第二个打印我们可能就会看到一个undefined了,那么有小伙伴就可能会产生这样一个疑惑了,为什么我明明打印出来看有这个值,但是为什么取不到值呢,这是因为在我们取值的时候,myGeo.getLocation这个异步函数还没有执行完毕,所以取值的时候我们是取不到这个值的,但是因为gpsDatas是一个引用数据类型,所以在异步函数执行完毕后,他会把数据填充到这个数组里面,因为引用地址没有改变,所以我们可以看到数组中的地址已经有值了。

可以这样理解,console输出数据的时候,他输出引用数据类型和基本数据类型是不同的。输出引用类型的话,其实他是输出了一个指针,我们看到的就是指向内存中的一片地址中的数据,所以尽管他是后边异步把数据放上来的,但是因为空间指向没有改变,所以输出的数据其实一直是在改变的,不过是console没有把这一步表现出来而已。

那么很显然,现在这种情况肯定是不满足我们的需求的,那么这里我们就需要将我们的方法就行改装一下了。

最终解决方案

经过前面的分析,我们可知,问题的产生是因为我们是一个循环调用异步函数的问题,循环先走完了,但是异步没有走完,所以导致我们取不出数据,那么大家其实很容易想到Promise,我们可以利用Promise.all,将所有的异步操作一起执行,然后在.then里面获取返回结果。实现如下:

getMaybePositionByLaLo(window,positionDatas){

// 定义一个Promise数组,来将异步操作放进来

let apiDatas = []

positionDatas.forEach((gpsItem)=>{

let apiItem = this.getMapInfo(window,gpsItem)

apiDatas.push(apiItem)

})

// 这里.all会将所有的异步操作一起放在队列中,等待所有异步执行完毕后才会执行.then,这就保证了我们的同步获取数据

return Promise.all(apiDatas)

.then((gpsData)=>{

return gpsData

})

}

// 将单个获取地理位置的方法封装成一个方法

// 这里传入window的目的是,有些地方直接new BMap会报错,需要new window.BMap才可以

getMapInfo(window,gpsItem){

return new Promise((resolve, reject)=>{

var map = new window.BMap.Map("allmap");

// 创建地理编码实例

var myGeo = new window.BMap.Geocoder();

// 根据坐标得到地址描述

myGeo.getLocation(new window.BMap.Point(gpsItem.longitude, gpsItem.latitude), function(result){

if (result){

gpsItem.maybePosition = result.address;

resolve(gpsItem)

}

})

})

}

// 然后我们就可以在页面直接调用了

this.getMaybePositionByLaLo(window,positionDatas)

.then((positionDatas)=>{

// 这里就可以去进行我们的取值赋值操作了

})

复制代码

以上我们就完成了我们的批量改装,其实核心就是对于Promise的应用,如何合理的运用Promise,对于我们以后的开发有着很大的好处,我也是最近才开始发现Promise的好处,之前只是了解,也没有多的去使用,欢迎大家以后一起学习指正。

java百度地图逆地址解析_web前端通过百度地图API批量逆解析地址相关推荐

  1. java百度地图逆地址解析_Web服务Geocoding API-百度地图

    公告:亲爱的用户,您好,自2014年9月1日起,我们将废弃Geocoding API V1.0,届时Geocoding API V1.0将无法正常使用.为不影响您的使用,请在截止日期之间将产品迁移至G ...

  2. 关于小程序移动端调用微信API及腾讯地图实例,获取当前位置、逆地址解析、路线规划、地图展示

    前言:记录使用腾讯地图定位的逻辑思路讲解 以下内容会分为三部分讲解: 小程序调用微信API获取经纬度 小程序调用腾讯地图API地址转坐标解析 小程序调用腾讯地图API获取目的地交通线路 移动端H5调用 ...

  3. java和web哪个难_web前端和java哪个难学?哪个简单?

    说到java很多都人都熟知,但是说到web前端可能是很多人并不知道,随着最近几年的发展,web前端开发人越来越吃香,无论是薪资待遇还是岗位的招聘数量比java差不了多少,最近有同学在咨询web前端和j ...

  4. 用批处理整理百度MP3上歌曲排行榜MP3及LRC文件的批量下载链接地址(含图文教程)

    http://bbs.wuyou.com/viewthread.php?tid=192322 本文结构如下: 一.缘起:问题的提出 二.试探:徒劳而返 三.峰回路转:芝麻!开门! 四.万事俱备:xml ...

  5. java和ui的区别_web前端和UI前端之间有什么区别

    许多人无法区分用户界面前端和网络前端的区别,认为他们做同样的工作.因此,今天的小编将详细讨论两者的区别: Web前端开发 对网站而言,前端即是网站的前端,它包括表现层和结构层.表现层就是前端设计,说白 ...

  6. java web前端面试题_web前端笔试试题(答案)

    一.填空题(每空1分,共70分) 1.JS中的数据类型有哪些__string,number,undefined,null,boolean,Object Array,Function,:(3分) 2.J ...

  7. vue 为什么要销毁第三方实例_Web前端工程师面试之Vue问题汇总解析

    又是一年毕业季,很多学习前端的同学面对激烈的求职竞争倍感压力,想要了解企业招聘会提问哪些问题.今天千锋郑州Web前端培训小编就给大家分享一下高级Web前端工程师面试中有关Vue的问题及解析. 1.Vu ...

  8. java百度地图逆地址解析_百度地图逆地址解析

    什么是Geocoding? Geocoding API 是一类简单的HTTP接口,用于提供从地址到经纬度坐标或者从经纬度坐标到地址的转换服务,用户可以使用C# .C++.Java等开发语言发送HTTP ...

  9. java程序调用百度Geocoding API逆地址解析通过经纬度查询位置

    自从百度升级了自己的逆地址解析调用接口,就多了一些调用限制,具体参数可以参照百度给出的解释.本文主要研究通过java代码调用该接口: 下面给出调用接口的方法: public static String ...

最新文章

  1. 分享10个效率实用工具,让你更优雅地使用windows
  2. git bash打印当前文件结构_6 个方便的 Git 脚本
  3. 掌握 ASP.NET 之路:自定义实体类简介 来源 :msdn
  4. 利用div的定位制作复杂的页面布局
  5. Tecplot云图锯齿状边界解决办法
  6. 分屏总屏计算机电缆,分屏加总屏电缆DJYVP计算机电缆14x2x0.75
  7. [转] Mou 一个Markdown工具 语法规则文档(最后)
  8. 【图像融合】基于matlab curvelet变换图像融合(评价指标)【含Matlab源码 781期】
  9. HDU - 1247 (字典树水题)
  10. 热点|国家动物健康与食品安全创新联盟成立科技创新赋能委员会 并首发动物源食品信任追溯平台...
  11. 李践《行动日志——目标管理》观后感
  12. 即时通讯视频聊天原理是什么
  13. java试题及答案下载_java练习题与答案百度云下载.doc
  14. [历朝通俗演义-蔡东藩-前汉]第002回 诛假父纳言迎母 称皇帝立法愚民
  15. Google开源C++单元测试框架gTest 5:死亡测试
  16. 茧数SCRM营销自动化的定位
  17. 车路协同先导试验平台
  18. ssh突然无法登录Connection closed by xxx port 22
  19. 中国标准时间转换为yyyy-MM-dd
  20. 转帖--IT圈子里鬼混---谈谈IT行业的收入和一些生存之道!

热门文章

  1. 批量查询快递单号筛选出代收单号
  2. 不想被甲方折磨?移动互联网的9大趋势知道一个算你牛
  3. rovisional headers are shown Learn more 报错
  4. 提高代码质量——使用Jest和Sinon给已有的代码添加单元测试
  5. 【复盘】记录生产环境问题,因没有及时合并maser
  6. 正常计算机的c盘空间多大,电脑C盘应该留多大空间?
  7. pdfbox2.0.1将pdf转图片
  8. linux 开发板传文件,Linux下用USB传输文件到开发板
  9. APP上短信验证码如何验证?
  10. 【网络与系统安全实验】网络扫描与防御技术