QGIS Simplify Geometriesツールを使用して隣接するポリゴンを単純化する


10

200,000ポリゴンの大きなShapefileがありますが、それを使用するアプリケーションにはファイルが大きすぎます。これらのポリゴンを一般化して、はるかに小さいファイルを作成したいと思います。

「ジオメトリの単純化」ツールを使用してQGISでこれを実行しようとしました。私はこれをShapefileの非常に小さな部分で試しましたが、結果には満足していますが、解決方法がわからない小さな問題があります。問題を示すために画像を追加しました。

白の境界は、単純化する前の境界です。REDの境界は単純化した後のものです。問題のある領域はオレンジ色で囲まれています。ご覧のように、「簡略化された境界」には、簡略化後に以前のポリゴンのいずれにも属さない領域が含まれています。

このシェープファイルを単純化して、ポリゴン間の共通の境界を単一の線として保持し、単純化後に作成された領域を削除するにはどうすればよいですか?

QGISの簡略化されたポリゴン

追加情報:

提案された指示に従った後

  1. ポリゴンをラインに変換する
  2. ラインを簡素化
  3. ラインをポリゴンに戻す

次の結果が得られます。以前より少し良いですが、それでも元のポリゴンの外側の領域ができます(下の画像の白い領域を参照)。

@Andrewは、各線を隣接するポリゴンに関連付けることを提案しましたが、QGISでそれを行う方法がわかりません。

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

私はまだポリゴンプロセスの簡略化を完了しようとしています。私はこの投稿で提案されている指示に従いましたが、許容できる結果が得られると思ったときに、もう1つの問題が発生しました。以下は結果の画像を使って私がしたことの要約です。すべてのステップは、QGISのPROCESSINGツールボックスを使用して実行されました。

  1. まず、ポリゴンをラインに変換しました
  2. 次に、ブレークオプションを指定してv.cleanを使用して行をクリーンアップしました。これにより、クリーニングされたベクトルレイヤーとエラーレイヤーが発生しました。エラーレイヤー(提供された画像の緑のドット)には、すべての線の交点に緑のドットがあります。私はこれが何を意味するのかわかりません。
  3. 3番目に、「SIMPLIFY GEOMETRY」ツールを使用して線を簡略化しました(画像に赤い線が表示されます)。単純化された赤い線と元のオレンジ色の線を比較すると、結果に満足しています。
  4. 4番目に、「PROCESSING」の「Polygonize」ツールを使用してラインをポリゴンに戻したいと思っていて、予想外の結果が出ました(2番目の画像は濃いオリーブ色のポリゴンの影付き)。これは、ポリゴナイザーがエラーレイヤーの交差点を接続しているように見え、単純化された線を無視して完全に異なるポリゴンのセットを作成しました。

誰かがここで何が悪かったのか説明できますか?

赤い単純化された線が単純化されたポリゴンに正しく変換されなかったのはなぜですか?

ご覧のとおり、私はGISの専門家ではありませんが、自分で行う必要があります。解決策から離れすぎているかどうかはわかりませんが、やりたいことに許容できるとわかっているが、ポリゴンに変換できない単純化された線が表示されるのはイライラします。

以下は、プロセスの最後の2つのステップの結果を示す2つの画像です。

簡略化された線と元の線

Plygonized簡略化されたラインの結果


@nhoptonポリゴナイザーWebページplugins.qgis.org/plugins/Polygonizerでは、「交差する線からポリゴンを作成する」と書かれています。これは、線の交差があるときはいつでもポリゴンが作成されることを示唆しています(しかし、おそらく私の解釈は間違っています)。私が必要なのは、「ジオメトリの単純化」ツールを使用したときに作成されたこれらのギャップを取り除くことです。Polygonizerがそれを実行できる場合、私はとてもハッピーになります。
David

考えてみれば、元のポリゴンレイヤーは問題なく単純化されているはずです。これを行わない場合、おそらく元のデータに不正なポリゴンがあることを意味していると思います。わずかに重なっている、またはそれらの間に小さなスペースがあるポリゴン。問題のある領域をズームインして、このようなものが見つかるかどうかを確認してください。N.
nhopton 2014年

トポロジーを保持するための良い方法は、@ radouxjuによって提案されたワークフローであり(不要な重心計算を除く)、私の回答の処理モデルで表されます。あるいは、GRASS v.generalizeもまた素晴らしいオプションだと思います。お役に立てれば。
アントニオファルチャーノ2014年

