web-dev-qa-db-ja.com

GISデータをインテリジェントに劣化または平滑化する方法(ポリゴンを単純化する方法)

TIGER LINE データセットからの詳細な米国の郡地図があります。データをサンプリング、スムージング、または劣化させて、地理的特徴を表すために、より真っ直ぐで、より箱型で、「ノイズの少ない」形状になるようにするにはどうすればよいでしょうか?

サンプリングがレンダリング時に効率的に行われる場合、または並列データセットを生成して保存できる場合は、サンプリングを行うことができます。 PostGIS を使用しており、ラインはshp2pgsqlによって生成されたマルチポリラインですが、波線を取り、それとほぼ同じ意味のより滑らかなラインに縮小するソリューション人間の通訳は非常に便利でしょう。

49
unmounted

ポイントを単純に破棄することの問題は、元のポリゴンの形状をすばやく歪めることができることです。より良いアプローチは、他の方向からそれに到達することです。多角形の基本的な近似から始めてから、複雑な形状に向かって上向きに調整します。

このアプローチの優れた例は、 Douglas-Pueckerアルゴリズム です。完全なポリゴンから描画された2つの頂点から始めます。最初の2つの頂点の間に描かれたエッジから最も遠い頂点を選択して、3番目の頂点を追加します。元のポリゴンに十分似たものができるまで、ポイントの追加を続けます。

30
ire_and_curses

ダグラス・ピーカーは間違いなく正しいアプローチです。 PostGISとQGISの実装にアクセスするいくつかの簡単な方法がありますが、この投稿に似た質問がある人のためにここに追加すると思いました。目標は、次のようなものから始めることです。

alt text

そして、このようなもので終わる:

alt text

PostGISでは、Douglas-Peuckerはsimplifyとして実装されています。詳細な構文 ここbostongis.org は、次のようなバリアントです:

SELECT transform(simplify(transform(the_geom, 2249), 500),4326) from the_geo_table

これは、完全な国別データセットでも非常にうまく機能しましたが、いくつかのエラーは基礎となるデータが不良であるためと思われます。また、QGISではメニュー項目Tools > Geometry Tools > Simplify Geometriesは、任意のジオメトリの単純化されたシェープファイルをエクスポートし、現在のプロジェクトにレイヤーとして追加します。

これは非常に基本的なツールセットであり、低レベルで質問しましたが、基礎となる数学を学ぶのは良いことでしたが、それについての良い説明があります ここ:http://www.mappinghacks。 com/code/PolyLineReduction / 、および必要ではないことが判明したサンプルコードと共に!

61
unmounted

QGISの代わりに、ogr2ogrを使用することをお勧めします ポリゴンを削除しない

ogr2ogr output.shp input.shp -simplify 0.0001
20
Carlos Rendon

簡単な反復平滑化アルゴリズムを次に示します。

経路上の3つの連続する各点について、中間点に交点がなく、2つの外側の点の間の直接経路の小さなしきい値角度内にある場合、それを削除します。

満足するまで繰り返します。

8
Will

また、Visvalingamのアルゴリズムを試すこともできます。これは、行の最も知覚されない部分を繰り返し削除します。そのアルゴリズムの優れた説明は次のとおりです。

7
Lars Grammel

Simplify.js を使用することもできます。これは Douglas-Peucker とRadial Distanceアルゴリズムの組み合わせを使用します。 githubプロジェクト にリストされている他の言語への多くのポートへのリンクもあります

4

@unmountedによる回答は正しいですが、もう1つ提案を追加したいと思います。

PostGISでは、ST_Simplifyの代わりに関数ST_SimplifyPreserveTopologyを常に使用します。両方とも同じ基礎となるアルゴリズム(Douglas-Peucker)を使用しますが、前者は、無効なジオメトリをもたらす単純化を回避します。たとえば、ST_Simplifyは、それ自体と交差するジオメトリをもたらす場合があります。

0
Rauni Lillemets