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 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
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
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()
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()