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
これで問題は解決しますが、私の懸念は、x / y方向に最大20mまでのすべてのポイントを変換していることです。また、適切な翻訳量が必要かどうかもわかりません。たとえば、このデータセットで試行錯誤を繰り返しても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)
最初にポイントをフィルタリングするために使用しています。