Exemplo n.º 1
0
def createMemLayer(line, breaksList):
    '''
    create memory layer storing all reaches
    :return:
    '''
    # create layer
    vl = QgsVectorLayer("LineString", "sinuosity_river", "memory")
    pr = vl.dataProvider()
    # add fields
    pr.addAttributes([
        QgsField("reach", QVariant.Int),
        QgsField("sinuosity", QVariant.Double),
        QgsField("Length", QVariant.Double)
    ])
    vl.updateFields()
    # create breaks with initial and final
    bk = sorted(breaksList)
    bk.insert(0, 0)
    bk.append(line.length())
    for breack in range(1, len(bk)):
        ptInt = line.interpolate(bk[breack - 1])
        ptFin = line.interpolate(bk[breack])
        reach = splitLine(line, ptInt, ptFin)
        # sinuosity calc
        dist = qgisdist(ptInt, ptFin)
        lenReach = bk[breack] - bk[breack - 1]
        # add a feature
        fet = QgsFeature()
        fet.setGeometry(QgsGeometry.fromPolylineXY(reach))
        fet.setAttributes([breack, lenReach / dist, str(lenReach)])
        pr.addFeatures([fet])
    #vl.updateExtents()
    vl.commitChanges()
    return vl
Exemplo n.º 2
0
    def apagar(self):
        if self.curva_id:
            self.model.delete_curva(self.curva_id, self.dados)
            self.update()
            features = []
            PI = 0
            for i, feat in enumerate(self.layer.getFeatures()):
                if i > self.current_index and i < self.next_index:
                    continue
                f = QgsFeature(self.layer.fields())
                attr = feat.attributes()
                attr[0] = len(features) + 1
                f.setAttributes(attr)
                if i == self.current_index:
                    l1 = featureToPolyline(feat)
                    l2 = featureToPolyline(
                        self.layer.getFeature(self.next_index + 1))
                    PI = seg_intersect(l1[0], l1[-1], l2[0], l2[-1])
                    f.setGeometry(
                        QgsGeometry.fromPolyline(
                            [p2QgsPoint(featureToPolyline(feat)[0]), PI]))
                    features.append(f)
                elif i == self.next_index:
                    PF = PI
                    f.setGeometry(
                        QgsGeometry.fromPolyline(
                            [PF, p2QgsPoint(featureToPolyline(feat)[-1])]))
                    features.append(f)
                else:
                    f.setGeometry(feat.geometry())
                    features.append(f)

            self.layer.dataProvider().deleteFeatures(
                [f.id() for f in self.layer.getFeatures()])
            self.layer.dataProvider().addFeatures(features)
            self.layer.updateExtents()
            self.curva_id = False

        try:
            QgsProject.instance().removeMapLayer(self.c.layer.id())
        except:
            pass
        refreshCanvas(self.iface, self.layer)
Exemplo n.º 3
0
 def add_point(self, attributes, location_point, layer):
     """
     добавление точки по координатам
     :param layer:
     :param point:
     :param attributes:
     :return:
     """
     caps = layer.dataProvider().capabilities()
     if caps & QgsVectorDataProvider.AddFeatures:
         feature = QgsFeature(layer.pendingFields())
         feature.setAttributes(
             attributes
         )  # feat.setAttribute('name', name) or feat.setAttribute(4, name)
         feature.setGeometry(QgsGeometry.fromPoint(location_point))
         res = layer.dataProvider().addFeatures([feature])
         print("add point")
         return res
     pass
Exemplo n.º 4
0
    def plotar(self):
        vl = QgsVectorLayer("Point", "temporary_points", "memory")
        pr = vl.dataProvider()

        # Enter editing mode
        vl.startEditing()

        # add fields
        pr.addAttributes([
            QgsField("estaca", QVariant.String),
            QgsField("descrição", QVariant.String),
            QgsField("north", QVariant.String),
            QgsField("este", QVariant.String),
            QgsField("cota", QVariant.String),
            QgsField("azimite", QVariant.String)
        ])
        fets = []

        for r in range(self.tableWidget.rowCount()):
            ident = self.tableWidget.item(r, 0).text()
            if ident in ["", None]: break
            fet = QgsFeature(vl.pendingFields())
            n = 0.0
            e = 0.0
            try:
                es = self.tableWidget.item(r, 0).text()
                d = self.tableWidget.item(r, 1).text()
                n = float(self.tableWidget.item(r, 3).text())
                e = float(self.tableWidget.item(r, 4).text())
                c = float(self.tableWidget.item(r, 5).text())
                a = self.tableWidget.item(r, 6).text()
            except:
                break
            fet.setGeometry(QgsGeometry.fromPoint(QgsPoint(e, n)))
            fet.setAttributes([es, d, n, e, c, a])
            fets.append(fet)
        pr.addFeatures(fets)
        vl.commitChanges()
        QgsMapLayerRegistry.instance().addMapLayer(vl)
