(從我的新浪博客上搬來的,做了一些修改。)
最近迷上了node.js以及JavaScript。現在接到一個活,要解析一個出租車點位數據的地理信息。於是就想到使用Node.js調用百度地圖API進行解析。
使用的庫主要就是有fs、request。
// 請求包 var fs = require('fs');var request = require('request'); // 設置百度API的參數var baiduApiKey = "cQV9U4QhamoOjg6rjdOTAQSiUMxxxxxx"; // 填寫申請的的ak // 打開點位信息的JSON文件 var jsonString = ""; // 創建日志文件寫文件流 var write = fs.createWriteStream("20140510_GetonDropoff_0h-log.txt"); // 創建讀取文件流 var sr = fs.createReadStream('20140510_GetonDropoff_0h.json',{flags:'r',mode:0666}); sr.on('data', function (chunk) { // 監聽讀取事件 jsonString += chunk; }) sr.on('error', function (err) { // 監聽錯誤事件 console.log(err); }) sr.on('end', function () { // 監聽讀取完畢事件 var jsonData = JSON.parse(jsonString); var i = 0; // 對每一條記錄進行循環 for (var listIndex in jsonData) { if (jsonData.hasOwnProperty(listIndex)) { var element = jsonData[listIndex]; var longitude = element['Lon']; var latitude = element['Lat']; // 構造百度web服務API的URL var rootUrl = 'http://api.map.baidu.com/geocoder/v2/?'; // 根URL var url = rootUrl + 'output=json' + '&ak=' + baiduApiKey + '&location=' + latitude + ',' + longitude; // GET參數字符串 // 發送GET請求 request.get(url, function (err, response, body) { i++; // 指示當前內容是哪一個點 // 解析body try { var responseJson = JSON.parse(body); // 解析成功 if (responseJson['status'] == 0) { // 如果返回正常解析數據 console.log(i + ": Success!"); var formatted_address = responseJson['result']['formatted_address']; // 提取結構化地址 jsonData[i-1]['formatted_address'] = 'formatted_address'; // 加入結構化地址中 } else { // 如果返回錯誤解析數據 console.log(i + ": Fail! " + responseJson['status']); jsonData[i-1]['formatted_address'] = ""; write.write(i + ': 請求失敗!錯誤代碼:' + responseJson['status'] + "\r\n"); } } catch (error) { // 解析失敗 jsonData[i-1]['formatted_address'] = ""; console.log(i + ": Error!" + error.stack); console.log(body); // 輸出body以供參考 write.write(i + ": " + error.stack); write.write(""body":" +body); } // 如果是最后一個點,關閉文件並將結果寫入 if (i == jsonData.length) { write.end(); write.close(); fs.writeFileSync("20140510_GetonDropoff_0h" + "-add" + ".json", JSON.stringify(jsonData)); } }) } } sr.close(); }); write.on('err', function (err) { // 監聽write的err事件 console.log(err.stack); })
后來將填寫URL的部分,改用qs和querystring都失敗了,原因是:百度地圖API要求的格式是 location=latitude,longitude ,而如果將location的值寫成一個數組,即 [latitude,longitude] ,querystring會變成 location=latitude&location=longitude ,qs可以變成以下三種形式:
- location=latitude&location=longitude
- location[0]=latitude&location[1]=longitude
- location[]=latitude&location[]=longitude
都不符合百度地圖API接口的要求。
如果想要避免字符串連接的麻煩,使用string-format庫也非常方便,只是url也會敲很長,也不如使用querystring庫美觀。
或者可以這樣使用querystring模塊。
querystring.unescape(querystring.stringify({ output: "json", ak: "xxxxxxxxxxxxxxxxxxxxxxxxx", location: latitude + "," + longitude }))
