Ich benutze eine PL/R
Funktion und PostGIS
generiere Voronoi-Polygone um eine Menge von Punkten. Die Funktion, die ich benutze, wird hier definiert . Wenn ich diese Funktion für einen bestimmten Datensatz verwende, wird folgende Fehlermeldung angezeigt:
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
Nach Prüfung dieses Teils der Fehlermeldung:
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
So sieht das oben aufgeführte Problem aus:
Ich dachte anfangs, dass diese Nachricht durch die Existenz identischer Punkte verursacht werden könnte, und versuchte dies mithilfe der st_translate()
Funktion zu lösen , die folgendermaßen verwendet wurde:
ST_Translate(geom, random()*20, random()*20) as geom
Dies behebt das Problem, aber meine Sorge ist, dass ich jetzt alle Punkte bis zu ~ 20 m in x / y-Richtung übersetze. Ich kann auch nicht sagen, welcher Übersetzungsbetrag angemessen ist. Zum Beispiel ist in diesem Datensatz durch Ausprobieren a 20m * random number
in Ordnung, aber wie kann ich feststellen, ob dies größer sein muss?
Basierend auf dem obigen Bild denke ich, dass das Problem darin besteht, dass sich der Punkt mit der Linie schneidet, während der Algorithmus versucht, den Punkt mit einem Polygon zu schneiden. Ich bin nicht sicher, was ich tun soll, um sicherzustellen, dass sich der Punkt innerhalb eines Polygons befindet, anstatt sich mit einer Linie zu schneiden. Der Fehler tritt in dieser Zeile auf:
"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'');"
Ich habe diese vorherige Frage gelesen: Was ist eine "nicht geknotete Kreuzung"? Um zu versuchen, dieses Problem besser zu verstehen, und um Ratschläge zu erhalten, wie es am besten gelöst werden kann.
WHERE ST_IsValid(p.geom)
, um die Punkte anfangs zu filtern.