QGISの最近傍グループ化選択


14

qgisにインポートしたlat / long形式で100,000以上のポイントを含むリストがあります。

さて、私がここでやろうとしているのは、これらすべてのポイントをボックスグループにグループ化することです。つまり、本質的に、マップを境界ボックスに分割したいということです。

私の要件は次のとおりです。

  • ボックス化されたグループは100ポイント以下、200ポイント以下である必要があります
  • 複数のグループにポイントを配置しないでください
  • すべてのポイントは、最近傍に基づいている必要があります

qgisでこれをどのように達成できますか?

カスタムクエリコードを渡して、結果またはシェープファイルとして作成されたボックスを保存できると仮定していますか?誰かがこれをどのように行うことができ、コードがどのように見えるかを説明してもらえますか?

前述のように、私の目的は、各ボックス内に100個以上、200個以下のプロパティが含まれるシェープファイルレイヤーとして表示される正方形のボックスを作成することです。


6
この質問を「お気に入り」とマークしたすべての人に:なぜそれも賛成しないのですか?お気に入りの質問は良い質問だと思うでしょう。
暗闇

1
なぜボクシングが必要なのですか?カウントに基づいてボックスを作成する場合、とにかくサイズが異なるため、タイリングは問題外です。おそらく、ポリゴン(凸包)にグループ化する方が簡単です。
-diciu

@diciuの回答に感謝します。はい。その後、凸包を箱に変えることができるので、凸包は問題ないでしょう。凸包アプローチを使用してそれを行うには、どのコードを使用する必要がありますか?
-NetConstructor.com

2
凸包を使用すると、バウンディングボックス(包を囲む)が重なり、1つのBBOX内にあるポイントの要件が満たされなくなります。凸包は、BBOXへの中間ステップとしてではなく、代わりとして機能します。その場合でも、一般的なソリューションの作成はかなり複雑になります。
-diciu

回答:


13

(a)ポイントのセットの最東半分と(b)ポイントのセットの最北半分を要求する方法を理解していると仮定することで、その方法の一部を得ることができます。もちろん、これらから(c)最西端または(d)最南端を簡単に取得できます。(私はQGISを知りませんが、(a)一般に行う方法の1つは、中央のx座標を要求し、それを超えるx座標を持つすべてのポイントを取得することです。(b)-(d)の解は同様です)

この機能を使用すると、簡単な再帰でソリューションを取得できます。それを説明するHalfために、前の操作を実装するプロシージャがあり、2つの引数を取ると仮定します。1つ目はポイントのセット、2つ目はtrue東西分割が必要な場合に等しく、falseそれ以外の場合に等しいコードです。要求されたとおりにパーティション化する入力の2つのサブセットを返します。

Procedure Box(P: set of points, i: boolean, n: integer)
Begin
    If (Count(P) > 2*n) then
        {R,S} = Half(P,i)
        Q = Box(R,!i,n) + Box(S,!i,n)
    Else
        Q = {P}
    Endif
    Return Q
End

この擬似コードでは、RとSはPを分割します。Box(R、!i、n)はRの直交方向のパーティション、Box(S、!i、n)はSの直交方向のパーティション、「+」は集合論的和集合を形成することを意味し、 {}はセットを指定します。(分割方向を変更すると、ストリップではなくボックスが作成されます。)パラメーターnは、パーティション内のグループの最小サイズを指定します。最大サイズは2 nです。

例

ここでは、例として、Box(P,true,100)サイズが100〜200のグループに分割された12,891個のランダムポイントのセットPがあります。アルゴリズムは128個のボックスを作成し、そのうち37個は100ポイント、91個は101ポイントです。


2
アルゴリズムは効率的です。シングルコアで実行し、18秒で10倍のポイント(128,910)を処理しました。nポイントのO(n log(n)log(n))としてスケーリングします。(log(n)のこれらの要因の1つを削除するように改善することもできますが、努力する価値はありそうにありません。)
whuber

1
@W辞書編集ソートを使用して、ポイント座標の分割を容易にしましたか?

2
@whuberこれはすごいです
dassouki

1
@Dan字句ソートは役立ちますが、必須ではありません。n値の中央値はO(n)時間(O(n log(n))時間ではない)にあるため、ポイントの東西半分または南北半分への分割は漸近的にO(n )計算。
whuber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.