Apakah ada fungsi PostGIS untuk menentukan apakah linestring memotong sendiri?

16

Saya telah mencari fungsi yang dapat memberi tahu saya jika LineString berpotongan dengan sendirinya. Saya sudah mencoba menelepon st_intersectsdengan LineString yang sama dua kali, tetapi jelas linestrings yang identik akan berpotongan. Rencana saya jika tidak ada fungsi adalah untuk mendapatkan semua poin dalam string baris, dan membuat linestrings individu dan kemudian memeriksa setiap linestring baru terhadap satu sama lain dengan st_intersects. Saya tidak ingin hal ini terjadi, tetapi saya khawatir hal itu akan terjadi.

Jadi, apakah ada fungsi PostGIS untuk memeriksa apakah linestring berpotongan sendiri? Seharusnya mirip dengan mencari tahu apakah poligon itu kompleks, saya kira

Jeff
sumber
Ada jawaban kedua di sini yang tidak cukup membantu saya dari segi PostGIS, tetapi memang mengandung tautan ke beberapa informasi bermanfaat tentang masalah secara keseluruhan. Tampaknya sudah dihapus. Adakah yang punya tautan itu?
Jeff

Jawaban:

14

Anda dapat menguji untuk linestring yang memotong sendiri dengan ST_IsSimple(geom):

SELECT ST_IsSimple('LINESTRING (50 50, 150 150, 50 150, 150 50)');
 st_issimple
-------------
 f
(1 row)

Persimpangan-diri di POINT (100.0 100.0)

Gambar di atas dan di bawah keterangan dari JTS TestBuilder (klik "Sederhana?")

Persimpangan diri di POINT ( 100.0 100.0 )

Ini dapat diperbaiki dengan ST_UnaryUnion(geom)(sejak PostGIS 2.0), yang mengembalikan multilinestring tiga potong yang valid / sederhana:

MULTILINESTRING((50 50, 100 100), 
  (100 100, 150 150, 50 150, 100 100), 
  (100 100, 150 50))
Mike T
sumber
Ini sempurna! Saya tahu jawabannya harus sangat sederhana. Anda bilang Anda menggunakan JTS Testbuilder untuk membuat gambar. Apakah ada cara yang Anda ketahui di Postgis untuk mendapatkan titik / titik persimpangan?
Jeff
Itulah detail yang menantang. JTS TestBuilder memiliki CheckNoding, tetapi ini hanya menemukan satu simpul koordinat per panggilan, bukan MULTIPOINT. Saya tidak yakin persis bagaimana cara mendapatkan titik noding dengan PostGIS.
Mike T