本文整理汇总了Python中qgis.core.QgsVectorLayer.commitChanges方法的典型用法代码示例。如果您正苦于以下问题:Python QgsVectorLayer.commitChanges方法的具体用法?Python QgsVectorLayer.commitChanges怎么用?Python QgsVectorLayer.commitChanges使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类qgis.core.QgsVectorLayer
的用法示例。
在下文中一共展示了QgsVectorLayer.commitChanges方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: _create_points
# 需要导入模块: from qgis.core import QgsVectorLayer [as 别名]
# 或者: from qgis.core.QgsVectorLayer import commitChanges [as 别名]
def _create_points(self):
"""Create points for testing"""
point_layer = QgsVectorLayer('Point?crs=EPSG:4326', 'points', 'memory')
point_provider = point_layer.dataProvider()
point_provider.addAttributes([QgsField('X', QVariant.Double)])
point_provider.addAttributes([QgsField('Y', QVariant.Double)])
x_index = point_provider.fieldNameIndex('X')
y_index = point_provider.fieldNameIndex('Y')
point_layer.startEditing()
for x in [10.0, 20.0, 30.0]:
for y in [10.0, 20.0, 30.0]:
feature = QgsFeature()
feature.initAttributes(2)
feature.setAttribute(x_index, x)
feature.setAttribute(y_index, y)
# noinspection PyCallByClass
geom = QgsGeometry.fromPoint(QgsPoint(x, y))
feature.setGeometry(geom)
_ = point_layer.dataProvider().addFeatures([feature])
point_layer.commitChanges()
return point_layer
示例2: create_layer
# 需要导入模块: from qgis.core import QgsVectorLayer [as 别名]
# 或者: from qgis.core.QgsVectorLayer import commitChanges [as 别名]
def create_layer(self, data):
display_name = 'some-layer'
uri = 'Point?crs=epsg:4326&index=yes&uuid=%s' % uuid.uuid4()
vlayer = QgsVectorLayer(uri, display_name, 'memory')
QgsMapLayerRegistry.instance().addMapLayer(vlayer)
provider = vlayer.dataProvider()
vlayer.startEditing()
provider.addAttributes([
QgsField('population_density', QtCore.QVariant.Double),
])
features = []
for x, y, density in data:
feat = QgsFeature()
geom = QgsGeometry.fromPoint(QgsPoint(x, y))
feat.setGeometry(geom)
feat.setAttributes([density])
features.append(feat)
provider.addFeatures(features)
vlayer.commitChanges()
vlayer.updateExtents()
self.canvas.setExtent(vlayer.extent())
cl = QgsMapCanvasLayer(vlayer)
self.canvas.setLayerSet([cl])
vlayer.triggerRepaint()
示例3: create_layer
# 需要导入模块: from qgis.core import QgsVectorLayer [as 别名]
# 或者: from qgis.core.QgsVectorLayer import commitChanges [as 别名]
def create_layer(vector):
"""Create empty layer.
The CRS and Geometry Type of new layer are the same as of vector layer.
Attributes of the layer are copied from vector.
:param vector: Vector layer
:type vector: QgsVectorLayer
:returns: Empty vector layer (stored in memory)
:rtype: QgsVectorLayer
"""
crs = vector.crs().toWkt()
if vector.geometryType() == 0:
# We can create layer from Point. Do not need to split it.
uri = "Point?crs=" + crs
elif vector.geometryType() == 1:
uri = "LineString?crs=" + crs
elif vector.geometryType() == 2:
uri = "Polygon?crs=" + crs
else:
msg = "Received unexpected type of layer geometry: %s" % (vector.geometryType(),)
raise WrongDataTypeException(msg)
result_layer = QgsVectorLayer(uri, "intersected", "memory")
result_provider = result_layer.dataProvider()
result_layer.startEditing()
# Copy fields from vector
vector_provider = vector.dataProvider()
fields = vector_provider.fields()
result_provider.addAttributes(fields.toList())
result_layer.commitChanges()
return result_layer
示例4: add_flooded_field
# 需要导入模块: from qgis.core import QgsVectorLayer [as 别名]
# 或者: from qgis.core.QgsVectorLayer import commitChanges [as 别名]
def add_flooded_field(self, shapefile_path):
"""Create the layer from the local shp adding the flooded field.
.. versionadded:: 3.3
Use this method to add a calculated field to a shapefile. The shapefile
should have a field called 'count' containing the number of flood
reports for the field. The field values will be set to 0 if the count
field is < 1, otherwise it will be set to 1.
:param shapefile_path: Path to the shapefile that will have the flooded
field added.
:type shapefile_path: basestring
:return: A vector layer with the flooded field added.
:rtype: QgsVectorLayer
"""
layer = QgsVectorLayer(
shapefile_path, self.tr('Jakarta Floods'), 'ogr')
# Add a calculated field indicating if a poly is flooded or not
# from PyQt4.QtCore import QVariant
layer.startEditing()
field = QgsField('flooded', QVariant.Int)
layer.dataProvider().addAttributes([field])
layer.commitChanges()
layer.startEditing()
idx = layer.fieldNameIndex('flooded')
expression = QgsExpression('state > 0')
expression.prepare(layer.pendingFields())
for feature in layer.getFeatures():
feature[idx] = expression.evaluate(feature)
layer.updateFeature(feature)
layer.commitChanges()
return layer
示例5: testUpdatedFields
# 需要导入模块: from qgis.core import QgsVectorLayer [as 别名]
# 或者: from qgis.core.QgsVectorLayer import commitChanges [as 别名]
def testUpdatedFields(self):
"""Test when referenced layer update its fields
https://issues.qgis.org/issues/20893
"""
ml = QgsVectorLayer("Point?srid=EPSG:4326&field=a:int", "mem", "memory")
self.assertEqual(ml.isValid(), True)
QgsProject.instance().addMapLayer(ml)
ml.startEditing()
f1 = QgsFeature(ml.fields())
f1.setGeometry(QgsGeometry.fromWkt('POINT(2 3)'))
ml.addFeatures([f1])
ml.commitChanges()
vl = QgsVectorLayer("?query=select a, geometry from mem", "vl", "virtual")
self.assertEqual(vl.isValid(), True)
# add one more field
ml.dataProvider().addAttributes([QgsField('newfield', QVariant.Int)])
ml.updateFields()
self.assertEqual(ml.featureCount(), vl.featureCount())
self.assertEqual(vl.fields().count(), 1)
geometry = next(vl.getFeatures()).geometry()
self.assertTrue(geometry)
point = geometry.asPoint()
self.assertEqual(point.x(), 2)
self.assertEqual(point.y(), 3)
QgsProject.instance().removeMapLayer(ml)
示例6: testGeopackageLargeFID
# 需要导入模块: from qgis.core import QgsVectorLayer [as 别名]
# 或者: from qgis.core.QgsVectorLayer import commitChanges [as 别名]
def testGeopackageLargeFID(self):
tmpfile = os.path.join(self.basetestpath, 'testGeopackageLargeFID.gpkg')
ds = ogr.GetDriverByName('GPKG').CreateDataSource(tmpfile)
lyr = ds.CreateLayer('test', geom_type=ogr.wkbPoint)
lyr.CreateField(ogr.FieldDefn('str_field', ogr.OFTString))
ds = None
vl = QgsVectorLayer(u'{}'.format(tmpfile) + "|layername=" + "test", 'test', u'ogr')
f = QgsFeature()
f.setAttributes([1234567890123, None])
self.assertTrue(vl.startEditing())
self.assertTrue(vl.dataProvider().addFeatures([f]))
self.assertTrue(vl.commitChanges())
got = [feat for feat in vl.getFeatures()][0]
self.assertEqual(got['fid'], 1234567890123)
self.assertTrue(vl.startEditing())
self.assertTrue(vl.changeGeometry(1234567890123, QgsGeometry.fromWkt('Point (3 50)')))
self.assertTrue(vl.changeAttributeValue(1234567890123, 1, 'foo'))
self.assertTrue(vl.commitChanges())
got = [feat for feat in vl.getFeatures()][0]
self.assertEqual(got['str_field'], 'foo')
got_geom = got.geometry()
self.assertIsNotNone(got_geom)
self.assertTrue(vl.startEditing())
self.assertTrue(vl.deleteFeature(1234567890123))
self.assertTrue(vl.commitChanges())
示例7: __createMemoryLayer
# 需要导入模块: from qgis.core import QgsVectorLayer [as 别名]
# 或者: from qgis.core.QgsVectorLayer import commitChanges [as 别名]
def __createMemoryLayer(self, layer_name, gtype, geometries, attributes, fNames, fTypes):
"""
Create a memory layer from parameters
:param layer_name: name for the layer
:param gtype: geometry type of the layer
:param geometries: objects geometries
:param attributes: objects attributes
:param fNames: fields names
:param fTypes: fields types
"""
layerList = QgsMapLayerRegistry.instance().mapLayersByName(layer_name)
if layerList:
QgsMapLayerRegistry.instance().removeMapLayers([layerList[0].id()])
epsg = self.canvas().mapRenderer().destinationCrs().authid()
fieldsParam = ""
for i in range(len(fNames)):
fieldsParam += "&field=" + fNames[i] + ":" + fTypes[i]
layer = QgsVectorLayer(gtype + "?crs=" + epsg + fieldsParam + "&index=yes", layer_name, "memory")
QgsMapLayerRegistry.instance().addMapLayer(layer)
layer.startEditing()
for i in range(len(geometries)):
feature = QgsFeature()
feature.setGeometry(QgsGeometry().fromWkt(geometries[i]))
fields = layer.pendingFields()
feature.setFields(fields)
for j in range(len(fNames)):
feature.setAttribute(fNames[j], attributes[i][j])
layer.addFeature(feature)
layer.commitChanges()
示例8: testEditGeoJsonAddFieldAndThenAddFeatures
# 需要导入模块: from qgis.core import QgsVectorLayer [as 别名]
# 或者: from qgis.core.QgsVectorLayer import commitChanges [as 别名]
def testEditGeoJsonAddFieldAndThenAddFeatures(self):
""" Test bugfix of https://issues.qgis.org/issues/18596 (adding a new field)"""
datasource = os.path.join(self.basetestpath, 'testEditGeoJsonAddField.json')
with open(datasource, 'wt') as f:
f.write("""{
"type": "FeatureCollection",
"features": [
{ "type": "Feature", "properties": { "x": 1 }, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } } ] }""")
vl = QgsVectorLayer(datasource, 'test', 'ogr')
self.assertTrue(vl.isValid())
self.assertTrue(vl.startEditing())
self.assertTrue(vl.addAttribute(QgsField('strfield', QVariant.String)))
self.assertTrue(vl.commitChanges())
self.assertEqual(len(vl.dataProvider().fields()), 1 + 1)
self.assertEqual([f.name() for f in vl.dataProvider().fields()], ['x', 'strfield'])
f = QgsFeature()
self.assertTrue(vl.getFeatures(QgsFeatureRequest()).nextFeature(f))
self.assertIsNone(f['strfield'])
self.assertEqual([field.name() for field in f.fields()], ['x', 'strfield'])
self.assertTrue(vl.startEditing())
vl.changeAttributeValue(f.id(), 1, 'x')
self.assertTrue(vl.commitChanges())
f = QgsFeature()
self.assertTrue(vl.getFeatures(QgsFeatureRequest()).nextFeature(f))
self.assertEqual(f['strfield'], 'x')
self.assertEqual([field.name() for field in f.fields()], ['x', 'strfield'])
# Completely reload file
vl = QgsVectorLayer(datasource, 'test', 'ogr')
self.assertEqual(len(vl.fields()), 2)
示例9: create_memory_layer
# 需要导入模块: from qgis.core import QgsVectorLayer [as 别名]
# 或者: from qgis.core.QgsVectorLayer import commitChanges [as 别名]
def create_memory_layer(self, layer):
"""Create an in-memory copy of an existing vector layer."""
data_provider = layer.dataProvider()
# create the layer path defining geometry type and reference system
geometry_type = QGis.vectorGeometryType(layer.geometryType())
crs_id = layer.crs().authid()
path = geometry_type + '?crs=' + crs_id + '&index=yes'
# create the memory layer and get a reference to the data provider
memory_layer = QgsVectorLayer(path, 'Cartogram', 'memory')
memory_layer_data_provider = memory_layer.dataProvider()
# copy all attributes from the source layer to the memory layer
memory_layer.startEditing()
memory_layer_data_provider.addAttributes(
data_provider.fields().toList())
memory_layer.commitChanges()
# copy all features from the source layer to the memory layer
for feature in data_provider.getFeatures():
memory_layer_data_provider.addFeatures([feature])
return memory_layer
示例10: pixels_to_points
# 需要导入模块: from qgis.core import QgsVectorLayer [as 别名]
# 或者: from qgis.core.QgsVectorLayer import commitChanges [as 别名]
def pixels_to_points(
raster,
threshold_min=0.0,
threshold_max=float('inf'),
field_name='value'):
"""
Convert raster to points.
Areas (pixels) with threshold_min < pixel_values < threshold_max will be
converted to point layer.
:param raster: Raster layer
:type raster: QgsRasterLayer
:param threshold_min: Value that splits raster to flooded or not flooded.
:type threshold_min: float
:param threshold_max: Value that splits raster to flooded or not flooded.
:type threshold_max: float
:param field_name: Field name to store pixel value.
:type field_name: string
:returns: Point layer of pixels
:rtype: QgsVectorLayer
"""
if raster.bandCount() != 1:
msg = "Current version allows using of one-band raster only"
raise NotImplementedError(msg)
extent = raster.extent()
width, height = raster.width(), raster.height()
provider = raster.dataProvider()
block = provider.block(1, extent, width, height)
# Create points
crs = raster.crs().toWkt()
point_layer = QgsVectorLayer('Point?crs=' + crs, 'pixels', 'memory')
point_provider = point_layer.dataProvider()
point_provider.addAttributes([QgsField(field_name, QVariant.Double)])
field_index = point_provider.fieldNameIndex(field_name)
attribute_count = 1
point_layer.startEditing()
for row in range(height):
for col in range(width):
value = block.value(row, col)
x, y = _get_pixel_coordinates(extent, width, height, row, col)
# noinspection PyCallByClass,PyTypeChecker,PyArgumentList
geom = QgsGeometry.fromPoint(QgsPoint(x, y))
if threshold_min < value < threshold_max:
feature = QgsFeature()
feature.initAttributes(attribute_count)
feature.setAttribute(field_index, value)
feature.setGeometry(geom)
_ = point_layer.dataProvider().addFeatures([feature])
point_layer.commitChanges()
return point_layer
示例11: create_memory_layer
# 需要导入模块: from qgis.core import QgsVectorLayer [as 别名]
# 或者: from qgis.core.QgsVectorLayer import commitChanges [as 别名]
def create_memory_layer(layer, new_name=''):
"""Return a memory copy of a layer
:param layer: QgsVectorLayer that shall be copied to memory.
:type layer: QgsVectorLayer
:param new_name: The name of the copied layer.
:type new_name: str
:returns: An in-memory copy of a layer.
:rtype: QgsMapLayer
"""
if new_name is '':
new_name = layer.name() + ' TMP'
if layer.type() == QgsMapLayer.VectorLayer:
vType = layer.geometryType()
if vType == QGis.Point:
typeStr = 'Point'
elif vType == QGis.Line:
typeStr = 'Line'
elif vType == QGis.Polygon:
typeStr = 'Polygon'
else:
raise MemoryLayerCreationError('Layer is whether Point nor '
'Line nor Polygon')
else:
raise MemoryLayerCreationError('Layer is not a VectorLayer')
crs = layer.crs().authid().toLower()
myUUID = str(uuid.uuid4())
uri = '%s?crs=%s&index=yes&uuid=%s' % (typeStr, crs, myUUID)
memLayer = QgsVectorLayer(uri, new_name, 'memory')
memProvider = memLayer.dataProvider()
provider = layer.dataProvider()
attribute_indexes = provider.attributeIndexes()
vFields = provider.fields()
fields = []
for i in vFields:
fields.append(vFields[i])
memProvider.addAttributes(fields)
provider.select(attribute_indexes)
ft = QgsFeature()
while provider.nextFeature(ft):
memProvider.addFeatures([ft])
if qgis_version() <= 10800:
# Next two lines a workaround for a QGIS bug (lte 1.8)
# preventing mem layer attributes being saved to shp.
memLayer.startEditing()
memLayer.commitChanges()
return memLayer
示例12: create_layer
# 需要导入模块: from qgis.core import QgsVectorLayer [as 别名]
# 或者: from qgis.core.QgsVectorLayer import commitChanges [as 别名]
def create_layer(name, attributes):
layer = QgsVectorLayer("Polygon", name, "memory")
pr = layer.dataProvider()
layer.startEditing()
pr.addAttributes(attributes)
layer.updateFields()
layer.commitChanges()
QgsMapLayerRegistry.instance().addMapLayer(layer)
return layer
示例13: get_poi
# 需要导入模块: from qgis.core import QgsVectorLayer [as 别名]
# 或者: from qgis.core.QgsVectorLayer import commitChanges [as 别名]
def get_poi(self):
try:
client_id = self.dlg.lineEdit_clientID.text()
client_secret = self.dlg.lineEdit_clientSecret.text()
radius = self.dlg.lineEdit_radius.text()
category_name = self.dlg.comboBox_category.currentText()
category_id = foursquare_categories[category_name]
current_date = str(datetime.datetime.now().date()).replace("-", "")
url = "https://api.foursquare.com/v2/venues/search?ll=%s,%s&radius=%s&intent=browse&categoryId=%s&limit=50&client_id=%s&client_secret=%s&v=%s" % (lat, lon, radius, category_id, client_id, client_secret, current_date)
req = urllib2.Request(url)
opener = urllib2.build_opener()
f = opener.open(req)
data = json.loads(f.read())
json_object_count = len(data['response']['venues'])
if json_object_count == 0:
iface.messageBar().pushMessage(u"Info:", "Unfortunately, there is no POI at the specified location...",
level=QgsMessageBar.INFO, duration=5)
else:
iface.messageBar().pushMessage(u"Info:", str(json_object_count) + " POI(s) fetched for " +
category_name + " category", level=QgsMessageBar.SUCCESS, duration=5)
poi_id = []
poi_name = []
poi_lon = []
poi_lat = []
for i in range(0, json_object_count):
poi_id.append(data['response']['venues'][i]['id'])
poi_name.append(data['response']['venues'][i]['name'])
poi_lon.append(data['response']['venues'][i]['location']['lng'])
poi_lat.append(data['response']['venues'][i]['location']['lat'])
coord_pairs = []
layer_name = "POI - %s" % category_name
memory_layer = QgsVectorLayer("Point?crs=epsg:4326", layer_name, "memory")
memory_layer.startEditing()
provider = memory_layer.dataProvider()
provider.addAttributes([QgsField("FoursqID", QVariant.String), QgsField("Name", QVariant.String), QgsField("Category", QVariant.String), QgsField("Date", QVariant.String)])
for fsid, name, x, y in zip(poi_id, poi_name, poi_lon, poi_lat):
geometry = QgsGeometry.fromPoint(QgsPoint(x, y))
feature = QgsFeature()
feature.setGeometry(geometry)
feature.setAttributes([fsid, name, category_name, current_date])
coord_pairs.append(feature)
memory_layer.dataProvider().addFeatures(coord_pairs)
memory_layer.updateExtents()
memory_layer.commitChanges()
QgsMapLayerRegistry.instance().addMapLayer(memory_layer)
except:
iface.messageBar().pushMessage(u"Error:", "Please make sure to drop a pin on Google Map or fill in all \
the fields!", level=QgsMessageBar.CRITICAL, duration=5)
示例14: copyInMemory
# 需要导入模块: from qgis.core import QgsVectorLayer [as 别名]
# 或者: from qgis.core.QgsVectorLayer import commitChanges [as 别名]
def copyInMemory(vLayer, copyName=''):
"""Return a memory copy of a layer
Input
origLayer: layer
copyName: the name of the copy
Output
memory copy of a layer
"""
if copyName is '':
copyName = vLayer.name() + ' TMP'
if vLayer.type() == QgsMapLayer.VectorLayer:
vType = vLayer.geometryType()
if vType == QGis.Point:
typeStr = 'Point'
elif vType == QGis.Line:
typeStr = 'Line'
elif vType == QGis.Polygon:
typeStr = 'Polygon'
else:
raise MemoryLayerCreationError('Layer is whether Point nor '
'Line nor Polygon')
else:
raise MemoryLayerCreationError('Layer is not a VectorLayer')
crs = vLayer.crs().authid().toLower()
myUUID = str(uuid.uuid4())
uri = '%s?crs=%s&index=yes&uuid=%s' % (typeStr, crs, myUUID)
memLayer = QgsVectorLayer(uri, copyName, 'memory')
memProvider = memLayer.dataProvider()
vProvider = vLayer.dataProvider()
vAttrs = vProvider.attributeIndexes()
vFields = vProvider.fields()
fields = []
for i in vFields:
fields.append(vFields[i])
memProvider.addAttributes(fields)
vProvider.select(vAttrs)
ft = QgsFeature()
while vProvider.nextFeature(ft):
memProvider.addFeatures([ft])
if qgisVersion() <= 10800:
# Next two lines a workaround for a QGIS bug (lte 1.8)
# preventing mem layer attributes being saved to shp.
memLayer.startEditing()
memLayer.commitChanges()
return memLayer
示例15: addParcelleMap
# 需要导入模块: from qgis.core import QgsVectorLayer [as 别名]
# 或者: from qgis.core.QgsVectorLayer import commitChanges [as 别名]
def addParcelleMap(self):
'''
Add content in the first page
with a map and basic information
'''
# First add headers
for key, item in list(self.composerTemplates.items()):
if 'sticky' in item:
self.buildComposerLabel(key, item, 0)
# Get feature extent
exp = QgsExpression('"geo_parcelle" = \'%s\'' % self.geo_parcelle)
request = QgsFeatureRequest(exp)
extent = None
features = self.layer.getFeatures(request)
for feature in features:
geom = feature.geometry()
peri = geom.length()
buf = peri / 20
extent = geom.buffer(buf,5).boundingBox()
# Add memory layer to highlight parcelle
if extent:
if self.redlineLayer:
self.mProject.removeMapLayer(self.redlineLayer.id())
crs = self.layer.crs().authid()
vl = QgsVectorLayer("Polygon?crs=" + crs, "temporary", "memory")
pr = vl.dataProvider()
vl.startEditing()
pr.addFeatures([f for f in self.layer.getFeatures(request)])
vl.commitChanges()
vl.updateExtents()
props = vl.renderer().symbol().symbolLayer(0).properties()
props['outline_width'] = u'1'
props['outline_color'] = u'0,85,255,255'
props['outline_style'] = u'solid'
props['style'] = u'no'
vl.renderer().setSymbol(QgsFillSymbol.createSimple(props))
self.mProject.addMapLayer(vl)
self.redlineLayer = vl
# Add composer map & to parcelle
miLayers = self.mInstance.layers()
miLayers.insert( 0, vl )
cm = QgsLayoutItemMap(self.currentComposition)
cm.updateBoundingRect()
cm.setRect(QRectF(0, 0, 286, 190))
cm.setPos(6,15)
cm.setLayers(self.mProject.mapThemeCollection().masterVisibleLayers())
if extent:
cm.zoomToExtent(extent)
cm.setFrameEnabled(True)
cm.setBackgroundEnabled(True)
self.currentComposition.addItem(cm)