Używam PL/R
funkcji i PostGIS
do generowania wielokątów voronoi wokół zestawu punktów. Funkcja, której używam, jest tutaj zdefiniowana . Gdy korzystam z tej funkcji w określonym zestawie danych, pojawia się następujący komunikat o błędzie:
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
Po zbadaniu tej części komunikatu o błędzie:
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
Tak wygląda powyższy problem:
Początkowo myślałem, że ten komunikat może być spowodowany istnieniem identycznych punktów, i próbowałem rozwiązać to za pomocą st_translate()
funkcji użytej w następujący sposób:
ST_Translate(geom, random()*20, random()*20) as geom
To rozwiązuje problem, ale obawiam się, że tłumaczę teraz wszystkie punkty do ~ 20 m w kierunku x / y. Nie umiem też powiedzieć, jaka jest odpowiednia kwota tłumaczenia. Na przykład w tym zestawie danych metodą prób i błędów a 20m * random number
jest w porządku, ale skąd mam wiedzieć, czy to musi być większe?
Na podstawie powyższego obrazu myślę, że problem polega na tym, że punkt przecina się z linią, podczas gdy algorytm próbuje przeciąć punkt wielokątem. Nie jestem pewien, co powinienem zrobić, aby upewnić się, że punkt znajduje się w wielokącie, zamiast przecinać się z linią. Błąd występuje w tym wierszu:
"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'');"
Przeczytałem poprzednie pytanie: Co to jest „skrzyżowanie bez węzła”? starając się lepiej zrozumieć ten problem i chętnie skorzystamy z wszelkich porad, jak najlepiej go rozwiązać.
WHERE ST_IsValid(p.geom)
początkowo używam do filtrowania punktów.