Di mana saya dapat menemukan kode kesalahan PostGIS?

8

Menggunakan ST_Containsdalam whereklausa terkadang memberi saya pesan kesalahan seperti

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

Untuk saat ini saya tidak dapat menjamin validitas untuk setiap geometri di DB, menggunakan alat impor pihak ketiga, jadi saya hanya menangkap setiap pengecualian:

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;

Saya ingin tahu di mana pengecualian seperti TopologyException benar-benar berada dan kondisi pengecualian mana yang harus saya gunakan, bukan OTHERS?

Utgarda
sumber

Jawaban:

3

Dengan asumsi Anda dapat mereproduksi kesalahan, Anda dapat dengan mudah mendapatkan kode kesalahan yang tepat:

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;
$$

(Masukkan geometri Anda yang sebenarnya, tentu saja.)

Menjalankan ini akan mencetak kode dan pesan kesalahan.

Saya tidak melakukan ST_Contains, tetapi sebagai contoh, saya mendapatkan hasil ini dari yang TopologyExceptionsaya temui:

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

Daftar kode kesalahan PostgreSQL mengatakan itu XX000adalah "internal_error". Dugaan terbaik saya adalah ini hanya kode yang digunakan PostgreSQL ketika acak, kode asli pihak ketiga meledak, karena PostgreSQL tidak bisa berbuat banyak dengan kesalahan-kesalahan itu. Mungkin patut mendapatkan di milis PostGIS dan melihat apakah mereka dapat melakukan sesuatu untuk setidaknya memberikan kesalahan PostGIS umum kode yang lebih spesifik.

jpmc26
sumber