Estou usando uma PL/R
função e PostGIS
para gerar polígonos voronoi em torno de um conjunto de pontos. A função que estou usando é definida aqui . Quando uso essa função em um conjunto de dados específico, recebo a seguinte mensagem de erro:
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
Ao examinar esta parte da mensagem de erro:
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
É assim que o problema listado acima se parece:
Inicialmente, pensei que essa mensagem pudesse ser causada pela existência de pontos idênticos e tentei resolver isso usando a st_translate()
função, usada da seguinte maneira:
ST_Translate(geom, random()*20, random()*20) as geom
Isso resolve o problema, mas minha preocupação é que agora estou traduzindo todos os pontos até ~ 20m na direção x / y. Também não sei dizer qual é a quantidade necessária de tradução. Por exemplo, neste conjunto de dados por tentativa e erro a 20m * random number
está ok, mas como posso saber se isso precisa ser maior?
Com base na imagem acima, acho que o problema é que o ponto está cruzando com a linha enquanto o algoritmo está tentando cruzar o ponto com um polígono. Não tenho certeza do que devo fazer para garantir que o ponto esteja dentro de um polígono, em vez de cruzar com uma linha. O erro está ocorrendo nesta linha:
"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'');"
Eu li essa pergunta anterior: o que é um "cruzamento sem aceno"? para tentar entender melhor esse problema e gostaria de receber conselhos sobre a melhor maneira de resolvê-lo.
WHERE ST_IsValid(p.geom)
para filtrar os pontos inicialmente.