def create_route(self, start_pt, target_pt): """ Based on points passed through a HTTP request a route is calculated, geometry generated on the basis of it and persisted to the database. :param start_pt: the start point specified :param target_pt: the end point specified :return: the id of the generated and persisted route geometry back to the page which requested it """ start_end = grid_utils.GridUtilities.start_end_points_to_cells(start_pt, target_pt) start_node = start_end[0] end_node = start_end[1] reverse_path = self.path_finder.find_path(start_node, end_node, self.gra.graph_dict) path = self.path_finder.rebuild_path(reverse_path[0], start_node, end_node) route_geoms = _generate_route_geom(path) start_pt_record = GridUtilities.find_cell_centre_projected(start_node, self.qs) end_pt_record = GridUtilities.find_cell_centre_projected(end_node, self.qs) route = TestRoutes(name='Route No {}'.format(random.randint(1, 100000)), distance=round(route_geoms[0].length/1852, 2), geom=route_geoms[0], geom_4326=route_geoms[1], start_geom=start_pt_record, end_geom=end_pt_record) route.save() return route.gid
def _generate_route_geom(path): """ Helper method which looks after the conversion of a list of geometry ids to a line which can be persisted in the database and displayed on screen :param path: :return: a linestring geometry representing the route calculated """ waypoints_proj = [] waypoints_geo = [] for item in path: cell = PathGrid.objects.get(pk=item) centre_point_geo = GridUtilities.convert_to_latlon(cell.geom.centroid) centre_point_proj = cell.geom.centroid waypoints_proj.append(centre_point_proj) waypoints_geo.append(centre_point_geo) route_line_proj = LineString(waypoints_proj, srid=32616) route_line_geom = LineString(waypoints_geo, srid=4326) return route_line_proj, route_line_geom