Exemplo n.º 5
0
    def run(self):
        QgsMessageLog.logMessage(f'Started task {self.description()}',
                                 'TracingCAJ', Qgis.Info)

        epsg = self.__hidrometers.crs().postgisSrid()
        uri = "LineString?crs=epsg:" + str(
            epsg
        ) + "&field=id:integer" "&field=distance:double(20,2)&index=yes"
        dist = QgsVectorLayer(uri, 'dist', 'memory')

        QgsProject.instance().addMapLayer(dist)
        prov = dist.dataProvider()
        points_features = [
            point_feature
            for point_feature in self.__hidrometers.getFeatures()
        ]

        feats = []
        if len(points_features) > 0:
            for p in points_features:
                nearest_pipe = self.find_nearest_pipelines(p.geometry())
                try:
                    minDistPoint = nearest_pipe.closestSegmentWithContext(
                        p.geometry().asPoint())[1]
                    feat = QgsFeature()
                    feat.setGeometry(
                        QgsGeometry.fromPolylineXY(
                            [p.geometry().asPoint(), minDistPoint]))
                    feat.setAttributes(
                        [points_features.index(p),
                         feat.geometry().length()])
                    feats.append(feat)
                except Exception as e:
                    print(p.id())

        prov.addFeatures(feats)
Exemplo n.º 6
0
    def saveCurva(self):
        self.layer: QgsVectorLayer
        self.comboCurva: QtWidgets.QComboBox
        self.draw()
        if self.curvaFailed:
            return

        curvaFeats = featuresList(self.c.layer)
        features = []
        if hasattr(self, "justStarted") and self.justStarted:
            i = 0
            for f, tipo in zip(curvaFeats, self.c.dados):
                feat = QgsFeature(self.layer.fields())
                feat.setGeometry(f.geometry())
                feat.setAttributes([i, str(tipo[0]), "Traçado"])
                features.append(feat)
                i += 1
            self.justStarted = False

        elif len(curvaFeats) > 0:
            fid = 1
            nomes = []
            #Delete all features of self.layer and add layer geometry in between
            for i, feat in enumerate(self.layer.getFeatures()):
                if i > self.current_index and i < self.next_index:
                    continue
                f = QgsFeature(self.layer.fields())
                attr = feat.attributes()
                attr[0] = len(features) + 1
                f.setAttributes(attr)
                if i == self.current_index:
                    PI = p2QgsPoint(featureToPolyline(curvaFeats[0])[0])
                    f.setGeometry(
                        QgsGeometry.fromPolyline(
                            [p2QgsPoint(featureToPolyline(feat)[0]), PI]))
                    features.append(f)

                    for i, cf in enumerate(curvaFeats):
                        f = QgsFeature(self.layer.fields())
                        attr = cf.attributes()
                        attr = [len(features) + 1] + attr
                        f.setAttributes(attr)
                        f.setGeometry(cf.geometry())
                        features.append(f)
                        if i == 0: nomes.append(str(attr[1]))
                    nomes.append(str(attr[1]))

                elif i == self.next_index:
                    PF = p2QgsPoint(featureToPolyline(curvaFeats[-1])[-1])
                    f.setGeometry(
                        QgsGeometry.fromPolyline(
                            [PF, p2QgsPoint(featureToPolyline(feat)[-1])]))
                    features.append(f)
                else:
                    f.setGeometry(feat.geometry())
                    features.append(f)

        self.layer.dataProvider().deleteFeatures(
            [f.id() for f in self.layer.getFeatures()])
        self.layer.dataProvider().addFeatures(features)
        self.layer.updateExtents()

        try:
            QgsProject.instance().removeMapLayer(self.c.layer.id())
        except:
            pass
        refreshCanvas(self.iface, self.layer)
