расчет расстояния между несколькими источниками и пунктами назначения с использованием широты и долготы - PullRequest
0 голосов
/ 26 мая 2020

У меня есть данные с несколькими источниками и местами доставки и их соответствующими значениями широты и долготы, мне нужно рассчитать расстояние (в км / милях) между каждым из источников и пунктов назначения, ниже указаны координаты источников и пунктов назначения

origin_coords = [
  '-33.8309, 151.0875', 
  '-33.77733, 151.119854']
destination_coords = [
  '-25.5789375305176, 134.359710693359', 
  '-12.46029472, 130.8423157', 
  '-33.87905884, 151.2432098']

может кто-нибудь помочь мне выполнить его в python

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Вы ищете что-то вроде этого

from sklearn.metrics import pairwise_distances
import numpy as np
from math import sin, cos, sqrt, atan2, radians

origin_coords = ['-33.8309, 151.0875', '-33.77733, 151.119854'] 
destination_coords = ['-25.5789375305176, 134.359710693359', '-12.46029472, 130.8423157', '-33.87905884, 151.2432098']

origin_coords = [[float(v.split(",")[0]), float(v.split(",")[1])] for v in origin_coords]
destination_coords = [[float(v.split(",")[0]), float(v.split(",")[1])] for v in destination_coords]

origin_coords = np.array([[radians(v[0]), radians(v[1])] for v in origin_coords])
destination_coords = np.array([[radians(v[0]), radians(v[1])] for v in destination_coords])

# distance in km.
def geodesic_dist(x, y):
  dlon = y[1] - x[1]
  dlat = y[0] - x[0]
  a = sin(dlat / 2)**2 + cos(x[0]) * cos(y[0]) * sin(dlon / 2)**2
  c = 2 * atan2(sqrt(a), sqrt(1 - a))

  return 6373.0 * c

print(pairwise_distances(origin_coords, destination_coords, metric=geodesic_dist))

, что дает

[[1854.93894877 3138.98807828   15.34816524]
 [1855.11802065 3136.96316526   16.06085592]]

Подробнее см. Получение расстояния между двумя точками на основе широты / долготы .

0 голосов
/ 26 мая 2020

Вы можете использовать geopy пакет:

from geopy.distance import geodesic
for org, dst in zip(origin_coords, destination_coords):
    print(geodesic(org, dst).kilometers)

(в км):

1855.6690160383962
3131.115522557264

Изменить:

Если вы хотите найти расстояние от каждой исходной точки до пункта назначения, используйте это:

import itertools 

coord_orig_2_dst = list(itertools.product(origin_coords, destination_coords)) # <-- will give 6 pairs
for idx, (org, dst) in enumerate(coord_orig_2_dst):

    if (idx+1)%(len(origin_coords)):
        print(f"\nposition from origin{(idx+1)//(len(origin_coords))} to destination")
    print(geodesic(org, dst).kilometers)

position from origin0 to destination
1855.6690160383962
3133.107252977121

position from origin1 to destination
15.3678706642723
1855.8745525856307

position from origin2 to destination
3131.115522557264
16.053573246669945
...