Tôi có thể tìm mã lỗi PostGIS ở đâu?


8

Sử dụng ST_Containstrong wheremệnh đề đôi khi mang lại cho tôi các thông báo lỗi như

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

Hiện tại tôi không thể đảm bảo tính hợp lệ cho mọi hình học trong DB, bằng cách sử dụng các công cụ nhập khẩu của bên thứ ba, vì vậy tôi chỉ nắm bắt mọi ngoại lệ:

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;

Tôi muốn biết các trường hợp ngoại lệ như TopologyException thực sự thuộc về đâu và tôi nên sử dụng điều kiện ngoại lệ nào thay vì OTHERS?

Câu trả lời:


3

Giả sử bạn có thể tái tạo lỗi, bạn có thể tự nhận được mã lỗi chính xác khá dễ dàng:

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

(Tất nhiên, đặt hình học thực tế của bạn vào.)

Chạy này sẽ in ra mã và thông báo lỗi.

Tôi đã không làm ST_Contains, nhưng như một ví dụ, tôi đã nhận được kết quả này từ một cụ thể TopologyExceptiontôi đang chạy vào:

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

Danh sách mã lỗi PostgreSQL nói rằng đó XX000là "Internal_error". Tôi đoán tốt nhất là đây chỉ là mã mà PostgreQuery sử dụng khi ngẫu nhiên, mã gốc của bên thứ ba nổ tung, vì PostgreQuery không thể làm gì nhiều với những lỗi đó. Có thể đáng để vào danh sách gửi thư của PostGIS và xem liệu họ có thể làm gì để ít nhất cung cấp cho các lỗi PostGIS chung một mã cụ thể hơn không.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.