コード例 #1
0
def copyMainLayer(layer, CRS, folder):
    fields = layer.pendingFields()

    layerPath = layer.dataProvider().dataSourceUri().split('|')[0]
    baseName = os.path.split(layerPath)[-1].replace(".shp", '')
    path = os.path.join(
        folder, os.path.join('MainLayers', 'Main_' + str(baseName) + '.shp'))
    if os.path.isfile(path):
        return False

    layerType = QGis.WKBPolygon
    newlayer = QgsVectorFileWriter(path, "utf-8", fields, layerType, CRS,
                                   "ESRI Shapefile")

    for feature in layer.getFeatures():
        NewFeature = QgsFeature()  # Create an empty feature
        NewFeature.setGeometry(feature.geometry())  # Set feature geometry
        NewFeature.setAttributes(feature.attributes())  # Set attributes
        #  Update feature to the new layer
        newlayer.addFeature(NewFeature)
    del newlayer

    newAttr = createNewAttrs(fields)

    newlayer = QgsVectorLayer(path, QFileInfo(path).baseName(), 'ogr')
    newlayer.startEditing()
    #  Add new attribute field to layer
    newlayer.dataProvider().addAttributes(newAttr)
    newlayer.commitChanges()

    newlayer.startEditing()
    fields = newlayer.pendingFields()
    FB_idx = fields.fieldNameIndex("ForceBound")
    Phx_idx = fields.fieldNameIndex("Physical")
    struct_idx = fields.fieldNameIndex("Recombine")
    geo_idx = fields.fieldNameIndex("geoName")
    for feature in newlayer.getFeatures():
        featId = feature.id()
        featureFields = feature.attributes()
        #  If nothing is written in field "ForceBound" and "Physical", write in
        #  1 in "ForceBound" to show force boundary in preset, and fill "Domain"
        #  in "Physical" to express the physical domain in grid generation.
        if type(featureFields[FB_idx]) == QPyNullVariant:
            attr = {FB_idx: 0}
            newlayer.dataProvider().changeAttributeValues({featId: attr})
        if type(featureFields[Phx_idx]) == QPyNullVariant:
            attr = {Phx_idx: "Domain"}
            newlayer.dataProvider().changeAttributeValues({featId: attr})
        if type(featureFields[struct_idx]) == QPyNullVariant:
            attr = {struct_idx: 1}
            newlayer.dataProvider().changeAttributeValues({featId: attr})
        if type(featureFields[geo_idx]) == QPyNullVariant:
            name = "IS+" + str(feature.id() + 1)
            attr = {geo_idx: name}
            newlayer.dataProvider().changeAttributeValues({featId: attr})
    newlayer.commitChanges()

    return newlayer
コード例 #2
0
    def run(self):
        """Run method that performs all the real work"""

        # show the dialog
        self.dlg.show()
        # Run the dialog event loop
        result = self.dlg.exec_()
        # See if OK was pressed
        if result:
            # Do something useful here - delete the line containing pass and
            # substitute with your code.

            filename = os.path.abspath("Sample_Data/sample_data.shp")
            iface.messageBar().pushMessage("Shapefile loaded ...",
                                           QgsMessageBar.INFO)

            source_layer = iface.addVectorLayer(filename, "sample_data", "ogr")
            centroid = QgsVectorLayer('Point', 'Centroid', 'memory')

            fields = QgsFields()
            fields.append(QgsField("code", QVariant.String))
            fields.append(QgsField("x", QVariant.Double))
            fields.append(QgsField("y", QVariant.Double))

            # Define additional attributes already on the layer level
            centroid_layer = QgsVectorFileWriter(
                centroid, "UTF8", fields, QGis.WKBPoint,
                QgsCoordinateReferenceSystem(4326), "ESRI Shapefile")

            if centroid_layer.hasError() != QgsVectorFileWriter.NoError:
                print("Error when creating centroid: ",
                      centroid_layer.errorMessage())
                iface.messageBar().pushMessage("Feature addition failed.",
                                               QgsMessageBar.CRITICAL)

            centroid_layer.startEditing()
            # Loop over all features
            for source_feature in source_layer.getFeatures():
                geometry = source_feature.geometry()
                centroid = geometry.centroid().asPoint()
                pts = [Centroid]
                name = source_feature["code"]

                # Create the new feature with the fields of the ogr layer
                # And set geometry and attribute before adding it to the target layer
                centroid_feature = QgsFeature(source_layer.fields())
                centroid_feature = source_feature.attributes()
                centroid_feature.setAttributes(centroid_feature)
                centroid_feature.setGeometry(centroid)
                centroid_feature['code'] = name
                centroid_layer.addFeature(centroid_feature)

                # Loop centroids to shapefile
                for x, y in pts:
                    centroid_feature = QgsFeature()
                    point = QgsPoint(x, y)
                    centroid_feature.setGeometry(QgsGeometry.fromPoint(point))
                    centroid_feature.setAttributes(attrs)
                    prov.addFeatures([centroid_feature])

            centroid_layer.commitChanges()

            # Add the layer to the registry
            QgsMapLayerRegistry.instance().addMapLayer(centroid_layer)

            # Save centroid layer as csv format
            QgsVectorFileWriter.writeAsVectorFormat(
                centroid_layer,
                r'extract_centroid',
                "utf-8",
                None,
                "CSV",
                layerOptions='GEOMETRY=AS_XYZ')
            iface.messageBar().pushMessage("Extract centroid saved as csv ...",
                                           QgsMessageBar.INFO)