Estoy usando un PL/R
función y PostGIS
para generar polígonos de voronoi en torno a un conjunto de puntos. La función que estoy utilizando es definido aquí. Al utilizar esta función en un determinado conjunto de datos me sale el siguiente mensaje de error:
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
Del examen de esta parte de la mensaje de error:
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
Esto es lo que el problema de los enumerados arriba se ve como:
Al principio pensé que este mensaje podría ser causado por la existencia de idénticos puntos, y trató de resolver esta usando el st_translate()
función, se utiliza de la siguiente manera:
ST_Translate(geom, random()*20, random()*20) as geom
Esto no soluciona el problema, pero mi preocupación es que ahora estoy traduciendo todos los puntos hasta ~20m en la dirección x/y. Yo también puedo decir lo que una traducción adecuada cantidad que se necesita. Por ejemplo, en este conjunto de datos a través de ensayo y error 20m * random number
está bien, pero ¿cómo puedo saber si esto tiene que ser más grande?
Basado en la imagen de arriba, creo que el problema es que el punto es la intersección con la línea mientras que el algoritmo está tratando de cortarse el punto con un polígono. No estoy seguro de lo que debe hacer para asegurarse de que el punto está dentro de un polígono, en lugar de intersección con una línea. El error está ocurriendo en esta línea:
"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'');"
He leído a través de esta pregunta anterior, ¿Qué es un "no-noded intersección"? para tratar de entender mejor este problema, y agradecería cualquier consejo sobre la mejor manera de resolverlo.