import pandas as pd
import webbrowser
import win32ui
################################原始数据导入#############################
#获取MR表信息
dlg = win32ui.CreateFileDialog(1) # 1表示打开文件对话框
dlg.SetOFNInitialDir('E:/Python') # 设置打开文件对话框中的初始显示目录
dlg.DoModal()
filename = dlg.GetPathName() # 获取选择的文件名称
df=pd.DataFrame(pd.read_csv('171018HN-MDT.csv'))#获取MR的df
print('原始MR的数据量为:%s'%str(df.shape[0]))
#获取基站参考表表信息
dlg = win32ui.CreateFileDialog(1) # 1表示打开文件对话框
dlg.SetOFNInitialDir('E:/Python') # 设置打开文件对话框中的初始显示目录
dlg.DoModal()
filename = dlg.GetPathName() # 获取选择的文件名称
df_para=pd.DataFrame(pd.read_excel('参考表1-基站经纬度.xls',sheet_name='sheet1'))
##############################数据清洗整理##############################
#选取需要处理数据的列
#eNB_Id MR_Longitude MR_Latitude MR_LteScRSRP
MR_LteScSinrUL
df_mr =
df.ix[:,['eNB_Id','MR_Longitude','MR_Latitude','MR_LteScRSRP','MR_LteScSinrUL']]
#数据清洗,去除空值
df_mr=df_mr.dropna(axis=0,how='any')#去除含有空值的行
#数据清洗,剔除经纬度偏差过大站点
df_mr=pd.merge(df_mr,df_para,on=['eNB_Id','eNB_Id'])#匹配基站经纬度
df_mr=df_mr[abs(df_mr['MR_Longitude']-df_mr['eNB_lon'])<0.1]#经度偏差
df_mr=df_mr[abs(df_mr['MR_Latitude']-df_mr['eNB_lat'])<0.1]#纬度偏差
#添加计数列
df_mr["MR_count"] = 1#count_MR
df_mr["eNB_count"] = 1#count_enb
#栅格化处理,10米栅格
df_mr10 = round(df_mr,4)#经纬度保留到4位,是10米栅格
#df_mr100= round(df_mr,3)#经纬度保留到3位,是100米栅格
#############################弱覆盖点聚合##########################
#计算弱覆盖的count值
df_rsrp = df_mr10[df_mr10['MR_LteScRSRP']
df_rsrp = df_rsrp.groupby(['MR_Longitude',
'MR_Latitude']).count().reset_index()#统计count点
#弱覆盖栅格点
df_rsrp0 = df_rsrp[df_rsrp['MR_count']>0]
df_rsrp0.to_csv('RSRP弱覆盖栅格.csv',index=True,header=True)
print('弱覆盖MR区域:%s'%str(df_rsrp0.shape[0]))
#弱覆盖,黄色点
df_rsrp10 = df_rsrp[df_rsrp['MR_count']<=50]
df_rsrp10.to_csv('RSRP弱覆盖栅格0-50聚合.csv',index=True,header=True)
print('50次以下弱覆盖MR区域:%s'%str(df_rsrp10.shape[0]))
#弱覆盖,橙色点
df_rsrp20 =
df_rsrp[(df_rsrp['MR_count']<=100)&(df_rsrp['MR_count']>50)]
df_rsrp20.to_csv('RSRP弱覆盖栅格50-100聚合.csv',index=True,header=True)
print('50-100次弱覆盖MR区域:%s'%str(df_rsrp20.shape[0]))
#弱覆盖,红色点
df_rsrp30 = df_rsrp[100
df_rsrp30.to_csv('RSRP弱覆盖栅格大于100聚合.csv',index=True,header=True)
print('100次以上弱覆盖MR区域:%s'%str(df_rsrp30.shape[0]))
############################百度地图HTML显示##############################
GEN_HTML = "demo_3.html" #命名生成的html
f = open(GEN_HTML,'w')
message1 = """
ul,li{list-style: none;margin:0;padding:0;float:left;}
html{height:100%}
body{height:100%;margin:0px;padding:0px;font-family:"微软雅黑";}
#container{height:90%;width:100%;}
#r-result{width:100%;}
var map = new
BMap.Map("container"); //
创建地图实例
var point = new
BMap.Point(117.023851, 32.63886);
map.centerAndZoom(point,
14); //
初始化地图,设置中心点坐标和地图级别
map.enableScrollWheelZoom(); // 允许滚轮缩放
var points = [
"""
###############################前后的保留部分是重点##########################
message2 = """ ];
if(!isSupportCanvas()){
}
//详细的参数,可以查看heatmap.js的文档
https://github.com/pa7/heatmap.js/blob/master/README.md
//参数说明如下:
heatmapOverlay = new
BMapLib.HeatmapOverlay({"radius":20});
map.addOverlay(heatmapOverlay);
heatmapOverlay.setDataSet({data:points,max:100});
//是否显示热力图
function
openHeatmap(){
heatmapOverlay.show();
}
function closeHeatmap(){
heatmapOverlay.hide();
}
closeHeatmap();
function
setGradient(){
var
gradient = {};
var
colors = document.querySelectorAll("input[type='color']");
colors = [].slice.call(colors,0);
colors.forEach(function(ele){
gradient[ele.getAttribute("data-key")] =
ele.value;
});
heatmapOverlay.setOptions({"gradient":gradient});
}
//判断浏览区是否支持canvas
function
isSupportCanvas(){
var elem =
document.createElement_x('canvas');
return !!(elem.getContext &&
elem.getContext('2d'));
}
"""
#HTML中写入第一部分
f.write(message1)
#HTML中写入第二部分,dataframe部分
for i in range(df_rsrp.shape[0]): ##########################重点部分##################
f.write('{"lng":%s,"lat":%s,"count":%s}'%(str(df_rsrp.at[i,'MR_Longitude']),str(df_rsrp.at[i,'MR_Latitude']),str(df_rsrp.at[i,'MR_count'])))
#\r\n为换行符
f.write(','+'\r\n')
#HTML中写入第三部分
f.write(message2)
f.close()
webbrowser.open(GEN_HTML,new = 1)