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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM