当前位置:文档之家› 基于站间距及方位角加权的邻区添加工具实现

基于站间距及方位角加权的邻区添加工具实现

基于站间距及方位角加权的邻区添加工具实现龙颖2016/8/5摘要:本课题设计一个针对小区间方位角进行距离加权的算法,从而更加贴近网络现状进行添加邻区。

目录一、设计背景 (2)二、设计目标及方法 (2)三、设计流程图 (3)3.1设计流程图 (3)四、设计过程及结果 (4)4.1 核心算法 (4)4.2 检索优化算法 (6)4.3经纬度算两点间距离算法 (10)4.4经纬度算两点间方位角算法 (11)五、设计结论与收获 (13)六、参考资料 (14)七、使用说明书及工具 (14)一、设计背景目前在众多软件中有很多邻区添加工具,但是较多工具中邻区添加算法大多没有对站点间小区的覆盖范围纳入考虑,故在小区对边缘站点添加邻区时,他们将邻站小区与本站小区正朝向的优先级与小区负朝向的优先级相同,显然按照此类邻区添加算法与现网网络模型不匹配。

现本课题设计一个针对小区间方位角进行距离加权的算法,从而更加贴近网络现状进行添加邻区。

二、设计目标及方法主要设计目标如下:设计一个算法,使得在邻区关系添加过程中,能根据方位角和地理位置区分对原小区的邻区优先级,从而更合理的添加邻区。

完成设计共需要实现4个功能:●小区间方位角加权的距离实现●优化检索算法●计算本小区与邻区间的站间距●计算本小区与邻区间方位角差值本设计将采用VBA程序语言,结合EXCEL界面做成一个工具,主要在EXCEL工具内部实现上述功能。

三、设计流程图3.1设计流程图本工具主要设计流程图如下:四、设计过程及结果4.1 核心算法方位角加权,可以把扇区考虑成一个扇形的区域,加权系数则是从扇柄到扇形外部的距离,当加权系数大时,距离扇柄的距离大,当加权系数小时,则到扇柄的距离小。

如下图所示:加权情况示意图则为了有效的将三个小区区分,可以对经纬度点根据方位角进行加权,这样加权越大,三个扇区的位置差异就越明显,从而能够对方位角与距离进行判断,添加更合理的网络邻区关系。

如下图所示:加权情况在实际网络中的应用核心算法由于小区距离的方位角DAL是由A向B的,所以夹角a=方位角A-(DAL+180)夹角b=方位角B-DAL,算得夹角后。

在垂直于小区连线方向通过SIN函数乘以加权系数D得到D_SHORT,小区连线方向通过COS函数乘以加权系数D加上小区距离,得到加权后连线的方向的长度D_LONG。

上述D_LONG与D_SHORT得到可以通过勾股定理,算得加权后的小区距离(见以下代码实现部分)核心代码实现部分Do While i <= .Range("A65536").End(xlUp).Row.Range("k" & i) = qiufangweijiang(Sheet2.Range("D" & i), Sheet2.Range("e" & i),Sheet1.Range("D" & j), Sheet1.Range("e" & j)).Range("j" & i) = Cal_Long_Lat(Sheet2.Range("D" & i), Sheet2.Range("e" & i),Sheet1.Range("D" & j), Sheet1.Range("e" & j))D2 = Sheet2.Range("G" & i).ValueDAL = .Range("k" & i).ValueDistanc = .Range("j" & i).ValueD_LONG = (Distanc + xishu * (Sin((D1 - DAL + 180) / 180 * pi) + Sin((D2 - DAL) / 180 * pi))) ^ 2D_SHORT = xishu * (Cos((D1 - DAL + 180) / 180 * pi) + Cos((D2 - DAL) / 180 * pi)) ^ 2 .Range("L" & i) = Sqr(D_LONG + D_SHORT)i = i + 1Loop4.2 检索优化算法初步算法是将市区每个点与目标经纬度点计算距离,然后得出N个TOP最近的点添加邻区。

由于新余地市较小,考虑到后期站点优化及批量站点添加,依然必须要对算法进行优化。

