Exemplo n.º 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
Exemplo n.º 2
0
 def run(self):
     area_type_dict = {}  # (key: area_type, value: nsite index list)
     d = QgsDistanceArea()  # 计算距离
     allNSiteFeatures = getFeaturesList(self.nsiteLayer)
     # 把所有的nsite按区域类型分类
     for nsiteFeature in allNSiteFeatures:
         area_type = nsiteFeature[u"区域类型"]
         if area_type not in [u"普通市区", u"密集市区", u"农村", u"郊区乡镇"]:
             area_type = u"普通市区"
         if not area_type_dict.has_key(area_type):
             area_type_dict[area_type] = [nsiteFeature]
         else:
             t = area_type_dict[area_type]
             t.append(nsiteFeature)
             area_type_dict[area_type] = t
             del t
     total = len(allNSiteFeatures)  # 写进度条
     progess = Progess(self.parent, total, u"优化中...")
     progess.show()
     delete_list = []  # 要删除的 nsiteFeaures.id() list
     for (area_type, nsiteFeatures_list) in area_type_dict.items():
         if area_type == u"密集市区":
             mergeDis = 200
         elif area_type == u"郊区乡镇":
             mergeDis = 500
         elif area_type == u"农村":
             mergeDis = 800
         else:
             # 默认普通市区
             mergeDis = 300
         for nsiteFeatures1 in nsiteFeatures_list:
             progess.count()
             lon1 = nsiteFeatures1[u"经度"]
             lat1 = nsiteFeatures1[u"纬度"]
             point1 = QgsPoint(float(lon1), float(lat1))
             rectangle = createARectangleByCenterPoint(point1, 2000)
             if nsiteFeatures1.id() in delete_list:
                 progess.count()
                 continue
             else:
                 request = QgsFeatureRequest()
                 request.setFilterRect(rectangle)
                 for nsiteFeature2 in self.nsiteLayer.getFeatures(request):
                     if nsiteFeatures1.id() == nsiteFeature2.id():
                         continue
                     if nsiteFeature2.id() in delete_list:
                         continue
                     lon2 = nsiteFeatures1[u"经度"]
                     lat2 = nsiteFeatures1[u"纬度"]
                     point2 = QgsPoint(float(lon2), float(lat2))
                     distance = d.convertMeasurement(
                         d.measureLine(point1, point2), 2, 0, False)[0]
                     if distance <= mergeDis:
                         delete_list.append(nsiteFeature2.id())
                         break
     progess.kill()
     # 删除features
     delFeatures(self.nsiteLayer, delete_list)
     return True
Exemplo n.º 3
0
 def deleteExtra(self, layer):
     extra_list = []
     polygon_layer = self.iface.activeLayer()
     selected_polygon = []
     for polygon in polygon_layer.selectedFeatures():
         selected_polygon.append(polygon)
     all_result = []
     for point in layer.getFeatures():
         all_result.append(point)
     for point in all_result:
         intersect_flag = False
         point_gemo = point.geometry()
         for polygon in selected_polygon:
             if point_gemo.intersects(polygon.geometry()):
                 intersect_flag = True
                 #print "had run"
                 break
         if intersect_flag == False:
             extra_list.append(point.id())
     # 删除多余features
     if delFeatures(layer, extra_list):
         return True
     else:
         return False
