筛选100米范围内而且方位角相差15度以内的基站

前面我在《使用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)

image-20220426164812169

然后先找出每个被查找点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)  # 地球平均半径,6371km
    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度的数据:

# 过滤出方位角小于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

image-20220426165732544

然后就可以通过表连接整理出需要的数据了:

result = pd.merge(find.explode("目标索引"), data, how="left",
                  left_on="目标索引", right_index=True)
result

image-20220426170915922

找出了这些覆盖角度相同的,距离又离得近的基站发射器之后,就可以拆除一些或者调整发射器的发射角度增大基站的利用率。

猜你喜欢

转载自blog.csdn.net/as604049322/article/details/124432705