PostGISポリゴンジオメトリのヘルプ-閉じていないリング


10

私はErik Westraによる超邪悪な本「Python Geospatial Development」(Amazonリンク)のコピーを手に取り、それを調べています。現在、地理空間Webアプリを構築する準備として、GSHHS海岸線データをシェープファイルからPostGISデータベースにロードするように教えています。

私の問題はこれです。GSHHSデータをPostGISにインポートしようとすると、海岸線のポリゴンが「有効」と見なされないために拒否されます。具体的には、海岸線ポリゴンの一部(すべてではない)が「閉じていないリング」であると説明されているエラーメッセージが表示されます。

このエラーは、ポリゴンの最初と最後の点が同じではないことを伝えようとしていることを理解しています。しかし、これは単に真実ではありません。多くのポリゴンのWKT表現を調べましたが、それらは正しいものです。彼らは間違いなく同じ座標で始まり、同じ座標で終わります。

ポリゴンは、OGRライブラリを使用してシェープファイルから抽出され、各ポリゴンフィーチャをWKTにエクスポートします。Shapelyを使用してポリゴンを再構成し、WKBを試しましたが、役に立ちませんでした。私がしている shp2pgsqlとローダーを使用して、MULTIPOLYGONテーブルとPostGISのに同じデータをロードすることができました。

:そこに誰がいた場合、私は思っていた
、おそらく、同じ本を使用()と同じ問題で捕まってしまった、と私のための答えを持っていますか?
(b)同様の問題に遭遇し、解決策を見つけましたか?
(c)失敗した場合、PostGISにロードする前に有効なジオメトリを確保するための「ベストプラクティス」のアドバイスはありますか?

更新:ある同僚は、「閉じていないリング」の問題は別の問題の兆候である可能性があることを示唆しています。私のPostGIS / PostgreSQL構成にサイズ制限(挿入トランザクション、受信パケット、テキスト文字列など)がある可能性があります。

入力として非常に長いWKTポリゴンを使用しているので、PostGISは、各ポリゴンを完成させるには早すぎる可能性があります。明日テストしてみますが、たぶん聞こえそうです。国境の挿入は、一部のレコードのみを受け入れ、他のレコードは受け入れませんでした。記憶から、受け入れられた形状は、アンティグアなどの小さな島国のものでした(したがって、おそらく短いWKT表現がありました)。

したがって、これは無効なジオメトリスレッドではなく、PostGISデータベース管理スレッドになりかねません。


サンプルのshpファイルを提供できますか?
Mario Miler、2011年

私が使用しているGSHHS海岸線データは、ここから96MBのダウンロードです。私が使用している世界の国境データは、thematicmapping.orgの
timmy

回答:


6

私はあなたのデータと本の例を見てきましたが、問題は本で処理されるデータに3つの無効なポリゴンがあることです:

GSHHS_l_L1.shp

ID = 92-W

POLYGON ((-180.0 71.514793999999995,-179.69008299999999 71.577888999999999,-178.648889 71.577416999999997,-178.40644399999999 71.549916999999994,-177.406306 71.244167000000004,-177.877444 71.022889000000006,-179.500111 70.863749999999996,-179.93011100000001 70.979583000000005,-180.0 70.962072000000006))

ID = 486-W

POLYGON ((-180.0 -16.799126,-179.84419399999999 -16.691278,-179.80041700000001 -16.789193999999998,-179.850472 -16.878361000000002,-180.0 -16.959561))

GSHHS_l_L2.shp

ID = 7333-W

POLYGON ((-180.0 65.393473,-179.76583299999999 65.428332999999995,-179.95416700000001 65.385555999999994,-179.90972199999999 65.316389,-180.0 65.321635))

これは例なので、データセットからこれらのポリゴンを削除するか、コードにifステートメントを追加するのが最も簡単です。

if geometry.IsValid():
       cursor.execute("INSERT INTO gshhs (level, geom) VALUES (%s, ST_GeomFromText(%s, 4326))", (level, wkt))

マリオに感謝します。すべての入力ポリゴンを適切に検証するのではなく、自分より先に進んでいるようです。正解です。OGRでテストしたところ、これらのポリゴンは無効として表示されました。興味深いことに、QGisでは問題なく見えましたが、ArcMapは完全なリングがないことを示しました。これら3つのポリゴンはすべて日付変更線上にあり、シェープファイルジオメトリは日付変更線に沿ったポリゴンエッジをカウントしなかったと思います。ソリューションは、無効なポリゴンを検​​出するための優れた簡単な方法です。投稿に回答済みのマークを付けます。
ティミー

慈善活動をしていると感じた場合、プロセスの次のステップ、つまり無効なポリゴンを修正するための良い解決策はありますか?OGRの.CloseRing()関数を使用しようとしましたが、役に立ちませんでした。関数呼び出しを無視しただけだと思います。
ティミー

「バッファトリック」(workshops.opengeo.org/postgis-intro/validity.html)を使用してみました。Shapelyは無効なポリゴンを読み取らず、ogrはバッファ操作を実行しません。現在のところ、その理由はわかりません。私がその答えに出くわしたら、あなたに知らせます。たぶん他の誰かがこの問題でもっと成功しているでしょう。ごめんなさい。
Mario Miler

ポリゴン検証が機能していると思います。OGRの.CloseRings()関数を間違った方法で使用していたと思います。ポリゴンのメソッド(poly.CloseRings()など)と呼ばれていました。代わりに、ポリゴンから線形リングを抽出して、それに対して実行する必要がありました(つまり、lr = poly.GetGeometryRef(0); lr.CloseRings())。結果はPostGISに正常に挿入されており、問題のない3つのポリゴンをQGisで使用できます。すべてのポリゴンの有効性をチェックするための計算コストは​​ほんの少しです。
ティミー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.