通过考虑矩阵算法,将整个网络分割成若干个网格,添加邻区时,仅对目标网格周边的8个网格进行计算。

目前可以通过基于笛卡尔层的空间搜索学习算法进行实现Cartesian Tiers 笛卡尔层Cartesian Tiers是通过将一个平面地图的根据设定的层次数,将每层的分解成若干个网格,如下图所示:笛卡尔分层示意图每层以2的评方递增,所以第一层为4个网格,第二层为16 个,所以整个地图的经纬度将在每层的网格中体现:笛卡尔矩阵笛卡尔层在Lucene中对空间地理位置查询最大的用处在查找周边地址的时候有效的减少查询量,即将查询量可以控制在分层后最小的网格中的若干docId。

构建这样的索引结构呢,只需要对应笛卡尔层的层数来构建域即可。

也即是tiers0->field_0,tiers1->field_1,tiers2-field_2,……,tiers19->field_19。

(一般20层即可)。

每个对应笛卡尔层次的域将根据当前这条记录的经纬度通过笛卡尔算法计算出归属于当前层的网格,然后将gridId(网格唯一标示)以term的方式存入索引。

这样每条记录关于笛卡尔0-19的域将都会有一个gridId对应起来。

目前索引的实现核心代码:ActiveCell.FormulaR1C1="=IF(MOD(RC[-5],0.1)-MOD(R[-1]C[-5],0.1)<0,R[-1]C+1,R[-1]C)"体现在EXCEL中是,对经纬度后1位进行取模(0.1)从而对每个0.1范围内的经度进行排序编号。

此编号即为经度索引X,同理可得纬度索引Y。

小区索引为CELL(X,Y)。

EXCEL中矩阵生成但是查询的时候一般是需要查周边的地址,那么可能周边的范围超过一个网格的范围,那么实际操作过程是根据经纬度和一个距离确定出需要涉及查询的从19-0(从高往低)若干层对应的若干网格的数据(关于代码实现在后面的文章内容阐述)。

那么一个经纬度周边地址的查询只需要如下图圆圈内的数据:小区查找周边邻区范围所以通过这样的数据过滤,将极大的减少计算量。

代码实现部分:sheets("规划首页").Range("H" & j) = Round((Application.RoundUp(sheets("规划首页").Range("D" & j), 1) - xm) * 10, 0)sheets("规划首页").Range("I" & j) = Round((Application.RoundUp(sheets("规划首页").Range("e" & j), 1) - ym) * 10, 0)''完成索引xnow = sheets("规划首页").Range("H" & j)ynow = sheets("规划首页").Range("I" & j)With sheets("现网工参")If .FilterMode = True Then .ShowAllData: ''清除筛选.Range("a1").AutoFilter.Range("$A$1:$I$" & .Range("A65536").End(xlUp).Row).AutoFilter Field:=8, Criteria1:=">=" & (xnow - 1), _Operator:=xlAnd, Criteria2:="<=" & (xnow + 1).Range("$a$1:$I$" & .Range("A65536").End(xlUp).Row).AutoFilter Field:=9, Criteria1:=">=" & (ynow - 1), _Operator:=xlAnd, Criteria2:="<=" & (ynow + 1)' ActiveSheet.Range("$H$2:$I$"& .Range("A65536").End(xlUp).Row).AutoFilter Field:=19, Criteria1:=">=" & (xnow - 1), _ Operator:=xlAnd, Criteria2:="<=" & (xnow + 1)' ActiveSheet.Range("$H$2:$I$"& .Range("A65536").End(xlUp).Row).AutoFilter Field:=20, Criteria1:=">=" & (ynow - 1), _ Operator:=xlAnd, Criteria2:="<=" & (ynow + 1).Cells.CopyEnd WithIf sheets("筛选前").FilterMode = True Then sheets("筛选前").ShowAllData ''清除筛选sheets("筛选前").Activatesheets("筛选前").Cells.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _:=False, Transpose:=False4.3经纬度算两点间距离算法经纬度距离算法在GIS应用中,计算两点之间距离的公式非常重要,这里仅列出几种计算方法。

相关主题