Node.js调用百度地图Web服务API的Geocoding接口进行点位反地理信息编码
(从我的新浪博客上搬来的,做了一些修改。)
// 请求包
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
}))
Node.js调用百度地图Web服务API的Geocoding接口进行点位反地理信息编码的更多相关文章
- C# 调用百度地图Web服务API
最近公司项目中需要根据两个地点的交通路径和距离做一些数据推荐,为了程序的稳定和用户体验所以想从百度地图 API 采集数据保存到数据库中,经过一翻研究之后选定了百度地图 Web 服务 API 中的 Di ...
- C# 调用百度地图 Web 服务 API
最近公司项目中需要根据两个地点的交通路径和距离做一些数据推荐,为了程序的稳定和用户体验所以想从百度地图 API 采集数据保存到数据库中,经过一翻研究之后选定了百度地图 Web 服务 API 中的 Di ...
- js调用百度地图接口
原文:js调用百度地图接口 这是前几天公司做的新项目,上面需要用到地图的数据.第一次做这类型的东西没啥思路,咱们经理说,这东西简单,截个图存文件夹里调整好尺寸,数据库里存上图片的地址动态调用就行了.心 ...
- 【完全开源】百度地图Web service API C#.NET版,带地图显示控件、导航控件、POI查找控件
目录 概述 功能 如何使用 参考帮助 概述 源代码主要包含三个项目,BMap.NET.BMap.NET.WindowsForm以及BMap.NET.WinformDemo. BMap.NET 对百度地 ...
- 【转】【完全开源】百度地图Web service API C#.NET版,带地图显示控件、导航控件、POI查找控件
[转][完全开源]百度地图Web service API C#.NET版,带地图显示控件.导航控件.POI查找控件 目录 概述 功能 如何使用 参考帮助 概述 源代码主要包含三个项目,BMap.NET ...
- Node.js 从零开发 web server博客项目[接口]
web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...
- js调用百度地图api
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- js调用百度地图API创建地图,搜索位置
实现代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <met ...
- C#怎么调用百度地图Web API
直接上代码: public ActionResult FindMileage() { string s; HttpWebRequest req = (HttpWebRequest)HttpWebReq ...
随机推荐
- HAProxy+apache实现web服务动静分离
HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案. HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支 ...
- JAVA中ClassPath妙用
初学java的人肯定都配置过java三大环境变量 . JAVA_HOME:JDK目录 PATH:jdkbin目录 jre目录 CLASSPATH:一般指向类库lib,也可自定义使用 以下例子是个小例 ...
- 13个不可不知的ASP.NET MVC扩展点
13个不可不知的ASP.NET MVC扩展点 ASP.NET MVC设计的主要原则之一是可扩展性.处理管线(processing pipeline)上的所有(或大多数)东西都是可替换的.因此,如果您不 ...
- Linux内核编译和运行
内核获取网站:https://www.kernel.org/pub/linux/kernel/ 步骤如下: 1.打开终端,更改用户权限为root.具体做法是在终端输入sudo su,然后按提示输入 ...
- 定制你自己的jQuery
如何定制你自己的jQuery jQuery随着版本的不断升级代码量也随之增加,从1.0.0的不到两千行到现在的1.10.2已经突破1万行. 新的API不断增加,但有些在项目中并没有用到.jQuery团 ...
- Struts2的拦截器
拦截器的作用: 拦截器可以动态地拦截发送到指定Action的请求,通过拦截器机制,可以载Action执行的前后插入某些代码,植入我们的逻辑思维. 拦截器的实现原理: 拦截器通过代理的方式来调用,通过动 ...
- 【又长见识了】函数传参,params参数,ref和out参数详解
一.原来函数这样传参 先看一个函数和函数调用. static void Main(string[] args) { ; Test(num);//局部变量在使用之前赋值 //Test(10); //直接 ...
- java调用Oracle存储存储过程
数据库表和增删改的procedure参照(http://www.cnblogs.com/J-wym/p/3292913.html) 1.测试添加数据的procedure public void tes ...
- java用正则表达式获取domain
在工作中经常用到获取url的来源和域名的黑白名单功能.前段时间写了一个获取url中域名的方法.但是在测试过程中发现有些小问题. /** * 根据URL获取domain * @param url * @ ...
- IS动态左侧菜单-01
<%@ Page Language="C#" CodeFile="Default3.aspx.cs" Inherits="Default3&qu ...