国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

用NodeJS實現批量查詢地理位置的經緯度接口

2019-11-20 09:13:41
字體:
來源:轉載
供稿:網友

實現步驟

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能有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宁海县| 芜湖县| 临湘市| 六盘水市| 汝阳县| 枣庄市| 石首市| 榆社县| 慈利县| 朝阳区| 卢氏县| 荥阳市| 沙洋县| 北海市| 阳朔县| 连州市| 荣昌县| 万州区| 灵川县| 河北省| 青铜峡市| 尉犁县| 铜川市| 孝昌县| 青海省| 鄱阳县| 安仁县| 当雄县| 攀枝花市| 临猗县| 德化县| 儋州市| 新邵县| 沂水县| 新兴县| 邳州市| 内江市| 虹口区| 岫岩| 浦城县| 岳普湖县|