最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用NodeJS實(shí)現(xiàn)批量查詢地理位置的經(jīng)緯度接口

 更新時(shí)間:2016年08月16日 15:51:50   投稿:daisy  
最近要實(shí)現(xiàn)一個(gè)顯示各個(gè)城市信息的功能,后臺(tái)一看包含一堆城市的excel,發(fā)現(xiàn)不僅有每個(gè)省的直轄市,還有二三線等的城市,數(shù)量還不少,一個(gè)個(gè)去查還挺浪費(fèi)時(shí)間的,那為什么不寫個(gè)腳本去實(shí)現(xiàn)批量查詢呢。

實(shí)現(xiàn)步驟

1、 查詢接口

網(wǎng)站上這種類型的接口還不少,筆者直接找了百度地圖的接口做,接口文檔,調(diào)用的API是Geocoding API中的地理編碼服務(wù)

請(qǐng)求示例:對(duì)北京市百度大廈進(jìn)行地理編碼查詢

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

這里面需要一個(gè)ak參數(shù),這個(gè)參數(shù)就是用戶創(chuàng)建應(yīng)用時(shí)生成的一串字符串,需要在請(qǐng)求數(shù)據(jù)的時(shí)候調(diào)用。

[注意]

創(chuàng)建的應(yīng)用為服務(wù)端類型

創(chuàng)建應(yīng)用有兩種校驗(yàn)方式供選擇,你可以選擇使用IP白名單校驗(yàn),也可以選擇使用sn做校驗(yàn),兩者不同點(diǎn)在于IP需要提前設(shè)定好你請(qǐng)求時(shí)候的IP地址,如果你不想提前設(shè)定死IP地址,也可以選擇sn校驗(yàn),這是利用md5作為加密算法的校驗(yàn)方式。
筆者一開始選擇sn做校驗(yàn),但是調(diào)用crypto生成md5簽名一直校驗(yàn)不過,只能改用ip白名單作為校驗(yàn)

2、nodejs進(jìn)行查詢

有了供調(diào)用的接口,我們就可以寫個(gè)小腳本去請(qǐng)求數(shù)據(jù),我們需要三個(gè)依賴,分別是express、superagent、eventproxy
express是一個(gè)輕量級(jí)的web應(yīng)用

superagent是一個(gè)爬蟲經(jīng)常用的庫,可以模擬各種請(qǐng)求

eventproxy是一個(gè)并發(fā)控制器

* 簡(jiǎn)單查詢

首先我們先寫一個(gè)簡(jiǎn)單的請(qǐng)求來檢測(cè)是否能獲取到地理位置:

 app.get('/one', function(req, res, next) {
  
  var sk = 'yoursk' // 創(chuàng)建應(yīng)用的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: "城市"
}

當(dāng)你能看到這些信息的時(shí)候 ,說明接口成功了,如果status不為0的時(shí)候,請(qǐng)參考返回碼狀態(tài)表

為什么要專門開個(gè)服務(wù)器才能去請(qǐng)求呢,因?yàn)槲覀儎?chuàng)建的應(yīng)用是服務(wù)端,我們需要建一個(gè)服務(wù)器才能去請(qǐng)求。

* 批量查詢

好了,一個(gè)城市可以查詢了,接下來我們要進(jìn)行多個(gè)城市的查詢,我們使用eventproxy做并發(fā)控制,你可以把它看做一個(gè)計(jì)數(shù)器,你可以命令它監(jiān)聽某個(gè)事件,并在n次后執(zhí)行對(duì)應(yīng)的函數(shù)。

關(guā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":"區(qū)縣"}}"
}
]

好了,批量查詢也沒有問題了,接下來我們要用nodejs去讀取后臺(tái)工程師丟給我的excel文件

3、nodejs讀寫文件

這次我們需要多兩個(gè)依賴,一個(gè)nodejs內(nèi)置的fs模塊,一個(gè)用來讀寫excel的庫node-xlsx

將要城市的excel文件丟到根目錄下,另起一個(gè)腳本xls2js.js:

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

再調(diào)用fs.writeFile將提取出來的城市寫入,代碼如下:

file_data.forEach(function(sheet, index) {
  var sheetname = sheet.name // 表格名稱
    , sheetdata = sheet.data // 表格的數(shù)據(jù)
    , sheethead = sheetdata[0] // 第一行一般為表頭,但不是一定的
    , sheetbody = sheetdata.slice(1) // 真正的數(shù)據(jù)
    , file_path_towrite = './static/address.json'
    , file_data_json
    , cities_name = []
    ;
  // 將城市的數(shù)據(jù)寫進(jìn)去
  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('寫入數(shù)據(jù)失敗', err);
    else 
      console.log('寫入文件成功');
  })
})

打開static/address.json文件,會(huì)看到如下格式的文本:

