UE4根据真实地图来生成行走道路(一)

拜拜、爱过 提交于 2019-11-30 04:05:33

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

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!