Я использую 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. Я также не могу сказать, какая сумма перевода нужна. Например, в этом наборе данных методом проб и ошибок все в 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)
для фильтрации точек изначально.