Ý nghĩa của hình học không hợp lệ là gì


15

Tôi đã nhập một số dữ liệu trong cơ sở dữ liệu Postgis và một số hình học được báo cáo không hợp lệ (ST_IsValidRory báo cáo tự giao hoặc tự giao nhau).

Các truy vấn tôi đang thực hiện dường như không bị ảnh hưởng bởi khía cạnh không hợp lệ của các hình học này (tôi chỉ sử dụng truy vấn ST_Distance).

Những thứ phá vỡ khi hình học không hợp lệ là gì?

Việc sửa các hình học này "tự động" (bộ đệm (geom, 0) hoặc ST_SimplifyPreserveTopology (geom, 0,0001)) là một tùy chọn?

Câu trả lời:


19

Giữ dữ liệu không đúng định dạng là một ý tưởng tồi, bởi vì bạn không bao giờ có thể dự đoán được khi nào và ở đâu sẽ xảy ra lỗi. Hơn nữa, dữ liệu không đúng định dạng có thể gây ra Heisenbugs , loại lỗi xấu xa và ảo tưởng nhất.

Tôi nghĩ rằng sẽ hơi vô nghĩa khi thảo luận về kết quả có thể có của việc lưu trữ hình học không hợp lệ. Có nói rằng, hậu quả có thể bao gồm:

  • Kết quả sai (nghĩa là ST_Distancesẽ trả về số liệu sai hoặc không chính xác)
  • Các vấn đề về hiệu suất cơ sở dữ liệu: Giữ dữ liệu không đúng định dạng có thể làm hỏng nghiêm trọng hiệu suất cơ sở dữ liệu và tạo tệp nhật ký lớn, vì mỗi lệnh gọi hàm sẽ ghi lỗi vào nhật ký và làm gián đoạn công việc cơ sở dữ liệu thông thường.
  • Cơ sở dữ liệu gặp sự cố.
  • Sự cố ứng dụng - gây ra bởi việc nhận dữ liệu không đúng định dạng từ cơ sở dữ liệu hoặc do nhận kết quả không hợp lý (ví dụ khoảng cách âm).
  • Hành vi ảo (xem liên kết ở trên). Đây là hậu quả tồi tệ nhất của tất cả. Bạn sẽ có những điều kỳ lạ xảy ra. Chậm lại, mất dữ liệu, sự cố, kết quả không hợp lý, tạm dừng lâu, không có phản ứng và nhiều lời nguyền khác. Bạn có thể không phát hiện ra chúng hoặc sao chép chúng, bởi vì tất cả chúng đều thuộc danh mục "không xác định" trong mọi tài liệu.

Lời khuyên của tôi - nếu bộ đệm nhỏ không gây hại đáng kể đến tính nhất quán dữ liệu của bạn, hãy sử dụng chúng để ngăn chặn bất kỳ điều nào ở trên xảy ra. Giữ dữ liệu của bạn hợp lệ.


Bạn có thể xây dựng một chút về việc sử dụng bộ đệm nhỏ? Làm thế nào để làm điều đó?
diciu

1
ST_Buffer(the_geom, 0.0000001)có thể làm thủ thuật cho giao lộ tự. Chỉ sử dụng nếu hậu quả của hình học lớn hơn một chút không nghiêm trọng.
Adam Matan

1
Kinh nghiệm của tôi là việc sửa dữ liệu không đúng định dạng là một cuộc điều tra. Nhưng mặc dù nó tốn thời gian, nhưng nó thường đáng để nỗ lực. Các ST_Buffer(the_geom, 0.0000001)thủ thuật chắc chắn sẽ giúp rất nhiều.
Châu

Vấn đề là ST_Buffer sửa hình học nhưng kết quả không thực sự như tôi mong đợi - đối với đa giác không hợp lệ này ở đây ( openstreetmap.org/browse/way/51954364 ) ST_Buffer chỉ trả về hình chữ nhật trên cùng bên trái. ST_SimplifyPreserveTopology dường như gần với những gì tôi cần (hình học hợp lệ nhưng càng gần với bản gốc không hợp lệ). Bất kỳ nhược điểm nào trong việc sử dụng ST_SimplifyPreserveTopology?
diciu

Hình học đó phải được xử lý như một MULTIPOLYGONtrong hai Đa giác, không phải là một POLYGON. Cố gắng để có được WKT ban đầu nếu có thể.
Adam Matan

13

Bạn có thể ngăn hình học không hợp lệ vào cơ sở dữ liệu của bạn ở nơi đầu tiên. Đối với người dùng PostgreSQL / PostGIS, việc này rất đơn giản với các ràng buộc kiểm tra . Ví dụ: hãy xem xét một bảng public.my_valid_tablecó một cột hình học đa giác geom, sử dụng SQL / DDL sau:

ALTER TABLE public.my_valid_table
  ADD CONSTRAINT enforce_valid_geom CHECK (st_isvalid(geom));

Lưu ý: bảng này phải có đa giác hợp lệ trước khi thực thi ràng buộc.

Nếu sau đó bạn cố gắng chèn / thêm một hình học không hợp lệ, bạn sẽ thấy một lỗi:

ERROR:  new row for relation "my_valid_table" violates check constraint "enforce_valid_geom"
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.