标签:
(从我的新浪博客上搬来的,做了一些修改。)
// 请求包 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可以变成以下三种形式:
都不符合百度地图API接口的要求。
如果想要避免字符串连接的麻烦,使用string-format库也非常方便,只是url也会敲很长,也不如使用querystring库美观。
或者可以这样使用querystring模块。
querystring.unescape(querystring.stringify({ output: "json", ak: "xxxxxxxxxxxxxxxxxxxxxxxxx", location: latitude + "," + longitude }))
Node.js调用百度地图Web服务API的Geocoding接口进行点位反地理信息编码
标签:
原文地址:http://www.cnblogs.com/MSspblxh/p/5740943.html