Exemplo n.º 7
0
 def addPoint(self, ref, attrs):
     
     refLen = len(ref)
     
     if refLen > 3:
         code = ref[0:2].upper()
         #print code
         e = self.east[code]
         n = self.north[code]
         #print "East: ", e, " North: ", n
         # Should now have the northings and eastings values... now need to add some more precision
         metres = ref[2:]
         l = len(metres)
         # print l
         if l & 0x1: # bad news, shouldn't have an odd number of digits... bomb out!
             
             self.badGridError()
             return 1
         
         else:
             # Good news so far... even number of digits... split 'em in half and pad with zeroes
             l /= 2
             eMetres = metres[0:l]
             while len(eMetres) < 5:
                 eMetres = eMetres + "0"
             
             nMetres = metres[l:]
             while len(nMetres) < 5:
                 nMetres = nMetres + "0"
             
             # Add the metres onto the eastings and northings
             e += eMetres
             n += nMetres
             # print e
             # print n
             
             # Great... now have out coordinates in QGIS acceptable format... add a new point
             # Get active layer
             layer = qgis.utils.iface.activeLayer()
             caps = layer.dataProvider().capabilities()
             if caps:
                 
                 # Declare a feature
                 feat = QgsFeature()
                 
                 # Add attributes
                 if len(attrs) > 0: # Just use comma delimited attList
                     attList = attrs.split(",")
                     # print attList
                     feat.setAttributes(attList)
                 
                 # Add the points
                 feat.setGeometry(QgsGeometry.fromPoint(QgsPoint(int(e), int(n))))
                 res, outFeats = layer.dataProvider().addFeatures([feat])
                 if not res:
                     qgis.utils.iface.messageBar().pushMessage("Error", "An error occurred adding points", level=QgsMessageBar.CRITICAL)
                     self.stayOpen = False
                     return 1
                 
                 # Must update the UI for user to enjoy the new points
                 layer.triggerRepaint()
             
             else:
                 self.badGridError()    
     else:
         self.badGridError()
         return 1
     
     # Must be OK
     return 0
