Lagi

Perpotongan 2 Linestring (tidak diinterpolasi)

Perpotongan 2 Linestring (tidak diinterpolasi)


Saya berjuang dengan kueri di POSTGIS

Saya ingin menemukan geometri linestring di mana geometri tersebut mengandung titik yang sama.

Saya tidak ingin menghitung titik persimpangan. Saya hanya ingin mendapatkan poin, jika titik tersebut adalah anggota nyata dari kedua geometri.

Contoh

SELECT ST_AsText(ST_Function(ST_GeomFromText('LINESTRING(1 2, 2 2, 0 0)'), ST_GeomFromText('LINESTRING(0 1, 2 2, 3 0)') ) )

harus kembali

POIN(2 2)

dan

SELECT ST_AsText(ST_Function(ST_GeomFromText('LINESTRING(1 2, 10 10)'), ST_GeomFromText('LINESTRING(1 1, 2 2, 3 3)') ) )

harus kembali

KOSONG

atau sesuatu yang serupa dengan kosong.

Bagaimana saya bisa mencapainya dalam satu permintaan?

Saya mencoba menggunakan ST_Intersection(), tetapi yang ini menghitung poinnya (yang salah dengan persyaratan saya).


Berikut adalah kueri yang mengembalikan simpul yang umum untuk string input Anda:

pilih ST_AsText(ST_Intersection(subq.g1,subq.g2)) dari (pilih ST_Collect(dump1.geom) sebagai g1, ST_Collect(dump2.geom) sebagai g2 dari ST_DumpPoints(ST_GeomFromText('LINESTRING(1 2, 2 2, 0 0) )')) sebagai dump1, ST_DumpPoints(ST_GeomFromText('LINESTRING(0 1, 2 2, 3 0)')) sebagai dump2) sebagai subq;

Hasil:

"TITIK(2 2)"

Query membuang simpul dari linestring ke dalam poin dan mengumpulkannya menjadi multipoint, dan akhirnya menemukan persimpangan multipoint.


Yang ini memberi Anda semua poin yang muncul lebih dari sekali di linestring.

MULAI; CREATE TEMPORARY TABLE test ( id serial, wkb_geometry geometric(LINESTRING, 4326) ) ON COMMIT DROP; INSERT INTO test(wkb_geometry) VALUES (ST_GeomFromText('LINESTRING(1 2, 2 2, 0 0)', 4326)), (ST_GeomFromText('LINESTRING(0 1, 2 2, 3 0)', 4326)); SELECT ST_AsText((dp).geom), COUNT(1) FROM ( SELECT (ST_DumpPoints(wkb_geometry)) dp FROM test ) a GROUP BY ST_AsText((dp).geom) HAVING COUNT(1) > 1; MELAKUKAN;

Dengan bantuan user30184, saya dapat membuat kueri. Ini dia:

DENGAN Data SEBAGAI (

PILIH a.id sebagai ID1, b.id sebagai ID2, a.way sebagai Geom1, b.way sebagai Geom2 DARI cara SEBAGAI cara GABUNG AS b ON not(ST_Equals(a.way, b.way))

)

SELECT ID1, ID2, ST_ASTEXT(ST_Intersection(subq.g1,subq.g2)) AS Intersection, ST_LineLocatePoint(Geom1, ST_Intersection(subq.g1,subq.g2)) AS Geom1Percent, ST_LineLocatePoint(Geom2, ST_Intersection(subq.g1,subq .g2)) SEBAGAI Geom2Percent, ST_GEOMETRYTYPE(Geom1) DARI Data,

(

PILIH ST_Collect(dump1.geom) AS g1, ST_Collect(dump2.geom) AS g2 FROM Data, ST_DumpPoints(Geom1) sebagai dump1, ST_DumpPoints(Geom2) sebagai dump2

) SEBAGAI subq

DI MANA ST_INTERSECTS(subq.g1, subq.g2)

DAN

Concat(ST_GEOMETRYTYPE(Geom1), ST_GEOMETRYTYPE(Geom2)) = 'ST_LineStringST_LineString'

Kueri itu mungkin tidak terlalu bagus dalam kinerjanya, tetapi memberikan hasil yang saya harapkan.