前面我在《使用sklearn处理经纬度的三种距离计算与地图可视化》一文中演示了三种基站经纬度数据的计算。
今天的需求给出原始数据是一批包含方位角的基站发射器数据,每个基站存在多个发射器,幼稚不同的方位角,要求找出与目标基站距离接近并且方位角接近的基站数据。例如筛选出100米范围内方位角相差15度以内的基站发射器。
首先我们读取数据:
import pandas as pd
import numpy as np
excel = pd.ExcelFile("多层网计算.xlsx")
find = excel.parse("基础网")
data = excel.parse("匹配数据")
display(find)
display(data)
然后先找出每个被查找点100米范围内的点:
from sklearn.neighbors import BallTree
from math import *
def distancefuc(s1, s2):
"创建用于计算两个经纬度距离的函数"
lon1, lat1 = map(radians, s1)
lon2, lat2 = map(radians, s2)
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat / 2)**2 + cos(lat1) * cos(lat2) * sin(dlon / 2)**2
distance = round(2 * asin(sqrt(a)) * 6371000, 1)
return distance
data_p = data.values[:, 1:3]
find_p = find.values[:, 1:3]
bt = BallTree(data_p, metric=distancefuc)
points = bt.query_radius(find_p, 100)
print(points)
[array([8, 7, 9, 6], dtype=int64)
array([1676, 1677, 129, 128, 130, 124, 123], dtype=int64)
array([131, 134, 135, 132, 133], dtype=int64) array([0, 1], dtype=int64)
array([], dtype=int64) array([], dtype=int64) array([], dtype=int64)
array([], dtype=int64) array([], dtype=int64) array([], dtype=int64)]
然后找出其中方位角小于15度的数据:
points2 = []
for a2, point in zip(find.方位角, points):
a1 = data.iloc[point, 3].values
mask = np.abs(a1-a2) < 15
points2.append(point[mask])
find["目标索引"] = points2
find
然后就可以通过表连接整理出需要的数据了:
result = pd.merge(find.explode("目标索引"), data, how="left",
left_on="目标索引", right_index=True)
result
找出了这些覆盖角度相同的,距离又离得近的基站发射器之后,就可以拆除一些或者调整发射器的发射角度增大基站的利用率。
|