Exemplo n.º 8
0
    def painting(self, data, fileType):
        currentInputCRS = self.dlg.inputCRS.text().replace(" ", "")
        table = data.sheets()[0]
        nrows = table.nrows
        if fileType == '4G':
            vl = QgsVectorLayer("Polygon?crs=EPSG:"+currentInputCRS, u"4G基础信息图层", "memory")
            vlLabel = QgsVectorLayer("Polygon?crs=EPSG:"+currentInputCRS, u"4G基础信息标签层", "memory")
        elif fileType == '3G':
            vl = QgsVectorLayer("Polygon?crs=EPSG:"+currentInputCRS, u"3G基础信息图层", "memory")
            vlLabel = QgsVectorLayer("Polygon?crs=EPSG:"+currentInputCRS, u"3G基础信息标签层", "memory")
        elif fileType == '2G':
            vl = QgsVectorLayer("Polygon?crs=EPSG:"+currentInputCRS, u"2G基础信息图层", "memory")
            vlLabel = QgsVectorLayer("Polygon?crs=EPSG:"+currentInputCRS, u"2G基础信息标签层", "memory")

        pr = vl.dataProvider()
        vlLabelPr = vlLabel.dataProvider()

        attrs = self.createAttributesTable(fileType)

        pr.addAttributes(attrs)
        vlLabelPr.addAttributes(attrs)
        vl.updateFields()
        vlLabel.updateFields()

        fet = QgsFeature()
        self.dlg.progressBar.setVisible(True)
        '''开始读取到内存'''
        list = [[] for row in range(nrows-1)]
        for i in range(nrows):
            if i > 0:
                try:
                    if fileType == '4G':
                        for j in range(21):
                             list[i - 1].append(table.cell(i, j).value)
                             if j == 20:
                                 list[i - 1].append(table.cell(i, 13).value % 3)
                    if fileType == '3G':
                        for j in range(73):
                             list[i - 1].append(table.cell(i, j).value)
                             if j == 72:
                                 list[i - 1].append(int(table.cell(i, 5).value) % 3)
                    if fileType =='2G':
                        for j in range(67):
                             list[i - 1].append(table.cell(i, j).value)
                             if j == 66:
                                 list[i - 1].append(int(table.cell(i, 2).value) % 3)
                except:
                    self.showErrorDialog(u'文档读取出错', u'文档可能存在错误或格式不符合规范')
                    self.dlg.progressBar.setVisible(False)
                    return
        '''完成读取到内存'''

        PCI_Types = {
            '0': ('#F49ECC', 'Mod3=0'),
            '1': ('#65F0FF', 'Mod3=1'),
            '2': ('#00FF00', 'Mod3=2'),
            '3': ('#000', u'未知值'),
        }
        categories = []
        for pci_type, (color, label) in PCI_Types.items():
            symbol = QgsSymbolV2.defaultSymbol(vl.geometryType())
            # symbol = QgsFillSymbolV2.createSimple({'color': color, 'color_border': color, 'width_border': '2'})
            symbol.setColor(QColor(color))
            # symbol.symbolLayer(0).setOutlineColor(QColor('#75263b'))
            category = QgsRendererCategoryV2(pci_type, symbol, label)
            categories.append(category)

        for i in range(len(list)):
            fetAttrs =[]
            if fileType == '4G':
                for j in range(22):
                    fetAttrs.append(list[i][j])
            elif fileType == '3G':
                for j in range(74):
                    fetAttrs.append(list[i][j])
            elif fileType == '2G':
                for j in range(68):
                    fetAttrs.append(list[i][j])
            fet.setAttributes(fetAttrs)
            if fileType == '4G':
                Longitude = 11
                Latitude = 12
                Azimuth = list[i][14]
            elif fileType == '3G':
                Longitude = 12
                Latitude = 13
                Azimuth = list[i][15]
            elif fileType == '2G':
                Longitude = 15
                Latitude = 16
                Azimuth = list[i][5]

            points = [QgsPoint(list[i][Longitude], list[i][Latitude])]  # start point
            startAngle = -20
            endAngle = 20
            while startAngle <= endAngle:
                # midway points
                points.append(QgsPoint(list[i][Longitude] + 0.001 * math.sin(math.radians(Azimuth + startAngle)),
                                       list[i][Latitude] + 0.001 * math.cos(math.radians(Azimuth + startAngle))))
                startAngle += 2
            points.append(QgsPoint(list[i][Longitude], list[i][Latitude]))  # end point

            # create the renderer and assign it to a layer
            expression = 'Mod3'  # field name
            renderer = QgsCategorizedSymbolRendererV2(expression, categories)
            vl.setRendererV2(renderer)

            fet.setGeometry(QgsGeometry.fromPolygon([points]))
            pr.addFeatures([fet])

            # fet.setGeometry(QgsGeometry.fromPoint(QgsPoint(Longitude, Latitude)))
            vlLabelPr.addFeatures([fet])

            vlLabel.setLayerTransparency(100)

            vl.updateExtents()
            vlLabel.updateExtents()
            vl.commitChanges()
            vlLabel.commitChanges()
            vl.updateFields()
            vlLabel.updateFields()
            if i % 200 == 0:
                print 'progress:', float(pr.featureCount()) / nrows * 100
                self.dlg.progressBar.setValue(float(pr.featureCount()) / nrows * 100.0)

            palyr = QgsPalLayerSettings()
            # palyr.readFromLayer(vl)
            palyr.enabled = True
            palyr.fieldName = 'CellName'
            if fileType =='2G':
                palyr.fieldName = 'CELL_NAME'
            palyr.placement = QgsPalLayerSettings.OverPoint
            # palyr.setDataDefinedProperty(QgsPalLayerSettings.Size,False,False,'','')
            palyr.writeToLayer(vlLabel)
            QgsMapLayerRegistry.instance().addMapLayer(vl)
            QgsMapLayerRegistry.instance().addMapLayer(vlLabel)
        print 'progress:', 100
        self.dlg.progressBar.setValue(0)
        self.dlg.progressBar.setVisible(False)
        self.iface.messageBar().clearWidgets()
        qgis.utils.iface.setActiveLayer(vl)
        self.saveEPSGChange()
        self.dlg.close()
