问题描述
最近想更新自己开发的 geoChina,发现在Mac上运行以下代码
library(geoChina)
geocode('Tsinghua University', api = 'google', ocs = 'GCJ-02', messaging = T)
出错,返回
1
2
3
4
5
6
calling http://maps.googleapis.com/maps/api/geocode/json?address=Tsinghua%20University&sensor=false ...
Warning message:
In readLines(connect, warn = FALSE) :
unable to connect to 'maps.googleapis.com' on port 80.
Error in fromJSON(paste(readLines(connect, warn = FALSE), collapse = "")) :
error in evaluating the argument 'content' in selecting a method for function 'fromJSON': Error in readLines(connect, warn = FALSE) : cannot open the connection
将geocode
封装的调用直接在浏览器里打开,能返回正确的json结果。而且该函数在Windows上运行正常。
问题分析
geoChina的开发的确是在Mac上完成的,但代码并没有针对不同的操作系统作了不同处理。因此可以初步判断是Mac操作系统的终端网络通讯出现了问题。http服务默认80端口,https服务默认443端口,从报错信息来看,终端网络通讯的80端口出现了问题。
curl
或wget
命令能够实现终端网页数据内容下载,因此可以用来验证初步判断。在终端输入
$ wget www.google.com
返回
Resolving www.google.com... 2404:6800:4005:805::1012, 173.194.127.244, 173.194.127.242, ...
Connecting to www.google.com|2404:6800:4005:805::1012|:80... failed: Host is down.
输入
$ curl -v -L www.google.com
返回
* Rebuilt URL to: www.google.com/
* Hostname was NOT found in DNS cache
* Trying 2404:6800:4005:801::1010...
* Trying 173.194.127.241...
* connect to 2404:6800:4005:801::1010 port 80 failed: Host is down
* connect to 173.194.127.241 port 80 failed: Host is down
都显示连接失败,Host is down
。而将访问的网站换成国内网站,比如www.baidu.com
,则都能访问成功,下载到网站首页。
这说明终端网络通讯80端口出问题的只是google等国外易干扰服务,而不是国内网络服务。自己Mac上的应用程序有此影响的只能是代理服务了。经过一番google,发现有人遇到和我十分类似的 [1],回答都是代理作祟,基本可以肯定是自己使用GoAgent代理导致终端无法通过80端口访问google服务。
问题解决
[1]给出的解决方案是在终端设置http/https代理,google Mac OS X终端设置代理的方法,找到
[2]。只需清楚GoAgent代理服务端口,然后编辑~/.bash_profile
文件,输入
export http_proxy='http://localhost:8103'
export https_proxy='http://localhost:8103'
保存.bash_profile
文件,在终端更新.bash_profile
生效
$ source .bash_profile
现在curl
或wget
命令都可以通过代理访问google服务了,但Mac上geoChina::geocode
运行还是时好时坏,看来geoChina
的开发维护只能暂时转到Windows上了。
如有同侪知道解决办法,烦请邮件告知。
PS:本文采用了 添加文内注释/参考文献引用Markdown写法。
参考链接
[1]: Unable to resolve host using curl/wget while page loads in browser
[2]: 如何为MacOS X终端设置代理
更新
由于GFW的原因,Google服务在国内的使用受影响。在国内调用Google Maps API时推荐使用ditu.google.cn,而不是maps.google.com。解决思路是通过调用GeoIP服务,查询用户是在国内还是国外,指定不同的Google Maps API调用链接。
geoChina已更新至1.1.3
。