Una implementación de codificación en redes neuronales de gráficos espaciales para la inferencia de funciones urbanas utilizando city2graph, OSMnx y PyTorch Geométrico
poi_gdf[“cx”] = poi_gdf.geometría.x poi_gdf[“cy”] = poi_gdf.geometry.y coordenadas = poi_gdf[[“cx”, “cy”]].to_numpy() nn = Vecinos más cercanos(radio=150.0).fit(coords) poi_gdf[“local_density”] = [len(idx) – 1 for idx in nn.radius_neighbors(coords, return_distance=False)]
si segments_gdf no es Ninguno y len(segments_gdf): intente: unido = gpd.sjoin_nearest(poi_gdf[[“geometry”]], segmentos_gdf[[“geometry”]], distancia_col=”dist_calle”) poi_gdf[“dist_street”] = unido.groupby(nivel=0)[“dist_street”].min().reindex(poi_gdf.index).fillna(0.0) excepto Excepción: poi_gdf[“dist_street”] = 0.0 más: poi_gdf[“dist_street”] = 0,0 poi_gdf[“category”] = poi_gdf[“category”].astype(“categoría”) poi_gdf[“label”] = poi_gdf[“category”].cat.codes.astype(int) CLASS_NAMES = lista(poi_gdf[“category”].cat.categories) print(“Clases:”, CLASS_NAMES) def graph_stats(nombre, constructor): intente: nodos, bordes = constructor() grados = pd.Series(np.r_[edges.index.get_level_values(0),
edges.index.get_level_values(1)]).value_counts() nombre de retorno, len(bordes), round(deg.mean(), 2), (nodos, bordes) excepto Excepción como e: nombre de retorno, f”ERR: {e}”, Ninguno, Ninguno constructores = { “KNN (k=8)”: lambda: c2g.knn_graph(poi_gdf, Distance_metric=”euclidean”, k=8, as_nx=False), “Delaunay”: lambda: c2g.delaunay_graph(poi_gdf, as_nx=False), “Gabriel”: lambda: c2g.gabriel_graph(poi_gdf, as_nx=False), “RNG”: lambda: c2g.relative_neighborhood_graph(poi_gdf, as_nx=False), “EMST”: lambda: c2g.euclidean_minimum_spanning_tree(poi_gdf, as_nx=False), “Waxman”: lambda: c2g.waxman_graph(poi_gdf, Distance_metric=”euclidean”, r0=150, beta=0.6), } print(“\n— Comparación de gráficos de proximidad —“) print(f”{‘graph’:<14}{'#edges':>10}{‘avg_title’:>12}”) construido = {} para nm, b en builders.items(): nombre, ne, avgdeg, payload = graph_stats(nm, b) print(f”{name:<14}{str(ne):>10}{str(avgdeg):>12}”) if payload: build[nm] = carga útil fig, ejes = plt.subplots(1, 3, figsize=(16, 5)) para ax, ingresa zip(axes, [“KNN (k=8)”, “Delaunay”, “EMST”]): si la clave está incorporada: n_, e_ = construida[key]
e_.plot(ax=ax, linewidth=0.4, color=”#3b7dd8″, alpha=0.6) poi_gdf.plot(ax=ax, Markersize=4, color=”#d83b5c”) ax.set_title(key); ax.set_axis_off() plt.suptitle(“Topologías de gráficos espaciales en el mismo conjunto de puntos de interés”, y=1.02) plt.tight_layout(); plt.mostrar()