用NodeJS实现批量查询地理位置的经纬度接口


Posted in NodeJs onAugust 16, 2016

实现步骤

1、 查询接口

网站上这种类型的接口还不少,笔者直接找了百度地图的接口做,接口文档,调用的API是Geocoding API中的地理编码服务

请求示例:对北京市百度大厦进行地理编码查询

http://api.map.baidu.com/geocoder/v2/?ak=E4805d16520de693a3fe707cdc962045&callback=renderOption&output=json&address=百度大厦&city=北京市

这里面需要一个ak参数,这个参数就是用户创建应用时生成的一串字符串,需要在请求数据的时候调用。

[注意]

创建的应用为服务端类型

创建应用有两种校验方式供选择,你可以选择使用IP白名单校验,也可以选择使用sn做校验,两者不同点在于IP需要提前设定好你请求时候的IP地址,如果你不想提前设定死IP地址,也可以选择sn校验,这是利用md5作为加密算法的校验方式。
笔者一开始选择sn做校验,但是调用crypto生成md5签名一直校验不过,只能改用ip白名单作为校验

2、nodejs进行查询

有了供调用的接口,我们就可以写个小脚本去请求数据,我们需要三个依赖,分别是express、superagent、eventproxy
express是一个轻量级的web应用

superagent是一个爬虫经常用的库,可以模拟各种请求

eventproxy是一个并发控制器

* 简单查询

首先我们先写一个简单的请求来检测是否能获取到地理位置:

app.get('/one', function(req, res, next) {
  
  var sk = 'yoursk' // 创建应用的sk
    , address = '北京市'
    ;
  superagent.get('http://api.map.baidu.com/geocoder/v2/')
    .query({address: address})
    .query({output: 'json'})
    .query({ak: sk})
    .end(function(err, sres) {
      if (err) {
        console.log('err:', err);
        return;
      }
      res.send(sres.text);
    }) 
 })

然后打开浏览器访问:http://localhost:8888/one

