Tôi đang sử dụng một PL/R
hàm và PostGIS
để tạo các đa giác voronoi xung quanh một tập hợp các điểm. Hàm mà tôi đang sử dụng được định nghĩa ở đây . Khi tôi sử dụng chức năng này trên một tập dữ liệu cụ thể, tôi nhận được thông báo lỗi sau:
Error : ERROR: R interpreter expression evaluation error
DETAIL: Error in pg.spi.exec(sprintf("SELECT %3$s AS id,
st_intersection('SRID='||st_srid(%2$s)||';%4$s'::text,'%5$s')
AS polygon FROM %1$s WHERE st_intersects(%2$s::text,'SRID='||st_srid(%2$s)||';%4$s');",
:error in SQL statement : Error performing intersection: TopologyException: found non-noded
intersection between LINESTRING (571304 310990, 568465 264611) and LINESTRING (568465
264611, 594406 286813) at 568465.05533706467 264610.82749605528
CONTEXT: In R support function pg.spi.exec In PL/R function r_voronoi
Từ việc kiểm tra phần này của thông báo lỗi:
Error performing intersection: TopologyException: found non-noded intersection between
LINESTRING (571304 310990, 568465 264611) and LINESTRING (568465 264611, 594406 286813)
at 568465.05533706467 264610.82749605528
Đây là những gì vấn đề được liệt kê ở trên trông giống như:
Ban đầu tôi nghĩ rằng thông điệp này có thể là do sự tồn tại của các điểm giống hệt nhau và đã cố gắng giải quyết vấn đề này bằng cách sử dụng st_translate()
hàm, được sử dụng theo cách sau:
ST_Translate(geom, random()*20, random()*20) as geom
Điều này không khắc phục được vấn đề, nhưng mối quan tâm của tôi là hiện tại tôi đang dịch tất cả các điểm lên tới ~ 20m theo hướng x / y. Tôi cũng không thể biết số lượng dịch phù hợp là cần thiết. Ví dụ, trong bộ dữ liệu này thông qua bản dùng thử và lỗi a 20m * random number
là ok, nhưng làm thế nào tôi có thể biết nếu cái này cần phải lớn hơn?
Dựa vào hình ảnh trên tôi nghĩ vấn đề là điểm đang giao nhau với đường thẳng trong khi thuật toán đang cố gắng giao điểm với đa giác. Tôi không chắc mình nên làm gì để đảm bảo rằng điểm nằm trong đa giác, thay vì giao nhau với một đường. Lỗi xảy ra trên dòng này:
"SELECT
%3$s AS id,
st_intersection(''SRID=''||st_srid(%2$s)||'';%4$s''::text,''%5$s'') AS polygon
FROM
%1$s
WHERE
st_intersects(%2$s::text,''SRID=''||st_srid(%2$s)||'';%4$s'');"
Tôi đã đọc qua câu hỏi trước đó, "Giao lộ không gật đầu" là gì? để cố gắng hiểu rõ hơn vấn đề này và sẽ đánh giá cao bất kỳ lời khuyên nào về cách tốt nhất để giải quyết nó.
WHERE ST_IsValid(p.geom)
để lọc các điểm ban đầu.