QGISを使用して属性値に基づいてポリゴン内に等間隔のポイントを作成しますか?


11

ポリゴン内の個人の数を表す属性値が添付されたポリゴンレイヤーがあります。QGIS 3.0を使用しています。

ポリゴン内のポイントのグリッドとしてカウントを視覚化する必要があります(つまり、1ポイント= 100カエル、正貨で色付けされています)。ポイントは必ずしもポリゴン全体を占める必要はなく、特定の解像度できちんとしたグリッドを表すことができるように、事前に定義された間隔(300 m)で重心の周りに描かれることが好ましい。

私が見つけた現在の回避策は、カウントパラメータで「通常のポイント」を使用して、マップに描かれた範囲内にグリッドを作成し、アルゴリズムによって作成された余分なポイントを削除することです(アルゴリズムはグリッドにラウンドし、17ではなく20ポイント入力)。これにより望ましい結果が得られますが、各ポリゴンの通常のポイントの領域の範囲を描画し、作成されたポイントの手動属性入力とクリーンアップが必要になります。さらに、間隔ではなくカウントを指定して「通常のポイント」を実行しているため、各ポリゴンには異なる間隔でポイントが割り当てられます。

簡単に言うと、各ポリゴン(バッチ)の通常のポイント(定義済みのポイント数、描画範囲)>追加ポイントの削除>#ポイントに属性値を割り当てます

代替(不規則な間隔を回避しますが、さらに操作が必要です):

レイヤー全体の範囲内の標準ポイント(定義された間隔、300m)>ポリゴン範囲にクリップ>必要なポイント数が得られるまで各ポリゴンの余分なポイントを削除>属性値をポイントに割り当てます。

私の回避策の主な問題は、ポリゴンごとの処理です。これにより、データを更新し、より多くのポリゴンを処理することが難しくなります。

同様の質問が、QGISのポリゴン内に規則的に間隔を置いて定義されたポイント数作成するように求められましたが、詳細は異なります。

望ましい結果のスクリーンショット:

属性テーブルL:


1
質問の画像は、結果として期待するものを表していますか?色付きのポイントのカウントはどこから来ますか?レイヤーの属性テーブルを追加できますか?特にエドモントンとシャーウッドパークを含むポリゴンの属性は、色と数をよりよく理解するためのものです。
カディールŞahbaz18年

1.これはマスクされたデータで、実際のポリゴンとはあまり関係ありませんが、そういう結果になると思いますが、ポリゴンの中心にドットがあります。2.カウントは属性テーブルの列から取得します。3列/ポイントタイプのポイントがあるため、それらを1列に集約して、最初にポリゴンごとに正しい数のポイントを取得し、次に式を使用して属性/色を割り当てます。編集:質問にExcelテーブルを追加しました。値を表すのではなく、データの構造を表します。
ルスラン

回答:


5

QGIS 3には、グリッドと呼ばれるクラスターレンダラーの新しいディスプレイスメントメソッドが付属しています。これはほとんどあなたが必要とするもののように見えます。ポリゴンの重心に必要な数のポイントを作成するだけです。

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

guiツールでのみポイントを生成する方法は知りませんが、比較的単純なpythonスクリプトでそれを行う必要があります。

with edit(point_layer):
    for polygon_feature in polygon_layer.getFeatures():
        point_feature = QgsFeature(point_layer.fields())
        point_feature.setGeometry(polygon_feature.geometry().centroid())

        point_feature['type'] = 'Frog'
        for i in range(polygon_feature['Frogs']):
            point_layer.addFeature(point_feature)

        point_feature['type'] = 'Cat'
        for i in range(polygon_feature['Cats']):
            point_layer.addFeature(point_feature)

        point_feature['type'] = 'Diplodoc'
        for i in range(polygon_feature['Diplodocs']):
            point_layer.addFeature(point_feature)

夢中になりたい場合は、カスタム処理アルゴリズムでそれをラップします。


Matthiasに感謝します。他のソリューションよりも優れているようです。これを実現するために、属性テーブルに基づいて目的のポイント数をすばやく作成する方法を提案できますか?
ルスラン

ちょっとしたpythonスクリプトを書く以外に、簡単な方法を知りません。コードは完全にテストされていないため、いくつかのタイプミスがある可能性があります;)
マティアスクーン

再度、感謝します。多くのレイヤー/エクステントなどに対して同様の視覚化を行う必要があるため、少なくともこのための処理モデルを構築しようとします。
ルスラン

5

