Estoy usando una PL/R
función y PostGIS
para generar polígonos voronoi alrededor de un conjunto de puntos. La función que estoy usando se define aquí . Cuando uso esta función en un conjunto de datos en particular, aparece 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
Al examinar esta parte del 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
Así es como se ve el problema mencionado anteriormente:
Inicialmente pensé que este mensaje podría ser causado por la existencia de puntos idénticos, e intenté resolverlo usando la st_translate()
función, que se usa de la siguiente manera:
ST_Translate(geom, random()*20, random()*20) as geom
Esto soluciona el problema, pero mi preocupación es que ahora estoy traduciendo todos los puntos hasta ~ 20m en la dirección x / y. Tampoco puedo decir qué cantidad de traducción se necesita. Por ejemplo, en este conjunto de datos a través de prueba y error a 20m * random number
está bien, pero ¿cómo puedo saber si esto necesita ser más grande?
Basado en la imagen de arriba, creo que el problema es que el punto se cruza con la línea mientras el algoritmo intenta intersecar el punto con un polígono. No estoy seguro de lo que debería hacer para asegurarme de que el punto esté dentro de un polígono, en lugar de cruzarse 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 esta pregunta anterior, ¿Qué es una "intersección sin nudos"? para tratar de comprender mejor este problema, y agradecería cualquier consejo sobre la mejor manera de resolverlo.
WHERE ST_IsValid(p.geom)
para filtrar los puntos inicialmente.