I have a line vector layer with a field name of "buffer_distance". I want create a dissolved buffer layer based on it's field. I write below code:
from qgis.utils import iface
from qgis.analysis import QgsGeometryAnalyzer
mc = iface.mapCanvas()
layer = mc.currentLayer()
Distance_Field = layer.fieldNameIndex("buffer_distance")
QgsGeometryAnalyzer().buffer(layer, "/tmp/buffer.shp", False, True, Distance_Field)
when run this code in QGIS 2.18 python console, It creates a new shapefile with all table fields of input layer but there is not any feature. What is problem?
1 Answer 1
You have several issues in your code.
- Name field too long.
- You don't need index name field as parameter. You need attribute value.
- Wrong parameters number and wrong order.
So, following code works as expected:
from qgis.utils import iface
from qgis.analysis import QgsGeometryAnalyzer
mc = iface.mapCanvas()
layer = mc.currentLayer()
feat = layer.getFeatures().next()
att = feat.attribute('buf_dist')
QgsGeometryAnalyzer().buffer(layer,
"/tmp/buffer.shp",
att,
False,
False,
-1)
After running it at Python Console of QGIS, I got desired buffer (retrieved from "/tmp/buffer.shp"):
as it can see at above image.
Editing Note:
In this case I would use QgsGeometry class because it also has a buffer method. Following code does the work:
mc = iface.mapCanvas()
layer = mc.currentLayer()
feats = [ feat for feat in layer.getFeatures() ]
buffers = [ feat.geometry().buffer(feat.attribute('buf_dist'), -1).exportToWkt()
for feat in feats ]
epsg = layer.crs().postgisSrid()
uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"
mem_layer = QgsVectorLayer(uri,
'buffers',
'memory')
prov = mem_layer.dataProvider()
feats = [ QgsFeature() for i in range(len(buffers)) ]
for i, feat in enumerate(feats):
feat.setAttributes([i])
feat.setGeometry(QgsGeometry.fromWkt(buffers[i]))
prov.addFeatures(feats)
QgsMapLayerRegistry.instance().addMapLayer(mem_layer)
I tried it out with line layer of following image:
and it works as expected.
-
Hi @xunilk, I used your code but it created equal buffer size for each feature while in my field there are different values.HMadadi– HMadadi2017年10月24日 19:52:48 +00:00Commented Oct 24, 2017 at 19:52
-
It seems "att" in QgsGeometryAnalyzer is first value that used to create buffer size for all features.HMadadi– HMadadi2017年10月24日 20:19:26 +00:00Commented Oct 24, 2017 at 20:19
-
1In this case I would use QgsGeometry class because it also has a buffer method. Please, see my Editing Note.xunilk– xunilk2017年10月24日 20:58:55 +00:00Commented Oct 24, 2017 at 20:58
-
in second code Is it possible to dissolve buffers?HMadadi– HMadadi2017年10月25日 03:51:58 +00:00Commented Oct 25, 2017 at 3:51
-
1Yes, it's possible. You can use gdalogr:dissolvepolygons, qgis:dissolve or grass:v.dissolve processing methods. I recommend qgis:dissolve because it has less parameters.xunilk– xunilk2017年10月25日 13:01:03 +00:00Commented Oct 25, 2017 at 13:01