J'utilise une PL/R
fonction et PostGIS
génère des polygones de voronoï autour d'un ensemble de points. La fonction que j'utilise est définie ici . Lorsque j'utilise cette fonction sur un ensemble de données particulier, le message d'erreur suivant s'affiche:
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
En examinant cette partie du message d'erreur:
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
Voici à quoi ressemble le problème mentionné ci-dessus:
J'ai d'abord pensé que ce message pouvait être causé par l'existence de points identiques et j'ai essayé de résoudre ce problème en utilisant la st_translate()
fonction utilisée de la manière suivante:
ST_Translate(geom, random()*20, random()*20) as geom
Cela résout le problème, mais ce qui me préoccupe, c’est que je traduis maintenant tous les points jusqu’à environ 20 m dans la direction x / y. Je ne peux pas non plus savoir quel montant de traduction est nécessaire. Par exemple, dans cet ensemble de données par essais et erreurs, un20m * random number
est ok, mais comment puis-je savoir si cela doit être plus grand?
Basé sur l'image ci-dessus, je pense que le problème est que le point intersecte la ligne alors que l'algorithme tente de l'intersecter du polygone. Je ne suis pas sûr de ce que je devrais faire pour m'assurer que le point se trouve dans un polygone, plutôt que de croiser une ligne. L'erreur se produit sur cette ligne:
"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'');"
J'ai lu cette question précédente, qu'est-ce qu'une "intersection sans nœud"? pour essayer de mieux comprendre ce problème et apprécierait tout conseil sur la meilleure façon de le résoudre.
WHERE ST_IsValid(p.geom)
pour filtrer les points au départ.