示例#1
0
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
示例#2
0
    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)
示例#3
0
    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)
示例#4
0
    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()
示例#5
0
 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
示例#6
0
 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)
示例#7
0
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
示例#8
0
 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)
示例#9
0
 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
示例#10
0
 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()
示例#11
0
    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()
示例#12
0
 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()
示例#13
0
 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)
示例#14
0
    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)
示例#15
0
 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()
示例#16
0
    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
示例#17
0
    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"导出数据失败!")
示例#18
0
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
示例#19
0
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
示例#20
0
 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
示例#21
0
    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)
示例#22
0
    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"自动规划基站失败!")
示例#23
0
    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()
示例#24
0
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"请选择小区图层!")
示例#25
0
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_()
示例#26
0
    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()
示例#27
0
    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
示例#28
0
    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()
示例#29
0
    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()
示例#30
0
    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)