如何给出开始,结束坐标

时间:2014-05-26 09:04:01

标签: python algorithm graph a-star

我是qgis的新手,在这里我想找到地图上两个选定点之间的路径(Roads-vector layer)。用户使用鼠标点击选择点。 所以我在这里用astar算法找到两点之间的路径。

********* ********** astar.py ************************

import heapq

class AStar(object):  
    def __init__(self, graphAstar):  
        self.graphAstar = graphAstar

    def heuristic(self, node, start, end):
        raise NotImplementedError

    def search(self, start, end):
    openset = set()
        closedset = set()
        current = start
        openHeap = []
        openset.add(current)
        openHeap.append((0,current))
        while openset:
        temp = heapq.heappop(openHeap)
        current = temp[1]
            if current == end:
                path = []
                while current.parent:
                    path.append(current)
                    current = current.parent
                path.append(current)
                return path[::-1]
            openset.remove(current)
            closedset.add(current)
            for node in self.graphAstar[current]:
                if node in closedset:
                    continue
                if node in openset:
                    new_g = current.gg + current.move_cost(node)
                    if node.gg > new_g:
                        node.gg = new_g
                        node.parent = current
                else:
                    node.gg = current.gg + current.move_cost(node)
                    node.H = self.heuristic(node, start, end)
                    node.parent = current
                    openset.add(node)
            heapq.heappush(openHeap, (node.H,node))
        return None

    class AStarNode(object):
        def __init__(self):
            self.gg = 0
            self.H = 0
            self.parent = None

        def move_cost(self, other):
            raise NotImplementedError

*****************************astar_grid.py*******************************

    from astar import AStar, AStarNode
    from math import sqrt

    class AStarGrid(AStar):
        def heuristic(self, node, start, end):
            return sqrt((end.x - node.x)**2 + (end.y - node.y)**2)

    class AStarGridNode(AStarNode):
        def __init__(self, x, y):
            self.x, self.y = x, y
            super(AStarGridNode, self).__init__()

        def move_cost(self, other):
            diagonal = abs(self.x - other.x) == 1 and abs(self.y - other.y) == 1
            return 14 if diagonal else 10

在主代码中,使用以下方法从矢量图层创建图形。

************************** plugin.py *************** *******************

def make_graph(self, mapinfo):
    nodes = [[AStarGridNode(x, y) for y in range(mapinfo['height'])] for x in range(mapinfo['width'])]
    graphAstar = {}
    for x, y in product(range(mapinfo['width']), range(mapinfo['height'])):
        node = nodes[x][y]
        graphAstar[node] = []
        for i, j in product([-1, 0, 1], [-1, 0, 1]):
                if not (0 <= x + i < mapinfo['width']): continue
                if not (0 <= y + j < mapinfo['height']): continue
                graphAstar[nodes[x][y]].append(nodes[x+i][y+j])
    return graphAstar, nodes

我在FindRoutes方法中调用了该方法..

def findRoutes(self):
vl=self.canvas.currentLayer()
director = QgsLineVectorLayerDirector( vl, -1, '', '', '', 3 )
properter = QgsDistanceArcProperter()
director.addProperter( properter )
crs = self.canvas.mapRenderer().destinationCrs()
builder = QgsGraphBuilder( crs )

global x1
global y1
global x2
global y2
pStart = QgsPoint( x1, y1 )
pStop = QgsPoint( x2, y2 )
graphAstar, nodes = self.make_graph({ "width": 8, "height": 8 })
paths = AStarGrid(graphAstar)

start, end = ??
path = paths.search(start, end)

我的问题是,如何将开始和结束坐标传递给上面的函数?因为传递它们就像坐标(start,end = pStart,pStop)一样不起作用。 如何将它们添加到作为节点创建的图形中? 或者有任何简单的方法吗?

请帮我找到解决此问题的方法。 谢谢

1 个答案:

答案 0 :(得分:0)

当我做一个astar时,我使用的节点是astar的实习生,并且包含一个与原始点对象(你的位置元组)相对应的参考。

也许它与您的AStarGridNode相同?

在你的情况下:

start = AStarGridNode(x1, y1)
stop = AStarGridNode(x2, y2)

此部分可以在您的搜索功能中隐藏此用户。