SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 9967|回复: 16
打印 上一主题 下一主题

用SAS获取指定地方的地图

[复制链接]

10

主题

39

帖子

1049

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1049
QQ
跳转到指定楼层
楼主
发表于 2014-3-23 15:28:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天在无意间发现了这一段程序,很有意思,所以分享给大家。其主要的功能就是获取谷歌地图的图片,我将原始程序进行了简单的修改,增加了参数,直接用宏调用。首先来看看效果:

示例一:(广州天河客运站)
  1. %sas_getMap("Tianhe Coach Terminal Station, Guangzhou, Guangdong","C:\temp\tianhe.png")
复制代码




示例二:(北京天安门)
  1. %sas_getMap("Tiananmen, Beijing, China","C:\temp\beijing.png")
复制代码




示例三:更详细的参数(广州塔)
  1. %sas_getMap("Canton tower, Guangdong, China","C:\temp\tower.png",zoom=18,width=640,height=640)
复制代码





因为程序中涉及到谷歌地图的相关API接口问题,本人暂时还不太了解,所以没法做大的修改。例如经过几次测试,中文的地址是不识别的。如果有大神能将其修改识别中文,那就好多了!


程序参数说明:
1. 必输参数:地址;只能用英文的,中文的不识别。
2. 必输参数:图片输出路径;这个没啥好介绍的。
3. 可选参数:放大级别,默认值为15;
4. 可选参数:图片宽度,默认值为640;
5. 可选参数:图片高度,默认值为520;

注:经过几次测试,发现图片的大小最大支持640*640,超出这个范围还是输出640*640的图片。

附上宏程序:


  1. %macro sas_getMap(address,img_filename,zoom=15,width=640,height=520);
  2. data _null_;
  3.   length url $ 2048;
  4.   url = catt( 'http://maps.googleapis.com/maps/api/staticmap?markers=', &address,
  5.    '&zoom=', &zoom, '&size=', &width, 'x', &height, '&sensor=false');
  6.   url = transtrn(trim(url), ' ', '%20');
  7.   call symputx('REQUEST_URL', url);
  8. run;
  9. filename img_fref &img_filename;
  10. proc http out = img_fref url = "%superq(REQUEST_URL)" method = "GET"
  11.   ct="application/x-www-form-urlencoded";
  12. run;
  13. %mend;
复制代码



最后的最后,附上最原始的程序员,大家有兴趣可以研究研究,从这段程序中可以收获很多东西。
原始程序中多了以下两个功能:

1. 增加了获取图片成功与否的判断;
2. 将这段宏程序通过FCMP过程封装到函数当中,若返回成功则返回0,若获取失败则返回非0值;


