<jupyter_start><jupyter_text>https://github.com/ustroetz/python-osrm OSMR API documentation: http://project-osrm.org/docs/v5.24.0/api/?language=cURLВыжимка:**Выбирается самый быстрый путь, а не минимальное расстояние между двумя координатами!****Расстояние указывается в метрах****Open Source OSMR API поддерживает только пути для машин. Есть попытаться указать другие опции, результат тот же.****route** — посчитает путь со всеми указанными координатами.options:    * skip_waypoints=true — не будет выводить информацию об указанных координатах. Позволяет экономить место;    * alternatives=n — показать альтернативные пути;    * geometries=geojson — возвращает список пар координат для построения пути;    * overview=full — полный, simplified — не подробный, уменьшает количество пар координат, false — без геометрии;response:    * code — обозначает успешность запроса (200 успешно, 400 — ошибка);    * waypoints — точки на пути, исчезнут при skip_waypoints=true;    * routes — пути, отранжированные от самого быстрого к самому медленному.**table** — посчитает пути между всеми парами координат, переданными в запрос.options:    * skip_waypoints=true — не будет выводить информацию об указанных координатах. Позволяет экономить место, но также обнулит sources и destinations;    * sources — координаты, используемые в качестве отправной точки, вернутся в качестве waypoint объекта    * destinations — координаты, используемые в качестве пункта назначения, вернутся в качестве waypoint объекта    * annotations — duration (default), distance , or duration,distance — что возвращается;    * fallback_speed — в случае, если между точкам не удается найти путь, будет посчитано кратчайшее расстояние, для которого необходимо указать скорость.response:    * code    * durations — null, если путь не удалось построить;    * distances — null, если путь не удалось построить;    * sources    * destinations    * fallback_speed_cells — если был использован fallback_speed, то вернется массив, указывающий, какие пары были рассчитаны подобным образом.    Макет ссылки:http://router.project-osrm.org/route/v1/driving/59.98259700478887,30.4297523923562;55.75269662241035,37.64085841204411?overview=false<jupyter_code>import requests
import json
import folium
response = requests.get('http://router.project-osrm.org/route/v1/driving/59.98259700478887,30.4297523923562;55.75269662241035,37.64085841204411?overview=simplified&geometries=geojson')
route = json.loads(response.text)
route['routes'][0]['geometry']['coordinates']
route['routes'][0]['distance']
r = route['routes'][0]['geometry']['coordinates']
m = folium.Map(location=[59.98259700478887,30.4297523923562],
              zoom_start=5)
folium.PolyLine(r,
                color='red',
                weight=15,
                opacity=0.8).add_to(m)
m<jupyter_output><empty_output><jupyter_text>Пробуем на датасете<jupyter_code>import psycopg2
import numpy as np
from scipy.cluster.hierarchy import fclusterdata
from scipy.spatial.distance import pdist
from math import pi, sin, cos, atan2
import matplotlib.pyplot as plt
import pandas as pd
from itertools import combinations
from tqdm import tqdm
conn = psycopg2.connect(dbname='sociolinguistic', user='app', 
                        password='<PASSWORD>', host='gisly.net')
cursor = conn.cursor()
cursor.execute(""" select place_born.longitude, place_born.latitude
from sociolinguistic_place place_born
where place_born.longitude is not null
and place_born.latitude is not null""")
X = np.array(cursor.fetchall())
cursor.close()
conn.close()
X[0]
table = list(combinations(X, 2))
longitude_x = [x[0][0] for x in table]
latitude_x = [x[0][1] for x in table]
longitude_y = [x[1][0] for x in table]
latitude_y = [x[1][1] for x in table]
df = pd.DataFrame()
df['longitude_x'] = longitude_x
df['latitude_x'] = latitude_x
df['longitude_y'] = longitude_y
df['latitude_y'] = latitude_y
df['distance'] = np.nan
df['duration'] =  np.nan
df['geometry'] = np.nan
def calculate_dist(place1, place2):
    place1 = str(place1[0]) + ',' + str(place1[1])
    place2 = str(place2[0]) + ',' + str(place2[1])
    try:
        response = requests.get(
            'http://router.project-osrm.org/route/v1/driving/{0};{1}?overview=simplified&geometries=geojson'.format(
            place1, place2))
        response = json.loads(response.text)
        distance = response['routes'][0]['distance']
        duration = response['routes'][0]['duration']
        geometry = json.dumps(response['routes'][0]['geometry']['coordinates'])
    except Exception as e:
        distance = np.nan
        duration = np.nan
        geometry = np.nan
    return distance, duration, geometry
for num, row in tqdm(df.iterrows()):
    distance, duration, geometry = calculate_dist([row['longitude_x'], row['latitude_x']],
                                                 [row['longitude_y'], row['latitude_y']])
    df.loc[num, 'distance'] = distance
    df.loc[num, 'duration'] = duration
    df.loc[num, 'geometry'] = geometry<jupyter_output>22043it [3:03:44,  1.98it/s]
{'fraction_non_alphanumeric': 0.1176704432518386, 'fraction_numerical': 0.044325183860067584, 'mean_word_length': 4.566371681415929, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 9, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '45931', 'license': 'MIT', 'n_tokens_mistral': 1850, 'n_tokens_neox': 1888, 'n_words': 422, 'path': 'migrations 2020-2021/OSRM.ipynb', 'repo_name': 'lalsnivts/sociolinguistic_db', 'size': '5036'}