{"cities_name":["北京市,北京市","北京市,市轄區(qū)","天津市,天津市"]}

4、綜合步驟2、3實(shí)現(xiàn)一個(gè)讀取本地城市文件、批量查詢、寫入新的文件的接口

好了,有了這個(gè)文件,我們就可以再次讀取然后進(jìn)行批量查詢:

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('寫入數(shù)據(jù)失敗', err);
        else 
          console.log('獲取數(shù)據(jù)并寫入文件成功');
        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、實(shí)現(xiàn)一個(gè)網(wǎng)頁,可以進(jìn)行輸入地理位置來進(jìn)行地理位置的批量查詢

這些就是前端的事情了,怎么好看怎么寫

6、總結(jié)

以上就是用NodeJS實(shí)現(xiàn)批量查詢地理位置的經(jīng)緯度接口的全部?jī)?nèi)容,希望對(duì)大家使用nodejs能有所幫助。

相關(guān)文章

  • node.js + socket.io 實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)隨機(jī)匹配聊天

    node.js + socket.io 實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)隨機(jī)匹配聊天

    這篇文章主要介紹了node.js + socket.io 實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)隨機(jī)匹配聊天,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 快速刪除node_modules的幾種方式小結(jié)

    快速刪除node_modules的幾種方式小結(jié)

    這篇文章主要介紹了快速刪除node_modules的幾種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • NodeJS實(shí)現(xiàn)不可逆加密與密碼密文保存的方法

    NodeJS實(shí)現(xiàn)不可逆加密與密碼密文保存的方法

    這篇文章主要介紹了NodeJS實(shí)現(xiàn)不可逆加密與密碼密文保存的方法,簡(jiǎn)單講述了不可逆加密與密碼密文保存的原理并結(jié)合實(shí)例形式分析了nodejs相關(guān)加密操作實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-03-03
  • 安裝nvm并使用nvm安裝nodejs及配置環(huán)境變量的全過程

    安裝nvm并使用nvm安裝nodejs及配置環(huán)境變量的全過程

    有時(shí)候使用nvm管理node會(huì)發(fā)現(xiàn)無法使用node或npm,主要原因是環(huán)境變量沒有配置成功,下面這篇文章主要給大家介紹了關(guān)于安裝nvm并使用nvm安裝nodejs及配置環(huán)境變量的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • node.js抓取并分析網(wǎng)頁內(nèi)容有無特殊內(nèi)容的js文件

    node.js抓取并分析網(wǎng)頁內(nèi)容有無特殊內(nèi)容的js文件

    nodejs獲取網(wǎng)頁內(nèi)容綁定data事件,獲取到的數(shù)據(jù)會(huì)分幾次相應(yīng),如果想全局內(nèi)容匹配,需要等待請(qǐng)求結(jié)束,在end結(jié)束事件里把累積起來的全局?jǐn)?shù)據(jù)進(jìn)行操作,本文給大家介紹node.js抓取并分析網(wǎng)頁內(nèi)容有無特殊內(nèi)容的js文件,需要的朋友參考下
    2015-11-11
  • 基于Node.js的http模塊搭建HTTP服務(wù)器

    基于Node.js的http模塊搭建HTTP服務(wù)器

    這篇文章主要為大家介紹了基于Node.js的http模塊來搭建HTTP服務(wù)器的示例過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • node版本升級(jí)npm命令警告原因及解決

    node版本升級(jí)npm命令警告原因及解決

    這篇文章主要為大家介紹了node版本升級(jí)npm命令警告原因解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • node.js+express制作網(wǎng)頁計(jì)算器

    node.js+express制作網(wǎng)頁計(jì)算器

    這篇文章主要介紹了node.js+express制作網(wǎng)頁計(jì)算器的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • Node.js Process對(duì)象詳解

    Node.js Process對(duì)象詳解

    本文詳細(xì)講解了Node.js Process對(duì)象,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • 一文詳解如何降低node包版本

    一文詳解如何降低node包版本

    這篇文章主要給大家介紹了關(guān)于如何降低node包版本的相關(guān)資料,在開發(fā)的工程中我們可能需要經(jīng)常切換node版本來應(yīng)對(duì)不同的開發(fā)環(huán)境,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11

最新評(píng)論

襄城县| 宾川县| 武宣县| 酉阳| 体育| 融水| 年辖:市辖区| 博罗县| 桃江县| 金塔县| 天长市| 名山县| 金平| 五大连池市| 海淀区| 平昌县| 新源县| 沙河市| 巴彦县| 萍乡市| 遂川县| 丹巴县| 安福县| 沁源县| 沧源| 武功县| 金湖县| 井陉县| 凌海市| 酉阳| 荔浦县| 应城市| 公主岭市| 漳州市| 香港| 滕州市| 宝坻区| 桂阳县| 舒兰市| 开阳县| 邳州市|