1 votos

Trazar una línea entre pares de puntos calculando la distancia con Folium

Estoy tratando de lograr la transformación exacta se explica en este Correo electrónico: .

Básicamente, tengo un par de coordenadas XY (en EPSG 2154 ) y utilizando Folium Necesito..:

  1. mostrar esos puntos en un mapa
  2. trazar una línea entre cada origen y su destino
  3. calcular la distancia entre cada origen y su destino

Así que traté de modificar el código y terminar con este :

CÓDIGO :

import pandas as pd
from pyproj import Transformer
import folium

# --- CREATING THE DATAFRAME
df = pd.DataFrame({'name_origin (f)' : ['A', 'A', 'A', 'A', 'A', 'A', 'A'],
                   'x_origin' : [485605.326573992206249, 485605.326573992206249, 
                                 485605.326573992206249, 485605.326573992206249, 
                                 485622.851343188376632, 485622.851343188376632, 
                                 485622.851343188376632],
                   'y_origin' : [6609181.990121294744313, 6609181.990121294744313,
                                 6609181.990121294744313, 6609181.990121294744313,
                                 6609868.775725279003382, 6609868.775725279003382,
                                 6609868.775725279003382],
                    'name_destination' : ['Point 1', 'Point 2', 'Point 3', 'Point 4', 'Point 5', 'Point 6', 'Point 7'],
                    'x_destination': [485625.494795222417451, 485406.249829484208021,
                                     485775.291626620688476, 485782.127203797223046,
                                     485689.846236585523002, 485452.832908925425727,
                                     485872.578190427448135],
                    'y_destination': [6608980.483131179586053, 6609103.971662417054176,
                                     6609113.006477451883256, 6608920.478859589435160,
                                     6610121.606054869480431, 6609983.695990070700645,
                                     6609883.745388342998922]})

# --- TRANSFORMING THE XY COORDINATES (EPSG2154) TO LON/LAT
transformer = Transformer.from_crs("epsg:2154", "epsg:4326")
latlong_coordinates_origin = transformer.transform(df.iloc[1,], df.iloc[2,])
latlong_coordinates_destination = transformer.transform(df.iloc[4,], df.iloc[5,])

# --- CREATING A FOLIUM MAP BASED ON THE TRANSFORMED DATAFRAME
m = folium.Map([latlong_coordinates_origin, latlong_coordinates_destination], zoom_start=15)

for _, row in df.iterrows():
    folium.CircleMarker([row['x_origin'], row['y_origin']],
                        radius=15,
                        fill_color="#3db7e4", # divvy color
                       ).add_to(m)

    folium.CircleMarker([row['x_destination'], row['y_destination']],
                        radius=15,
                        fill_color="red", # divvy color
                       ).add_to(m)

    folium.PolyLine([[row['x_origin'], row['y_origin']], 
                     [row['x_destination'], row['y_destination']]]).add_to(m)
m

ERROR :

Lamentablemente, recibo este error :

TypeError: input must be an array, list, tuple, scalar, or have the __array__ method.

¿Tiene alguna propuesta?

5voto

nitinsavant Puntos 6

Puede utilizar este script:

import pandas as pd
from pyproj import Transformer
import folium

df = pd.DataFrame({'name_origin (f)' : ['A', 'A', 'A', 'A', 'A', 'A', 'A'],
                   'x_origin' : [485605.326573992206249, 485605.326573992206249, 
                                 485605.326573992206249, 485605.326573992206249, 
                                 485622.851343188376632, 485622.851343188376632, 
                                 485622.851343188376632],
                   'y_origin' : [6609181.990121294744313, 6609181.990121294744313,
                                 6609181.990121294744313, 6609181.990121294744313,
                                 6609868.775725279003382, 6609868.775725279003382,
                                 6609868.775725279003382],
                    'name_destination' : ['Point 1', 'Point 2', 'Point 3', 'Point 4', 'Point 5', 'Point 6', 'Point 7'],
                    'x_destination': [485625.494795222417451, 485406.249829484208021,
                                     485775.291626620688476, 485782.127203797223046,
                                     485689.846236585523002, 485452.832908925425727,
                                     485872.578190427448135],
                    'y_destination': [6608980.483131179586053, 6609103.971662417054176,
                                     6609113.006477451883256, 6608920.478859589435160,
                                     6610121.606054869480431, 6609983.695990070700645,
                                     6609883.745388342998922]})

transformer = Transformer.from_crs("epsg:2154", "epsg:4326")
latlong_origin = list(zip(*transformer.transform(df["x_origin"], df["y_origin"])))
latlong_destination = list(zip(*transformer.transform(df["x_destination"], df["y_destination"])))
m = folium.Map(latlong_origin[0], zoom_start=15)

for origin, destination in zip(latlong_origin, latlong_destination):
    folium.CircleMarker([origin[0], origin[1]],
                        radius=15,
                        fill_color="#3db7e4", # divvy color
                       ).add_to(m)

    folium.CircleMarker([destination[0], destination[1]],
                        radius=15,
                        fill_color="red", # divvy color
                       ).add_to(m)

    folium.PolyLine([[origin[0], origin[1]], 
                     [destination[0], destination[1]]]).add_to(m)
m

enter image description here

0 votos

Muchas gracias @Kadir. Este es el resultado exacto que estoy buscando. Ejecuté el código en Jupyter y ¡funcionó! ¿Hay alguna manera de añadir una columna al Dataframe para precisar la longitud de cada línea?

0 votos

¿Existe también la posibilidad de poner etiquetas en cada marcador? Eventualmente, los nombres del origen/destino. ¡Esto sería increíble si pudiéramos hacerlo!

0 votos

Puede añadir la columna de distancia utilizando: import numpy as np; df["distance"] = np.sqrt((df["x_origin"] - df["x_destination"])**2 + (df["y_origin"] - df["y_destination"])**2)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X