原帖由
exchange 于 2010-10-26 12:44:57 发表

中联通爆发式布局WLAN10月18日,中国联通公布了2010年WLAN工程接入设备框架集采中标的结果,华为、中兴等25家设备厂商分享20万台设备大单。这是中国联通继中国移动与中国电信之后,首次进行大规模WLAN设备集采, ...
import glob
import matplotlib
import matplotlib.pyplot as plt
import pandas
from sklearn.cluster import KMeans
from math import sin, cos, radians, atan2, sqrt
# 维护经纬度坐标
class Coordinate:
def __init__(self, longitude, latitude):
self.longitude = longitude
self.latitude = latitude
# 使用Haversine公式计算两个经纬度坐标点之间的距离
def calculate_distance(self, other):
lon1, lat1, lon2, lat2 = map(radians, [self.longitude,
self.latitude,
other.longitude,
other.latitude])
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
km = 2 * atan2(sqrt(a), sqrt(1-a)) * 6371
#将公里转化为米
return km * 1000
# 弱覆盖区域中任意两个坐标点的最大距离阈值
MAX_DISTANCE = 70
#弱覆盖区域中坐标点的数量
MIN_COUNT = 5
# 管理弱覆盖区域的坐标点
# 在一个弱区域中,任意坐标点的距离都要小于MAX_DISTANCE,并且坐标点的数量大于MIN_COUNT
class CoordinateSet:
def __init__(self):
self.coordinates = []
def get_set_len(self):
return len(self.coordinates)
def add(self, coord,coord_map):
if (coord.longitude,coord.latitude) in coord_map:
#坐标点coord已经被其他弱覆盖区域使用
return False
for c in self.coordinates:
if coord.calculate_distance(c) >= MAX_DISTANCE:
return False
self.coordinates.append(coord)
print("将坐标点({0},{1})加入弱覆盖区域,当前弱覆盖区域的坐标点数量:{2}".format(coord.longitude,coord.latitude,len(self.coordinates)))
#坐标点coord被当前弱覆盖区域使用
coord_map[(coord.longitude,coord.latitude)] = 1
return True
# 判断集合是否相同:两个集合中的坐标点数量相同,并且每个坐标点的经纬度也相同,则认为这两个集合相同
def equals(self, other):
if len(self.coordinates) != len(other.coordinates):
return False
#判断集合是否相同
my_coords = set((c.longitude, c.latitude) for c in self.coordinates)
other_coords = set((c.longitude, c.latitude) for c in other.coordinates)
return my_coords == other_coords
def is_valid(self):
return len(self.coordinates) >= MIN_COUNT
#avg_rsrp1的阈值
AVG_RSRP1_VALUE = -110
# 找出所有弱覆盖区域,弱覆盖区域由多个坐标点构成,
# 将每个弱覆盖区域的坐标点都保存到指定的CSV文件中
class Task1():
def handle(self):
df =pandas.read_csv("./MDT.csv", encoding='GBK')
df1 = df.query('avg_rsrp1 < {0}'.format(AVG_RSRP1_VALUE))
df2 = df1[['longitude_center', 'latitude_center', 'avg_rsrp1']]
#弱覆盖区域集合
coord_sets = []
#坐标点哈希表:为防止弱覆盖区域的重复计算,一个坐标点只能位于一个弱覆盖区域。
coord_map = {}
for i in range(len(df2)):
coord = Coordinate(df2.iloc[i]['longitude_center'],df2.iloc[i]['latitude_center'])
set_tmp = CoordinateSet()
set_tmp.add(coord,coord_map)
for j in range(i + 1, len(df2)):
coord = Coordinate(df2.iloc[j]['longitude_center'], df2.iloc[j]['latitude_center'])
if set_tmp.add(coord,coord_map):
continue
if set_tmp.is_valid():
coord_sets.append(set_tmp)
print("找到弱覆盖区域,该区域节点数量:{0}".format(set_tmp.get_set_len()))
unique_sets =self.get_unique_sets(coord_sets)
self.dump_unique_sets(unique_sets)
# 对弱覆盖区域集合S的元素进行去重操作:
# 弱覆盖区域集合S = {s1,s2,...sn},其中每一个sk(k=1~N)都是一个包含若干坐标点的集合。
# 如果si和sj中的元素完全相同,则将si从S中删除
def get_unique_sets(self,coord_sets):
unique_sets = []
for i in range(len(coord_sets)):
is_unique = True
for j in range(i + 1, len(coord_sets)):
if coord_sets[i].equals(coord_sets[j]):
is_unique = False
break
if is_unique:
unique_sets.append(coord_sets[i])
return unique_sets
#将弱覆盖区域集合S中的每一个元素都导出到一个csv文件中
def dump_unique_sets(self,unique_sets):
id = 0
for coord_set in unique_sets:
id = id + 1
filename = "/data/{0}.csv".format(id)
with open(filename, 'w') as f:
#先写表头
f.write("longitude,latitude\n")
for coord in coord_set.coordinates:
f.write("{0},{1}\n".format(coord.longitude,coord.latitude))
if __name__ == '__main__':
task= Task1()
task.handle()