我正在使用一个PL/R
函数,并PostGIS
围绕一组点生成voronoi多边形。我正在使用的功能在这里定义。当我在特定数据集上使用此函数时,出现以下错误消息:
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
通过检查错误消息的这一部分:
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
上面列出的问题是这样的:
我最初以为该消息可能是由于存在相同的点而引起的,因此尝试使用该st_translate()
函数来解决此问题,该函数的使用方式如下:
ST_Translate(geom, random()*20, random()*20) as geom
这确实解决了问题,但是我担心的是,我现在正在沿x / y方向平移所有点,直到〜20m。我也不知道需要什么适当的翻译量。例如,在该数据集中通过反复试验,a 20m * random number
可以,但是如何确定是否需要更大?
基于上图,我认为问题在于算法试图将点与多边形相交时,点与线相交。我不确定应该怎么做才能确保该点在多边形内,而不是与直线相交。该行发生错误:
"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'');"
我已经阅读了前面的问题,什么是“非节点交叉点”?以便更好地了解此问题,并希望就如何最好地解决该问题提供任何建议。
WHERE ST_IsValid(p.geom)
最初用于过滤点。