对于售点POI标签计算脚本性能优化总结
对于两组经纬度的距离计算可以使用常规的公式计算法:
Haversine 公式是一种用于计算两个球面坐标点(经度和纬度)之间的距离的公式。它的原理是基于球面三角形中的余弦定理,即:
cos© = cos(a) * cos(b) + sin(a) * sin(b) * cos©
其中,a、b 和 c 分别表示球面三角形的三条边所对应的夹角,C 表示球面三角形中两点间的弧长。根据余弦定理,我们可以得出:
cos© = cos(lat1) * cos(lat2) * cos(lon2 - lon1) + sin(lat1) * sin(lat2)
其中,lat1、lat2、lon1 和 lon2 分别表示两个点的纬度和经度。由于我们通常使用角度而非弧度来表示经纬度,因此需要将其转换为弧度。
poi_outlet = poi_outlet.withColumn("dlat", radians(poi_outlet["LATITUDE"]) - radians(poi_outlet["lat"]))
poi_outlet = poi_outlet.withColumn("dlon", radians(poi_outlet["LONGITUDE"]) - radians(poi_outlet["lng"]))
poi_outlet = poi_outlet.withColumn("a",
sin(poi_outlet["dlat"]/2)**2 +
cos(radians(poi_outlet["LATITUDE"])) * cos(radians(poi_outlet["lat"])) *
sin(poi_outlet["dlon"]/2)**2)
poi_outlet = poi_outlet.withColumn("distance", 2 * asin(sqrt(poi_outlet.a))*6371.393*1000)
避免使用外部引用
from geopy.distance import geodesic
distance = geodesic((lat1, lng1), (lat2, lng2)).m
-
减少需要计算的数据量
售点数据有:1 650 654,为减少计算量 ,将没有经纬度信息的售点进行筛除。筛除后1 167 357
腾讯POI数据有:30 498 558,为减少计算量 ,将没有经纬度信息进行筛除。晒出后29 607 224
整体的数据计算量,以售点经纬度为中心,圈出一个 经度、维度为1500m范围的经纬局域,这样就可以减少后续的计算数据量
# _lon_res = round(0.0011141771746803184 * 15, 5) 0.01671
# _lat_res = round(0.0009034837993532672 * 15, 5) 0.01355
poi_outlet = poi_outlet.filter(
(poi_outlet.lng.isNotNull()) & (poi_outlet.LONGITUDE.isNotNull()) &
(poi_outlet.lat.isNotNull()) & (poi_outlet.LATITUDE.isNotNull()) &
(expr("abs(lng - LONGITUDE) <= 0.01671")) &
(expr("abs(lat - LATITUDE) <= 0.01355"))
)