def SelectFinalRoutes(candidatewaypath, savefinalroutespath): """ 本函数与SelectFinalRoute功能相同,只是本函数处理完整的轨迹时,如果大于50.会重新开始计算最大连通性 根据坐标点的候选路段选出路网的匹配路线 保存格式为:车辆名:路线(如果不确定,可能为多条),车辆名为txt文件名 :param candidatewaypath: 坐标点候选路段的txt文件路径,如H:\\CandidateWay\\NewStrategy\\334e4763-f125-425f-ae42-8028245764fe.txt :param savefinalroutespath: 最终路线保存路径 :return: """ #file = open("H:\GPS_Data\Road_Network\BYQBridge\FinalRoutes\\334e4763-f125-425f-ae42-8028245764fe.txt", 'a') max_connect = 0 (tempath, tempfilename) = os.path.split( candidatewaypath) # tempfilename为txt文件名(包含后缀) (trunkname, extension) = os.path.splitext( tempfilename) # filename 为传入的csv文件名 extension为后缀 savetxtfilename = trunkname + '.txt' file = open(os.path.join(savefinalroutespath, savetxtfilename), 'a') with open(candidatewaypath) as candidatewayfile: filelines = candidatewayfile.readlines() linesnum = len(filelines) finalline = [] #存储最终路线,可能为多条,随着坐标点的迭代,会变化,直到处理完最有一个坐标点 for key in eval(filelines[0].strip('\n').split(">>>")[-1]).keys(): finalline.append([key]) predict = eval(filelines[0].strip('\n').split(">>>")[-1]) # 遍历每个坐标点的候选路段 print(f"需要处理坐标数为:{linesnum}") for lineindex in range(1, linesnum): templine = [] #存储临时路线 curdict = eval(filelines[lineindex].strip('\n').split(">>>")[-1]) flag = 0 #标记之前的路线与当前轨迹点的所有候选路段是否能连通,不能连通,舍弃该轨迹点 newdic = {} for subline in finalline: #遍历每一条的候选路线 #print(f"ID{lineindex-1}:{predict},{curdict}") for key in curdict.keys(): #遍历每个轨迹点的候选路段 connectroute = Common_Functions.InquireConn( subline[-1], key, "connects") #先查表 if connectroute != 0: #print(subline[-1], predict[subline[-1]], key, curdict[key]) connectroute = GridMapNavigation.CandidateWay_Connect( subline[-1], predict[subline[-1]], key, curdict[key]) # 双重列表 #print(f"next:{connectroute}") if connectroute: flag = 1 for line in connectroute: temsubline = copy.deepcopy(subline) temsubline.extend(line) # 将走通的路线加入到子路线,扩展当前路线 templine.append(temsubline) #newdic[line[-1]] = curdict[line[-1]] else: pass else: pass if flag == 1: finalline.clear() predict = curdict templine = Common_Functions.DoubleDel(templine) templine = Common_Functions.Main_Auxiliary_road( templine) #去除头尾路段一样的候选路线,路线只有一个路段 不会处理 templine = Common_Functions.Start_End( templine ) # 对于[wayid1,wayid2,wayid3] [wayid1,wayid4,wayid5,wayid3] 去除路段多的,如果包含路段数量一致 暂不处理 Common_Functions.Sequential_subset( finalline) # 最后去路线(至少两个及以上的其他路线是其前缀) for sub in templine: finalline.append(Common_Functions.del_adjacent(sub)) else: pass #print(f"final:{finalline}") print("共选出{}条路".format(len(finalline))) for sub in finalline: print(sub) file.write(str(sub) + "\n") file.close()
def SelectFinalRoutes(candidatewaypath, savefinalroutespath): """ 本函数与SelectFinalRoute功能相同,只是本函数处理完整的轨迹时,如果大于50.会重新开始计算最大连通性 根据坐标点的候选路段选出路网的匹配路线 保存格式为:车辆名:路线(如果不确定,可能为多条),车辆名为txt文件名 :param candidatewaypath: 坐标点候选路段的txt文件路径,如H:\\CandidateWay\\NewStrategy\\334e4763-f125-425f-ae42-8028245764fe.txt :param savefinalroutespath: 最终路线保存路径 :return: """ #file = open("H:\GPS_Data\Road_Network\BYQBridge\FinalRoutes\\334e4763-f125-425f-ae42-8028245764fe.txt", 'a') max_connect = 0 #记录计算最大连通的轨迹点数 (tempath, tempfilename) = os.path.split( candidatewaypath) # tempfilename为txt文件名(包含后缀) (trunkname, extension) = os.path.splitext( tempfilename) # filename 为传入的csv文件名 extension为后缀 savetxtfilename = trunkname + '.txt' Resetflag = 0 #标记最终路段是否重新开始计算 file = open(os.path.join(savefinalroutespath, savetxtfilename), 'a') with open(candidatewaypath) as candidatewayfile: filelines = candidatewayfile.readlines() linesnum = len(filelines) finalline = [] #存储最终路线,可能为多条,随着坐标点的迭代,会变化,直到处理完最有一个坐标点 for key in eval(filelines[0].strip('\n').split(">>>")[-1]).keys(): finalline.append([key]) #print(finalline) # 遍历每个坐标点的候选路段 print("需要处理坐标数为:{}".format(linesnum)) for lineindex in range(1, linesnum): print(f"正在处理第{lineindex+1}个坐标") if filelines[lineindex].strip('\n').split( ">>>")[-1] == "BreakPoint": #轨迹分段,分开计算 file.write("New_Road\n") for sub in finalline: file.write(str(sub) + "\n") file.flush() Resetflag = 1 #标记从下一个点要重新开始匹配轨迹了 max_connect = 0 continue if max_connect == 100: file.write("New_Road\n") for sub in finalline: file.write(str(sub) + "\n") file.flush() Resetflag = 1 #标记从下一个点要重新开始匹配轨迹了 max_connect = 0 continue if Resetflag == 1: finalline.clear() for key in eval(filelines[lineindex].strip('\n').split(">>>") [-1]).keys(): finalline.append([key]) Resetflag = 0 continue templine = [] #存储临时路线 #print("处理坐标{}:{}".format(lineindex,eval(filelines[lineindex].strip('\n').split(">>>")[-1]))) #print("处理路段{}".format(eval(filelines[lineindex].strip('\n').split(">>>")[-1]))) connect_next_flag = 0 #记录下一步是否能有能走通的路段 for subline in finalline: #遍历每一条的候选路线 for key in eval(filelines[lineindex].strip('\n').split(">>>") [-1]).keys(): #遍历每个轨迹点的候选路段 #此代码块只加入key,不加入完整路线 print("路段:{}匹配key:{}".format(subline[-1], key)) # 只需要查看subline的最后一个路段与路段key是否连通即可,因为subline的连通性是通过测试的 connectroute = Common_Functions.InquireConn( subline[-1], key, "connects") #先查表 #connectroute = -1 if connectroute != 0 and connectroute != 1: #表中没有记录 再用简易导航 connectroute = MapNavigation.waytoway( subline[-1], key) # 为列表 if connectroute: connect_next_flag = 1 temsubline = copy.deepcopy(subline) temsubline.append(key) # 只加入轨迹点所属路段,而不加入这两个路段走通的路线 templine.append(temsubline) else: # 此路线不连通,舍弃当前路段key pass """ #此代码块是加入完整路线 #connectroute = Common_Functions.InquireConn(subline[-1], key,"connects") #先查表 #connectroute = -1 connectroute = MapNavigation.Nodirectionwaytoway(subline[-1], key) # 为列表 if subline[-1] == key: temsubline = copy.deepcopy(subline) templine.append(temsubline) #elif connectroute !=0 and connectroute!= 1: #表中没有记录 再用简易导航 #connectroute = MapNavigation.Nodirectionwaytoway(subline[-1], key) # 为列表 elif connectroute: #路段可连通 temsubline = copy.deepcopy(subline) temsubline.extend(connectroute[1:]) #将走通的路线加入到子路线,扩展当前路线 templine.append(temsubline) else:pass """ if connect_next_flag == 0: #所有的候选路线与当前轨迹点的候选路段均不能相通,跳过此轨迹点 pass else: finalline.clear() # print(templine) finalline = Common_Functions.DoubleDel(templine) # 去相邻重复 再去重 finalline = Common_Functions.Main_Auxiliary_road( finalline) # 去除头尾路段一样的候选路线,路线只有一个路段 不会处理 # print(finalline) #finalline = Common_Functions.Start_End(finalline) # 对于[wayid1,wayid2,wayid3] [wayid1,wayid4,wayid5,wayid3] 去除路段多的,如果包含路段数量一致 暂不处理 finalline = Common_Functions.Sequential_subset( finalline) # 最后去路线(至少两个及以上的其他路线是其前缀) max_connect += 1 file.write("New_Road\n") for sub in finalline: file.write(str(sub) + "\n") file.flush() file.close()
def SelectFinalRoute(candidatewaypath, savefinalroutespath): """ 根据坐标点的候选路段选出路网的匹配路线 保存格式为:车辆名:路线(如果不确定,可能为多条),车辆名为txt文件名 :param candidatewaypath: 坐标点候选路段的txt文件路径,如H:\\CandidateWay\\NewStrategy\\334e4763-f125-425f-ae42-8028245764fe.txt :param savefinalroutespath: 最终路线保存路径 :return: """ #file = open("H:\GPS_Data\Road_Network\BYQBridge\FinalRoutes\\334e4763-f125-425f-ae42-8028245764fe.txt", 'a') (tempath, tempfilename) = os.path.split( candidatewaypath) # tempfilename为txt文件名(包含后缀) (trunkname, extension) = os.path.splitext( tempfilename) # filename 为传入的csv文件名 extension为后缀 savetxtfilename = trunkname + '.txt' file = open(os.path.join(savefinalroutespath, savetxtfilename), 'a') with open(candidatewaypath) as candidatewayfile: filelines = candidatewayfile.readlines() linesnum = len(filelines) finalline = [] #存储最终路线,可能为多条,随着坐标点的迭代,会变化,直到处理完最有一个坐标点 for key in eval(filelines[0].strip('\n').split(">>>")[-1]).keys(): finalline.append([key]) #print(finalline) # 遍历每个坐标点的候选路段 print("需要处理坐标数为:{}".format(linesnum)) for lineindex in range(1, linesnum): templine = [] #存储临时路线 # 遍历到最后一行 print(len(finalline)) print(finalline) print("处理坐标{}:{}".format( lineindex, eval(filelines[lineindex].strip('\n').split(">>>")[-1]))) #print("处理路段{}".format(eval(filelines[lineindex].strip('\n').split(">>>")[-1]))) for subline in finalline: for key in eval(filelines[lineindex].strip('\n').split(">>>") [-1]).keys(): temsubline = [] #此代码块只加入key,不加入完整路线 print("路段:{}匹配key:{}".format(subline[-1], key)) # 只需要查看subline的最后一个路段与路段key是否连通即可,因为subline的连通性是通过测试的 connectroute = Common_Functions.InquireConn( subline[-1], key, "connects") #先查表 #connectroute = -1 if connectroute != 0 and connectroute != 1: #表中没有记录 再用简易导航 connectroute = MapNavigation.waytoway( subline[-1], key) # 为列表 if connectroute: temsubline = copy.deepcopy(subline) temsubline.append(key) # 只加入轨迹点所属路段,而不加入这两个路段走通的路线 templine.append(temsubline) else: # 此路线不连通,舍弃当前路段key pass """ #此代码块是加入完整路线 #connectroute = Common_Functions.InquireConn(subline[-1], key,"connects") #先查表 #connectroute = -1 connectroute = MapNavigation.Nodirectionwaytoway(subline[-1], key) # 为列表 if subline[-1] == key: temsubline = copy.deepcopy(subline) templine.append(temsubline) #elif connectroute !=0 and connectroute!= 1: #表中没有记录 再用简易导航 #connectroute = MapNavigation.Nodirectionwaytoway(subline[-1], key) # 为列表 elif connectroute: #路段可连通 temsubline = copy.deepcopy(subline) temsubline.extend(connectroute[1:]) #将走通的路线加入到子路线,扩展当前路线 templine.append(temsubline) else:pass """ # print(temsubline) # print(templine) finalline.clear() #print(templine) finalline = Common_Functions.DoubleDel(templine) #去相邻重复 再去重 finalline = Common_Functions.Main_Auxiliary_road( finalline) #去除头尾路段一样的候选路线,路线只有一个路段 不会处理 #print(finalline) finalline = Common_Functions.Start_End( finalline ) # 对于[wayid1,wayid2,wayid3] [wayid1,wayid4,wayid5,wayid3] 去除路段多的,如果包含路段数量一致 暂不处理 finalline = Common_Functions.Sequential_subset( finalline) # 最后去路线(至少两个及以上的其他路线是其前缀) print("共选出{}条路".format(len(finalline))) for sub in finalline: file.write(str(sub) + "\n") file.flush() print(finalline) file.close()