Exemplo n.º 4
0
    def NewAngle(self):
        # 获取小区大小和长度设置
        setting = getCellGraphicParam(self.iface)
        # 判断是否读取到参数设置
        if not setting:
            QMessageBox.critical(self, u"错误", u"无法获取小区图形参数设置")
            return

        newangle = self.titleEdit.text().strip()

        selection = self.cellLayer.selectedFeatures()
        ilist = []
        cellfeatures = []
        # 判断是否填入了角度
        if not newangle:
            QMessageBox.critical(self, u"提醒", u"请输入数值!")
            return False
        # 判断是否选中了要修改的小区
        if len(selection) == 0:
            QMessageBox.critical(self, u"错误", u"<b>请选择要修改的小区<\b>!")
            return False

        # 根据输入值创建新的扇区feature
        for f in selection:
            ilist.append(f.id())
            cellAttrs = f.attributes()
            del cellAttrs[0]
            cellAttrs[7] = int(newangle)
            operator = cellAttrs[18]
            # 识别图形设置
            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]
                else:
                    szAngle = setting[u"铁塔"][0]
                    szLength = setting[u"铁塔"][1]
            else:
                # 自定义
                system = cellAttrs[10]
                frequency = cellAttrs[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(cellAttrs[8]), float(cellAttrs[9])), szLength,
                self.iface, True, cellAttrs[7], szAngle)
            cellFeature = createACellFeature(cellGeometry, cellAttrs)
            cellfeatures.append(cellFeature)
            break
        else:
            QMessageBox.critical(self, u"提醒", u"请选择至少一个扇区!")
            return False

        button = QMessageBox.question(self, "Question", u"修改后将无法撤回,是否继续?",
                                      QMessageBox.Ok | QMessageBox.Cancel,
                                      QMessageBox.Ok)
        if button == QMessageBox.Ok:

            # 删除原角度扇区feature
            delRessult = delFeatures(self.cellLayer, ilist)
            if delRessult:
                impResult = importFeaturesToLayer(self.cellLayer, cellfeatures)
                if impResult:
                    QMessageBox.information(self, u"修改小区方向角", u"修改小区方向角成功!")
                else:
                    QMessageBox.critical(self, u"修改小区方向角", u"修改小区方向角失败!")
                    self.close()
                    return
            else:
                QMessageBox.critical(self, u"修改小区方向角", u"修改小区方向角失败!")
                self.close()
                return
            self.iface.actionDraw().trigger()
        else:
            return False
        self.accept()
Exemplo n.º 5
0
    def moveTo(self):
        # 获取小区大小和长度设置
        setting = getCellGraphicParam(self.iface)
        # 判断是否读取到参数设置
        if not setting:
            QMessageBox.critical(self, u"错误", u"无法获取小区图形参数设置")
            self.accept()
            return

        oldsitelist = []
        sitefeatures = []
        cellfeatures = []

        if len(self.selectedSiteFeatures) == 1:
            for f in self.selectedSiteFeatures:
                oldsitelist.append(f.id())
                siteAttrs = f.attributes()
                del siteAttrs[0]
                siteAttrs[3] = self.lon_edit.text()
                siteAttrs[4] = self.lat_edit.text()
                self.titleEdit1.setText(unicode(siteAttrs[1]))
                siteFeature = createASiteFeature(
                    QgsPoint(float(siteAttrs[3]), float(siteAttrs[4])),
                    siteAttrs)
                sitefeatures.append(siteFeature)
                for c in self.selectedCellFeatures:
                    cellAttrs = c.attributes()
                    del cellAttrs[0]  # 删除唯一标识符,创建新feature后会重新生成,避免重复
                    cellAttrs[8] = self.lon_edit.text()
                    cellAttrs[9] = self.lat_edit.text()
                    # 识别图形设置
                    operator = cellAttrs[18]
                    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]
                        else:
                            szAngle = setting[u"铁塔"][0]
                            szLength = setting[u"铁塔"][1]
                    else:
                        # 自定义
                        system = cellAttrs[10]
                        frequency = cellAttrs[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(cellAttrs[8]), float(cellAttrs[9])),
                        szLength, self.iface, True, cellAttrs[7], szAngle)
                    cellFeature = createACellFeature(cellGeometry, cellAttrs)
                    cellfeatures.append(cellFeature)
        else:
            QMessageBox.critical(self, u"提醒", u"需且仅需选择一个基站!")
            self.accept()
            return False

        button = QMessageBox.question(self, "Question", u"移动后将无法撤回,是否继续?",
                                      QMessageBox.Ok | QMessageBox.Cancel,
                                      QMessageBox.Ok)
        if button == QMessageBox.Ok:
            # 先删除旧features再往图层上添加新features
            delFeatures(self.sitelayer, oldsitelist)
            importFeaturesToLayer(self.sitelayer, sitefeatures)
            delFeatures(self.celllayer, self.oldcelllist)
            importFeaturesToLayer(self.celllayer, cellfeatures)
            self.iface.actionDraw().trigger()
            self.selectedSiteFeatures = []
            self.selectedCellFeatures = []
            self.sitelayer.selectAll()
            self.sitelayer.invertSelection()
        else:
            return False
        self.accept()