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