{
  status: 0,
  result: {
  location: {
    lng: 116.39564503787867,
    lat: 39.92998577808024
  },
  precise: 0,
  confidence: 10,
  level: "城市"
}

当你能看到这些信息的时候 ,说明接口成功了,如果status不为0的时候,请参考返回码状态表

为什么要专门开个服务器才能去请求呢,因为我们创建的应用是服务端,我们需要建一个服务器才能去请求。

* 批量查询

好了,一个城市可以查询了,接下来我们要进行多个城市的查询,我们使用eventproxy做并发控制,你可以把它看做一个计数器,你可以命令它监听某个事件,并在n次后执行对应的函数。

关键代码如下:

app.get('/many', function(req, res, next) {
  var sk = 'yoursk'
    , addresses = ['北京市', '深圳市', '广州市', '普宁市']
    ;
  ep.after('getLocation', addresses.length, function(locations) {
    res.send(locations);
  })
  addresses.forEach(function(e, i) {
    superagent.get('http://api.map.baidu.com/geocoder/v2/')
      .query({address: e})
      .query({output: 'json'})
      .query({ak: sk})
      .end(function(err, sres) {
        ep.emit('getLocation', {address: e, res: sres.text})
      })  
  })
})

打开浏览器访问:http://localhost:8888/many

[
{
address: "北京市",
res: "{"status":0,"result":{"location":{"lng":116.39564503787867,"lat":39.92998577808024},"precise":0,"confidence":10,"level":"城市"}}"
},
{
address: "深圳市",
res: "{"status":0,"result":{"location":{"lng":114.0259736573215,"lat":22.546053546205248},"precise":0,"confidence":14,"level":"城市"}}"
},
{
address: "广州市",
res: "{"status":0,"result":{"location":{"lng":113.30764967515182,"lat":23.12004910207623},"precise":0,"confidence":12,"level":"城市"}}"
},
{
address: "普宁市",
res: "{"status":0,"result":{"location":{"lng":116.07816590835329,"lat":23.28895358314155},"precise":0,"confidence":14,"level":"区县"}}"
}
]

好了,批量查询也没有问题了,接下来我们要用nodejs去读取后台工程师丢给我的excel文件

3、nodejs读写文件

这次我们需要多两个依赖,一个nodejs内置的fs模块,一个用来读写excel的库node-xlsx

将要城市的excel文件丢到根目录下,另起一个脚本xls2js.js:

var xlsx = require('node-xlsx')
  , fs = require('fs')
  ;
var file_path = './query_result.xlsx';
var file_data = xlsx.parse(file_path);

再调用fs.writeFile将提取出来的城市写入,代码如下:

file_data.forEach(function(sheet, index) {
  var sheetname = sheet.name // 表格名称
    , sheetdata = sheet.data // 表格的数据
    , sheethead = sheetdata[0] // 第一行一般为表头,但不是一定的
    , sheetbody = sheetdata.slice(1) // 真正的数据
    , file_path_towrite = './static/address.json'
    , file_data_json
    , cities_name = []
    ;
  // 将城市的数据写进去
  sheetbody.forEach(function(e, i) {
    cities_name.push('' + e[1] + ',' + e[2])
  })
  file_data_json = JSON.stringify({cities_name: cities_name});
  fs.writeFile(file_path_towrite, file_data_json, function(err) {
    if (err) 
      console.log('写入数据失败', err);
    else 
      console.log('写入文件成功');
  })
})

打开static/address.json文件,会看到如下格式的文本:

{"cities_name":["北京市,北京市","北京市,市辖区","天津市,天津市"]}

4、综合步骤2、3实现一个读取本地城市文件、批量查询、写入新的文件的接口

好了,有了这个文件,我们就可以再次读取然后进行批量查询:

app.get('/', function(req, res, next) {
  var sk = 'yoursk'
    , addresses = []
    , file_path = './static/address.json'
    , file_path_towrite = './static/geocoder.json'
    , file_data
    ;

  fs.readFile(file_path, function(err, data) {
    if (err) {
      console.log('读取文件失败', err);
      return;
    }
    file_data = JSON.parse(data);
    addresses = file_data.cities_name;
    
    ep.after('getLocation', addresses.length, function(locations) {
      var file_data = {};
      locations.forEach(function(e, i) {
        file_data[e.address.split(',')[1]] = [e['location']['lng'], e['location']['lat']];
      })
      fs.writeFile(file_path_towrite, JSON.stringify(file_data), function(err) {
        if (err) 
          console.log('写入数据失败', err);
        else 
          console.log('获取数据并写入文件成功');
        res.send(file_data);
      })
    })
    addresses.forEach(function(e, i) {
      superagent.get('http://api.map.baidu.com/geocoder/v2/')
        .query({address: e.split(',').join(' ')})
        .query({city: e.split(',')[1]})
        .query({output: 'json'})
        .query({ak: sk})
        .end(function(err, sres) {
          var location
            , res_json
            ;
          res_json = JSON.parse(sres.text);
          if (res_json.status == 0) {
            location = res_json.result && res_json.result.location || '';
          } else {
            location = {"lng":0,"lat":0};
          }
          ep.emit('getLocation', {address: e, location: location})
        })
    })
  });
})

5、实现一个网页,可以进行输入地理位置来进行地理位置的批量查询

这些就是前端的事情了,怎么好看怎么写

6、总结

以上就是用NodeJS实现批量查询地理位置的经纬度接口的全部内容,希望对大家使用nodejs能有所帮助。

NodeJs 相关文章推荐
轻松创建nodejs服务器(9):实现非阻塞操作
Dec 18 NodeJs
NodeJS制作爬虫全过程
Dec 22 NodeJs
使用nodejs开发cli项目实例
Jun 03 NodeJs
Nodejs进阶:基于express+multer的文件上传实例
Nov 21 NodeJs
async/await与promise(nodejs中的异步操作问题)
Mar 03 NodeJs
nodejs使用express创建一个简单web应用
Mar 31 NodeJs
nodejs个人博客开发第二步 入口文件
Apr 12 NodeJs
深入学习nodejs中的async模块的使用方法
Jul 12 NodeJs
使用npm安装最新版本nodejs
Jan 18 NodeJs
nodejs中Express与Koa2对比分析
Feb 06 NodeJs
NodeJS 实现多语言的示例代码
Sep 11 NodeJs
nodejs微信开发之接入指南
Mar 17 NodeJs
使用nodejs中httpProxy代理时候出现404异常的解决方法
Aug 15 #NodeJs
NodeJs的优势和适合开发的程序
Aug 14 #NodeJs
在windows上用nodejs搭建静态文件服务器的简单方法
Aug 11 #NodeJs
Nodejs抓取html页面内容(推荐)
Aug 11 #NodeJs
用nodejs的实现原理和搭建服务器(动态)
Aug 10 #NodeJs
nodejs如何获取时间戳与时间差
Aug 03 #NodeJs
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
Jul 26 #NodeJs
You might like
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
2016/08/17 PHP
php微信开发之图片回复功能
2018/06/14 PHP
CSS和Javascript简单复习资料
2010/06/29 Javascript
AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
2014/06/06 Javascript
点击button获取text内容并改变样式的js实现
2014/09/09 Javascript
完美兼容各大浏览器的jQuery仿新浪图文淡入淡出间歇滚动特效
2014/11/12 Javascript
后台获取ZTREE选中节点的方法
2015/02/12 Javascript
ECMAScript6中Map/WeakMap详解
2015/06/12 Javascript
深入理解Java线程编程中的阻塞队列容器
2015/12/07 Javascript
IE和Firefox之间在JavaScript语法上的差异
2016/04/22 Javascript
JS & JQuery 动态添加 select option
2016/06/08 Javascript
Angular.JS利用ng-disabled属性和ng-model实现禁用button效果
2017/04/05 Javascript
仿淘宝JSsearch搜索下拉深度用法
2018/01/15 Javascript
JS动画实现回调地狱promise的实例代码详解
2018/11/08 Javascript
Vue 理解之白话 getter/setter详解
2019/04/16 Javascript
Vue实现数据请求拦截
2019/10/23 Javascript
JavaScript 几种循环方式以及模块化的总结
2020/09/03 Javascript
[02:28]PWL开团时刻DAY3——Ink Ice与DeMonsTer之间的勾心斗角
2020/11/03 DOTA
Python3读取UTF-8文件及统计文件行数的方法
2015/05/22 Python
Python paramiko模块的使用示例
2018/04/11 Python
Python学习笔记之open()函数打开文件路径报错问题
2018/04/28 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
2019/10/14 Python
Python利用Xpath选择器爬取京东网商品信息
2020/06/01 Python
世界最大域名注册商:GoDaddy
2016/07/24 全球购物
逻辑链路控制协议
2016/10/01 面试题
幼儿园教师备课制度
2014/01/12 职场文书
社会实践感言
2014/01/25 职场文书
2014年保卫科工作总结
2014/12/05 职场文书
师德承诺书
2015/01/20 职场文书
校长新学期寄语2016
2015/12/04 职场文书
人民调解协议书
2016/03/21 职场文书
React配置子路由的实现
2021/06/03 Javascript
JS轻量级函数式编程实现XDM二
2022/06/16 Javascript
教你nginx跳转配置的四种方式
2022/07/07 Servers
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers
django项目、vue项目部署云服务器的详细过程
2022/07/23 Servers