def deleteSite(iface): # 若选中基站则联动把其所带的小区一并删除,若只选中小区则值删除小区 delete_site = [] # 存放要删除的基站features id delete_cell = [] # 存放要删除的小区features id siteLayer = getLayerByName(u'基站', iface) cellLayer = getLayerByName(u'小区', iface) selected_site = siteLayer.selectedFeatures() selected_cell = cellLayer.selectedFeatures() for site in selected_site: site_id = site[u"基站ID"] site_rnc_bsc = site[u"RNC-BSC"] allcell = cellLayer.getFeatures() delete_site.append(site.id()) for cell in allcell: if site_id == cell[u"基站ID"] and site_rnc_bsc == cell[u"RNC-BSC"]: delete_cell.append(cell.id()) for cell in selected_cell: if cell.id() not in delete_cell: delete_cell.append(cell.id()) delete_result = True # 默认为True if len(delete_site) != 0: if not delFeatures(siteLayer, delete_site): delete_result = False if len(delete_cell) != 0: if not delFeatures(cellLayer, delete_cell): delete_result = False return delete_result
def impFinish1(self, mylist): self.threadImp.quit() self.threadImp.wait() self.threadImp.deleteLater() self.impFeatureThread.deleteLater() remsg = u'数据导入完成!' layer = None if self.impType == LayerType.SITE: # remsg = u'基站' + remsg layer = getLayerByName(u'基站', self.iface) elif self.impType == LayerType.CELL: # remsg = u'小区' + remsg layer = getLayerByName(u'小区', self.iface) else: remsg = u'相邻小区' + remsg layer = getLayerByName(u'相邻小区', self.iface) self.setStatusBarMsg(remsg) layer.updateExtents() # 更新地图数据 self.iface.actionDraw().trigger() QMessageBox.information(self, u'数据导入', remsg) merlist = [] for eritm in self.erlist: merlist.append(eritm['item']) self.tableWidget.clearContents() # 先清楚表格的内容,再将错误的行显示到表格中 self.initTable(merlist)
def getDatas(self): sitedatas = [] # [SiteName, SiteId] sitepoints = [] celldatas = [ ] # [CellName, CellId, site_name, SiteId, Lon, Lat, WCDMA-PSC, LTE-PCI, CDMA-PN, GSM-BCCH, Azimuth, TILT, AntHeigth, RNC-BSC] cellpoints = [] siteLayer = getLayerByName(u'基站', self.iface) cellLayer = getLayerByName(u'小区', self.iface) # 判断要输出哪些运营商的数据 operator_list = [] # 保存要输出的运营商的名字 if self.ydcheckbox.isChecked(): operator_list.append(u"移动") if self.ltcheckbox.isChecked(): operator_list.append(u"联通") if self.dxcheckbox.isChecked(): operator_list.append(u"电信") if self.ttcheckbox.isChecked(): operator_list.append(u"铁塔") if self.type == SogoType.Site: # 判断是否只导出选中的基站 if self.select_flag.isChecked(): outputSites = siteLayer.selectedFeatures() else: outputSites = siteLayer.getFeatures() for site in outputSites: # 判断是不是属于要输出的运营商数据 if site[u'运营商'] in operator_list: temp = [] for field in Sogo_SiteFields: temp.append(site[field].strip()) sitepoints.append(site.geometry().asPoint()) sitedatas.append(temp) del temp return (sitedatas, sitepoints) elif self.type == SogoType.Cell: # 判断是否只导出选中的小区 if self.select_flag.isChecked(): outputCells = cellLayer.selectedFeatures() else: outputCells = cellLayer.getFeatures() for cell in outputCells: # 判断是不是属于要输出的运营商数据 if cell[u'运营商'] in operator_list: temp = [] for field in Sogo_CellFields: if cell[field] != None: if type(cell[field]) == basestring: temp.append(cell[field].strip()) else: temp.append(cell[field]) else: temp.append(u'NULL') cellpoints.append(cell.geometry().asPolygon()[0]) celldatas.append(temp) del temp return (celldatas, cellpoints)
def __init__(self, iface, parent=None): super(SearchUI, self).__init__() self.iface = iface self.parent = parent # 获取图层对象 self.siteLayer = getLayerByName(u'基站', self.iface) self.cellLayer = getLayerByName(u'小区', self.iface) self.initUI()
def checkIsSelectedFeatures(self): siteLayer = getLayerByName(u"基站", self.iface) # 基站图层 selected_site = siteLayer.selectedFeatures() cellLayer = getLayerByName(u"小区", self.iface) # 小区图层 selected_cell = cellLayer.selectedFeatures() if len(selected_site) == 0 and len(selected_cell) == 0: return False else: return True
def __init__(self, iface, parent=None): super(QuickPCIPlan, self).__init__() self.iface = iface self.parent = parent self.marco_range = None self.room_range = None self.drip_range = None self.coverage = None self.siteLayer = getLayerByName(u"基站", self.iface) self.cellLayer = getLayerByName(u"小区", self.iface)
def updatePolygonInfo(iface, polygonLayer, polygon_id_field, content_field, parent=None): siteLayer = getLayerByName(u"基站", iface) cellLayer = getLayerByName(u"小区", iface) update_site_dict = {} # 要更新了的基站dict (key: site.id(), value: {field: value}) update_cell_dict = {} # 要更新了的小区dict (key: cell.id(), value: {field: value}) all_polygon = polygonLayer.getFeatures() # 生成进度条 total = polygonLayer.featureCount() progess = Progess(parent, total) progess.show() # 显示进度条 for polygon in all_polygon: polygon_geom = polygon.geometry() polygon_id = polygon[polygon_id_field] if content_field != '': content = polygon[content_field] else: content = None all_site = siteLayer.getFeatures() for site in all_site: if not update_site_dict.has_key(site.id()): site_geom = site.geometry() # 判断是否相交 if site_geom.intersects(polygon_geom): temp_dict = {} temp_dict[site.fieldNameIndex(u'Polygon')] = polygon_id if content != None: temp_dict[site.fieldNameIndex(u'其他')] = content update_site_dict[site.id()] = temp_dict del temp_dict all_cell = cellLayer.getFeatures() for cell in all_cell: if not update_cell_dict.has_key(cell.id()): cell_gemo = cell.geometry() # 判断是否相交 if cell_gemo.intersects(polygon_geom): temp_dict = {} temp_dict[cell.fieldNameIndex(u'Polygon')] = polygon_id if content != None: temp_dict[cell.fieldNameIndex(u'其他')] = content update_cell_dict[cell.id()] = temp_dict del temp_dict progess.count() result1 = modifyFeatures(siteLayer, update_site_dict) result2 = modifyFeatures(cellLayer, update_cell_dict) progess.kill() if result1 and result2: return True else: return False
def __init__(self, iface, tlist): super(AddNewSites, self).__init__() self.iface = iface self.tlist = tlist # 存放所有参数的列表 # 判断是否选中正确图层 self.layer = self.iface.activeLayer() if self.layer.name() != u"泰森结点": QMessageBox.critical(self.parent, u"错误", u"请选择泰森结点图层!") return False self.result_layer = getLayerByName(u"规划基站结果", self.iface) if not self.result_layer: QMessageBox.critical(self.parent, u"错误", u"找不到规划基站结果!") return False self.nsiteLayer = getLayerByName(u'规划基站结果', self.iface) self.siteLayer = getLayerByName(u"基站", self.iface)
def __init__(self, iface, jlist, tlist ,parent=None): super(AutoBuildSite, self).__init__() self.iface = iface self.jlist = jlist # 存放泰森多边形结点 self.tlist = tlist # tlist=[分区角度,辐射范围,农村,郊区,普通市区,密集市区] self.siteLayer = getLayerByName(u"基站", self.iface) self.parent = parent
def importSCellData(self): try: # 导入相邻小区数据 features = [] total = len(self.data_list) progess = Progess(self.parent, total, u"数据导入中") progess.show() for itm in self.data_list: feat = createASCellFeature(itm) if feat == False: progess.kill() break else: features.append(feat) progess.count() scellLayer = getLayerByName(u"相邻小区", self.iface) res = importFeaturesToLayer(scellLayer, features) if res is False: scellLayer.destroyEditCommand() return False else: scellLayer.endEditCommand() # 事务提交 return True except Exception: raise Exception, traceback.format_exc()
def newSiteAnaly(self): sitelayer = getLayerByName(u'基站', self.iface) #sitelayer 基站图层 nodelayer = self.createNodeLayer() if not nodelayer: return False self.jlist=[] #定义存放结点 namelist1=[] self.alist=[] #定义存放所有基站 jfeatures = nodelayer.getFeatures() for jf in jfeatures : namelist1.append(jf[2]) namelist2 = list(set(namelist1)) namelist2.sort(key=namelist1.index) jfeatures = nodelayer.getFeatures() for jf in jfeatures : if jf[2] in namelist2 : self.jlist.append(jf) namelist2.remove(jf[2]) if len(self.jlist)== 0 : self.iface.messageBar().pushMessage(u'提示', u'未找到规划站点!' , QgsMessageBar.CRITICAL, 5) spt = AutoBuildSite(self.iface, self.jlist, self.tlist, self) spt.calculationResult.connect(self.calculationFinish) spt.run()
def __init__(self, iface, parnet): super(ModifyAzimuthUI, self).__init__() self.iface = iface self.parent = parnet # 获取工程所在路径 self.project_dir = getProjectDir(self.iface) # 获取小区图层对象 self.cellLayer = getLayerByName(u'小区', self.iface) self.initUI()
def layerListener(self): # 先清空原有的字段选择combobox self.field_combo.clear() # 获取所选图层名字 layer_name = self.layer_combo.currentText() self.layer = getLayerByName(layer_name, self.iface) # 获取所选图层的所有字段 if self.layer: fields_list = [] for field in self.layer.pendingFields(): fields_list.append(field.name().strip()) self.field_combo.addItems(fields_list)
def setSiteInfo(self): siteLayer = getLayerByName(u"基站", self.iface) selected_sites_list = siteLayer.selectedFeatures() for selected_site in selected_sites_list: self.site_id.setText(selected_site[u'基站ID']) self.site_id.setReadOnly(True) self.site_name.setText(selected_site[u'基站名']) self.site_name.setReadOnly(True) self.rnc_bsc.setText(selected_site[u'RNC-BSC']) self.rnc_bsc.setReadOnly(True) if selected_site[u"运营商"] == u"移动": self.operator.setCurrentIndex(0) elif selected_site[u"运营商"] == u"联通": self.operator.setCurrentIndex(1) elif selected_site[u"运营商"] == u"电信": self.operator.setCurrentIndex(2) elif selected_site[u"运营商"] == u"铁塔": self.operator.setCurrentIndex(3) else: QMessageBox.critical(self, u"错误", u"请检查所选中的基站的运营商填写是否规范!") self.accept() return False if selected_site[u"典型环境"] == u"普通市区": self.region.setCurrentIndex(0) elif selected_site[u"典型环境"] == u"密集市区": self.region.setCurrentIndex(1) elif selected_site[u"典型环境"] == u"郊区乡镇": self.region.setCurrentIndex(2) elif selected_site[u"典型环境"] == u"农村": self.region.setCurrentIndex(3) else: raise u"所选中的基站的区域类型填写格式不规范!" self.lon.setText(str(selected_site[u"经度"])) self.lon.setReadOnly(True) self.lat.setText(str(selected_site[u"纬度"])) self.lat.setReadOnly(True) if selected_site[u"网络制式"].strip() == u"G": self.system.setCurrentIndex(0) elif selected_site[u"网络制式"].strip() == u"D": self.system.setCurrentIndex(1) elif selected_site[u"网络制式"].strip() == u"C": self.system.setCurrentIndex(2) elif selected_site[u"网络制式"].strip() == u"W": self.system.setCurrentIndex(3) elif selected_site[u"网络制式"].strip() == u"T": self.system.setCurrentIndex(4) elif selected_site[u"网络制式"].strip() == u"D": self.system.setCurrentIndex(5) elif selected_site[u"网络制式"].strip() == u"TDS": self.system.setCurrentIndex(6)
def __init__(self, iface, parent=None): super(MoveSiteUI, self).__init__() self.iface = iface self.parent = parent # 获取工程所在路径 self.project_dir = getProjectDir(self.iface) # 获取操作图层对象 self.sitelayer = getLayerByName(u'基站', self.iface) self.celllayer = getLayerByName(u'小区', self.iface) self.selectedSiteFeatures = self.sitelayer.selectedFeatures() self.allCellFeatures = self.celllayer.getFeatures() # 初始化鼠标点选事件 self.mapTool = MapTool(self.iface.mapCanvas()) self.mapTool.canvasClicked.connect(self.mouseClicked) self.iface.mapCanvas().setMapTool(self.mapTool) self.iface.mapCanvas().mapToolSet[QgsMapTool, QgsMapTool].connect( self.mapToolChanged) self.crsXform = QgsCoordinateTransform() self.crsXform.setDestCRS(QgsCoordinateReferenceSystem(4326)) self.pos = None '''self.cellutils = FeatureUtils(u'小区', self.iface) self.siteutils = FeatureUtils(u'基站', self.iface)''' self.initUI()
def createNodeLayer(self): project_dir = getProjectDir(self.iface, u"基站") if not project_dir: QMessageBox.critical(self, u"错误", u"基站图层不存在!") return False else: project = QgsProject.instance() VoronoiName = u"泰森多边形" NodesName = u"泰森结点" # 若已存在泰森多边形和泰森结点图层,则先移除图层再删除shape文件 voronoi_layer = getLayerByName(VoronoiName, self.iface) if voronoi_layer: QgsMapLayerRegistry.instance().removeMapLayer(voronoi_layer) else: deleteShapefile(project_dir, VoronoiName) nodes_layer = getLayerByName(NodesName, self.iface) if nodes_layer: QgsMapLayerRegistry.instance().removeMapLayer(nodes_layer) else: deleteShapefile(project_dir, NodesName) if (voronoi_layer) or (nodes_layer): project.write() QMessageBox.critical(self, u"错误", u"相应文件已被占用,请重启QGIS软件!") return False site_layer = getLayerByName(u'基站', self.iface) # 生成泰森多边形 VoronoiFile = os.path.join(project_dir, VoronoiName + u".shp") Vor = processing.runalg("qgis:voronoipolygons", site_layer, 0, VoronoiFile) Voronoi = processing.load(Vor['OUTPUT'], VoronoiName) # 生成泰森结点 NodesFile = os.path.join(project_dir, NodesName + u".shp") Nod = processing.runalg("qgis:extractnodes", Voronoi, NodesFile) Nodes = processing.load(Nod['OUTPUT'], NodesName) return Nodes
def show(self): allLayerNames = getAllLayerName(self.iface) (layerName, ok) = QInputDialog.getItem(self.parent, u'导出数据', u'选择要导出的数据图层', allLayerNames) if ok and (layerName != None and layerName != ''): layer = getLayerByName(layerName, self.iface) saveFileName = QFileDialog.getSaveFileName(self.parent, u"导出数据", '/', 'Excel File (*.xls)') if saveFileName.strip() != "": exportData = ExportData(self.iface, self.parent) if exportData.exportDataToExcel(layer, saveFileName): QMessageBox.information(self.parent, u"导出数据", u"导出数据成功!") else: QMessageBox.critical(self.parent, u"导出数据", u"导出数据失败!")
def getSCellName(iface, SCell_list): if len(SCell_list) > 0: scell_name = None scell_id = SCell_list[0] cellLayer = getLayerByName(u"小区", iface) # 小区图层 allCells = cellLayer.getFeatures() for cell in allCells: if cell[u'RNC-BSC'] + '_' + (cell[u'基站ID']) + '_' + ( cell[u'小区ID']) == scell_id: scell_name = cell[u'小区名'] break return scell_name else: iface.messageBar().pushMessage(u'错误', u'请先设置服务小区', QgsMessageBar.CRITICAL, 3) return None
def getProjectDir(iface, layer_name=u""): if iface: if layer_name == u"": # 如果没有指定图层名字 layers = iface.mapCanvas().layers() project_dir = os.path.dirname(layers[0].source()) else: layer = getLayerByName(layer_name, iface) if not layer: # 如果相应图层不存在,则返回None return None else: project_dir = os.path.dirname(layer.source()) return project_dir else: return None
def run(self): if not self.Cycles.text(): QMessageBox.critical(self.parent, u"错误", u"请输入算法要循环的次数!") return False self.accept() cycles = int(self.Cycles.text()) # 获取循环次数 planing = AccuratePCIThread(cycles, self.iface, self.parent) cellLayer = getLayerByName(u"小区", self.iface) cells = cellLayer.selectedFeatures() if not cells: QMessageBox.critical(self.parent, u"错误", u"请选中要配置PCI的小区!") return False if len(cells) > 600: QMessageBox.critical(self.parent, u"错误", u"此功能只支持600个以内的小区!") return False if planing.run(): QMessageBox.information(self.parent, u"成功", u"PCI规划完成!") else: return False
def initTableHeader(self): self.heads = [] if self.impType == ImpDateType.SITEANDCELL: # 获取当前项目图层的字段名 cell_layer = getLayerByName(u"小区", self.iface) for head in HeadsConfig.SiteANDCellHead: self.heads.append(head) if len(cell_layer.pendingFields()) > 55: for (index, field) in enumerate(cell_layer.pendingFields()): if index > 54: field_name = field.name().strip() self.heads.append(field_name) else: self.heads = HeadsConfig.ServingCellHead self.tableWidget.setColumnCount(len(self.heads)) # 设置表格的列数 for (i, h) in enumerate(self.heads): tabItem = QTableWidgetItem(h) self.tableWidget.setHorizontalHeaderItem(i, tabItem)
def setResultLayer(self, result_list): layerName = u'规划基站结果' layerType = QGis.WKBPoint project_dir = getProjectDir(self.iface) # 先判断是否已存在规划基站结果图层 result_layer = getLayerByName(layerName, self.iface) if result_layer: #清空数据 delAllFeatures(result_layer) else: # 删除原有图层文件 deleteShapefile(project_dir, layerName) shapPath = os.path.join(project_dir, layerName + u".shp") # 生成图层 fileds = self.createFields() # 创建出Shap文件 # 数据源编码模式为GBK2312(否则中文字段会乱码) wr = QgsVectorFileWriter(shapPath, "GBK2312", fileds, layerType, None, "ESRI Shapefile") # 如果保存的时候没有错误 if wr.hasError() == QgsVectorFileWriter.NoError: pass else: print wr.hasError() raise Exception, wr.errorMessage() # 发生错误,抛出异常交给外面的方法处理异常 del wr # 使添加的字段生效 result_layer = QgsVectorLayer(shapPath, layerName, 'ogr') QgsMapLayerRegistry.instance().addMapLayer(result_layer) # 添加数据 features_list = [] for result in result_list: feature = createABasicPointFeature(QgsPoint(float(result[1]),float(result[2])), result) features_list.append(feature) importFeaturesToLayer(result_layer, features_list) # 合并站点 mergeNSite = OptimizateNewSite(result_layer, self.parent) if mergeNSite.run(): QMessageBox.information(self.parent, u"自动规划基站", u"自动规划基站成功!") else: QMessageBox.critical(self.parent, u"自动规划基站", u"自动规划基站失败!")
def __init__(self, iface, parent=None): super(AddNSitesUI, self).__init__() self.iface = iface self.parent = parent # 判断是否存在泰森结点图层 if u"泰森结点" not in getAllLayerName(self.iface): self.accept() QMessageBox.critical(self.parent, u"错误", u"请先执行自动规划基站功能!") return False # 判断是否选中正确图层 self.layer = self.iface.activeLayer() if self.layer.name() != u"泰森结点": self.accept() QMessageBox.critical(self.parent, u"错误", u"请选择泰森结点图层!") return False self.result_layer = getLayerByName(u"规划基站结果", self.iface) if not self.result_layer: self.accept() QMessageBox.critical(self.parent, u"错误", u"找不到规划基站结果!") return False self.initUI()
def getSCell(iface, HL_SCell=None, parent=None): SCellList = [] layer = iface.activeLayer() # 获取当前活动图层 if not layer == None: # 检查活动图层是否是小区图层 if layer.name() == u'小区': cellLayer = getLayerByName(u"小区", iface) # 小区图层 selection = cellLayer.selectedFeatures() if HL_SCell is not None: iface.mapCanvas().scene().removeItem(HL_SCell) for s in selection: scell_id = s[u'RNC-BSC'] + '_' + (s[u'基站ID']) + '_' + ( s[u"小区ID"]) SCellList.append(scell_id) HL_SCell = QgsHighlight(iface.mapCanvas(), s.geometry(), layer) HL_SCell.setFillColor(QColor('Red')) if len(SCellList) > 0: SCell = SCellList return SCellList, HL_SCell else: QMessageBox.critical(parent, u"错误", u"请选择小区图层!") else: QMessageBox.critical(parent, u"错误", u"请选择小区图层!")
def Mod3Render(iface, styleManager, parent=None): cellLayer = getLayerByName(u"小区", iface) # 模三规则 rules = (('0', ' "PCI" % 3 = 0', 'red'), ('1', ' "PCI" % 3 = 1', 'yellow'), ('2', ' "PCI" % 3 = 2', '#47d54c')) sym_pci = QgsSymbolV2.defaultSymbol( cellLayer.geometryType()) # 小区feature重置默认样式 rend_pci = QgsRuleBasedRendererV2(sym_pci) # 设置为基于规则样式 root_rule = rend_pci.rootRule() for label, exp, color, in rules: # 根据规则渲染 rule = root_rule.children()[0].clone() rule.setLabel(label) rule.setFilterExpression(exp) rule.symbol().setColor(QColor(color)) root_rule.appendChild(rule) cellLayer.setRendererV2(rend_pci) iface.actionDraw().trigger() legend = Mod3Legend(iface, styleManager, parent) legend.show() legend.exec_()
def calculationFinish(self, merge_result): self.setResultLayer(merge_result) fileName = QFileDialog.getSaveFileName(self, u'合并结果导出到 ...', '/', 'Excel File(*.xls *.xlsx)') if fileName: self.sphead = [u'规划基站名称', u'经度', u'纬度', u'区域类型', u"平均距离"] for i in range(6): # 根据输入的参数增加表头 self.sphead.append(u'基站名称') self.sphead.append(u'距离') self.sphead.append(u'经度') self.sphead.append(u'纬度') layer = getLayerByName(u"基站合并结果", self.iface) if not layer: QMessageBox.critical(self, u"错误", u"找不到基站合并结果图层") exportData = ExportData(self.iface, self) if exportData.exportDataToExcel(layer, fileName): QMessageBox.information(self, u"成功", u"数据导出成功!") else: QMessageBox.critical(self, u"错误", u"数据导出失败!") else: self.close()
def initView(self): # 数据表格 self.tableWidget = QTableWidget(self) self.tableWidget.setAlternatingRowColors(True) self.tableWidget.setRowCount(7) # 设置当前Table不能编辑 self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers) # 初始化表格上下文菜单 self.initTableContextMenu() self.initTableHeader() # 定义按钮 impBtn = QPushButton(u"导入EXCEL表", self) self.connect(impBtn, SIGNAL('clicked()'), self.impData) startBtn = QPushButton(u"开始合并", self) self.connect(startBtn, SIGNAL('clicked()'), self.mergeJSite) #布局 hbox = QHBoxLayout() hbox.addWidget(impBtn) hbox.addWidget(startBtn) vbox = QVBoxLayout() vbox.addWidget(self.tableWidget) vbox.addLayout(hbox) self.setLayout(vbox) # 判断是否已有规划基站结果 layer = getLayerByName(u'规划基站结果', self.iface) if layer: data_list = [] for feature in layer.getFeatures(): temp_list = [] for value in feature.attributes(): temp_list.append(value) data_list.append(temp_list) del temp_list self.initTable(data_list) self.__mlist = data_list
def add(self): # 获取并处理填写的信息 site_id = self.site_id.text().strip() # 基站ID(新建基站ID前自动添加N) site_name = self.site_name.text().strip() # 基站名字 rnc_bsc = self.rnc_bsc.text().strip() # RNC-BSC operator = self.operator.currentText().strip() # 运营商 region = self.region.currentText().strip() # 区域类型 system = self.system.currentText().strip() # 网络制式 frequency = self.frequency.currentText().strip() # 频段 system_flag = u"W" # 默认 W if system == u"900": system_flag = u"G" elif system == u"1800": system_flag = u"D" elif system == u"CDMA": system_flag = u"C" elif system == u"WCDMA": system_flag = u"W" elif system == u"TD-LTE": system_flag = u"T" elif system == u"FDD-LTE": system_flag = u"F" elif system == u"TDSCDMA": system_flag = u"TDS" lon = self.lon.text().strip() # 经度 lat = self.lat.text().strip() # 纬度 azimuth_1 = self.azimuth_1.text().strip() tilt_1 = self.tilt_1.text().strip() etilt_1 = self.etilt_1.text().strip() mtilt_1 = self.mtilt_1.text().strip() azimuth_2 = self.azimuth_2.text().strip() tilt_2 = self.tilt_2.text().strip() etilt_2 = self.etilt_2.text().strip() mtilt_2 = self.mtilt_2.text().strip() azimuth_3 = self.azimuth_3.text().strip() tilt_3 = self.tilt_3.text().strip() etilt_3 = self.etilt_3.text().strip() mtilt_3 = self.mtilt_3.text().strip() azimuth_4 = self.azimuth_4.text().strip() tilt_4 = self.tilt_4.text().strip() etilt_4 = self.etilt_4.text().strip() mtilt_4 = self.mtilt_4.text().strip() # 判断必填项是否已填 if site_name == "": QMessageBox.critical(self, u"提示", u"请填写基站名字!") return False if site_id == "": QMessageBox.critical(self, u"提示", u"请填写基站ID!") return False if rnc_bsc == "": # 赋值随机数 rnc_bsc = str(random.randint(1, 9999)) if (lon == "") or (lat == ""): QMessageBox.critical(self, u"提示", u"请填写经纬度,或通过点击画布选择坐标!") return False # 先添加基站 # 检查ID和名字是否重复 self.sitelayer = getLayerByName(u'基站', self.iface) # 基站图层 allsite = self.sitelayer.getFeatures() for site in allsite: if site_name == site[u'基站名']: QMessageBox.critical(self, u"提示", u"所填写的基站名与项目中的数据有重复,请更改!") return False if site_id == site[u'基站ID']: QMessageBox.critical(self, u"提示", u"所填写的基站ID与项目中的数据有重复,请更改!") return False siteFeatureAttrs = ['NULL'] * 20 siteFeatureAttrs[0] = site_id siteFeatureAttrs[1] = site_name siteFeatureAttrs[2] = rnc_bsc siteFeatureAttrs[3] = lon siteFeatureAttrs[4] = lat siteFeatureAttrs[5] = system_flag siteFeatureAttrs[6] = region siteFeatureAttrs[8] = operator # 生成基站Feature add_site_list = [] siteFeature = createASiteFeature(QgsPoint(float(lon), float(lat)), siteFeatureAttrs) add_site_list.append(siteFeature) # 判断是否需要顺带添加小区 azimuth_list = [] if azimuth_1 != "": if not tilt_1: tilt_1 = None if not etilt_1: etilt_1 = None if not mtilt_1: mtilt_1 = None azimuth_1_info = (int(azimuth_1), tilt_1, etilt_1, mtilt_1) azimuth_list.append(azimuth_1_info) if azimuth_2 != "": if not tilt_2: tilt_2 = None if not etilt_2: etilt_2 = None if not mtilt_2: mtilt_2 = None azimuth_2_info = (int(azimuth_2), tilt_2, etilt_2, mtilt_2) azimuth_list.append(azimuth_2_info) if azimuth_3 != "": if not tilt_3: tilt_3 = None if not etilt_3: etilt_3 = None if not mtilt_3: mtilt_3 = None azimuth_3_info = (int(azimuth_3), tilt_3, etilt_3, mtilt_3) azimuth_list.append(azimuth_3_info) if azimuth_4 != "": if not tilt_4: tilt_4 = None if not etilt_4: etilt_4 = None if not mtilt_4: mtilt_4 = None azimuth_4_info = (int(azimuth_4), tilt_4, etilt_4, mtilt_4) azimuth_list.append(azimuth_4_info) if len(azimuth_list) != 0: # 获取小区大小和长度设置 setting = getCellGraphicParam(self.iface) # 判断是否读取到参数设置 if not setting: QMessageBox.Critical(self.parent, u"错误", u"无法获取小区图形参数设置") return add_cell_list = [] # 要添加的小区list # 若填写了小区 for index, azimuth_info in enumerate(azimuth_list): cell_feature = ['NULL'] * 54 cell_feature[0] = site_id # 基站ID cell_feature[1] = site_name # 所属基站名字 cell_id = u"%s%s" % (site_id, str(index + 1)) # 小区ID cell_feature[2] = cell_id # 小区ID cell_name = u"%s-%s" % (site_name, str(index + 1)) # # 小区名字 cell_feature[3] = cell_name cell_feature[4] = index # Sector ID cell_feature[6] = rnc_bsc cell_feature[7] = azimuth_info[0] # Azimuth cell_feature[8] = lon cell_feature[9] = lat cell_feature[10] = system_flag cell_feature[11] = region # 典型环境 cell_feature[12] = frequency # 频段 cell_feature[13] = azimuth_info[1] cell_feature[14] = azimuth_info[2] cell_feature[15] = azimuth_info[3] cell_feature[18] = operator # 识别图形设置 if setting["type"] == 0: if operator == u'移动': szAngle = setting[u"移动"][0] szLength = setting[u"移动"][1] elif operator == u'联通': szAngle = setting[u"联通"][0] szLength = setting[u"联通"][1] elif operator == u'电信': szAngle = setting[u"电信"][0] szLength = setting[u"电信"][1] elif operator == u'铁塔': szAngle = setting[u"铁塔"][0] szLength = setting[u"铁塔"][1] else: # 自定义 system = cell_feature[10] frequency = cell_feature[12] # 获取默认设置 szAngle = setting[u"默认"][0] szLength = setting[u"默认"][1] # 获取分类 case_list = setting["case_list"] for (c_system, c_frequency, c_angle, c_length) in case_list: if c_system and (not c_frequency): if system == c_system: szAngle = c_angle szLength = c_length elif (not c_system) and c_frequency: if frequency == c_frequency: szAngle = c_angle szLength = c_length elif c_system and c_frequency: if (system == c_system) and (frequency == c_frequency): szAngle = c_angle szLength = c_length # 生成小区扇形geometry cellGeometry = createSector(QgsPoint(float(lon), float(lat)), szLength, self.iface, True, cell_feature[7], szAngle) # 判断小区名字和小区ID是否已于现有数据中 self.celllayer = getLayerByName(u'小区', self.iface) # 小区图层 # 检查是否已勾选了小图特曾 if not self.celllayer: QMessageBox.critical(self.parent, u"错误", u"没有找到小区图层!") return False allcell = self.celllayer.getFeatures() for cell in allcell: if cell_name == cell[u'小区名']: QMessageBox.critical( self.parent, u"提示", u"生成的小区名: " + cell_name + u" 与项目中的数据有重复,请更改!") return False if cell_id == cell[u"小区ID"]: QMessageBox.critical( self.parent, u"提示", u"生成的小区ID: " + cell_id + u" 与项目中的数据有重复,请更改!") return False # 生成小区feature并添加到list中 cell = createACellFeature(cellGeometry, cell_feature) add_cell_list.append(cell) button = QMessageBox.question(self, "Question", u"添加后将无法撤回,是否继续?", QMessageBox.Ok | QMessageBox.Cancel, QMessageBox.Ok) if button == QMessageBox.Ok: # 向图层中导入新增的数据 if len(add_site_list) != 0: siteLayer = getLayerByName(u"基站", self.iface) result1 = importFeaturesToLayer(siteLayer, add_site_list) if len(add_cell_list) != 0 and result1: cellLayer = getLayerByName(u"小区", self.iface) result2 = importFeaturesToLayer(cellLayer, add_cell_list) if not result2: QMessageBox.critical(self, u"添加基站", u"添加基站数据失败!") self.accept() return elif not result1: QMessageBox.critical(self, u"添加基站", u"添加基站数据失败!") self.accept() return self.iface.actionDraw().trigger() # 刷新地图 else: return if result1 or result2: QMessageBox.information(self, u"添加基站", u"添加基站数据成功!") self.accept()
def importSiteAndCellData(self): cell_features = [] site_features = [] site_dict = {} try: # 先生成小区feature再生成基站feature for itm in self.data_list: # 创建小区feature # 当有小区ID和小区名时才导入信息 cell_id = itm[2] cell_name = itm[3] if cell_id and cell_name: cell = [] for (index, i) in enumerate(itm): # 小区表中没有站点地址(48)和基站ID2(51) if index not in [48, 51]: cell.append(i) # 获取小区图形设置\ setting = self.getCellGraphicParam() if not setting: return # 处理小区图形参数 if setting["type"] == 0: # 按运营商 operator = itm[18] if operator == u'移动': angle = setting[u"移动"][0] length = setting[u"移动"][1] elif operator == u'联通': angle = setting[u"联通"][0] length = setting[u"联通"][1] elif operator == u'电信': angle = setting[u"电信"][0] length = setting[u"电信"][1] else: angle = setting[u"铁塔"][0] length = setting[u"铁塔"][1] else: # 自定义 system = itm[10] frequency = itm[12] # 获取默认设置 angle = self.setting[u"默认"][0] length = self.setting[u"默认"][1] # 获取分类 case_list = self.setting["case_list"] for (c_system, c_frequency, c_angle, c_length) in case_list: if c_system and (not c_frequency): if system == c_system: angle = c_angle length = c_length elif (not c_system) and c_frequency: if frequency == c_frequency: angle = c_angle length = c_length elif c_system and c_frequency: if (system == c_system) and (frequency == c_frequency): angle = c_angle length = c_length # 根据小区类型生成相应的geometry if itm[5] == u"室分": circle = createCircle(QgsPoint(float(itm[8]), float(itm[9])), length / 2, self.iface, True, 64) cell_feat = createACellFeature(circle, cell) cell_features.append(cell_feat) else: sector = createSector(QgsPoint(float(itm[8]), float(itm[9])), length, self.iface, True, itm[7], angle) cell_feat = createACellFeature(sector, cell) cell_features.append(cell_feat) # 创建基站feature site = [ itm[0], # 基站ID itm[1], # 基站名 itm[6], # RNC-BSC itm[8], # 经度 itm[9], # 纬度 itm[10], # 网络制式 itm[11], # 典型环境 itm[17], # 区域 itm[18], # 运营商 itm[19], # 簇 itm[20], # 基站英文名 itm[22], # 基站类型 itm[48], # 站点地址 itm[49], # MCC itm[50], # MNC itm[51], # 基站ID2 itm[52], # 话务量 itm[53], # 投诉量 itm[54], # Polygon itm[55] # 其他 ] site_id = itm[0] site_name = itm[1] rnc_bsc = itm[6] lon = itm[8] lat = itm[9] site_key = (site_id, site_name, rnc_bsc, lon, lat) if site_dict.has_key(site_key): continue else: site_dict[site_key] = True site_feat = createASiteFeature(QgsPoint(float(itm[8]), float(itm[9])), site) site_features.append(site_feat) # 导入数据 siteLayer = getLayerByName(u"基站",self.iface) site_result = importFeaturesToLayer(siteLayer, site_features) cellLayer = getLayerByName(u"小区", self.iface) cell_result = importFeaturesToLayer(cellLayer, cell_features) if (site_result is False) or (cell_result is False): siteLayer.destroyEditCommand() cellLayer.destroyEditCommand() return False else: siteLayer.endEditCommand() cellLayer.endEditCommand() return True except Exception: raise Exception, traceback.format_exc()
def __init__(self, iface, parent=None): super(RangeByStrSettingUI, self).__init__() self.iface = iface self.parent = parent self.iface.mapCanvas().currentLayerChanged[QgsMapLayer].connect(self.LayerChanged) self.color_btn_list = [] # 保存各范围所设置的颜色按钮 self.delete_btn_list = [] # 保存各范围所设置的删除按钮 self.value_widget_list = [] self.setting_list = [] # 保存参数设置 self.setWindowTitle(u"分类显示") layer_label = QLabel(u"选择图层:") self.layer_combo = QComboBox() layers_name = getAllLayerName(self.iface) self.layer_combo.addItems(layers_name) self.layer = getLayerByName(self.layer_combo.currentText(), self.iface) self.connect(self.layer_combo, SIGNAL('currentIndexChanged(int)'), self.layerListener) field_label = QLabel(u"选择字段:") self.field_combo = QComboBox() if self.layer != None: fields_list = [] for field in self.layer.pendingFields(): fields_list.append(field.name().strip()) self.field_combo.addItems(fields_list) ok = QPushButton(u"确定") cancel = QPushButton(u"取消") self.connect(ok, SIGNAL('clicked()'), self.run) self.connect(cancel, SIGNAL('clicked()'), self.accept) # 选择图层、字段Widget source_grid = QGridLayout() source_grid.setSpacing(10) source_grid.addWidget(layer_label, 0, 1) source_grid.addWidget(self.layer_combo, 0, 2) source_grid.addWidget(field_label, 1, 1) source_grid.addWidget(self.field_combo, 1, 2) source_widget = QWidget() source_widget.setLayout(source_grid) # 参数设置窗口(带滚动条) self.setting_Widget = QWidget() self.setting_Widget.setMinimumSize(380, 800) self.scroll_vbox = QVBoxLayout() self.scroll_vbox.setSpacing(15) self.setting_vbox = QVBoxLayout() self.setting_vbox.setSpacing(5) value_widget = self.createAValue() self.setting_vbox.addWidget(value_widget) self.add_range_btn = QPushButton(u"添加") self.connect(self.add_range_btn, SIGNAL("clicked()"), self.add_value_box) self.scroll_vbox.addLayout(self.setting_vbox) self.scroll_vbox.addWidget(self.add_range_btn) self.scroll_vbox.addStretch(1) self.setting_Widget.setLayout(self.scroll_vbox) self.scroll = QScrollArea() self.scroll.setWidget(self.setting_Widget) self.scroll.setAutoFillBackground(True) self.scroll.setWidgetResizable(True) # 确定/取消 按钮 Widget btn_hbox = QHBoxLayout() btn_hbox.setSpacing(15) btn_hbox.addStretch(1) btn_hbox.addWidget(ok) btn_hbox.addWidget(cancel) btn_hbox.addStretch(1) btn_widget = QWidget() btn_widget.setLayout(btn_hbox) vbox = QVBoxLayout() vbox.setSpacing(15) vbox.addWidget(source_widget) vbox.addWidget(self.scroll) vbox.addWidget(btn_widget) self.setLayout(vbox) self.setFixedSize(430, 500)