同様の行を比較してレイヤーを更新する


16

ここには、通りを表す2つのレイヤーがあり、アイデアは次のとおりです。最新のレイヤー(赤い線)を、他のレイヤー(明るい青)に保存されているデータの一部で更新しますが、これらのレイヤーは地図上の場所に応じて非常に近く、少し離れた地理的位置で類似しており、他の属性と同じ行がある場合に一致する属性は1つだけです(codlog x codlog5)。

Qgisレイヤー。

たとえば、画像の中央には両方のレイヤーに正方形がありますが、青いレイヤーが緑のレイヤーと同じであることを認識して最近のレイヤーを更新するにはどうすればよいですか?

どうすればいいですか?それに役立つプラグインやツールはありますか?


青いレイヤーの属性または青いレイヤーの追加機能で赤いレイヤーを更新しますか?
dmh126

属性。状況:赤いレイヤーには列(a、b、c、d)が含まれ、青いレイヤーには列(d、e、f)が含まれます。赤いレイヤーに、他のレイヤーの列(e、f)と一致する結果を追加します。
ジョナタンオリベイラ

融合プラグインのドキュメントがここにあります。開発が完了したかどうかはわかりません。
バルバロッサ

1
ジャンプしてみましたか?
radouxju

しかし、blu行の「d」列と赤い行の「d」列は一意の共通IDですか?何が含まれていますか?
セルジオ

回答:


6

これは素晴らしい質問です。最近似たようなことをしなければなりませんでしたが、データセットがはるかに小さいので、視覚的な品質チェックを追加した単純な共通部分を使用することができました。

しかし、ここにはそのためのアイデアがありますが、私にはコードはありません。それは一種の多額のプロセスです。最初に完全なデータセットのサンプルで確実にテストします。おそらく、この辺りにいくつかの便利なコードがあります。(インデントは以下で少し奇妙になりました。):

  1. 適切なジオメトリセット(属性を最終的に取得する場所)を取得し、そのバッファを作成します*

  2. 各バッファー機能を反復処理します。

    2a。フィーチャの一般的な方向を計算します(max_y-min_y / max_x-min_xまたはそのようなもの)

    2b。この単一の機能を使用して、他のレイヤーで場所による選択クエリを作成します

    1. 場所による選択クエリに一致する複数の機能があるため、これらの選択した機能を反復処理し、それぞれの方向を計算します

    2. バッファフィーチャの方向に最も近い方向を持つフィーチャから属性を取得します。

*非常に短い距離(1つのマップユニットまたは何か)から開始し、距離を増やしながらこのプロセスを実行します。既に転送した属性を上書きしないように注意します。

**実際には、バッファ機能の作成を実際に忘れて、バッファ距離を指定した場所による選択クエリを実行するだけです。私はQGISにあまり精通していませんが、あなたはそれができると確信しています。

これがすべての機能に対して完全に機能する方法はありませんが、それは出発点であり、転送をチェックして完了するための優れたQA / QC戦略を開発することになります。

編集これについてさらに考えると、非常に短いバッファ距離から始めて、私が推奨するように最適な向きの機能を選択した場合、システムを完全に破壊する基本的な例を次に示します。

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

間違った赤い線から属性が取得されます。これを回避するには、何らかの許容値を作成し、その方向(元の青いフィーチャの方向と比較した場合)がその許容範囲内にある場合にのみフィーチャの属性を取得します。

EDIT 2エラー、これらのポリゴンはありますか?私はそれらが灰色の背景の線であると仮定したと思います。それらがポリゴンである場合、この方向の概念が良いものかどうかはわかりません。ただし、交差するすべてのフィーチャを選択し、最も重複しているフィーチャを特定することができます(Unionタイプのツールを実行してから、面積が最大のポリゴンを使用します...)。


その論理は健全です。C#/ ArcObjectsで同様のアプローチを使用して、属性を持つ不正確なデータセットから属性のない正確なデータセットに属性をコピーしました... 95%正しい。狭いエリアでは手動によるチェック/修正が必要でしたが、すべてを手動で行うよりも確実に迅速でした。
マイケルスティムソン

2

赤のレイヤーから青のレイヤーにいくつかの属性を追加し、両方のレイヤーで1つの属性が共通する場合、Add Vector Joinを使用する必要があります。

ここでそれについて書い

  1. レイヤーパネルで赤いシェープファイルレイヤーを右クリックし、[ プロパティ]を選択します
  2. 次に、[ 結合 ]タブに移動します。
  3. 押し+のボタンを、それが参加し、新規作成されます。
  4. 結合レイヤーは、赤いシェープファイルレイヤーです。結合フィールドは、両方に共通の値を持つフィールドです。ターゲットフィールドは、青いレイヤーから結合するフィールドです。
  5. その後、シェープファイルテーブルに新しい属性を取得します。

それでおしまい。

ここにスクリーンショットの例を示します。


1

彼の方法ではred_lineレイヤーを非常に簡単に更新できるため、@ dmh126からの回答を非常に好みます。

別の方法を追加するために、Processing Toolboxの [ Join attributes table]ツールを使用して、共通フィールドでレイヤーを選択できます。このメソッド、既存のシェープファイルを更新する代わりに、新しいシェープファイルを作成することに注意してください

結合属性テーブル


0

古いレイヤーから新しいレイヤーに値を簡単に結合するために使用できる、両方のレイヤーに一意のIDがある場合、それは簡単です。しかし、これはそのようには見えません。

そうでない場合、それはかなり難しい問題です。OpenJUMPとプラグインhttp://www.vividsolutions.com/products.asp?catg=spaapp&code=roadmatcherを使用することを提案するuser30184からのコメントが、このケースでは完全に合法に聞こえるので、代わりに回答として投稿されなかったのだろうか。

それ以外の場合、いくつかのコーディングなしでこれを行うことはできないと思います。QGISを使用すると、シェイプリーを使用できます。また、バッファリングと交差を組み合わせると、重要な自動チェックを実行できるはずです。

1つのアプローチは、かなり大きな赤い線のバッファーと青い線を比較し、一致する属性と比率を取得することです。擬似コード内:

for r_line in red_lines:
  r_line_buf = r_line.buffer()
  intersecting_b_lines = []
  for b_line in blue_lines:
    if r_line_buf.intersects(b_line):
      intersect_length = calculateIntersectionLength(r_line_buf,b_line)
      b_line_values = getAttributes(b_line)
      intersecting_b_lines.append((b_line_values,intersect_length))
  b_line_best_fit = findLongestLineWithinIntersected(intersecting_b_lines)
  r_line_length = r_line.length
  b_vs_r_line_ratio = compareLength(r_line_length,b_line_best_fit)
  saveToNewColumns(r_line, b_line_best_fit.Atribute1, b_line_best_fit.Atribute2..., b_vs_r_line_ratio)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.