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