2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > Node.js调用百度地图Web服务API的Geocoding接口进行点位反地理信息编码

Node.js调用百度地图Web服务API的Geocoding接口进行点位反地理信息编码

时间:2020-04-24 04:48:01

相关推荐

Node.js调用百度地图Web服务API的Geocoding接口进行点位反地理信息编码

(从我的新浪博客上搬来的,做了一些修改。)

最近迷上了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("0510_GetonDropoff_0h-log.txt");// 创建读取文件流var sr = fs.createReadStream('0510_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的URLvar rootUrl = 'http://api./geocoder/v2/?'; // 根URLvar url = rootUrl + 'output=json' + '&ak=' + baiduApiKey + '&location=' + latitude + ',' + longitude; // GET参数字符串// 发送GET请求request.get(url, function (err, response, body) {i++; // 指示当前内容是哪一个点// 解析bodytry {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("0510_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=longitudelocation[0]=latitude&location[1]=longitudelocation[]=latitude&location[]=longitude

都不符合百度地图API接口的要求。

如果想要避免字符串连接的麻烦,使用string-format库也非常方便,只是url也会敲很长,也不如使用querystring库美观。

或者可以这样使用querystring模块。

querystring.unescape(querystring.stringify({output: "json",ak: "xxxxxxxxxxxxxxxxxxxxxxxxx",location: latitude + "," + longitude}))

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。