回答:


7

デフォルト値を使用して、Processing ToolboxからGRASS v.generalizeを使用してかなり良い結果が得られました。

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

一部の線はそのままです。


@Kantanによって提案されているように、v.in.ogr スナップ許容値を-1(スナップなし)から0.00001 に設定した後、このメソッドで成功しました。
cm1

4

Qgis2.16でその問題に巻き込まれましたが、GRASSで@AndreJのようなトポロジ的に正しい結果を得ることができませんでした。

良い回避策は、v.generalize.simplifyツールの詳細パラメーターでv.in.ogrスナップ許容値を変更することです。デフォルトは-1で、GRASSでのスナップを防止します。

ここに小さな値(1e-05 mなど)を入力すると、スナップが有効になり、GRASSがポリゴンの共有境界を認識します。単純化すると、トポロジー的に正しいレイヤーに穴がなくなります。

注:スナップ許容値を高い値に設定することで、必要に応じて非常に薄いポリゴンを削除できるようにポリゴンを変更することもできます。rmareaと小さな残り物を削除するのに十分な大きさのしきい値を使用して、v.cleanでその操作を実行します。これで完了です!


3

まずポリゴンをラインに変換します

v.cleanを使用してトポロジをクリーンアップします( "break"オプションを使用)

次に、ラインを簡素化します

最後に、ラインをポリゴンに戻します(polygonizeを使用)。

編集:ポリゴンの属性を取得するための最良の方法は、元のデータセットにマルチパートポリゴンがない場合、古いポリゴンと簡略化されたポリゴンの重心を取得し、最も近い場所に基づいてそれらを結合することです(重心は境界を少しだけ変更する場合は、あまり動かさないでください)


1
ワークフローは最終的には機能するかもしれませんが、これはいくつかのステップを省略したように見えます。ポリゴンをラインに変換するとき、ラインをすべての隣接するポリゴンに関連付ける必要がある場合があります。次に、単純化した後、ラインをマルチパートポリゴンに戻す必要があります。元のポリゴンが凸型である場合、重心を使用して元のポリゴンを簡略化されたものに一致させることができる場合があります(たとえば、元のポリゴンの重心が簡略化されたポリゴンに含まれている場合、それは一致です)。凸状でない場合は、さらに困難になります。
アンディW

こんにちは、私はradouxjuによって提案された手順に従いましたが、元のポリゴンの一部が元の境界の外側にあります。QGISで隣接するすべてのポリゴンにラインを関連付けるにはどうすればよいですか?これらのポリゴンをWebアプリケーションで使用する予定であり、ロードを高速化するためにノードの数を減らす必要があります。私が今得ているのは良い削減ですが、単純化した後にあるこれらの小さな領域を取り除くことはできません。これを解決するためのアイデアは大歓迎です。
デビッド

@David。あなたの問題はステップ3、ラインからポリゴンへの問題かもしれないと思います。Processing Toolkitには「Polygonize」というツールがあり、これを試してみました。これには、まだShapelyおよびNumpyパッケージをインストールする必要があると思います。とはいえ、QGIS-Masterで「Polygonize」を機能させることはできません。N.
nhopton 2014年

2

次のような処理(SEXTANTEなど)モデルで問題を解決できます。

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

スクリプトのバージョン:

##Simplify polygons=name
##vectorlayer_input=vector
##number_tolerance=number 0.0
##output_layer_alg3=output vector
outputs_0=Processing.runalg("qgis:polygonstolines", vectorlayer_input, None)
outputs_1=Processing.runalg("qgis:simplifygeometries", outputs_0['OUTPUT'], number_tolerance, None)
outputs_2=Processing.runalg("qgis:linestopolygons", outputs_1['OUTPUT'], None)
outputs_3=Processing.runalg("qgis:joinattributestable", outputs_2['OUTPUT'], vectorlayer_input, ID, ID, output_layer_alg3)

注:の出力の唯一のフィールドであるため、唯一の制約は、共通フィールドがにある必要IDJoin attributes tableあることですLines to polygons。これが、共通フィールドがモデルの変数入力ではない理由です。したがって、IDフィールドは入力ポリゴンレイヤーで使用できる必要があります。

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