Posted at

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

More than 1 year has passed since last update.


目的

QGISには、地点から円Bufferの作る機能がありますが、四角Bufferの既存機能は、現在ない。

QGISのPython Consoleで四角Bufferを作る方法です。

image.png

:point_right:QGIS2.x用のSOURCE (この記事に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) → 北海道の帯広の東から〜



      • そのほかのmeters unitの座標系(CRS)でもOK:thumbsup_tone2:





QGISでの選択CRSの事例

Capture d’écran 2018-07-25 à 18.41.23.png


四角Bufferの作成


1. レイヤーをClickで選択する

image.png


2. Python Consoleを表示

Capture d’écran 2018-07-25 à 18.46.22.png


3. 下記のCodeをコピー

QGIS version 2.x 用


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 用


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’écran 2018-07-25 à 19.02.11.png


5. 作られた四角Bufferを保存

square_bufferの新レイヤーが保存していないので、Exportを意識してください:bulb:

Capture d’écran 2018-07-25 à 19.04.07.png


まとめ

四角Bufferを作られますが、Console Pythonでcodeのコピペのママです。

よく作成するになれば、QGIS個人ツールを自分で作らた方がいい。

 

 

以上:v_tone2::red_circle::black_circle: