複雑なシェープファイルをグリッドに分割する


11

ポリゴン/マルチポリゴン機能を備えたきちんとした詳細なシェープファイルがあります(ファイルは約500MBです)。実際には、全世界のシェープファイルであり、フィーチャは海岸線を表します。グリッドを使用してこのデータを分割する必要があります。明確にするために、データを「ソート」したくはありませんが、実際にはポリゴンをタイルに分割します。この質問は以前に聞かれたことに気づきましたが、見つけた解決策はうまくいきませんでした。

私はもう試した:

  • QGISを使用し、シェイプファイルのコンテンツをベクターグリッドと交差させます-結果はひどいです。主要な陸地の大部分は魔法のように消えますが、土地の小さな塊が時々それを作るようです。この方法は、はるかに単純なデータ(つまりポイントが少ない)で非常にうまく機能することに注意してください。

  • OGRの交差ツールを使用します。私はogr2ogrを介して、さらには独自のC ++ツールを使用して試してみました。どちらもQGISと同じ問題を抱えています。また、単純なファイルではこの問題は発生しませんが、より複雑なファイルでは失敗します。参考までに、サイズが20 MB未満のオーストラリアとニュージーランドのシェープファイルを使用していますが、QGISとOGRの両方が「グリッド化」できません。

PostGISには交差機能があるため、ある時点でPostGISを使用することを提案しましたが、PostGISのST_IntersectはOGRと同じGEOSバックエンドを使用します。実際、私が知る限り、両方とも同じ関数を呼び出しているため、PostGISが異なる結果をもたらすとは思いません。

私は他に何ができるかについての提案を探していました。非常に詳細なシェープファイルをタイルに分割できる堅牢なアプリケーションまたはツールキットが必要です。

編集:いくつかの情報を追加する

シンバマングへの応答:

  • シェープファイルは、基本的にOpenStreetMapの海岸線データです。これは、「processed_p」ファイルのマージされたバージョンであるため(タイルに分割されません)、開発者リストをメールで送信しました。タイルの分割(重複した100 km x 100 kmチャンク)は必ずしも必要なものではないことに注意してください-重複したくないので、グリッドサイズを自由に選択したい、または単にデフォルトのprocessed_p。

  • デフォルトでは、海岸線データにはQGISによって報告されたジオメトリエラーがあります。これらのエラーは、この問題に特に対処するために設計されたいくつかのコード(海岸線データのジオメトリエラーの修復:https : //github.com/tudelft-gist/prepair)を使用して作成した小さなツールで修正します。このツールを使用してファイルを実行すると、QGISで検出されるほぼすべてのエラーが修正されます。ファイルをクリーニングした後にのみ、交差を試みます。

  • QGISを使用して行ったこととまったく同じ:データを開いて、QGISで正常に表示されることを確認します。指定した間隔でベクターグリッドを使用してタイルのレイヤーを作成し、2つのレイヤーを交差させてタイルに分割してみてください。より小さなデータセットを使用してみてください-オセアニア(オーストラリア、ニュージーランド)の機能を選択して、より小さなデータセットを試します-この形状ファイルのサイズは20 MB未満です。もう一度分割してみてください、動作しません。

  • OGRで行ったこと:ogr2ogrは、spat_extentで '-spat'および '-clipsrc'オプションを直接使用しました。また、WKTで動作する小さなC ++ツールを作成したため、ogr2ogrを使用してシェープファイルをWKTに変換し、テキストファイルをアプリケーションにフィードします。ファイル全体を実行し、http//www.gdal.org/ogr/classOGRGeometry.htmlに記載されているIntersection()メソッドを呼び出します。最終的にはogr2ogrを直接使用するのとまったく同じことを行うと思います。

ブレントへの応答:

  1. します。すべてがWGS84 Lat / Lonにあります
  2. グリッドタイルの特定のセットでは、各タイルにより空間的にローカライズされる可能性のある断片化されたフィーチャの束ではなく、1つの巨大なマルチポリゴンと交差するのに時間がかかると思いました興味深い提案-私はそれを試して報告します。
  3. プロセス中に属性フィールドは保持されません。ジオメトリにのみ興味があります。
  4. よくわかりませんが、特定のグリッドタイルと重なるポリゴンを選択してから交差を実行する必要があると言っていると思います。これはQGISでは手動で面倒です。私のツールは、バウンディングボックスチェックを使用して、すでにある程度これを行っています。少しスピードアップしますが、最終結果はまだ悪く、目立った違いはありません。
  5. これはオプションではありません。現在、データを1 deg lat x 1 deg lonに分割しようとしています。すべてのケースで機能する一般的で堅牢な方法論を探しています。グリッドサイズ(10x10など)を増やして、より良い結果が得られるかどうかを確認しましたが、グリッドサイズと出力の品質との間に相関関係は見られません。

編集#2:

私はこれをもっと試してみましたが、一般的には、GEOSとQGIS(fToolsを使用していますが、GEOSを再び使用するかどうかはわかりません)の両方で結果が信頼できないようです。グリッドのサイズが結果とは何の関係もないと述べるのは間違っていました-グリッドが大きいほど、結果は良くなります(それは知っておくのは良いことですが、解決策ではありません)。これは、ほとんど機能しているが、1つのタイルで部分的に失敗した、実際に間隔をあけたグリッドのスクリーンショットです。

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

ジオメトリはきれいです-QGISは「妥当性のチェック」ツールでエラーを表示しません。私はこの問題に一歩ずつ取り組むつもりはありません。特定のフィーチャが視覚的に明らかではない場合に、この大きなデータセットの交差に失敗したかどうかを確認することは(そして、小さなタイルでは不可能です)実用的ではありません。


世界またはオーストラリアのシェープファイルはどこで入手しましたか?そのファイルのジオメトリに問題がある可能性があります(Vector | Geometry Tools | Check Geometry Validity in QGIS)。小さな世界のシェープファイルと5度のタイルで交差を試みたところ、QGISで完全に機能します。
シンバマング

1
Geoscience Australiaの100Kオーストラリアの海岸線(20MB)と4度のタイルでこれを試しましたが、これも正常に機能します(QGIS 1.7.4、OSX 10.7)。あなたのデータとあなたがしたことをより詳しく説明してもらえますか?
シンバマング

すべての追加情報をありがとう。OSMデータには何か奇妙なものがあると思う。前述のデータセットで試してみて、より良い結果が得られるかどうかを確認してください。過去にOSMの湖のデータに奇妙さを感じたことを覚えているようです。調べてみます。
シンバマング

データセットを共有できますか、それともその一部をクリップで共有できますか(上記の例のように)?
シンバマング

回答:


7

私はこれを行うための独自のツールを作成しました。

Clipperライブラリ(http://www.angusj.com/delphi/clipper.php)とOGRを使用して、データセットを分割しました。注目すべき点は、このライブラリと単純に交差を実行するのに非常に時間がかかるため、代わりにクアッドツリーアプローチを使用したことです。つまり、希望する解像度になるまで、4つのグリッドセルに分割します。ライブラリはうまく機能しますが、東半球の結果を示すスクリーンショットを添付しました:

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

上記の結果は、1.33GHzプロセッサで約4.5時間かかりました。

将来同様の問題が発生した場合のツールを以下に示します。それらは概念実証と一緒にハッキングされているので、おそらく直接使用するべきではないことに注意してください(ただし、何かの良い出発点になるかもしれません):

https://github.com/preet/scratch/tree/master/gis/polytoolkit

https://github.com/preet/scratch/tree/master/gis/shapefiles/shptk


リンクされたコードは利用できなくなりました:
ショーンマクドナルド14

リポジトリをgithub.com/preet/scratch/tree/master/gis/polytoolkitに移動しました。何を達成しようとしているかに応じて、github.com / preet / scratch / tree / master / gis / shapefiles / shptkの方が便利な場合があります。
プリス14

後者の方が便利です。PostGISを使用する方法を見つけましたが、これがもっと速いかどうかを調べることに興味があります。コンパイルとインストールのreadmeはありますか?
ショーンマクドナルド14

回答を編集してリンクを修正してもらえますか?ありがとう
16

4

ジオメトリの問題があるようです。ジオメトリの問題に最初に対処しない限り、使用するソフトウェアに関係なく、ダーティな入力ファイルからクリーンな結果が得られる可能性は低いです。ジオメトリの問題を整理したら、まだ問題がある場合は次を試してください。

1)グリッドデータセットの投影がワールドポリゴンデータセットと同じであることを確認してください。そうでない場合は、適切な投影で再作成します。

2)すべての機能を単一のパーツに変換-処理がはるかに簡単

