python - 将纬度/经度转换为 XY 的有效方法
问题描述
我有一个script
将坐标转换Latitude
为Longitude
笛卡尔坐标的工作。但是,我必须在每个时间点 ( row by row
) 对特定点执行此操作。
我想在更大的df
. 我不确定是否 aloop
迭代每个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)
解决方案
如果我是你,我会这样做。(顺便说一句:元组铸造部分可以优化。
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)
推荐阅读
- c# - 无法将类型“System.DateTime”隐式转换为 IEnumerable
- vim - 使用 vimscript 通过使用普通 vim 命令运行测试脚本
- python - 查找给定字符串中使用的字符的最大频率
- reactjs - Stripe + NextJs - 未定义窗口
- python - 如何在 pygame 中以正确的方式使用 blit()?
- flutter - Flutter 更新到 1.15.22-pre.18 后将无法在 iOS 上运行。Xcode 构建失败
- python-unittest - 自定义 GNU radio python 块中引发的异常的单元测试
- image - 图像处理如何检测图像中的特定自定义形状
- python - 在没有 ssh 进入我的容器的情况下运行测试
- c - 如何使用 C 程序从集合列表中删除超集