Exemplo n.º 9
0
    def ltefpsOKBtn(self):
        currentInputCRS = self.dlg.inputCRS.text().replace(" ", "")
        try:
            sourceLayer = QgsMapLayerRegistry.instance().mapLayersByName(u'4G基础信息图层')[0]
        except:
            self.showErrorDialog(u'未找到图层', u'请检查是否已加载“4G基础信息图层”')
            return
        try:
            inputFreq = int(self.ltefpsdlg.inputFreq.text())
            inputPCI = int(self.ltefpsdlg.inputPCI.text())
        except:
            self.showErrorDialog(u'错误的输入', u'请输入数字')
            return

        # 隐藏之前的同名图层
        try:
            sameLayers = QgsMapLayerRegistry.instance().mapLayersByName(u'4G图层频点PCI查找')
            for oneLayer in sameLayers:
                qgis.utils.iface.legendInterface().setLayerVisible(oneLayer, False)
        except:
            pass

        ltefpsLayer = QgsVectorLayer("Polygon?crs=EPSG:"+currentInputCRS, u"4G图层频点PCI查找", "memory")
        ltefpsPr = ltefpsLayer.dataProvider()
        ltefpsPr.addAttributes(self.createAttributesTable('4GFreqPCISearch'))
        ltefpsLayer.updateFields()
        qgis.utils.iface.legendInterface().setLayerVisible(sourceLayer, False)
        ltefpsFet = QgsFeature()

        PCI_Types = {
            1: ('#FFFF00', u'频点='+str(inputFreq)+',PCI='+str(inputPCI)),
            0: ('#EEEEEE', u'无关频点PCI')
        }
        categories = []
        for pci_type, (color, label) in PCI_Types.items():
            symbol = QgsSymbolV2.defaultSymbol(ltefpsLayer.geometryType())
            symbol.setColor(QColor(color))
            category = QgsRendererCategoryV2(pci_type, symbol, label)
            categories.append(category)
            # 创建属性表
            fetAttrs = []
            relatedAttrs = []
            Longitude, Latitude, Azimuth = 11, 12, 14
            for feature in sourceLayer.getFeatures():
                attrs = feature.attributes()
                if (inputFreq == attrs[9]) & (inputPCI == int(attrs[13])):
                    temp = []
                    for j in range(21):
                        temp.append(attrs[j])
                    temp.append(1)
                    relatedAttrs.append(temp)
                else:
                    temp = []
                    for j in range(21):
                        temp.append(attrs[j])
                    temp.append(0)
                    fetAttrs.append(temp)
            for one in relatedAttrs:
                fetAttrs.append(one)
            for fetAttr in fetAttrs:
                ltefpsFet.setAttributes(fetAttr)
                # 开始画图
                points = [QgsPoint(fetAttr[Longitude], fetAttr[Latitude])]  # start point
                startAngle = -20
                endAngle = 20
                while startAngle <= endAngle:
                    points.append(
                        QgsPoint(fetAttr[Longitude] + 0.001 * math.sin(math.radians(fetAttr[Azimuth] + startAngle)),
                                 fetAttr[Latitude] + 0.001 * math.cos(math.radians(fetAttr[Azimuth] + startAngle))))
                    startAngle += 2
                points.append(QgsPoint(fetAttr[Longitude], fetAttr[Latitude]))  # end point
                ltefpsFet.setGeometry(QgsGeometry.fromPolygon([points]))
                ltefpsPr.addFeatures([ltefpsFet])
                # 根据字段值渲染颜色
                expression = 'FreqPCI'  # field name
                renderer = QgsCategorizedSymbolRendererV2(expression, categories)
                ltefpsLayer.setRendererV2(renderer)

                ltefpsLayer.updateExtents()
                ltefpsLayer.commitChanges()
                ltefpsLayer.updateFields()
                # 更新图层
                QgsMapLayerRegistry.instance().addMapLayer(ltefpsLayer)
        self.ltefpsdlg.close()
        self.saveEPSGChange()
        self.dlg.close()
