PythonでQGISのポイントの周りに正方形のバッファーを作成しますか?


8

緯度/経度のx、y座標があり、それらの周囲に5x5度の正方形のセルを作成する必要があります。緯度/経度の座標は重心です。

私の最初のオプションは、1セグメントと1/2(5°)* sqrt(2)の距離を持つ重心の周りにバッファーを作成することです(sqrt(2)を掛ける必要があります)bcツールは四角形の角に重心を使用します重心からエッジまでのバッファ距離)。これにより、ポイントの周りに横向きの四角形が表示され、各フィーチャが45度回転します。距離が正確ではなく、個々のバッファ機能をすばやく回転させる方法がわからないので、これを行わないほうがよいでしょう。

私の2番目のオプションは、はるかに単純に思えますが、必要な距離((1/2)* 5°)で重心の周りにバッファーを作成し、ArcMapのフィーチャからエンベロープツールのようなものを使用します。

ここで誰かが同じ質問をして答えが出たようですが、プログラムでそれを行う方法がわかりません。

回答:


19

前の段落で疑問に思っているように、PyQGISを使用してプログラムでそれを行うことはそれほど難しくありません。次のコードを試すことができます。ただし、シェープファイルと投影座標をメートル単位で使用しました(バッファーには1000 mがあります)。いくつかの変更を行うだけで済みます。

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)

上記のコードをQGISのPythonコンソールで実行すると、次の結果が得られました。

ここに画像の説明を入力してください

できます。

ノートの編集:

次のコードは、属性テーブルで、各ポイントのx座標、y座標、ID番号の列を紹介します。

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)

QGISのPythonコンソールで新しいコードを実行すると、結果は次のようになります。

ここに画像の説明を入力してください


お返事ありがとうございます。最終的な出力ポリゴンにポイントの属性が含まれるように、これをどのように変更しますか?
srha

ウィッチポイントの属性?
xunilk 2016

1
これは別の質問ですが、私の編集メモに回答があります。
xunilk 2016

2
QGIS 3(このコメントを書いている時点では2.99)でこれを試す人QgsMapLayerRegistryは、最後の行をに置き換えてくださいQgsProject。詳細情報については参照この
Techie_Gus

1
-1完全に循環するバッファのデフォルトです。1を使用すると4サイドバッファーが取得され、2は8サイドバッファー(4 + 4)が取得され、3は12サイドバッファー(8 + 4)が取得されます。
xunilk 2018

4

QGIS 3は迅速かつダーティな代替手段を提供します:-ベクター->ジオプロセシングツール->バッファー

ポイントレイヤーを入力レイヤーとして選択し、エンドキャップのスタイルが正方形に設定され、距離が目的の正方形の長さの半分であることを確認します(したがって、1辺が1kmの正方形の距離は500mにする必要があります)。


1

ポイントを正方形に変換native:bufferするには、END_CAP_STYLEパラメーターを2(正方形)に設定してアルゴリズムを処理して みます。

警告!結果は異なる場合があり、入力レイヤーの座標系によって異なります。たとえば、WGS 84を使用して距離を5000これに設定すると、(メートルではなく)5000 度の正方形の線になります。

ここに画像の説明を入力してください

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

使用例:

buffer_result = buffer(input=r'C:\input.shp', distance=5000, output=r'C:\output.shp')
print(buffer_result)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.