QGISでの四角バッファ作成方法

#目的
QGISには、地点から円Bufferの作る機能がありますが、四角Bufferの既存機能は、現在ない。
QGISのPython Consoleで四角Bufferを作る方法です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168196/2e76b4cf-840f-b70e-3e53-349ef80a5b3d.png)

[:point_right:QGIS2.x用のSOURCE ](https://gis.stackexchange.com/questions/210295/how-to-create-square-buffers-around-points-in-qgis-with-python) (この記事にQGIS3.xも対応してる)


#はじめに
##**地点データの座標系(CRS)を意識しましょう**:earth_africa:
- 円Bufferを作っても、バッファー処理を実行する前にinput Point dataの座標系(CRS)を確認してください
    - → 緯度経度関係の座標系だと(WGS84, SRID 4326)、バッファーの距離を500に設定する場合、500度のバッファーを作成される:scream:
    - 座標系に修正したければ、Input 地点データのレイヤーからExportして、下記の座標系で選択してください
        - UTM 51 N (SRID 32651) →　沖縄辺
        - UTM 52 N (SRID 32652) →　九州〜広島・松山辺
        - UTM 53 N (SRID 32653) →　広島〜大阪〜静岡辺
        - UTM 54 N (SRID 32654) →　静岡〜関東〜東北〜北海道
        - UTM 55 N (SRID 32655) →　北海道の帯広の東から〜
            - [出典](http://www.hcc.co.jp/solutionhp/gismap/mesh10km/tokyo/utm/55.html)
        - そのほかのmeters unitの座標系(CRS)でもOK:thumbsup_tone2:

QGISでの選択CRSの事例
![Capture d’écran 2018-07-25 à 18.41.23.png](https://qiita-image-store.s3.amazonaws.com/0/168196/dbdfd984-2764-169e-451c-811b4166499c.png)


#四角Bufferの作成
####1. レイヤーをClickで選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168196/bb6df353-7b26-38eb-42d3-423ba74972fa.png)

####2. Python Consoleを表示
![Capture d’écran 2018-07-25 à 18.46.22.png](https://qiita-image-store.s3.amazonaws.com/0/168196/d4100071-6384-155f-076f-bb5d94bcd431.png)

####3. 下記のCodeをコピー
QGIS version 2.x 用

```python:QGIS2用 
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(500, -1).boundingBox().asWktPolygon()
    new_feat.setGeometry(QgsGeometry.fromWkt(tmp_feat))
    prov.addFeatures([new_feat])

##### QGIS 2.x の場合
QgsMapLayerRegistry.instance().addMapLayer(mem_layer) 

```

QGIS version 3.x 用

```python:QGIS3用 
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(500, -1).boundingBox().asWktPolygon()
    new_feat.setGeometry(QgsGeometry.fromWkt(tmp_feat))
    prov.addFeatures([new_feat])


##### QGIS 3.x の場合
QgsProject.instance().addMapLayer(mem_layer) 
```

**※ このラインに距離を設定できる** (下記に500m)
`tmp_feat = feat.geometry().buffer(500, -1).boundingBox().asWktPolygon()`
####4. Python ConsoleにPasteしてから実行
Consoleの下の部分にPasteしたらこの感じになり、Enterで実行する
![Capture d’écran 2018-07-25 à 19.02.11.png](https://qiita-image-store.s3.amazonaws.com/0/168196/2bab1b78-0069-9465-e214-ad1c3934a6c7.png)

####5. 作られた四角Bufferを保存
square_bufferの新レイヤーが保存していないので、Exportを意識してください:bulb:
![Capture d’écran 2018-07-25 à 19.04.07.png](https://qiita-image-store.s3.amazonaws.com/0/168196/6974d0d1-1469-bc13-e004-d98fbdb8dd02.png)

#まとめ
四角Bufferを作られますが、Console Pythonでcodeのコピペのママです。
よく作成するになれば、QGIS個人ツールを自分で作らた方がいい。


　
　

以上:v_tone2::red_circle::black_circle: