Sto usando una PL/R
funzione e PostGIS
per generare poligoni voronoi attorno a una serie di punti. La funzione che sto usando è definita qui . Quando utilizzo questa funzione su un determinato set di dati, viene visualizzato il seguente messaggio di errore:
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
Dall'esame di questa parte del messaggio di errore:
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
Ecco come appare il problema sopra elencato:
Inizialmente pensavo che questo messaggio potesse essere causato dall'esistenza di punti identici e ho provato a risolverlo utilizzando la st_translate()
funzione, utilizzata nel modo seguente:
ST_Translate(geom, random()*20, random()*20) as geom
Questo risolve il problema, ma la mia preoccupazione è che ora sto traducendo tutti i punti fino a ~ 20m nella direzione x / y. Inoltre, non posso dire quale sia la necessità di una traduzione adeguata. Ad esempio, in questo set di dati tramite tentativi ed errori a 20m * random number
è ok, ma come posso sapere se questo deve essere più grande?
In base all'immagine sopra, penso che il problema sia che il punto si interseca con la linea mentre l'algoritmo sta cercando di intersecare il punto con un poligono. Non sono sicuro di cosa dovrei fare per assicurarmi che il punto sia all'interno di un poligono, piuttosto che intersecarsi con una linea. L'errore si sta verificando su questa riga:
"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'');"
Ho letto questa domanda precedente, che cos'è un "incrocio non annuito"? per cercare di capire meglio questo problema e apprezzerebbe qualsiasi consiglio su come risolverlo al meglio.
WHERE ST_IsValid(p.geom)
inizialmente sto usando per filtrare i punti.