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