用NodeJS實(shí)現(xiàn)批量查詢地理位置的經(jīng)緯度接口
實(shí)現(xiàn)步驟
1、 查詢接口
網(wǎng)站上這種類型的接口還不少,筆者直接找了百度地圖的接口做,接口文檔,調(diào)用的API是Geocoding API中的地理編碼服務(wù)
請求示例:對北京市百度大廈進(jìn)行地理編碼查詢
http://api.map.baidu.com/geocoder/v2/?ak=E4805d16520de693a3fe707cdc962045&callback=renderOption&output=json&address=百度大廈&city=北京市
這里面需要一個ak參數(shù),這個參數(shù)就是用戶創(chuàng)建應(yīng)用時生成的一串字符串,需要在請求數(shù)據(jù)的時候調(diào)用。
[注意]
創(chuàng)建的應(yīng)用為服務(wù)端類型
創(chuàng)建應(yīng)用有兩種校驗(yàn)方式供選擇,你可以選擇使用IP白名單校驗(yàn),也可以選擇使用sn做校驗(yàn),兩者不同點(diǎn)在于IP需要提前設(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)用的接口,我們就可以寫個小腳本去請求數(shù)據(jù),我們需要三個依賴,分別是express、superagent、eventproxy
express是一個輕量級的web應(yīng)用
superagent是一個爬蟲經(jīng)常用的庫,可以模擬各種請求
eventproxy是一個并發(fā)控制器
* 簡單查詢
首先我們先寫一個簡單的請求來檢測是否能獲取到地理位置:
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)你能看到這些信息的時候 ,說明接口成功了,如果status不為0的時候,請參考返回碼狀態(tài)表
為什么要專門開個服務(wù)器才能去請求呢,因?yàn)槲覀儎?chuàng)建的應(yīng)用是服務(wù)端,我們需要建一個服務(wù)器才能去請求。
* 批量查詢
好了,一個城市可以查詢了,接下來我們要進(jìn)行多個城市的查詢,我們使用eventproxy做并發(fā)控制,你可以把它看做一個計數(shù)器,你可以命令它監(jiān)聽某個事件,并在n次后執(zhí)行對應(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去讀取后臺工程師丟給我的excel文件
3、nodejs讀寫文件
這次我們需要多兩個依賴,一個nodejs內(nèi)置的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);
再調(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文件,會看到如下格式的文本:
{"cities_name":["北京市,北京市","北京市,市轄區(qū)","天津市,天津市"]}
4、綜合步驟2、3實(shí)現(xiàn)一個讀取本地城市文件、批量查詢、寫入新的文件的接口
好了,有了這個文件,我們就可以再次讀取然后進(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)一個網(wǎng)頁,可以進(jìn)行輸入地理位置來進(jìn)行地理位置的批量查詢
這些就是前端的事情了,怎么好看怎么寫
6、總結(jié)
以上就是用NodeJS實(shí)現(xiàn)批量查詢地理位置的經(jīng)緯度接口的全部內(nèi)容,希望對大家使用nodejs能有所幫助。
- node.js集成百度UE編輯器
- Node.js編寫爬蟲的基本思路及抓取百度圖片的實(shí)例分享
- Node Puppeteer圖像識別實(shí)現(xiàn)百度指數(shù)爬蟲的示例
- nodejs根據(jù)ip數(shù)組在百度地圖中進(jìn)行定位
- 微信小程序訪問node.js接口服務(wù)器搭建教程
- 詳解基于Node.js的微信JS-SDK后端接口實(shí)現(xiàn)代碼
- Node.js 實(shí)現(xiàn)簡單的接口服務(wù)器的實(shí)例代碼
- 詳解nodejs微信jssdk后端接口
- 用Node編寫RESTful API接口的示例代碼
- node 文件上傳接口的轉(zhuǎn)發(fā)的實(shí)現(xiàn)
- 配置node服務(wù)器并且鏈接微信公眾號接口配置步驟詳解
- nodejs實(shí)現(xiàn)百度輿情接口應(yīng)用示例
相關(guān)文章
node.js配置Token驗(yàn)證的2種方式總結(jié)
token驗(yàn)證,在設(shè)計登錄注冊和一些權(quán)限接口時發(fā)揮作用,下面這篇文章主要給大家介紹了關(guān)于node.js配置Token驗(yàn)證的2種方式,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02nodejs(officegen)+vue(axios)在客戶端導(dǎo)出word文檔的方法
這篇文章主要介紹了nodejs(officegen)+vue(axios)在客戶端導(dǎo)出word文檔的方法,需要的朋友可以參考下2018-07-07node連接kafka2.0實(shí)現(xiàn)方法示例
這篇文章主要介紹了node連接kafka2.0,nodejs連接kafka2.0的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了kafka2.0的功能、原理、以及node.js連接kafka2.0的具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2023-05-05Express 框架中使用 EJS 模板引擎并結(jié)合 silly-datetime
這篇文章主要介紹了Express 框架中使用 EJS 模板引擎并結(jié)合 silly-datetime 庫進(jìn)行日期格式化的實(shí)現(xiàn)方法,結(jié)合具體實(shí)例形式分析了express框架引入EJS模版以及導(dǎo)入 silly-datetime 庫的格式化方法傳遞給EJS模版使用的相關(guān)操作技巧,需要的朋友可以參考下2023-05-05