run.py
import xlsxwriter as xlsxwriter
from astar import astar
from Map import Map
import pandas as pd
import sqlalchemy
mymap = [
[1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1]
]
map = Map(mymap,0,1,6,25)
result = astar(map)
result.reverse()
print(result)
num=len(result)
m=''
for i in range(num):
x=str(result[i])
m=m+x
workbook = xlsxwriter.Workbook('C:/Users/17709/Desktop/map.xlsx')
worksheet = workbook.add_worksheet()
# Widen the first column to make the text clearer
# 设置一列或者多列单元属性
worksheet.set_column('A:A', 30)
# Add a bold format to use to highlight cells
# 在工作表中创建一个新的格式对象来格式化单元格,实现加粗
bold = workbook.add_format({'bold': True})
# Write some numbers, with row/column notation #按照坐标写入
worksheet.write(0,0,'')
worksheet.write(1,0,'1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1')
worksheet.write(2,0,'1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1')
worksheet.write(3,0,'1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1')
worksheet.write(4,0,'1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1')
worksheet.write(5,0,'1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1')
worksheet.write(6,0,'1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1')
worksheet.write(7,0,'1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1')
worksheet.write(8,0,'1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1')
worksheet.write(9,0,'1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1')
worksheet.write(12,0,m)
# 关闭工作薄
workbook.close()
print('已导出至Excel')
engine=sqlalchemy.create_engine('mysql+pymysql://用户名:密码@ip:3306/map')
#读取数据
db=pd.read_excel('C:/Users/17709/Desktop/map.xlsx')
#导入数据库
db.to_sql(name='1',con=engine,index=False,if_exists='replace')
print('已导入数据库')
astar.py
from Node import Node
def getKeyforSort(element:Node):
return element.g #element#不应该+element.h,否则会穿墙
def astar(workMap):
startx,starty = workMap.startx,workMap.starty
endx,endy = workMap.endx,workMap.endy
startNode = Node(startx, starty, 0, 0, None)
openList = []
lockList = []
lockList.append(startNode)
currNode = startNode
while((endx,endy) != (currNode.x,currNode.y)):
workList = currNode.getNeighbor(workMap.data,endx,endy)
for i in workList:
if (i not in lockList):
if(i.hasNode(openList)):
i.changeG(openList)
else:
openList.append(i)
openList.sort(key=getKeyforSort)#关键步骤
currNode = openList.pop(0)
lockList.append(currNode)
result = []
while(currNode.father!=None):
result.append((currNode.x,currNode.y))
currNode = currNode.father
result.append((currNode.x,currNode.y))
return result
Node.py
'''
Node.py主要是描述对象Node
'''
class Node(object):
'''
初始化节点信息
'''
def __init__(self,x,y,g,h,father):
self.x = x
self.y = y
self.g = g
self.h = h
self.father = father
'''
处理边界和障碍点
'''
def getNeighbor(self,mapdata,endx,endy):
x = self.x
y = self.y
result = []
#先判断是否在上下边界
#if(x!=0 or x!=len(mapdata)-1):
#上
#Node(x,y,g,h,father)
if(x!=0 and mapdata[x-1][y]!=0):
upNode = Node(x-1,y,self.g+10,(abs(x-1-endx)+abs(y-endy))*10,self)
result.append(upNode)
#下
if(x!=len(mapdata)-1 and mapdata[x+1][y]!=0):
downNode = Node(x+1,y,self.g+10,(abs(x+1-endx)+abs(y-endy))*10,self)
result.append(downNode)
#左
if(y!=0 and mapdata[x][y-1]!=0):
leftNode = Node(x,y-1,self.g+10,(abs(x-endx)+abs(y-1-endy))*10,self)
result.append(leftNode)
#右
if(y!=len(mapdata[0])-1 and mapdata[x][y+1]!=0):
rightNode = Node(x,y+1,self.g+10,(abs(x-endx)+abs(y+1-endy))*10,self)
result.append(rightNode)
#西北 14
if(x!=0 and y!=0 and mapdata[x-1][y-1]!=0 ):
wnNode = Node(x-1,y-1,self.g+14,(abs(x-1-endx)+abs(y-1-endy))*10,self)
result.append(wnNode)
#东北
if(x!=0 and y!=len(mapdata[0])-1 and mapdata[x-1][y+1]!=0 ):
enNode = Node(x-1,y+1,self.g+14,(abs(x-1-endx)+abs(y+1-endy))*10,self)
result.append(enNode)
#西南
if(x!=len(mapdata)-1 and y!=0 and mapdata[x+1][y-1]!=0 ):
wsNode = Node(x+1,y-1,self.g+14,(abs(x+1-endx)+abs(y-1-endy))*10,self)
result.append(wsNode)
#东南
if(x!=len(mapdata)-1 and y!=len(mapdata[0])-1 and mapdata[x+1][y+1]!=0 ):
esNode = Node(x+1,y+1,self.g+14,(abs(x+1-endx)+abs(y+1-endy))*10,self)
result.append(esNode)
# #如果节点在关闭节点 则不进行处理
# finaResult = []
# for i in result:
# if(i not in lockList):
# finaResult.append(i)
# result = finaResult
return result
def hasNode(self,worklist):
for i in worklist:
if(i.x==self.x and i.y ==self.y):
return True
return False
#在存在的前提下
def changeG(self,worklist):
for i in worklist:
if(i.x==self.x and i.y ==self.y):
if(i.g>self.g):
i.g = self.g
Map.py
import math
'''
对象Map,主要有地图数据、起点和终点
'''
class Map(object):
def __init__(self,mapdata,startx,starty,endx,endy):
self.data = mapdata
self.startx = startx
self.starty = starty
self.endx = endx
self.endy = endy
评论 (0)