* Authors: * Chuntao Li, Ph.D. , China Stata Club(爬虫俱乐部)(chtl@hust.edu.cn) * Xueren Zhang, China Stata Club(爬虫俱乐部)(zhijunzhang_hi@163.com) * Yuan Xue, China Stata Club(爬虫俱乐部)(xueyuan@hust.com) * December 4th, 2018 * Program written by Dr. Chuntao Li, Xueren Zhang and Yuan Xue * Used to get the information of distance and time from one location to another from Baidu Map API * and can only be used in Stata version 14.0 or above * Original Data Source: http://api.map.baidu.com * Please do not use this code for commerical purpose program define cntraveltime if _caller() < 14.0 { disp as error "this is version `=_caller()' of Stata; it cannot run version 14.0 programs" exit 9 } version 14 syntax, baidukey(string) startlat(string) startlng(string) endlat(string) endlng(string) [mode(string) detail /// intercitytype(real 0) intercitytactic(real 0) tactic(real 0)] if "`mode'" == "" local mode = "public" if !inlist("`mode'", "car", "public", "bike") { disp as error "you specify the option mode() wrongly." exit 198 } if "`mode'" != "public" & "`intercitytype'" != "0" { disp as error `"you could not specify the option intercitytype() when you specify "bike" or "car" in the option mode()."' exit 198 } if "`tactic'" == "" local tactic = 0 else if ("`mode'" == "public" & !inrange(`tactic', 0, 5)) /// | ("`mode'" == "bike" & !inlist(`tactic', 0, 1)) /// | ("`mode'" == "car" & `tactic' != 0 & !inrange(`tactic', 3, 11)) { disp as error "you specify a wrong number in the option tactic()" exit 198 } if "`intercitytype'" == "" { local intercitytrans = 0 } else{ local intercitytrans = `intercitytype' } if "`intercitytactic'" == ""{ local intercitytactic = 0 } qui { tempvar baidumap if "`mode'" == "public" { local url1 = "http://api.map.baidu.com/direction/v2/transit?origin=" local url2 = "&ak=`baidukey'&tactics_incity=`tactic'&trans_type_intercity=`intercitytrans'&tactics_intercity=`intercitytactic'&output=xml" } else if "`mode'" == "bike" { local url1 = "http://api.map.baidu.com/direction/v2/riding?origin=" local url2 = "&ak=`baidukey'&riding_type=`tactic'&output=xml" } else { local url1 = "http://api.map.baidu.com/direction/v2/driving?origin=" local url2 = "&ak=`baidukey'&tactics=`tactic'&output=xml" } gen `baidumap' = "" forvalues i = 1/`=_N' { replace `baidumap' = fileread("`url1'`=`startlat'[`i']',`=`startlng'[`i']'&destination=`=`endlat'[`i']',`=`endlng'[`i']'`url2'") in `i' local times = 0 while filereaderror(`baidumap'[`i']) != 0 { sleep 1000 local times = `times' + 1 replace `baidumap' = fileread("`url1'`=`startlat'[`i']',`=`startlng'[`i']'&destination=`=`endlat'[`i']',`=`endlng'[`i']'`url2'") in `i' if `times' > 10 { disp as error "Internet speeds is too low to get the data" exit `=filereaderror(`baidumap'[`i'])' } } if !index(`baidumap'[`i'],"0") { noisily disp as text "please check the information of location in `i'" continue } if index(`baidumap'[`i'],"AK有误请检查再重试") { disp as error "error: please check your baidukey" exit 198 } } replace `baidumap' = ustrregexra(`baidumap', "\s", "") replace `baidumap' = substr(`baidumap', index(`baidumap', ""), index(`baidumap', "") - index(`baidumap', "") + length("")) gen distance = real(ustrregexs(1)) if ustrregexm(`baidumap', `"(.*?)"') gen duration = real(ustrregexs(1)) if ustrregexm(`baidumap', `"(.*?)"') if "`detail'" != "" { replace `baidumap' = substr(`baidumap', index(`baidumap', ""), index(`baidumap', "") - index(`baidumap', "") + length("")) replace `baidumap' = ustrregexra(`baidumap', "<.*?>", "") if "`mode'" == "public" { replace `baidumap' = ustrregexra(`baidumap', "^.*?", "") replace `baidumap' = ustrregexra(`baidumap', ".*?", ",") replace `baidumap' = ustrregexra(`baidumap', ".*$", "") } else if "`mode'" == "bike" { replace `baidumap' = ustrregexra(`baidumap', "^.*?", "") replace `baidumap' = ustrregexra(`baidumap', ".*?", ",") replace `baidumap' = ustrregexra(`baidumap', ".*?", ",") replace `baidumap' = ustrregexra(`baidumap', ".*$", "") replace `baidumap' = ustrregexra(`baidumap', ",+$", "") } else { replace `baidumap' = ustrregexra(`baidumap', "^.*?", "") replace `baidumap' = ustrregexra(`baidumap', ".*?", ",") replace `baidumap' = ustrregexra(`baidumap', ".*$", "") } gen detail = `baidumap' } } end