PostGISエラーコードはどこにありますか?


8

ST_Containsin where句を使用すると、次のようなエラーメッセージが表示されることがあります

ERROR: GEOSContains: TopologyException: side location conflict at 37.3706 55.7882

現時点では、サードパーティのインポートツールを使用してDBのすべてのジオメトリの有効性を保証することはできないため、すべての例外をキャッチします。

CREATE OR REPLACE FUNCTION safe_st_contains(geom1 geometry, geom2 geometry)
  RETURNS BOOL AS
  $$
  BEGIN
    RETURN ST_Contains($1, $2);
    EXCEPTION WHEN others THEN
      RAISE NOTICE 'TopologyException'; -- this is a guess
      RETURN FALSE;
  END;
  $$
LANGUAGE plpgsql;

TopologyExceptionなどの例外が実際にどこに属していて、代わりにどの例外条件を使用する必要があるのか​​知りたいのOTHERSですが?

回答:


3

エラーを再現できるとすれば、正確なエラーコードを自分で簡単に取得できます。

DO $$
  BEGIN
    PERFORM ST_Contains('problem 1 geom here'::GEOMETRY, 'problem geom 2 here'::GEOMETRY);
    EXCEPTION WHEN others THEN
      RAISE NOTICE 'Error code: %', SQLSTATE;
      RAISE NOTICE 'Error message: %', SQLERRM;
  END;
$$

(もちろん、実際の形状を入れてください。)

これを実行すると、コードとエラーメッセージが出力されます。

私はしていませんでしたST_Containsが、例として、私がTopologyException実行している特定のものからこの結果を得ました:

Error code: XX000
Error message: GEOSUnaryUnion: TopologyException: found non-noded intersection between LINESTRING (401336 4.79544e+06, 401336 4.79544e+06) and LINESTRING (401336 4.79544e+06, 401339 4.79543e+06) at 401336.24785627011 4795435.9978510197

PostgreSQLのエラーコードリストには、XX000「internal_error」と記載されています。私の推測では、これはPostgreSQLがランダムにサードパーティのネイティブコードが爆発したときに使用するコードにすぎないためです。PostGISメーリングリストにアクセスして、少なくとも一般的なPostGISエラーにより具体的なコードを提供するために何かできるかどうかを確認する価値があるかもしれません。


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