3)交差が実行された後に属性を結合できるようにするidフィールドのみを保持するすべての無関係なフィールドを削除します-処理がはるかに簡単になりました

4)グリッドデータセット全体をワールドポリゴンデータセット全体と交差させる代わりに、グリッドポリゴンをループして、ワールドデータセット内の交差するポリゴンを選択し、グリッドポリゴンに基づいてクリップを実行します。これにより、問題を特定し、最終的に結果をマージして元の目標を達成できます。

5)より大きなグリッドポリゴンを使用してみてください。


+1本当に興味深い-データにIDフィールドまたはマルチパートを保持すると、ジオプロセシングの速度にどの程度影響しますか?
シンバマング

1
実際に違いを定量化しようとしたことはありません。私は、過度にジオプロセシング操作が失敗した経験からのみ話すことができ、これらは問題の解決を助けた一種のものです。
ブレントエドワーズ

(2)をまったく動作させることができませんでした。機能を選択し、QGISを使用してそれらをマージしようとすると、基本的に私のシステムがロックされるようです-おそらくまだ処理中のものですが、その速度では実用的ではありません:QGISでシステムを一晩放置し、データセットとそれはまだ朝にそれで行っていました。
プリス

1
マージは一切行わないでください。目標は、マルチパート機能を爆発させることです。たとえば、失敗したタイルのスクリーンショットの目的は、BCとアラスカの海岸沿いの島の特徴のようなグループ化された空間的にばらばらのポリゴンを含むすべてのレコードを、個別の単一パートポリゴンレコードに分解することです。これは、Vector> Geometry Toolsメニューの「Multipart to singleparts」ツールを使用してQGISで実現できます。
ブレントエドワーズ

シングルパーツフィーチャに変換したら、すべてがきれいであることを確認するために、ジオメトリを再検証する必要があります。
ブレントエドワーズ

0

別のアプローチは、ベクトルからラスターへの変換を試みてポイントデータセットを作成し、そのポイントデータセットを使用してタイルを作成するためのコードを記述することです。

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