首页
学习
活动
专区
工具
TVP
发布

亿级经纬度距离计算88.73秒,秒杀VBA!

计算经纬度的代码网上一搜一大把,通常是单点距离的计算,无法实现批量计算,本文将利用pandas实现亿级经纬度距离代码的实现。

本文将实现两张表的任意点之间100、200、300、500、800、1000米范围内的距离计算。

首先导入需要使用的包

1importpandasaspd

2importnumpyasnp

3frommathimportradians, cos, sin, asin, sqrt, ceil

4importmath

5importtime

经纬度计算自定义函数

1defgeodistance(lng1,lat1,lng2,lat2):

2lng1, lat1, lng2, lat2 = map(radians, [float(lng1), float(lat1), float(lng2), float(lat2)])

3# 经纬度转换成弧度

4dlon=lng2-lng1

5dlat=lat2-lat1

6a=sin(dlat/2)**2+ cos(lat1) * cos(lat2) * sin(dlon/2)**2

7distance=2*asin(sqrt(a))*6371*1000# 地球平均半径,6371km

8distance=round(distance,)

9returndistance

实现不同范围内的距离计算,例如100、200、300、500、800、1000,适合做成一张参数表。

由于地球是球形,不同纬度下,同一经度差值对应的距离不同,纬度相同且纬度越大时,同一经度对应的距离越小,中国经纬度跨度约为,此处为了计算最大经度差值,我们选取纬度为;不同经度下,同一纬度差异对应的距离相同

不同经纬度差异对应最小距离表格如下:

分别导入源表和目标表,两个表关联得到原点与目标点的所有配对

1file_name =r'D:\python\geo\sTable.csv'

2df1=pd.read_csv(file_name)

3file_name2 =r'D:\python\geo\tTable.csv'

4df2=pd.read_csv(file_name2)

5m = pd.concat([pd.concat([df1]*len(df2)).sort_index().reset_index(drop=True),

6pd.concat([df2]*len(df1)).reset_index(drop=True) ],1)

然后根据经度和纬度差值进行过滤(经纬度差值大于某个值,距离大于某个值,参见参数表

得到下图表格:

然后针对每一行的4个参数应用自定义函数,此处使用内置模块(比使用循环要高效很多)。

根据经纬度差值判断距离是一个大致的范围,我们选取纬度值获取了最大的经度差值,随着纬度减小,此时计算的距离会大于该阈值,所以要对初次计算结果进行过滤,得出满足阈值的条目:

1distance = distance.append(nn[nn.distance

经过调试,发现该方法计算量上限基本为万,当计算量大于万怎么办?

偶然间想起了之前自己将文件分割的文章,当计算量大于万,我们对原表进行分割,分割个数就是,不能整除时,需要先上取整,多分割一个文件

分割数目有了,文件分片大小也就有了

1linesPerFile = ceil(count_a / pieces)+1

文件分割代码:

1filecount =1

2# 以0为起点,文件行数为终点,分片大小为间隔,循环遍历文件,每次遍历行数即为分片大小,而不是每行遍历一次,处理效率极高,但是比较吃内存

3foriinrange(, len(csv_file), linesPerFile):

4# 打开目标文件准备写入,不存在则创建

5withopen(file_name[:-4] +'_'+ str(filecount) +'.csv','w+')asf:

6# 判断是否为第一个文件,不是的话需要先写入标题行

7iffilecount >1:

8f.write(csv_file[])

9# 批量写入i至i+分片大小的多行数据,效率极高

10f.writelines(csv_file[i:i+linesPerFile])

11# 完成一个文件写入之后,文件编号增加1

12filecount +=1

详情可以参考如下文章。

将文件分割之后,我们便可以循环处理分片文件与目标文件,将得到的结果合并到一个空的里st_time)))

使用测试数据测算,经纬度距离亿次计算量耗时约秒,秒杀VBA。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200217A0QIPH00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券