UE4根據真實地圖來生成行走道路(一)


起因:前不久看美術在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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM