ポイントが存在するポリゴンを見つける方法は?


8

ポリゴンフィーチャのレイヤーがあります。各機能には属性と値があります。座標のリストもあるので、その座標がどのフィーチャ(またはポリゴン)にあるのか知りたいのですが。

誰かがこれについてどうやって進むかについて私を案内してくれませんか?私の目標を達成するのに役立つ関数がAPIにありますか、それとも自分でそれを行うためにいくつかの計算幾何アルゴリズムを使用する必要がありますか?後者の方法は知っていますが、組み込み関数がすでにある場合は、時間を節約できます。

ありがとう。

回答:


6

いくつかの機能

あなたがおそらくやりたいことは:

  1. 座標からQgsPointのリストを作成します
  2. すべてのレイヤーフィーチャ(ポリゴン)を反復処理します
  3. ポイントのリストをループします(反復内)
  4. feature.geometry()。contains(point)を呼び出して、一致するかどうかを確認します

もちろん、たとえばポイントが1つのポリゴンにのみ含まれることがわかっている場合は、パフォーマンスを向上させることができます。適切なポリゴンが見つかったら、リストからポイントを削除できます。

多くの機能(SpatialIndexの使用)

コメントで指摘されているように、空間インデックスを使用すると、プロセスを大幅に高速化できます。

ここでの手順は

  1. 座標からQgsPointのリストを作成します
  2. QgsSpatialIndexを作成する
  3. すべてのレイヤーフィーチャ(ポリゴン)を反復処理します
  4. insertFeatureを使用して機能をインデックスに追加する
  5. すべてのポイントを繰り返します
  6. index.intersects(QgsRectangle(point、point))を呼び出して、一致するかどうかを確認します

NathanWによるコード例もあります


ああ、feature.geometry.contains(point)の呼び出しについては知りませんでした。mathplotlibを使用しました。pastebin.com/61LSeMWv私のコードの乱雑を許してください。私は急いでいて、後でそれを掃除します。
Shubham Goyal 2013

私はあなたのソリューションを実装していないので、それが機能するかどうかをはっきりと言うことはできません。しかし、私はそれが正しいと信じているので、これを正しい答えとしてマークします:)
Shubham Goyal 2013

2
これはQgsSpatialIndexを使用して高速化できますか?
Snorfalorpagus 2013年

1
QgsSpatailIndexを使用することを強くお勧めします。nathanw.net/2013/01/04/…に
Nathan W

6

まず、座標のリストをプロジェクトにインポートする必要があります。このチュートリアルでは、その方法について詳しく説明しています。http//qgis.spatialthoughts.com/2012/01/importing-spreadsheets-or-csv-files-to.html

プロジェクトに両方のレイヤー(ポリゴンとポイント)がある場合は、[ベクター]> [データ管理ツール]> [場所による属性の結合]に移動します

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

組み合わせるレイヤーを定義できるウィンドウが表示されます。

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

  • ポイントレイヤーまたは「ターゲットベクトルレイヤー」を設定します。
  • ポリゴンレイヤーを「結合ベクターレイヤー」として設定します。
  • 出力シェープファイルを定義します(新しく作成されます。そのため、見落としても元のデータは保持されます)。
  • ポリゴンと一致しない場合でも、すべてのデータを新しいシェープファイルに保持するように選択できます。「すべてのレコードを保持する(一致しないターゲットレコードを含む)」をオンにします

「OK」をクリックします。新しいシェープファイルが作成され、「TOCに新しいレイヤーを追加しますか?」という質問が表示されます。もう一度[OK]をクリックします。

新しく追加されたシェープファイルの属性テーブルを開くと、対応するポリゴンのすべてのフィーチャが、そのポリゴンに配置されるポイントに追加されていることがわかります。


2

PyQGISを使用してこれを行うより簡単な方法。QgsRectangle単一のポイントでオブジェクトを作成し、それを使用して、QgsFeatureRequestそれと交差するレイヤーからフィーチャをフィルタリングできることを理解しました。

point = QgsPoint(10, 10)
# Construct a QgsRectange with the same point
rect = QgsRectangle(point, point)
req = QgsFeatureRequest()
req.setFilterRect(rect)
# You get the feature that intersects the point
f = layer.getFeatures(req).next()

0

QuantumGISでは、「区切られたテキストレイヤーの追加」機能(csvファイルの場合)を使用して座標のリストを追加できます。ポリゴンも追加します。次に、「交差」または「ポリゴン内のポイント」を実行できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.