Saya menggunakan PL/R
fungsi dan PostGIS
untuk menghasilkan poligon voronoi di sekitar serangkaian poin. Fungsi yang saya gunakan didefinisikan di sini . Ketika saya menggunakan fungsi ini pada dataset tertentu saya mendapatkan pesan kesalahan berikut:
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
Dari memeriksa bagian ini dari pesan kesalahan:
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
Seperti inilah masalah yang tercantum di atas:
Saya awalnya berpikir bahwa pesan ini mungkin disebabkan oleh adanya titik-titik yang identik, dan mencoba menyelesaikannya dengan menggunakan st_translate()
fungsi, yang digunakan dengan cara berikut:
ST_Translate(geom, random()*20, random()*20) as geom
Ini memang memperbaiki masalah, tetapi kekhawatiran saya adalah bahwa saya sekarang menerjemahkan semua poin hingga ~ 20m ke arah x / y. Saya juga tidak tahu berapa jumlah terjemahan yang sesuai. Misalnya, dalam dataset ini melalui coba-coba a 20m * random number
adalah ok, tapi bagaimana saya bisa tahu apakah ini perlu lebih besar?
Berdasarkan gambar di atas saya pikir masalahnya adalah bahwa titik tersebut bersinggungan dengan garis sementara algoritma mencoba untuk memotong titik dengan poligon. Saya tidak yakin apa yang harus saya lakukan untuk memastikan bahwa intinya ada dalam poligon, daripada berpotongan dengan garis. Kesalahan terjadi pada baris ini:
"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'');"
Saya telah membaca pertanyaan sebelumnya, Apa itu "persimpangan non-mengangguk"? untuk mencoba lebih memahami masalah ini, dan akan sangat menghargai saran tentang cara terbaik untuk menyelesaikannya.
WHERE ST_IsValid(p.geom)
untuk memfilter poin pada awalnya.