Create square buffers around points in QGIS with Python?
As you wondering in your last paragraph, to do that programmatically with PyQGIS it is not very difficult. You can try out next code. However, I used a shapefile and projected coordinates in meters (buffer has 1000 m). You only would need to do a few changes.
layer = iface.activeLayer()
feats = [ feat for feat in layer.getFeatures() ]
epsg = layer.crs().postgisSrid()
uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"
mem_layer = QgsVectorLayer(uri,
'square_buffer',
'memory')
prov = mem_layer.dataProvider()
for i, feat in enumerate(feats):
new_feat = QgsFeature()
new_feat.setAttributes([i])
tmp_feat = feat.geometry().buffer(1000, -1).boundingBox().asWktPolygon()
new_feat.setGeometry(QgsGeometry.fromWkt(tmp_feat))
prov.addFeatures([new_feat])
QgsMapLayerRegistry.instance().addMapLayer(mem_layer)
After running the above code at the Python Console of QGIS, I got:
It works.
Editing Note:
Next code introduces at the attributes table a column for the x-coordinate, y-coordinate, and ID number for each point.
layer = iface.activeLayer()
feats = [ feat for feat in layer.getFeatures() ]
epsg = layer.crs().postgisSrid()
uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer&field=x:real&field=y:real&field=point_id:integer""&index=yes"
mem_layer = QgsVectorLayer(uri,
'square_buffer',
'memory')
prov = mem_layer.dataProvider()
for i, feat in enumerate(feats):
point = feat.geometry().asPoint()
new_feat = QgsFeature()
new_feat.setAttributes([i, point[0], point[1], feat.id()])
tmp_feat = feat.geometry().buffer(1000, -1).boundingBox().asWktPolygon()
new_feat.setGeometry(QgsGeometry.fromWkt(tmp_feat))
prov.addFeatures([new_feat])
QgsMapLayerRegistry.instance().addMapLayer(mem_layer)
After running the new code at the Python Console of QGIS, result was:
QGIS 3 provides a quick and dirty alternative: - Vector --> Geoprocessing tools --> Buffer
Select your point layer as an input layer, make sure that the end cap style is set to square and the distance should be half of the intended square length (so a 1km-per-side square should have a Distance of 500m).
To transform points into squares you can try native:buffer
processing algorithm with
END_CAP_STYLE
parameter set to 2
(square).
Warning! Results may vary and depend on input layer's coordinate system. In exapmle, if you use WGS 84 and set distance to 5000
this will result in a square line of 5000 degrees (not meters).
Tested with pyQGIS 3.6.1:
def buffer(input, distance, output, before_processing_reproject_to_epsg_number=None):
params = {'INPUT': input,
'DISTANCE': distance,
'END_CAP_STYLE': 2 , # - 0: Round - 1: Flat - 2: Square
'DISSOLVE': False,
'OUTPUT': output}
feedback = qgis.core.QgsProcessingFeedback()
alg_name = 'native:buffer'
# print(processing.algorithmHelp(alg_name)) # tool tips
result = processing.run(alg_name, params, feedback=feedback)
return result
Usage example:
buffer_result = buffer(input=r'C:\input.shp', distance=5000, output=r'C:\output.shp')
print(buffer_result)