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("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
}))

 

转载于:https://www.cnblogs.com/MSspblxh/p/5740943.html

你可能感兴趣的:(Node.js调用百度地图Web服务API的Geocoding接口进行点位反地理信息编码)