| 
 | 
 
今天在无意间发现了这一段程序,很有意思,所以分享给大家。其主要的功能就是获取谷歌地图的图片,我将原始程序进行了简单的修改,增加了参数,直接用宏调用。首先来看看效果: 
 
示例一:(广州天河客运站) 
- %sas_getMap("Tianhe Coach Terminal Station, Guangzhou, Guangdong","C:\temp\tianhe.png")
 
  复制代码 
 
 
 
示例二:(北京天安门) 
- %sas_getMap("Tiananmen, Beijing, China","C:\temp\beijing.png")
 
  复制代码 
 
 
 
示例三:更详细的参数(广州塔) 
- %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的图片。 
 
附上宏程序: 
 
 
- %macro sas_getMap(address,img_filename,zoom=15,width=640,height=520);
 
 -  data _null_;
 
 -   length url $ 2048;
 
 -   url = catt( 'http://maps.googleapis.com/maps/api/staticmap?markers=', &address,
 
 -    '&zoom=', &zoom, '&size=', &width, 'x', &height, '&sensor=false');
 
 -   url = transtrn(trim(url), ' ', '%20');
 
 -   call symputx('REQUEST_URL', url);
 
 -  run;
 
 -  filename img_fref &img_filename;
 
 -  proc http out = img_fref url = "%superq(REQUEST_URL)" method = "GET"
 
 -   ct="application/x-www-form-urlencoded";
 
 -  run;
 
 - %mend;
 
  复制代码 
 
 
最后的最后,附上最原始的程序员,大家有兴趣可以研究研究,从这段程序中可以收获很多东西。 
原始程序中多了以下两个功能: 
1. 增加了获取图片成功与否的判断; 
2. 将这段宏程序通过FCMP过程封装到函数当中,若返回成功则返回0,若获取失败则返回非0值; 
 
程序如下,我已做了部分注释: 
- %macro sas_getMap;
 
 -  /*URL设置,参数设置,空格替换为20%*/
 
 -  data _null_;
 
 -   length url $ 2048;
 
 -   url = catt('http://maps.googleapis.com/maps/api/staticmap?markers=', &address,
 
 -    '&zoom=12','&size=', &width, 'x', &height,'&sensor=false');
 
 -   url = transtrn(trim(url), ' ', '%20');
 
 -   call symputx('REQUEST_URL', url);
 
 -  run;
 
 -  /*图片输出文件*/
 
 -  filename img_fref &img_filename;
 
 -  /*临时文件:保存从谷歌地图服务器返回的header*/
 
 -  filename hdr_out temp;
 
 -  proc http out = img_fref url = "%superq(REQUEST_URL)" headerout = hdr_out method = "GET"
 
 -   ct="application/x-www-form-urlencoded";
 
 -  run;
 
 -  /*通过返回的header来判断地图是否获取成功,成功返回0,否则返回谷歌地图服务器返回的值*/
 
 -  data _null_;
 
 -   infile hdr_out;
 
 -   input;
 
 -   if prxmatch('/^HTTP\/\S+\s+\d+/', _infile_);
 
 -   status = scan(_infile_, 2, ' ');
 
 -   /*200表示成功,其他值都为失败*/
 
 -   if status = '200' then
 
 -   call symputx('STATUS', 0);
 
 -   else
 
 -   call symputx('STATUS', status);
 
 -   stop;
 
 -  run;
 
 - %mend;
 
 - /*将宏程序封装到函数sas_getMap中*/
 
 - proc fcmp outlib=sasuser.funcs.web;
 
 -  function sas_getMap(address $, width, height, img_filename $);
 
 -  length status 8;
 
 -  rc = run_macro('sas_getMap', address, width, height, img_filename, status);
 
 -  return (status);
 
 -  endsub;
 
 - quit;
 
 - /*生成包含地址的数据集*/
 
 - data addresses;
 
 -  length name $ 32 address $ 128;
 
 -  infile datalines truncover;
 
 -  input name address $128.;
 
 - datalines;
 
 - SAS SAS Campus Dr., Cary, NC 27513
 
 - YMCA 1603 Hillsborough St., Raleigh, NC 27605
 
 - NCSU Joyner Visitor Center, NC State University, Raleigh, NC 27695-7504
 
 - UNC-CH UNC Visitor Center, 250 East Franklin Street, Chapel Hill, NC
 
 - ;
 
 - options cmplib=sasuser.funcs;
 
 - /*通过函数sas_getMap获取地图图片*/
 
 - data _null_;
 
 -  set addresses;
 
 -  /* <Imagine report generation code here> */
 
 -  rc = sas_getMap(address, 160, 120, catt('c:\temp\', name, '.png'));
 
 -  if rc then
 
 -  putlog 'ERROR: Could not get map for ' name;
 
 - run;
 
  复制代码 
 
最后,希望大家看了之后有所收获。大家也可以将各种修改版的程序发上来供大家学些!谢谢! 
 |   
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册 
 
 
 
x
 
 
 
 
 |