Расчет расстояния от каждой координаты до каждой координаты - PullRequest
1 голос
/ 02 февраля 2020

У меня есть этот фрейм данных:

 ID  Latitude  Longitude
  1  29.39291  -98.50925
  2  29.39923  -98.51256
  3  29.40147  -98.51123
  4  29.38752  -98.52372
  5  29.39537  -98.50402
  6  29.39343  -98.49707
  7  29.39556  -98.53148
  8  29.39706  -98.49565

Я хочу вычислить расстояние Haversine от каждой координаты до каждой координаты. А также найдите, сколько значений меньше или равно 0.5 в каждой строке (исключая 0 значения).

Я использую эту функцию:

def haversine2(lat1, lat2, lon1, lon2, to_radians=True, R = 6371):
    """

    Calculate the great circle distance between two points
    on the earth (specified in decimal degrees or in radians)

    All (lat, lon) coordinates must have numeric dtypes and be of equal length.

    """
    if to_radians:
        lat1, lat2, lon1, lon2 = np.radians([lat1, lat2, lon1, lon2])

    a = np.sin((lat2-lat1)/2.0)**2 + \
        np.cos(lat1) * np.cos(lat2) * np.sin((lon2-lon1)/2.0)**2

    return R * 2 * np.arcsin(np.sqrt(a))

Ожидаемый результат:

 ID  Latitude  Longitude    1_Dist    2_Dist    3_Dist    4_Dist    5_Dist    6_Dist    7_Dist    8_Dist  SE_0_5
  1  29.39291  -98.50925  0.000000  0.558800  0.334307  2.442989  0.882915  2.056223  3.752787  2.295881       1
  2  29.39923  -98.51256  0.558800  0.000000  0.224503  1.884152  1.441617  2.614885  3.193814  2.854464       1
  3  29.40147  -98.51123  0.334307  0.224503  0.000000  2.108690  1.217100  2.390347  3.418271  2.629913       2
  4  29.38752  -98.52372  2.442989  1.884152  2.108690  0.000000  3.325918  4.499314  1.310145  4.738936       0
  5  29.39537  -98.50402  0.882915  1.441617  1.217100  3.325918  0.000000  1.173271  4.635576  1.412938       0
  6  29.39343  -98.49707  2.056223  2.614885  2.390347  4.499314  1.173271  0.000000  5.808935  0.239727       1
  7  29.39556  -98.53148  3.752787  3.193814  3.418271  1.310145  4.635576  5.808935  0.000000  6.048434       0
  8  29.39706  -98.49565  2.295881  2.854464  2.629913  4.738936  1.412938  0.239727  6.048434  0.000000       1

1 Ответ

0 голосов
/ 02 февраля 2020

Это не полный ответ, и мое время истекло, но я уверен, что вы можете взять его отсюда

import numpy as np
import pandas as pd


def cartesian(d):
    # cols = d.keys()
    d.loc[:, 'key_col'] = 1
    outer = pd.merge(d, d, on='key_col', suffixes=('', '_2')).drop('key_col', axis=1).reset_index(drop=True)
    return outer


def haversine2(lat1, lat2, lon1, lon2, to_radians=True, R = 6371):
    """

    Calculate the great circle distance between two points
    on the earth (specified in decimal degrees or in radians)

    All (lat, lon) coordinates must have numeric dtypes and be of equal length.

    """
    if to_radians:
        lat1, lat2, lon1, lon2 = np.radians([lat1, lat2, lon1, lon2])

    a = np.sin((lat2-lat1)/2.0)**2 + \
        np.cos(lat1) * np.cos(lat2) * np.sin((lon2-lon1)/2.0)**2

    return R * 2 * np.arcsin(np.sqrt(a))


if __name__ == "__main__":
    def main():
        a = pd.DataFrame({"ID": [1, 2, 3, 4, 5, 6, 7, 8],
                          'Latitude': [29.39291, 29.39923, 29.4014, 29.38752, 29.39537, 29.39343, 29.39556, 29.39706],
                          'Longitude': [-98.50925, -98.51256, -98.51123, -98.52372, -98.50402, -98.49707, -98.53148,
                                        -98.49565]})

        cartesian_df = cartesian(a)
        print(cartesian_df)

        func = lambda row: haversine2(row['Latitude'], row['Latitude_2'], row['Longitude'], row['Longitude_2'])
        distances_df = cartesian_df.apply(func, axis=1)
        print(distances_df)

        result = cartesian_df
        result['distances'] = distances_df
        print(result)


    main()

Это вычисляет столбец distances для каждой комбинации входов в соответствии с вашим function.

Вы можете переформатировать это в соответствии со своими потребностями.

output:

    ID  Latitude  Longitude  ID_2  Latitude_2  Longitude_2  distances
0    1  29.39291  -98.50925     1    29.39291    -98.50925   0.000000
1    1  29.39291  -98.50925     2    29.39923    -98.51256   0.772456
2    1  29.39291  -98.50925     3    29.40140    -98.51123   0.963335
3    1  29.39291  -98.50925     4    29.38752    -98.52372   1.524651
4    1  29.39291  -98.50925     5    29.39537    -98.50402   0.575805
..  ..       ...        ...   ...         ...          ...        ...
59   8  29.39706  -98.49565     4    29.38752    -98.52372   2.919048
60   8  29.39706  -98.49565     5    29.39537    -98.50402   0.832361
61   8  29.39706  -98.49565     6    29.39343    -98.49707   0.426437
62   8  29.39706  -98.49565     7    29.39556    -98.53148   3.475146
63   8  29.39706  -98.49565     8    29.39706    -98.49565   0.000000

Примечание: запуск функции на вашем входе напрямую не дает ожидаемых результатов. попробуйте haversine2(29.39291, 29.39923, -98.50925, -98.51256, to_radians=True, R = 6371) [это ids = 1, 2] и получите 0.7724556421884609

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...