Я використовую PL/R
функцію і PostGIS
генерую багатокутники вороного навколо набору точок. Функція , яку я використовую визначається тут . Коли я використовую цю функцію на певному наборі даних, я отримую таке повідомлення про помилку:
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
Це все-таки вирішує проблему, але я хвилююсь, що зараз я перекладаю всі точки до ~ 20 м у напрямку x / y. Я також не можу сказати, яка потрібна сума перекладу. Наприклад, у цьому наборі даних через пробну помилку і помилку 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)
спочатку використовую для фільтрування очок.