es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Coordinadas reales de latitud y longitud importadas de un diccionario.

Tengo un diccionario de coordenadas que estoy utilizando para la ubicación de nodos. Estoy usando el módulo networkx para crear grafos.

Para mi proyecto, necesito conocer la distancia real en m o km de todas las aristas en el grafo. Actualmente estoy utilizando la distancia euclidiana, pero por supuesto esa no es la distancia real. Estoy utilizando coordenadas de longitud y latitud.

Así es como parte de mi diccionario se ve:

coord = {0: [4.98666883, 52.29477044],
1: [4.96969627, 52.31851732],
2: [4.95026886, 52.31294893],
3: [4.97016485, 52.30191036],
4: [4.98254078, 52.32017747],
5: [4.99130712, 52.29755548],
6: [4.97406065, 52.28985602]}

Y esta es la definición que estoy utilizando para agregar peso a las aristas:

def Longitud(G, coord):
for i, j in G.edges():
G[i][j][‘weight’] = euclidean(coord[i], coord[j])
return G

Y este es el código que estoy utilizando para el resto del grafo.

G = nx.Graph()
G.add_nodes_from(coord.keys())
G = nx.complete_graph(coord.keys())
G = Longitud(G, coord) #Dit gaat goed nu
print(TotalLength(G))

out: 500 metros

Para imprimir la longitud total estoy utilizando:

def LongitudTotal(G):
return G.size(‘weight’)

Esta definición funciona siempre.

¿Qué puedo hacer para añadir la distancia real a las aristas?

Gracias de antemano.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para agregar la distancia real a los bordes de tu gráfico, puedes usar la fórmula de haversine para calcular la distancia del gran círculo entre dos puntos en una esfera (en este caso, la superficie de la Tierra). Aquí está el código actualizado para la función Length():

    from math import radians, cos, sin, asin, sqrt
    
    def haversine(lon1, lat1, lon2, lat2):
        # convertir grados decimales a radianes
        lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
        # fórmula de haversine
        dlon = lon2 - lon1
        dlat = lat2 - lat1
        a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
        c = 2 * asin(sqrt(a))
        # Radio de la Tierra en kilómetros. Usar 3956 para millas
        r = 6371
        return c * r * 1000
    
    def Length(G,coord):
        for i, j in G.edges():
            G[i][j]['weight'] = haversine(coord[i][0], coord[i][1], coord[j][0], coord[j][1])
        return G
    

    La función haversine() recibe las longitudes y latitudes de dos puntos y devuelve la distancia del gran círculo entre ellos en metros. La función Length() luego utiliza esta fórmula para calcular la distancia entre cada par de nodos y la asigna como peso del borde correspondiente.

    Todavía puedes usar la función TotalLength() como antes para calcular la longitud total de tu gráfico. El resultado ahora estará en metros y debería ser más preciso que la distancia euclidiana.

Comments are closed.