起因:前不久看美術在UE4地圖里面拉Spline線來作為演示的步行道路,每兩個不同地點就要按照地圖道路來拉出演示線,所以我突發奇想,能不能用現有的一些地圖API輸入經緯度,來給我生成行走道路(百度地圖,高德地圖),后面我去看了一下,發現這個方法可行,現在我們開始行動吧。
API選擇:現在很多地圖APP都提供了API(谷歌,百度,高德),支持的語言也多,但都需要注冊,注冊這些API的Key我就不演示了,網上有很多這方面的教程,我選用的是百度API,調用API數據使用的是Python,當然你也可以使用其他方法,使用編寫Python的IDE是Jupyter Notebook ,用這個編寫好處我就不說了,你也可以用其他IDE,現在開始我們的入坑之路吧。
首先我們打開百度地圖API中德WebApi服務中的輕量級路線規划,最開始編譯的時候可以選取一個API開始,后面再進行增添
你點擊一個,你會發現必須輸入哪些參數,和可選哪些參數,首先必須輸入的是開發者AK(就是你自己申請的Key),還有起點經緯度和終點經緯度,其他可以不用填,我們在Python中的寫法:
url = 'http://api.map.baidu.com/direction/v2/transit?' #步行 params = { 'ak':'ZWiWngbeBeGe6ncQz6eFdEp2jGCeGjqH', 'origin':'30.493530,104.080483', #起點 'destination':'30.505234,104.053783', #終點 }
然后我們需要調用requests庫,該庫基本方法網上有很多,可自行查找,我們只需要他來爬取數據,后面再把數據給解析出來:
import requests ... r = requests.get(url,params) r_js = r.json()
現在我們回到百度API的詳解里面輸出的參數結構,當然你也可以在Python中打印出來看參數結構,我們可能需要的是行走時每個點的數據和總時間和總路程:
routes_ = r_js['result']['routes'][0] #路程點 dis_ = routes_['distance'] #總路程 time_ = routes_['duration'] #總時間
好,現在我們獲取到自己想要的數據,但是我們怎么才能讓UE4知道該數據呢,我們可以使用Python調用C++函數,也可以使用把數據給存入一個txt文件,讓C++讀取該txt文件,我使用的是后者,當然你們可以使用前者:
f_path = 'f:\\PythonProject\\walking.txt' #把數據傳入該路徑 f_re = open(f_path,'w') with open(f_path, "r+") as f: read_data = f.read() f.seek(0) f.truncate() #清空文件 f.write(read_data.replace('apple', 'android')) steps_ = routes_['steps'] for step in steps_: path_ = step['path'] point_lst = path_.split(';') print(point_lst) f_re.writelines(['-----','\n']) #每一到拐角處用-----區分一下 for point in point_lst: lng = point.split(',')[0] lat = point.split(',')[1] f_re.writelines([str(lng),',',str(lat),'\n']) f_re.writelines(['end','\n']) f_re.writelines(['time:',str(time_),'\n']) f_re.writelines(['distance:',str(dis_),'\n']) f_re.close()
我們可以啟動一下看看是否txt里面有數據,如果有那就成功了,如果沒有,我們需要查看百度API AK值對否,還有就是自身IP是否在百度API中,當所有無誤時,我們就可以進入下一章,UE4插件對Python的調用和藍圖與UE4插件的響應方法。
完整Python代碼:
import requests url = 'http://api.map.baidu.com/direction/v2/transit?' #步行 params = { 'ak':'ZWiWngbeBeGe6ncQz6eFdEp2jGCeGjqH', 'origin':'30.493530,104.080483', #起點 'destination':'30.505234,104.053783', #終點 } r = requests.get(url,params) r_js = r.json() #print(r_js) routes_ = r_js['result']['routes'][0] #路程點 dis_ = routes_['distance'] #總路程 time_ = routes_['duration'] #總時間 #print('總行程距離為:'+str(dis_)+'米,總時間為:'+str(time_)+'秒') f_path = 'f:\\PythonProject\\walking.txt' #把數據傳入該路徑 f_re = open(f_path,'w') with open(f_path, "r+") as f: read_data = f.read() f.seek(0) f.truncate() #清空文件 f.write(read_data.replace('apple', 'android')) steps_ = routes_['steps'] for step in steps_: path_ = step['path'] point_lst = path_.split(';') print(point_lst) f_re.writelines(['-----','\n']) #每一到拐角處用-----區分一下 for point in point_lst: lng = point.split(',')[0] lat = point.split(',')[1] f_re.writelines([str(lng),',',str(lat),'\n']) f_re.writelines(['end','\n']) f_re.writelines(['time:',str(time_),'\n']) f_re.writelines(['distance:',str(dis_),'\n']) f_re.close()