程序如下,我已做了部分注释:
  1. %macro sas_getMap;
  2. /*URL设置,参数设置,空格替换为20%*/
  3. data _null_;
  4.   length url $ 2048;
  5.   url = catt('http://maps.googleapis.com/maps/api/staticmap?markers=', &address,
  6.    '&zoom=12','&size=', &width, 'x', &height,'&sensor=false');
  7.   url = transtrn(trim(url), ' ', '%20');
  8.   call symputx('REQUEST_URL', url);
  9. run;
  10. /*图片输出文件*/
  11. filename img_fref &img_filename;
  12. /*临时文件:保存从谷歌地图服务器返回的header*/
  13. filename hdr_out temp;
  14. proc http out = img_fref url = "%superq(REQUEST_URL)" headerout = hdr_out method = "GET"
  15.   ct="application/x-www-form-urlencoded";
  16. run;
  17. /*通过返回的header来判断地图是否获取成功,成功返回0,否则返回谷歌地图服务器返回的值*/
  18. data _null_;
  19.   infile hdr_out;
  20.   input;
  21.   if prxmatch('/^HTTP\/\S+\s+\d+/', _infile_);
  22.   status = scan(_infile_, 2, ' ');
  23.   /*200表示成功,其他值都为失败*/
  24.   if status = '200' then
  25.   call symputx('STATUS', 0);
  26.   else
  27.   call symputx('STATUS', status);
  28.   stop;
  29. run;
  30. %mend;
  31. /*将宏程序封装到函数sas_getMap中*/
  32. proc fcmp outlib=sasuser.funcs.web;
  33. function sas_getMap(address $, width, height, img_filename $);
  34. length status 8;
  35. rc = run_macro('sas_getMap', address, width, height, img_filename, status);
  36. return (status);
  37. endsub;
  38. quit;
  39. /*生成包含地址的数据集*/
  40. data addresses;
  41. length name $ 32 address $ 128;
  42. infile datalines truncover;
  43. input name address $128.;
  44. datalines;
  45. SAS SAS Campus Dr., Cary, NC 27513
  46. YMCA 1603 Hillsborough St., Raleigh, NC 27605
  47. NCSU Joyner Visitor Center, NC State University, Raleigh, NC 27695-7504
  48. UNC-CH UNC Visitor Center, 250 East Franklin Street, Chapel Hill, NC
  49. ;
  50. options cmplib=sasuser.funcs;
  51. /*通过函数sas_getMap获取地图图片*/
  52. data _null_;
  53. set addresses;
  54. /* <Imagine report generation code here> */
  55. rc = sas_getMap(address, 160, 120, catt('c:\temp\', name, '.png'));
  56. if rc then
  57. putlog 'ERROR: Could not get map for ' name;
  58. run;
复制代码


最后,希望大家看了之后有所收获。大家也可以将各种修改版的程序发上来供大家学些!谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享到:  微信微信
收藏收藏3
回复

使用道具 举报

0

主题

2

帖子

30

积分

新手上路

Rank: 1

积分
30
推荐
发表于 2014-3-26 11:52:37 | 只看该作者
baidu地图有类似的api调用
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  4. <title>静态图与URLAPI结合示例</title>  
  5. <body>
  6.     <a href='http://api.map.baidu.com/geocoder?address=上海虹桥机场&amp;output=html' target='_blank'> <img style="margin:2px" width="400" height="300" src="http://api.map.baidu.com/staticimage?
  7.     width=400&amp;height=300&amp;zoom=11¢er=上海虹桥机场" />
  8. </a>
  9. </body>
  10. </html>
复制代码

上面是baidu给的一个静态实例,相信改一下就可以支持中文的地址了

回复 支持 1 反对 0

使用道具 举报

0

主题

2

帖子

46

积分

新手上路

Rank: 1

积分
46
沙发
发表于 2014-3-23 16:20:08 | 只看该作者
运行出错了哦  ERROR 68-185: 函数 TRANSTRN 未知,或无法访问。

NOTE: 数字值已转换为字符值,位置:(行:列)。
      1:196
NOTE: SAS 系统由于错误而停止了该步的处理。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间         0.01 秒
      CPU 时间         0.01 秒



ERROR: 过程 HTTP 没有找到。
WARNING: 没有解析符号引用 REQUEST_URL。

NOTE: SAS 系统由于错误而停止了该步的处理。
NOTE: “PROCEDURE HTTP”所用时间(总处理时间):
      实际时间         0.00 秒
      CPU 时间         0.00 秒
回复 支持 反对

使用道具 举报

1

主题

3

帖子

26

积分

新手上路

Rank: 1

积分
26
板凳
发表于 2014-3-23 16:26:34 | 只看该作者
刚接触SAS,虽然看不懂 但是领略到SAS还可以干这些事,觉得很神奇。谢谢楼主
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
发表于 2014-3-23 18:43:44 来自手机 | 只看该作者
这个好好玩,我也没用过。不过有啥应用场合,我倒是要想想看,说不定可以做一个不错的分析应用哦。
回复 支持 反对

使用道具 举报

6

主题

31

帖子

293

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
293
5#
发表于 2014-3-23 19:05:09 | 只看该作者
我了个去。真正高大上。

Slash这次发了个猛力!
SAS资源
1. SAS 微信:mysasnet
2. SAS QQ群:348941365
3. SAS Blog:编程|统计|医药
回复 支持 反对

使用道具 举报

10

主题

39

帖子

1049

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1049
QQ
7#
 楼主| 发表于 2014-3-29 20:17:20 | 只看该作者
zhongkailv 发表于 2014-3-23 16:20
运行出错了哦  ERROR 68-185: 函数 TRANSTRN 未知,或无法访问。

NOTE: 数字值已转换为字符值,位置:(行: ...

是不是又是SAS版本问题?是不是9.1的?
回复 支持 反对

使用道具 举报

10

主题

39

帖子

1049

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1049
QQ
8#
 楼主| 发表于 2014-3-29 20:17:54 | 只看该作者
shiyiming 发表于 2014-3-23 18:43
这个好好玩,我也没用过。不过有啥应用场合,我倒是要想想看,说不定可以做一个不错的分析应用哦。 ...

是的,可以发挥发挥!
回复 支持 反对

使用道具 举报

10

主题

39

帖子

1049

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1049
QQ
9#
 楼主| 发表于 2014-3-29 20:18:43 | 只看该作者
soporaeternus 发表于 2014-3-26 11:52
baidu地图有类似的api调用

上面是baidu给的一个静态实例,相信改一下就可以支持中文的地址了

感谢,今天试试这个东东!
回复 支持 反对

使用道具 举报

10

主题

39

帖子

1049

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1049
QQ
10#
 楼主| 发表于 2014-3-29 20:18:45 | 只看该作者
soporaeternus 发表于 2014-3-26 11:52
baidu地图有类似的api调用

上面是baidu给的一个静态实例,相信改一下就可以支持中文的地址了

感谢,今天试试这个东东!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2024-4-19 19:45 , Processed in 0.241821 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表