Эффективный способ конвертировать широту / долготу в XY - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть рабочий script, который преобразует Latitude и Longitude координаты в декартовы координаты. Тем не менее, я должен выполнить это для конкретных точек в каждый момент времени (row by row).

Я хочу сделать нечто подобное на более крупном df. Я не уверен, является ли loop, который перебирает каждый row, наиболее эффективным способом сделать это? Ниже script, который преобразует одну точку XY.

import math
import numpy as np
import pandas as pd

point1 = [-37.83028766, 144.9539561]

r = 6371000 #radians of earth meters

phi_0 = point1[1]
cos_phi_0 = math.cos(np.radians(phi_0))

def to_xy(point, r, cos_phi_0):
    lam = point[0]
    phi = point[1]
    return (r * np.radians(lam) * cos_phi_0, r * np.radians(phi))

point1_xy = to_xy(point1, r, cos_phi_0)

Это прекрасно работает, если я хочу конвертировать между отдельными точками. Вопрос в том, есть ли у меня большой фрейм данных или список (>100,000 rows) координат. Будет loop, что iterates через каждый row будет неэффективным. Есть ли лучший способ выполнить ту же функцию?

Ниже приведен пример чуть большего размера df.

d = ({
    'Time' : [0,1,2,3,4,5,6,7,8],       
    'Lat' : [37.8300,37.8200,37.8200,37.8100,37.8000,37.8000,37.7900,37.7900,37.7800],       
    'Long' : [144.8500,144.8400,144.8600,144.8700,144.8800,144.8900,144.8800,144.8700,144.8500],                               
     })

df = pd.DataFrame(data = d)

1 Ответ

0 голосов
/ 08 ноября 2018

Я сделаю это на твоем месте.(Кстати: литье кортежа может быть оптимизировано.

import numpy as np
import pandas as pd

point1 = [-37.83028766, 144.9539561]

def to_xy(point):

    r = 6371000  #radians of earth meters
    lam,phi = point
    cos_phi_0 = np.cos(np.radians(phi))


    return (r * np.radians(lam) * cos_phi_0,
            r * np.radians(phi))

point1_xy = to_xy(point1)
print(point1_xy)

d = ({
    'Lat' : [37.8300,37.8200,37.8200,37.8100,37.8000,37.8000,37.7900,37.7900,37.7800],       
    'Long' : [144.8500,144.8400,144.8600,144.8700,144.8800,144.8900,144.8800,144.8700,144.8500],                               
     })

df = pd.DataFrame(d)

df['to_xy'] = df.apply(lambda x: 
         tuple(x.values),
         axis=1).map(to_xy)

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