def exportDataToExcel(self, layer, saveFilePath): fieldsName_list = getLayerFieldNames(layer) datas = getFeaturesDataBtLayer(layer) if len(datas) >= 65500: QMessageBox.critical(self.parent, u"错误", u"该功能不支持导出超过65500条数据") return False progress = Progess(self.parent, len(datas), u"导出数据中") progress.show() try: wbk = xlwt.Workbook(style_compression=2) sheet = wbk.add_sheet(unicode(layer.name()), True) # 先写入表头 for (i, itm) in enumerate(fieldsName_list): sheet.write(0, i, itm, self.set_style(220, True, True)) progress.count() # 写入数据 if datas != None and len(datas) > 0: for (a, aitm) in enumerate(datas): for (b, bitm) in enumerate(aitm): sheet.write(a + 1, b, bitm, self.set_style(220, False, False)) progress.count() wbk.save(saveFilePath) return True except Exception: raise Exception, traceback.format_exc() finally: progress.kill()
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 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 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 getDivDatas(self, searchRange, density=0.5, main_thread_flag=False): search_result = [] # 根据搜索密度分块 xmin = float(searchRange[0][0]) xmax = float(searchRange[1][0]) ymin = float(searchRange[0][1]) ymax = float(searchRange[1][1]) xNum = (xmax - xmin) * density yNum = (ymax - ymin) * density rows = int(1 / density) cols = int(1 / density) if main_thread_flag: progess_len = rows * cols progess = Progess(self.parent, progess_len) progess.show() for block_index in xrange(rows * cols): # 整理当前分块的搜索范围 i = block_index / rows j = block_index % rows aa = ymin + j * yNum bb = xmin + i * xNum cc = aa + yNum dd = bb + xNum bottom_left_point = (bb, aa) upper_right_point = (dd, cc) # 获取该分块的第0页搜索结果 url = self.createURL(bottom_left_point, upper_right_point) try: (total, datas) = self.getDatas(url) # 如果搜索结果大于400则将分块按0.5的搜索密度继续分块 if total >= 400: datas = self.getDivDatas( (bottom_left_point, upper_right_point), 0.5) if datas: search_result.extend(datas) # 小于400获取该分块所有结果 else: # 添加第0页搜索结果 search_result.extend(datas) # 遍历并添加余下页搜索结果 page_num = int( math.ceil(total / (self.page_size * len(self.keywords)))) for current_page_num in range(1, page_num): url = self.createURL(bottom_left_point, upper_right_point, current_page_num) (datas_result, datas) = self.getDatas(url) if datas_result != False: search_result.extend(datas) else: print url return False except Exception, e: print url raise traceback.format_exc() if ("progess" in locals().keys()) and main_thread_flag: # 判断进度条是否存在 progess.count()
def createData(self): outputs = None datas = u'' if self.type == TencentType.Site: # 基站 # 数据分组,每组最多30 points = [] # 已经分组的需要转换的点 qq_points = [] # 已经转换好的点 total = 0 # 总记录数 if (len(self.site_datas) % 30) > 0: groupCount = len(self.site_datas) / 30 + 1 else: groupCount = len(self.site_datas) / 30 for i in range(groupCount): temp = [] for j in range(30): if total < len(self.site_datas): temp.append(self.site_points[(i * 30) + j]) total = total + 1 points.append(temp) del temp # 生成进度条 total = len(points) + len(self.site_datas) progess = Progess(self.parent, total) progess.show() # 数据点转换 for groups in points: locations = u'' for (x, point) in enumerate(groups): locations = locations + str(point[1]) + u"," + str( point[0]) # 纬度在前,经度在后 if x != len(groups) - 1: locations = locations + u";" url = u"http://apis.map.qq.com/ws/coord/v1/translate?locations=" + locations \ + u"&type=1&key=" + self.key req = urllib2.Request(url) time.sleep(0.4) # 0.4s发送一次请求 res_data = urllib2.urlopen(req) res = res_data.read() s = json.loads(res) if s[u'status'] != 0: message = s[u'message'] print s[u'status'] print message QMessageBox( self.parent, u"错误", u"错误代码:" + str(s[u'status']) + u"\n" + s[u'message']) progess.kill() return (False, outputs) else: progess.count() for i in range(len(groups)): qq_points.append((s[u'locations'][i][u'lng'], s[u'locations'][i][u'lat'])) # 数据转换(用自定义算法) total = len(self.site_datas) progess = Progess(self.parent, total) progess.show() for (i, data) in enumerate(self.site_datas): qq_lon = qq_points[i][0] qq_lat = qq_points[i][1] datas = datas + u"{SiteName:'" + data[0] + u"',SiteId:'" + data[1] + \ u"',lon:" + str(self.site_points[i][0]) + u",lat:" + str(self.site_points[i][1]) + \ u",qq_lon:" + str(qq_lon) + u",qq_lat:" + \ str(qq_lat) + u"}\n" if i != len(self.site_datas) - 1: datas = datas + "," progess.count() outputs = u"var site = [ \n" + datas + u"\n" + u"]\n" if outputs != None: #print datas return (True, outputs) else: return (False, outputs) elif self.type == TencentType.Cell: # 小区 # 生成进度条 total = len(self.cell_datas) + 1 progess = Progess(self.parent, total) progess.show() for (i, data) in enumerate(self.cell_datas): # 先转换基站的经纬度(纬度在前,经度在后) locations = str(data[5]) + u"," + str(data[4]) + u";" for (j, point) in enumerate(self.cell_points[i]): # 数据点转换(纬度在前,经度在后) if len(self.cell_points[i]) > 40: # 如果小区是圆形则只转换基站坐标 locations = locations + str(data[5]) + u"," + str( data[4]) break else: locations = locations + str(point[1]) + u"," + str( point[0]) if j != len(self.cell_points[i]) - 1: locations = locations + u";" url = u"http://apis.map.qq.com/ws/coord/v1/translate?locations=" + locations \ + u"&type=1&key=" + self.key req = urllib2.Request(url) time.sleep(0.4) # 0.4s发送一次请求 res_data = urllib2.urlopen(req) res = res_data.read() s = json.loads(res) # s[u'locations'] 第一个数据为基站经纬度 if s[u'status'] != 0: print s[u'status'] message = s[u'message'] print message QMessageBox( self.parent, u"错误", u"错误代码:" + str(s[u'status']) + u"\n" + s[u'message']) progess.kill() return (False, outputs) else: polygon = u"[" qq_lon = u"" # 转换后的基站经度 qq_lat = u"" # 转换后的基站纬度 for (m, qq_point) in enumerate(s[u'locations']): if m == 0: qq_lon = str(qq_point[u'lng']) qq_lat = str(qq_point[u'lat']) else: polygon = polygon + str( qq_point[u'lng']) + u"," + str( qq_point[u'lat']) if m != len(s[u'locations']) - 1: polygon = polygon + u"," polygon = polygon + u"]" datas = datas + u"{CellName:'" + data[0] + u"',CellId:'" + data[1] + \ u"',SiteName:'" + data[2] + u"',SiteId:'" + data[3] + \ u"',lon:" + str(data[4]) + u",lat:" + str(data[5]) + \ u",qq_lon:" + qq_lon + u",qq_lat:" + qq_lat + \ u",WCDMA_PSC:'" + str(data[6]) + u"',LTE_PCI:'" + str(data[7]) + \ u"',CDMA_PN:'" + str(data[8]) + u"',GSM_BCCH:'" + str(data[9]) + \ u"',Azimuth:'" + str(data[10]) + u"',TILT:'" + str(data[11]) + \ u"',AntHeigth:'" + str(data[12]) + u"',RNC_BSC:'" + str(data[13]) + \ u"', Polygon:" + polygon + u"}\n" if i != len(self.cell_datas) - 1: datas = datas + u"," progess.count() outputs = u"var cell = [ \n" + datas + u"\n" + u"]\n" progess.count() if outputs != None: #print datas return (True, outputs) else: return (False, outputs)
def createData(self): outputs = None datas = u'' if self.type == BaiduType.Site: # 基站 # 数据分组,每组最多99 points = [] # 已经分组的需要转换的点 bd_points = [] # 已经转换好的点 total = 0 # 总记录数 if (len(self.site_datas) % 99) > 0: groupCount = len(self.site_datas) / 99 + 1 else: groupCount = len(self.site_datas) / 99 for i in range(groupCount): temp = [] for j in range(99): if total < len(self.site_datas): temp.append(self.site_points[(i * 99) + j]) total = total + 1 points.append(temp) del temp # 生成进度条 total = len(points) + len(self.site_datas) progess = Progess(self.parent, total) progess.show() # 数据点转换 for groups in points: coords = u'' for (x, point) in enumerate(groups): coords = coords + str(point[0]) + u"," + str(point[1]) if x != len(groups) - 1: coords = coords + u";" url = u"https://api.map.baidu.com/geoconv/v1/?coords=" + coords \ + u"&from=1&to=5&ak=" + self.key req = urllib2.Request(url) res_data = urllib2.urlopen(req) res = res_data.read() s = json.loads(res) if s[u'status'] != 0: status = s[u'status'] if status == 1: print status QMessageBox.critical(self.parent, u"错误", u"坐标转换出现内部错误") return (False, outputs) elif status == 21: print status QMessageBox.critical(self.parent, u"错误", u"坐标转换from非法") return (False, outputs) elif status == 22: print status QMessageBox.critical(self.parent, u"错误", u"坐标转换to非法") return (False, outputs) elif status == 24: print status QMessageBox.critical(self.parent, u"错误", u"坐标转换coords格式非法") return (False, outputs) elif status == 25: print status QMessageBox.critical(self.parent, u"错误", u"坐标转换coords个数非法") return (False, outputs) progess.count() for i in range(len(groups)): bd_points.append( (s[u'result'][i][u'x'], s[u'result'][i][u'y'])) for (i, data) in enumerate(self.site_datas): bd_lon = bd_points[i][0] bd_lat = bd_points[i][1] datas = datas + u"{SiteName:'" + data[0] + u"',SiteId:'" + data[1] + \ u"',lon:" + str(self.site_points[i][0]) + u",lat:" + str(self.site_points[i][1]) + \ u",bd_lon:" + str(bd_lon) + u",bd_lat:" + \ str(bd_lat) + u"}\n" if i != len(self.site_datas) - 1: datas = datas + "," progess.count() outputs = u"var site = [ \n" + datas + u"\n" + u"]\n" if outputs != None: return (True, outputs) else: return (False, outputs) elif self.type == BaiduType.Cell: # 小区 # 生成进度条 total = len(self.cell_datas) + 1 progess = Progess(self.parent, total) progess.show() for (i, data) in enumerate(self.cell_datas): # 先转换基站的经纬度 coords = str(data[4]) + u"," + str(data[5]) + u";" for (j, point) in enumerate(self.cell_points[i]): #print 8 # 数据点转换 coords = coords + str(point[0]) + u"," + str(point[1]) if j != len(self.cell_points[i]) - 1: coords = coords + u";" url = u"https://api.map.baidu.com/geoconv/v1/?coords=" + coords \ + u"&from=1&to=5&ak=" + self.key req = urllib2.Request(url) res_data = urllib2.urlopen(req) res = res_data.read() s = json.loads(res) # s[u'result'] 第一个数据为基站经纬度 if s[u'status'] != 0: status = s[u'status'] if status == 1: print u"坐标转换出现内部错误" return (False, outputs) elif status == 21: print u"坐标转换from非法" return (False, outputs) elif status == 22: print u"坐标转换to非法 " return (False, outputs) elif status == 24: print u"坐标转换coords格式非法 " return (False, outputs) elif status == 25: print u"坐标转换coords个数非法,超过限制 " return (False, outputs) else: print status polygon = u"[" bd_lon = u"" # 转换后的基站经度 bd_lat = u"" # 转换后的基站纬度 for (m, bd_point) in enumerate(s[u'result']): if m == 0: bd_lon = str(bd_point[u'x']) bd_lat = str(bd_point[u'y']) else: polygon = polygon + str(bd_point[u'x']) + u"," + str( bd_point[u'y']) if m != len(s[u'result']) - 1: polygon = polygon + u"," polygon = polygon + u"]" datas = datas + u"{CellName:'" + data[0] + u"',CellId:'" + data[1] + \ u"',SiteName:'" + data[2] + u"',SiteId:'" + data[3] + \ u"',lon:" + str(data[4]) + u",lat:" + str(data[5]) + \ u",bd_lon:" + bd_lon + u",bd_lat:" + bd_lat + \ u",WCDMA_PSC:'" + str(data[6]) + u"',LTE_PCI:'" + str(data[7]) + \ u"',CDMA_PN:'" + str(data[8]) + u"',GSM_BCCH:'" + str(data[9]) + \ u"',Azimuth:'" + str(data[10]) + u"',TILT:'" + str(data[11]) + \ u"',AntHeigth:'" + str(data[12]) + u"',RNC_BSC:'" + str(data[13]) + \ u"', Polygon:" + polygon + u"}\n" if i != len(self.cell_datas) - 1: datas = datas + u"," progess.count() outputs = u"var cell = [ \n" + datas + u"\n" + u"]\n" progess.count() if outputs != None: return (True, outputs) else: return (False, outputs)
def createData(self): outputs = None datas = u'' if self.type == SogoType.Site: # 生成进度条 total = len(self.site_datas) progess = Progess(self.parent, total) progess.show() for (i, data) in enumerate(self.site_datas): datas = datas + u"{SiteName:'" + data[0] + u"',SiteId:'" + data[1] + \ u"',lon:" + str(self.site_points[i][0]) + u",lat:" + str(self.site_points[i][1]) + \ u"}\n" if i != len(self.site_datas) - 1: datas = datas + "," progess.count() outputs = u"var site = [ \n" + datas + u"\n" + u"]\n" if outputs != None: # print datas return (True, outputs) else: return (False, outputs) elif self.type == SogoType.Cell: # 小区 # 生成进度条 total = len(self.cell_datas) + 1 progess = Progess(self.parent, total) progess.show() for (i, data) in enumerate(self.cell_datas): polygon = u"[" for (j, point) in enumerate(self.cell_polygons[i]): polygon = polygon + str(point[0]) + u"," + str(point[1]) if j != len(self.cell_polygons[i]) - 1: polygon = polygon + u"," polygon = polygon + u"]" datas = datas + u"{CellName:'" + data[0] + u"',CellId:'" + data[1] + \ u"',SiteName:'" + data[2] + u"',SiteId:'" + data[3] + \ u"',lon:" + str(data[4]) + u",lat:" + str(data[5]) + \ u",WCDMA_PSC:'" + str(data[6]) + u"',LTE_PCI:'" + str(data[7]) + \ u"',CDMA_PN:'" + str(data[8]) + u"',GSM_BCCH:'" + str(data[9]) + \ u"',Azimuth:'" + str(data[10]) + u"',TILT:'" + str(data[11]) + \ u"',AntHeigth:'" + str(data[12]) + u"',RNC_BSC:'" + str(data[13]) + \ u"', Polygon:" + polygon + u"}\n" if i != len(self.cell_datas) - 1: datas = datas + u"," progess.count() outputs = u"var cell = [ \n" + datas + u"\n" + u"]\n" progess.count() if outputs != None: return (True, outputs) else: return (False, outputs)
def create(self): try: outputs = None head = u'<?xml version="1.0" encoding="utf-8" ?>' Schema_label = KMLLabel('Schema') Schema_label.setAttribute(('name', self.filename)) for (field, type) in KMLHead.items(): SimpleField_label = KMLLabel('SimpleField') SimpleField_label.setAttribute(('name', field), ('type', type)) SimpleField = SimpleField_label.create() Schema_label.addLabel(SimpleField) Schema = Schema_label.create() Document_label = KMLLabel('Document') Document_label.addLabel(Schema) # 基站 if self.type == KMLType.Site: # 生成进度条 total = len(self.site_datas) + 1 progess = Progess(self.parent, total) progess.show() Folder_label = KMLLabel('Folder') name_label = KMLLabel('name') name_label.createTextNode(u"基站") name = name_label.create() Folder_label.addLabel(name) for (i, feature) in enumerate(self.site_datas): Placemark_label = KMLLabel('Placemark') ExtendedData_label = KMLLabel('ExtendedData') SchemaData_label = KMLLabel('SchemaData') SchemaData_label.setAttribute( ('schemaUrl', u'#' + self.filename)) for (j, data) in enumerate(feature): SimpleData_label = KMLLabel('SimpleData') SimpleData_label.setAttribute( ('name', self.site_fields[j])) if data != None: SimpleData_label.createTextNode(data) else: SimpleData_label.createTextNode('NULL') SimpleData = SimpleData_label.create() SchemaData_label.addLabel(SimpleData) SchemaData = SchemaData_label.create() ExtendedData_label.addLabel(SchemaData) ExtendedData = ExtendedData_label.create() Point_label = KMLLabel('Point') coordinates_label = KMLLabel('coordinates') coordinates_label.createTextNode( str(self.site_points[i][0]) + ',' + str(self.site_points[i][1])) coordinates = coordinates_label.create() Point_label.addLabel(coordinates) Point = Point_label.create() Sitename_label = KMLLabel('name') Sitename_label.createTextNode(self.site_names[i]) sitename = Sitename_label.create() Style_label = KMLLabel('Style') labelScale_label = KMLLabel('labelScale') labelScale_label.createTextNode('0.7') labelScale = labelScale_label.create() Style_label.addLabel(labelScale) Style = Style_label.create() Placemark_label.addLabel(Style) Placemark_label.addLabel(sitename) Placemark_label.addLabel(ExtendedData) Placemark_label.addLabel(Point) Placemark = Placemark_label.create() Folder_label.addLabel(Placemark) # 更新进度 progess.count() Folder = Folder_label.create() Document_label.addLabel(Folder) # 更新进度 progess.count() #小区 elif self.type == KMLType.Cell: # 生成进度条 total = len(self.cell_infos) + 1 + len(self.cell_datas) + 2 progess = Progess(self.parent, total) progess.show() Folder_label = KMLLabel('Folder') name_label = KMLLabel('name') name_label.createTextNode(u'小区') name = name_label.create() Folder_label.addLabel(name) # 小区信息 Folder1_label = KMLLabel('Folder') name_label = KMLLabel('name') name_label.createTextNode(u'小区信息') name = name_label.create() Folder1_label.addLabel(name) for infos in self.cell_infos: Placemark_label = KMLLabel('Placemark') name_label = KMLLabel('name') if infos[0] != None: name_label.createTextNode(infos[0]) else: name_label.createTextNode(u'无') name = name_label.create() Placemark_label.addLabel(name) # 设置样式 Style_label = KMLLabel('Style') # 设置IconStyle IconStyle_label = KMLLabel('IconStyle') # 把小区信息的图标设置为无图标模式 Icon_label = KMLLabel('Icon') Icon = Icon_label.create() IconStyle_label.addLabel(Icon) IconStyle = IconStyle_label.create() Style_label.addLabel(IconStyle) # 设置LabelStyle LabelStyle_label = KMLLabel('LabelStyle') # 把label比例修改为0.7 labelScale_label = KMLLabel('labelScale') labelScale_label.createTextNode('0.7') labelScale = labelScale_label.create() LabelStyle_label.addLabel(labelScale) # 设置label颜色 color_label = KMLLabel('color') color_label.createTextNode('ff7fffaa') color = color_label.create() LabelStyle_label.addLabel(color) LabelStyle = LabelStyle_label.create() # 设置LabelStyle到Style_label Style_label.addLabel(LabelStyle) Style = Style_label.create() Placemark_label.addLabel(Style) styleUrl_label = KMLLabel('styleUrl') styleUrl_label.createTextNode('#onlytextname') styleUrl = styleUrl_label.create() Placemark_label.addLabel(styleUrl) Point_label = KMLLabel('Point') extrude_label = KMLLabel('extrude') extrude_label.createTextNode(1) extrude = extrude_label.create() Point_label.addLabel(extrude) altitudeMode_label = KMLLabel('altitudeMode') altitudeMode_label.createTextNode('relativeToGround') altitudeMode = altitudeMode_label.create() Point_label.addLabel(altitudeMode) coordinates_label = KMLLabel('coordinates') coordinates_label.createTextNode( str(infos[1]) + ',' + str(infos[2]) + ',' + '0') coordinates = coordinates_label.create() Point_label.addLabel(coordinates) Point = Point_label.create() Placemark_label.addLabel(Point) Placemark = Placemark_label.create() Folder1 = Folder1_label.addLabel(Placemark) # 更新进度 progess.count() Folder1 = Folder1_label.create() Folder_label.addLabel(Folder1) # 更新进度 progess.count() # 小区图形 Folder2_label = KMLLabel('Folder') name_label = KMLLabel('name') name_label.createTextNode(u'小区图形') name = name_label.create() Folder2_label.addLabel(name) for (i, feature) in enumerate(self.cell_datas): Placemark_label = KMLLabel('Placemark') ExtendedData_label = KMLLabel('ExtendedData') SchemaData_label = KMLLabel('SchemaData') SchemaData_label.setAttribute( ('schemaUrl', u'#' + self.filename)) for (j, data) in enumerate(feature): SimpleData_label = KMLLabel('SimpleData') SimpleData_label.setAttribute( ('name', self.cell_fields[j])) if data != None: SimpleData_label.createTextNode(data) else: SimpleData_label.createTextNode('NULL') SimpleData = SimpleData_label.create() SchemaData_label.addLabel(SimpleData) SchemaData = SchemaData_label.create() ExtendedData_label.addLabel(SchemaData) ExtendedData = ExtendedData_label.create() Polygon_label = KMLLabel('Polygon') altitudeMode_label = KMLLabel('altitudeMode') altitudeMode_label.createTextNode('relativeToGround') altitudeMode = altitudeMode_label.create() Polygon_label.addLabel(altitudeMode) outerBoundaryIs_label = KMLLabel('outerBoundaryIs') LinearRing_label = KMLLabel('LinearRing') LinearRing_label.addLabel(altitudeMode) coordinates_label = KMLLabel('coordinates') for cell_points in self.cell_points[i]: for cell_point in cell_points: coordinates_label.createTextNode( str(cell_point[0]) + ',' + str(cell_point[1]) + ' ') coordinates = coordinates_label.create() LinearRing_label.addLabel(coordinates) LinearRing = LinearRing_label.create() outerBoundaryIs_label.addLabel(LinearRing) outerBoundaryIs = outerBoundaryIs_label.create() Polygon_label.addLabel(outerBoundaryIs) Polygon = Polygon_label.create() Cellname_label = KMLLabel('name') Cellname_label.createTextNode(self.cell_names[i]) cellname = Cellname_label.create() Placemark_label.addLabel(cellname) Style_label = KMLLabel('Style') LineStyle_label = KMLLabel('LineStyle') color_label = KMLLabel('color') color_label.createTextNode('ff0000ff') color = color_label.create() LineStyle_label.addLabel(color) # 将线的宽度定义为2 width_label = KMLLabel('width') width_label.createTextNode('2') width = width_label.create() LineStyle_label.addLabel(width) LineStyle = LineStyle_label.create() Style_label.addLabel(LineStyle) PolyStyle_label = KMLLabel('PolyStyle') fill_label = KMLLabel('fill') fill_label.createTextNode('0') fill = fill_label.create() PolyStyle_label.addLabel(fill) PolyStyle = PolyStyle_label.create() Style_label.addLabel(PolyStyle) Style = Style_label.create() Placemark_label.addLabel(Style) Placemark_label.addLabel(ExtendedData) Placemark_label.addLabel(Polygon) Placemark = Placemark_label.create() Folder2_label.addLabel(Placemark) # 更新进度 progess.count() Folder2 = Folder2_label.create() Folder_label.addLabel(Folder2) # 更新进度 progess.count() Folder = Folder_label.create() Document_label.addLabel(Folder) # 更新进度 progess.count() # 基站+小区 else: # 生成进度条 total = len(self.site_datas) + 1 + len( self.cell_infos) + 1 + len(self.cell_datas) + 2 progess = Progess(self.parent, total) progess.show() # 基站 Folder_label = KMLLabel('Folder') name_label = KMLLabel('name') name_label.createTextNode(u'基站') name = name_label.create() Folder_label.addLabel(name) for (i, feature) in enumerate(self.site_datas): Placemark_label = KMLLabel('Placemark') ExtendedData_label = KMLLabel('ExtendedData') SchemaData_label = KMLLabel('SchemaData') SchemaData_label.setAttribute( ('schemaUrl', u'#' + self.filename)) for (j, data) in enumerate(feature): SimpleData_label = KMLLabel('SimpleData') SimpleData_label.setAttribute( ('name', self.site_fields[j])) if data != None: SimpleData_label.createTextNode(data) else: SimpleData_label.createTextNode('NULL') SimpleData = SimpleData_label.create() SchemaData_label.addLabel(SimpleData) SchemaData = SchemaData_label.create() ExtendedData_label.addLabel(SchemaData) ExtendedData = ExtendedData_label.create() Point_label = KMLLabel('Point') coordinates_label = KMLLabel('coordinates') coordinates_label.createTextNode( str(self.site_points[i][0]) + ',' + str(self.site_points[i][1])) coordinates = coordinates_label.create() Point_label.addLabel(coordinates) Point = Point_label.create() Sitename_label = KMLLabel('name') Sitename_label.createTextNode(self.site_names[i]) sitename = Sitename_label.create() # 将名字显示比例设置为0.7 Style_label = KMLLabel('Style') labelScale_label = KMLLabel('labelScale') labelScale_label.createTextNode('0.7') labelScale = labelScale_label.create() Style_label.addLabel(labelScale) Style = Style_label.create() Placemark_label.addLabel(Style) Placemark_label.addLabel(sitename) Placemark_label.addLabel(ExtendedData) Placemark_label.addLabel(Point) Placemark = Placemark_label.create() Folder_label.addLabel(Placemark) # 更新进度 progess.count() Folder = Folder_label.create() Document_label.addLabel(Folder) # 更新进度 progess.count() # 小区 Folder_label = KMLLabel('Folder') name_label = KMLLabel('name') name_label.createTextNode(u'小区') name = name_label.create() Folder_label.addLabel(name) # 小区信息 Folder1_label = KMLLabel('Folder') name_label = KMLLabel('name') name_label.createTextNode(u'小区信息') name = name_label.create() Folder1_label.addLabel(name) for infos in self.cell_infos: Placemark_label = KMLLabel('Placemark') name_label = KMLLabel('name') if infos[0] != None: name_label.createTextNode(infos[0]) else: name_label.createTextNode(u'无') name = name_label.create() Style_label = KMLLabel('Style') # 把小区信息的图标设置为无图标模式 IconStyle_label = KMLLabel('IconStyle') Icon_label = KMLLabel('Icon') Icon = Icon_label.create() IconStyle_label.addLabel(Icon) IconStyle = IconStyle_label.create() Style_label.addLabel(IconStyle) # 设置LabelStyle LabelStyle_label = KMLLabel('LabelStyle') # 把label比例修改为0.7 labelScale_label = KMLLabel('labelScale') labelScale_label.createTextNode('0.7') labelScale = labelScale_label.create() LabelStyle_label.addLabel(labelScale) # 设置label颜色 color_label = KMLLabel('color') color_label.createTextNode('ff7fffaa') color = color_label.create() LabelStyle_label.addLabel(color) LabelStyle = LabelStyle_label.create() # 设置LabelStyle到Style_label Style_label.addLabel(LabelStyle) Style = Style_label.create() Placemark_label.addLabel(Style) Style = Style_label.create() Placemark_label.addLabel(Style) Placemark_label.addLabel(name) styleUrl_label = KMLLabel('styleUrl') styleUrl_label.createTextNode('#onlytextname') styleUrl = styleUrl_label.create() Placemark_label.addLabel(styleUrl) Point_label = KMLLabel('Point') extrude_label = KMLLabel('extrude') extrude_label.createTextNode(1) extrude = extrude_label.create() Point_label.addLabel(extrude) altitudeMode_label = KMLLabel('altitudeMode') altitudeMode_label.createTextNode('relativeToGround') altitudeMode = altitudeMode_label.create() Point_label.addLabel(altitudeMode) coordinates_label = KMLLabel('coordinates') coordinates_label.createTextNode( str(infos[1]) + ',' + str(infos[2]) + ',' + '0') coordinates = coordinates_label.create() Point_label.addLabel(coordinates) Point = Point_label.create() Placemark_label.addLabel(Point) Placemark = Placemark_label.create() Folder1_label.addLabel(Placemark) # 更新进度 progess.count() Folder1 = Folder1_label.create() Folder_label.addLabel(Folder1) # 更新进度 progess.count() # 小区图形 Folder2_label = KMLLabel('Folder') name_label = KMLLabel('name') name_label.createTextNode(u'小区图形') name = name_label.create() Folder2_label.addLabel(name) for (i, feature) in enumerate(self.cell_datas): Placemark_label = KMLLabel('Placemark') ExtendedData_label = KMLLabel('ExtendedData') SchemaData_label = KMLLabel('SchemaData') SchemaData_label.setAttribute( ('schemaUrl', u'#' + self.filename)) for (j, data) in enumerate(feature): SimpleData_label = KMLLabel('SimpleData') SimpleData_label.setAttribute( ('name', self.cell_fields[j])) if data != None: SimpleData_label.createTextNode(data) else: SimpleData_label.createTextNode('NULL') SimpleData = SimpleData_label.create() SchemaData_label.addLabel(SimpleData) SchemaData = SchemaData_label.create() ExtendedData_label.addLabel(SchemaData) ExtendedData = ExtendedData_label.create() Polygon_label = KMLLabel('Polygon') altitudeMode_label = KMLLabel('altitudeMode') altitudeMode_label.createTextNode('relativeToGround') altitudeMode = altitudeMode_label.create() Polygon_label.addLabel(altitudeMode) outerBoundaryIs_label = KMLLabel('outerBoundaryIs') LinearRing_label = KMLLabel('LinearRing') LinearRing_label.addLabel(altitudeMode) coordinates_label = KMLLabel('coordinates') for cell_points in self.cell_points[i]: for cell_point in cell_points: coordinates_label.createTextNode( str(cell_point[0]) + ',' + str(cell_point[1]) + ' ') coordinates = coordinates_label.create() LinearRing_label.addLabel(coordinates) LinearRing = LinearRing_label.create() outerBoundaryIs_label.addLabel(LinearRing) outerBoundaryIs = outerBoundaryIs_label.create() Polygon_label.addLabel(outerBoundaryIs) Polygon = Polygon_label.create() Cellname_label = KMLLabel('name') Cellname_label.createTextNode(self.cell_names[i]) cellname = Cellname_label.create() Placemark_label.addLabel(cellname) Style_label = KMLLabel('Style') LineStyle_label = KMLLabel('LineStyle') color_label = KMLLabel('color') color_label.createTextNode('ff0000ff') color = color_label.create() LineStyle_label.addLabel(color) # 将线的宽度定义为2 width_label = KMLLabel('width') width_label.createTextNode('2') width = width_label.create() LineStyle_label.addLabel(width) LineStyle = LineStyle_label.create() Style_label.addLabel(LineStyle) PolyStyle_label = KMLLabel('PolyStyle') fill_label = KMLLabel('fill') fill_label.createTextNode('0') fill = fill_label.create() PolyStyle_label.addLabel(fill) PolyStyle = PolyStyle_label.create() Style_label.addLabel(PolyStyle) Style = Style_label.create() Placemark_label.addLabel(Style) Placemark_label.addLabel(ExtendedData) Placemark_label.addLabel(Polygon) Placemark = Placemark_label.create() Folder2_label.addLabel(Placemark) # 更新进度 progess.count() Folder2 = Folder2_label.create() Folder_label.addLabel(Folder2) # 更新进度 progess.count() Folder = Folder_label.create() Document_label.addLabel(Folder) # 更新进度 progess.count() Document_label.setAttribute(('id', 'root_doc')) Document = Document_label.create() kml_label = KMLLabel('kml') kml_label.setAttribute(('xmlns', 'http://www.opengis.net/kml/2.2')) kml_label.addLabel(Document) kml = kml_label.create() outputs = head + kml return (True, outputs) except Exception as e: raise traceback.format_exc()
def run(self): allCellFeatures_list = getFeaturesList(self.cellLayer) d = QgsDistanceArea() marco_cells_dict = {} room_cells_dict = {} not_room_cells_list = [] drip_cells_dict = {} PCI_dict = {} # key:cell.id() value:PCI # 先把室分小区筛选出来 for cell in allCellFeatures_list: if cell[u"小区类型"] == u"室分": site_name = cell[u"基站名"] site_id = cell[u"基站ID"] site = (site_id, site_name) if not room_cells_dict.has_key(site): temp_list = [cell] room_cells_dict[site] = temp_list del temp_list else: temp_list = room_cells_dict[site] temp_list.append(cell) room_cells_dict[site] = temp_list del temp_list else: not_room_cells_list.append(cell) # 将非室分的小区按基站来分类以筛选滴灌小区 if not_room_cells_list: cells_dict = {} for cell in not_room_cells_list: site_name = cell[u"基站名"] site_id = cell[u"基站ID"] site = (site_id, site_name) if not cells_dict.has_key(site): temp_list = [cell] cells_dict[site] = temp_list del temp_list else: temp_list = cells_dict[site] temp_list.append(cell) cells_dict[site] = temp_list del temp_list # 筛选宏站和滴灌小区 for (site, cells_list) in cells_dict.iteritems(): if len(cells_list) > 3: drip_cells_dict[site] = cells_list else: marco_cells_dict[site] = cells_list # 生成进度条 progess_len = len(marco_cells_dict)+len(room_cells_dict)+len(drip_cells_dict) progess = Progess(self.parent, progess_len) progess.show() # 先为宏站分配PCI sss = self.marco_range[0] for (site0, cells_list0) in marco_cells_dict.iteritems(): had_used_SSS_set = set() for (site1, cells_list1) in marco_cells_dict.iteritems(): if site0 == site1: continue lon0 = cells_list0[0][u"经度"] lat0 = cells_list0[0][u"纬度"] site_point0 = QgsPoint(lon0, lat0) lon1 = cells_list1[0][u"经度"] lat1 = cells_list1[0][u"纬度"] site_point1 = QgsPoint(lon1, lat1) distance = d.convertMeasurement(d.measureLine(site_point0, site_point1), 2, 0, False)[0] # 单位(米) if distance > 5*self.coverage: continue # 在5倍覆盖范围内 if not PCI_dict.has_key(cells_list1[0].id()): pci1 = cells_list1[0]["PCI"] else: pci1 = PCI_dict[cells_list1[0].id()] if pci1: sss1 = pci1 / 3 had_used_SSS_set.add(sss1) # 为同一基站下的小区分配PCI # 先确定可用SSS for i in range(self.marco_range[0], self.marco_range[1]+1): if sss in had_used_SSS_set: sss = sss + 1 if sss > self.marco_range[1]: sss = self.marco_range[0] else: break cells_list0.sort(key=lambda x:x[u"方向角"]) for index,cell in enumerate(cells_list0): pci = index + 3*sss PCI_dict[cell.id()] = pci progess.count() # 为室分站分配PCI pci_count = self.room_range[0]*3 for (site, cells_list) in room_cells_dict.iteritems(): for cell in cells_list: if pci_count > self.room_range[1]*3 + 2: pci_count = self.room_range[0]*3 PCI_dict[cell.id()] = pci_count pci_count = pci_count + 1 progess.count() # 为滴灌站分配PCI pci_count = self.drip_range[0] * 3 for (site, cells_list) in drip_cells_dict.iteritems(): for cell in cells_list: if pci_count > self.drip_range[1]*3 + 2: pci_count = self.drip_range[0]*3 PCI_dict[cell.id()] = pci_count pci_count = pci_count + 1 progess.count() # 修改图层数据 if PCI_dict: update_dict = {} pci_field_index = self.cellLayer.fieldNameIndex('PCI') for (id, pci) in PCI_dict.iteritems(): update_dict[id] = {pci_field_index:pci} modifyFeatures(self.cellLayer, update_dict) progess.count() return True else: return False
def run(self): totalDict = {} # 用于保存所有基站的计算结果 suit_jlist = {} # 保存符合条件的结点 d = QgsDistanceArea() total = len(self.jlist) #写进度条 progess = Progess(self.parent,total, u"分析中...") progess.show() maxDistance = self.tlist[1] for (jindex, jsite) in enumerate(self.jlist): #遍历结点 perList = [] #临时列表,用于转化子字典 SuitOrNot = True # 结点是否符合标准标志(默认为True符合) jnaDis = None # 保存结点和基站之间的距离 jnaAngle = None jnaminDis1,jnaminDis2,jnaminDis3,jnaminDis4,jnaminDis5,jnaminDis6=[self.tlist[1] for i in range(6)] asite1,asite2,asite3,asite4,asite5,asite6=[None for i in range(6)] if jsite[7]==u'农村': minDis=float(self.tlist[2]) elif jsite[7]==u'郊区乡镇' : minDis=float(self.tlist[3]) elif jsite[7]==u'密集市区' : minDis=float(self.tlist[5]) else: #区域类型的结点的最小辐射范围 # 默认jsite[7]==u'普通市区' minDis=float(self.tlist[4]) jpoint=jsite.geometry().asPoint() # 先找到结点附近设置搜索范围内的所有基站 area = createARectangleByCenterPoint(jpoint, maxDistance) siteFeatures_list = getFeaturesListByArea(self.siteLayer, area) for asite in siteFeatures_list: #遍历找到的基站 jnaDis = d.convertMeasurement(d.measureLine(jpoint,\ QgsPoint(asite[4], asite[5])), 2, 0, False)[0] if jnaDis < minDis: # 如果存在一个基站与结点间距离小于所设定的范围,则忽略该结点 SuitOrNot = False break jnaAngle = math.atan2(asite[5]-jpoint.y(), asite[4]-jpoint.x()) jnaAngle =90.0 - 180 / math.pi * jnaAngle #弧度转角度(90-方位角,可转为以正北为0度角) if jnaDis <= jnaminDis1 and 0 < jnaAngle <= 60 : jnaminDis1 = float('%0.4f' % jnaDis) # 保留四位小数 asite1 = asite elif jnaDis <= jnaminDis2 and 60 < jnaAngle <= 120 : jnaminDis2 = float('%0.4f' % jnaDis) # 保留四位小数 asite2 = asite elif jnaDis <= jnaminDis3 and 120 < jnaAngle <= 180 : jnaminDis3 = float('%0.4f' % jnaDis) # 保留四位小数 asite3 = asite elif jnaDis <= jnaminDis4 and -180 < jnaAngle <= -120 : jnaminDis4 = float('%0.4f' % jnaDis) # 保留四位小数 asite4 = asite elif jnaDis <= jnaminDis5 and -120 < jnaAngle <= -60 : jnaminDis5 = float('%0.4f' % jnaDis) # 保留四位小数 asite5 = asite elif jnaDis <= jnaminDis6 and -60 < jnaAngle <= 0 : jnaminDis6 = float('%0.4f' % jnaDis) # 保留四位小数 asite6 = asite if jnaminDis1 and asite1 : perList.append([jnaminDis1,asite1]) if jnaminDis2 and asite2 : perList.append([jnaminDis2,asite2]) if jnaminDis3 and asite3 : perList.append([jnaminDis3,asite3]) if jnaminDis4 and asite4 : perList.append([jnaminDis4,asite4]) if jnaminDis5 and asite5 : perList.append([jnaminDis5,asite5]) if jnaminDis6 and asite6 : perList.append([jnaminDis6,asite6]) # 判断是否至少找到一个符合的基站 if len(perList) == 0: # 如果一个符合的基站都没有,则判断该节点不符合,跳过此次循环 SuitOrNot = False elif len(perList) < 6 : for i in range(6-len(perList)) : perList.append(None) #若数量不足,给列表补None值 if SuitOrNot == True: # 结点符合才添加 totalDict[jindex] = perList #记录新建基站的计算结果,{0:[[],[],[],……],1:[……],……} suit_jlist[jindex] = jsite progess.count() #进度条+1 self.calculationResult.emit(suit_jlist, totalDict)