|
今天在无意间发现了这一段程序,很有意思,所以分享给大家。其主要的功能就是获取谷歌地图的图片,我将原始程序进行了简单的修改,增加了参数,直接用宏调用。首先来看看效果:
示例一:(广州天河客运站)
- %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
|