Exemplo n.º 10
0
    def gsmfsOKBtn(self):

        currentInputCRS = self.dlg.inputCRS.text().replace(" ", "")

        inputFreq = self.gsmfsdlg.inputFreq.text()
        try:
            sourceLayer = QgsMapLayerRegistry.instance().mapLayersByName(u'2G基础信息图层')[0]
        except:
            self.showErrorDialog(u'未找到图层', u'请检查是否已加载“2G基础信息图层”')
            return

        # 隐藏之前的同名图层
        try:
            sameLayer = QgsMapLayerRegistry.instance().mapLayersByName(u'2G图层频点查找')
            for oneLayer in sameLayer:
                qgis.utils.iface.legendInterface().setLayerVisible(oneLayer, False)
        except:
            pass
        gsmfsLayer = QgsVectorLayer("Polygon?crs=EPSG:"+currentInputCRS, u"2G图层频点查找", "memory")
        gsmfsPr = gsmfsLayer.dataProvider()
        gsmfsPr.addAttributes(self.createAttributesTable('2GFreqSearch'))
        gsmfsLayer.updateFields()

        # QgsMapLayerRegistry.instance().addMapLayer(gsmfsLayer)
        qgis.utils.iface.legendInterface().setLayerVisible(sourceLayer, False)
        gsmfsFet = QgsFeature()
        try:
            inputFreq.replace(" ", "")
            B = int(inputFreq)
        except:
            self.showErrorDialog(u'错误的输入', u'请输入数字')
            return
        A = B - 1
        C = B + 1
        PCI_Types = {
            A: ('#FF63F2', u'频点='+ str(A)),
            B: ('#FFFF00', u'指定频点='+ str(B)),
            C: ('#01FF8D', u'频点='+ str(C)),
            '-1': ('#eeeeee', u'无关频点')
        }
        categories = []
        for pci_type, (color, label) in PCI_Types.items():
            symbol = QgsSymbolV2.defaultSymbol(gsmfsLayer.geometryType())
            symbol.setColor(QColor(color))
            category = QgsRendererCategoryV2(pci_type, symbol, label)
            categories.append(category)

        # 创建属性表
        fetAttrs = []
        relatedAttrs = []
        Longitude, Latitude, Azimuth = 15, 16, 5
        for feature in sourceLayer.getFeatures():
            attrs = feature.attributes()
            if (int(inputFreq) == attrs[3]):
                temp = []
                for j in range(67):
                    temp.append(attrs[j])
                temp.append(B)
                relatedAttrs.append(temp)
            elif int(inputFreq) == int(attrs[3]) - 1:
                temp = []
                for j in range(67):
                    temp.append(attrs[j])
                temp.append(A)
                relatedAttrs.append(temp)
            elif int(inputFreq) == int(attrs[3]) + 1:
                temp = []
                for j in range(67):
                    temp.append(attrs[j])
                temp.append(C)
                relatedAttrs.append(temp)
            else:
                temp = []
                for j in range(67):
                    temp.append(attrs[j])
                    if j == 66:
                        if (int(inputFreq) != attrs[3]) & (int(inputFreq) != int(attrs[3])-1) & (int(inputFreq) != int(attrs[3])+1):
                            temp.append('-1')
                fetAttrs.append(temp)
        for one in relatedAttrs:
            fetAttrs.append(one)
        for fetAttr in fetAttrs:
            gsmfsFet.setAttributes(fetAttr)
            #开始画图
            points = [QgsPoint(fetAttr[Longitude], fetAttr[Latitude])]  # start point
            startAngle = -20
            endAngle = 20
            while startAngle <= endAngle:
                points.append(QgsPoint(fetAttr[Longitude] + 0.001 * math.sin(math.radians(fetAttr[Azimuth] + startAngle)),
                                       fetAttr[Latitude] + 0.001 * math.cos(math.radians(fetAttr[Azimuth] + startAngle))))
                startAngle += 2
            points.append(QgsPoint(fetAttr[Longitude], fetAttr[Latitude]))  # end point
            gsmfsFet.setGeometry(QgsGeometry.fromPolygon([points]))
            gsmfsPr.addFeatures([gsmfsFet])
            #根据字段值渲染颜色
            expression = 'Condition'  # field name
            renderer = QgsCategorizedSymbolRendererV2(expression, categories)
            gsmfsLayer.setRendererV2(renderer)

            gsmfsLayer.updateExtents()
            gsmfsLayer.commitChanges()
            gsmfsLayer.updateFields()
            QgsMapLayerRegistry.instance().addMapLayer(gsmfsLayer)
        self.gsmfsdlg.close()
        self.saveEPSGChange()
        self.dlg.close()