サラスSRKの答えから刺激を受ける別の方法かもしれません:

  1. ポリゴンの重心
  2. 正方形の式を使用し、スケールに合わせてバッファを使用します。つまり、(1000 *(sqrt( "Frogs" + "Cats" + "Diplodocs" / 2))+ 1およびSegment = 1、End cap style = Square
  3. バッファのスケールと一貫した間隔を持つ新しいグリッドポイント。
  4. バッファーレイヤーと交差しないポイントを削除(場所で選択)
  5. 位置による属性の結合(バッファーまたは元のポリゴンの属性)

それでも、あなたはこのようなものを持つでしょう ここに画像の説明を入力してください

  1. グラフィカルモデラーを使用して、コマンド「@row_number」で新しいフィールドを作成します ここに画像の説明を入力してください

  2. バッファーレイヤーで反復を使用してモデルを実行する ここに画像の説明を入力してください

  3. すべての新しいレイヤーを統合

  4. フィールドの合計より大きいID_ptフィールドを持つすべてのポイントを削除します( "Frogs" + "Cats" + "Diplodocs")

  5. ルールで分類する(つまり、
    • 「ID_pt」<=「カエル」
    • 「ID_pt」>「カエル」および「ID_pt」<=(「猫」+「カエル」)
    • "ID_pt">( "猫" + "カエル")および "ID_pt" <=( "猫" + "カエル" + "Diplodocs") ここに画像の説明を入力してください

これをありがとう!今日はこれを試す時間はありませんが、あなたが望む出力を得たことを考えると、実行可能な解決策のようです。
ルスラン

1

これにはジオメトリジェネレータを使用できます。

  1. シンボルに3つのサブレイヤーを追加します(色/属性ごとに1つ)。
  2. 各サブレイヤーのマルチポリゴンを生成する式を作成します。
  3. ハードパーツになりました。属性に基づいてマルチポリゴンの正方形パーツを生成します。これには、カスタムのPython式関数が必要になると思います。
  4. オプションで、map-scaleのレンダリング変数を使用して、ポリゴンのスケーリングと間隔を決定します。

申し訳ありませんが、完全な答えを得るには忙しすぎますが、このレシピから何かを調理しようとするのは非常に興味深い挑戦です。誰かがこれに基づいて素敵なソリューションを提供してくれるかもしれません。
マティアスクーン

1

1つの解決策は、各ポリゴンの重心にポイントを持つポイントレイヤーを作成することです。たとえば、エドモントンの重心25で重なった例:5はカエル属性、20は猫、0は外交官です。

次に、グリッドとして設定されたPlacementメソッドでポイントディスプレイスメントレンダラーを使用すると、効果を得ることができるはずです。

難点は、ポイントレイヤーを作成することです。


0

非常に簡単な代替方法は、レイヤーのプロパティで利用可能な円グラフを使用することですか?属性とサイズは、式で指定できます。

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


2
さて、データをマッピングする別の方法について知っています。問題のポイントは、その視覚化ワークフローを可能にすることです。グリッドを見ると、個人の数を非常によく理解できるため、円グラフは実際には機能しません。円グラフから各ポリゴンの正確な個々のカウントを推定しようとすることはほとんど不可能です。
ルスラン

0

多角形の重心から始まるスパイラルパス上にポイントを生成できます。次のStack Overflowの投稿には、等距離のポイントを作成するpythonコードがありますが、空き時間がないため、現時点ではテストできません。


十分に近いようですが、質問で述べたように、私はこれをコーディングする/そこに提案されているコードを変更するのに十分ではありません。
ルスラン

十分な知識と時間を持っている人がチャイムインすることを
願っ

0

あなたの場合、

  1. AOI全体に与えられた距離を使用して、等間隔のポイントを作成します
  2. すべてのポリゴンの重心点を作成します(入力)。
  3. セグメント値が「1」の固定距離バッファを使用して、その重心ポイントのバッファを作成します。円ではなく正方形のバッファーを作成します(バッファーポリゴンを回転する場合は、Qgisで回転ツールを使用します)。
  4. ベクトル->調査ツール->場所で選択(ポリゴンルール内のポイント)を使用して、バッファーポリゴン内にあるポイントの選択を作成します。
  5. 選択を切り替え、バッファポリゴン外のポイントを削除します。これで、ポリゴンの重心の周りに規則的に間隔を置いたポイントが得られました。
  6. ポイント全体のマジョリティ属性を指定し、残りのポイントは手動で分類する必要があります。QuickMultiAttributeEditツールを使用して、属性を簡単に更新します。

おかげで、これは処理ステップを削減するようですが、これは手動で選択する必要がある問題を解決しません(ポリゴン内のバッファはサイズ=ポリゴンあたりの同じポイント数です)、削除し、それぞれの作成されたポイントの属性を作成しますこれと私のワークフローの主な問題であるポリゴン。
ルスラン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.