Как водить каждую улицу в данной области?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как водить каждую улицу в данной области?

Сообщение Anonymous »

Я хочу собрать 360 изображений в данной области, за рулем все улицы в нем, пытаясь оптимизировать маршрут (вариант китайской проблемы почтальона - CPP). < /p>
Я пытаюсь использовать этот хороший код, каждая улица, которая решает оригинальный CPP, поэтому мне не нужно полностью разрабатывать решение. Таким образом, это то, что делает оригинальный код: < /p>

Получить все спускаемые пешеходные дороги в данной области из OpenStreetMap < /p>
< /li>
Применить алгоритм, предложенный Эдмондсом, Дж. И Джонсон, который дает решение для оптималла. Этот алгоритм применяется в сетевом пакете, разработанном тем же автором. Существует 2 корректировки, я думаю, мне нужно применить в исходном коде: < /p>

Настройка способов получить только управляемые дороги (исключать пешеходные пути и т. Д.) < /li>
network_type = 'drive' :
org_graph = ox.graph.graph_from_place("My Area", network_type='drive', simplify=True, retain_all=True, truncate_by_edge=False, which_result=None, buffer_dist=0, clean_periphery=None, custom_filter=None)
< /code>
Оригинальный код также имеет эту строку, которую я удалил: < /p>
graph = ox.utils_graph.get_undirected(org_graph)
Кажется, график ориентирован, но в конце концов, полученный файл GPX все еще не уважает направление улиц. OpenStreetMap правильно отображается, и я вставил несколько строк в середине кода, чтобы проверить, ориентирован ли график, что он подтвержден. Я также проверил сетевой пакет, который, кажется, готов иметь дело с направленным графиком. Это обсуждение, которое у него было некоторое время назад, без решения.import warnings
warnings.filterwarnings("ignore")

from libs.tools import *
from libs.graph_route import plot_graph_route

import networkx as nx
import osmnx as ox
import matplotlib.pyplot as plt

from network import Network
from network.algorithms import hierholzer
ox.config(use_cache=True, log_console=True)
< /code>
org_graph = ox.graph.graph_from_place("Campus do Pici, Fortaleza", network_type='drive', simplify=True, retain_all=True, truncate_by_edge=False, which_result=None, buffer_dist=0, clean_periphery=None, custom_filter=None)
fig, ax = ox.plot_graph(org_graph, node_zorder=2, node_color="k", bgcolor="w")
< /code>
# The nodes you want to remove (replace with your actual node IDs) - workaround to remove some nodes in order to make the network fully reachable.
nodes_to_remove = [7804644351, 2509017600]

# Remove the nodes
org_graph.remove_nodes_from(nodes_to_remove)
fig, ax = ox.plot_graph(org_graph, node_zorder=2, node_color="k", bgcolor="w")
< /code>
graph = ox.utils_graph.get_largest_component(org_graph,strongly=False)
fig, ax = ox.plot_graph(graph, node_zorder=2, node_color="k", bgcolor="w")
< /code>
# Finds the odd degree nodes and minimal matching
odd_degree_nodes = get_odd_degree_nodes(graph)
pair_weights = get_shortest_distance_for_odd_degrees(graph, odd_degree_nodes)
matched_edges_with_weights = min_matching(pair_weights)
< /code>
fig, ax = plt.subplots(figsize=(8, 8), facecolor='black', frameon=False)
for v, u, w in matched_edges_with_weights:
x = graph.nodes[v]["x"], graph.nodes["x"]
y = graph.nodes[v]["y"], graph.nodes["y"]
ax.plot(x, y, c='red', alpha=0.3)
ax.scatter(x, y, c='red', edgecolor="none")

fig, ax = ox.plot_graph(graph, node_zorder=2, node_color='g', bgcolor='k', ax=ax)
< /code>
from libs.gpx_formatter import TEMPLATE, TRACE_POINT
from datetime import datetime
...
# List all edges of the extended graph including original edges and edges from minimal matching
single_edges = [(u, v) for u, v, k in graph.edges]
added_edges = get_shortest_paths(graph, matched_edges_with_weights)
edges = map_osmnx_edges2integers(graph, single_edges + added_edges)

# Finds the Eulerian path
network = Network(len(graph.nodes), edges, weighted=True)
eulerian_path = hierholzer(network)
converted_eulerian_path = convert_integer_path2osmnx_nodes(eulerian_path, graph.nodes())
double_edge_heap = get_double_edge_heap(org_graph)

# Finds the final path with edge IDs
final_path = convert_path(graph, converted_eulerian_path, double_edge_heap)
coordinates_path = convert_final_path_to_coordinates(org_graph, final_path)

eccentricity = nx.eccentricity(graph)
center = nx.center(graph)
center_node = graph.nodes[center[0]]

trace_points = "\n\t\t\t".join([TRACE_POINT.format(
lat=lat, lon=lon, id=i, timestamp=datetime.now().isoformat()
) for i, (lat, lon) in enumerate(coordinates_path)])

gpx_payload = TEMPLATE.format(
name="Name your everystreet route",
trace_points=trace_points,
center_lat=center_node["y"],
center_lon=center_node["x"]
)

with open("gpx_output.gpx", "w") as f:
f.write(gpx_payload)
< /code>
In this last section, at network = Network(len(graph.nodes), edges, weighted=True), я также добавил arecreted = true , но затем он бросает ошибку:
ValueError Traceback (most recent call last)
Cell In[11], line 11
9 # Finds the Eulerian path
10 network = Network(len(graph.nodes), edges, directed=True, weighted=True)
---> 11 eulerian_path = hierholzer(network)
12 converted_eulerian_path = convert_integer_path2osmnx_nodes(eulerian_path, graph.nodes())
13 double_edge_heap = get_double_edge_heap(org_graph)

File ~\everystreet\network\algorithms\eulerian.py:67, in hierholzer(network, source)
64 if network.n == 0:
65 return path
---> 67 eulerian, odd_degree_nodes = is_eulerian(network)
68 if not eulerian:
69 raise NotEulerianNetwork(f"Network is not Eulerian, not all nodes are even degree: {odd_degree_nodes}")

File ~\everystreet\network\algorithms\eulerian.py:22, in is_eulerian(network)
12 """ Checks if the network is Eulerian
13
14 Args:
(...)
19 odd_degree_nodes (list): list if nodes with odd degree
20 """
21 if network.directed:
---> 22 out_degree, in_degree = network.directed_degrees()
23 odd_degree_nodes = [
24 {"node": n, "out_degree": d, "in_degree": in_degree[n]}
25 for n, d in enumerate(out_degree) if d != in_degree[n]
26 ]
27 else:

File ~\everystreet\network\network.py:146, in Network.directed_degrees(self)
135 """However, degrees_list holds info about out-degree values (or both for undirected networks), this function
136 return out-degree and in-degree for each node
137
(...)
143 after running Network.directed_degrees()!
144 """
145 out_degree = self.degrees_list
--> 146 in_coming_edges_basket = self.get_edge_basket(self.n, self.edges, reverse=True, directed=True)
148 in_degree = [len(_) for _ in in_coming_edges_basket]
149 self.in_degrees_list = in_degree

File ~\everystreet\network\network.py:69, in Network.get_edge_basket(n, edges, edge_basket, directed, reverse, weighted)
66 # Removing weights for weighted network
67 edges = [(v, u) for v, u, w in edges] if weighted else edges
---> 69 for v, u in edges:
70 if reverse and directed:
71 v, u = u, v

ValueError: too many values to unpack (expected 2)


Подробнее здесь: https://stackoverflow.com/questions/786 ... given-area
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»