Memeriksa apakah hasil st_difference kosong

Aug 20 2020

Saya mencoba memilih garis yang benar-benar menyentuh poligon (tidak hanya pada satu titik).

Saya akan berasumsi bahwa ini akan menjadi kasus sederhana st_isempty ( st_difference (geom_a, geom_b)).

Namun, ini tidak terjadi seperti yang Anda lihat pada gambar berikut.

Saya hanya ingin agar garis kuning sorotan dikembalikan. Apa yang saya lakukan salah?

(Saya bisa menyelesaikannya dengan perbandingan string, tapi saya ingin menghindari pemanggilan ekstra "st_astext").

Kueri:

SELECT a.geometry, 
       a.id as a_id, 
       b.FID as b_id,
       st_astext(ST_GeometryN(st_difference(a.geometry,b.geometry),1)) as st_difference,
       st_isempty(ST_GeometryN(st_difference(a.geometry,b.geometry),1)) as st_isempty
FROM a
INNER JOIN b ON st_touches(a.geometry,b.geometry)

Jawaban

1 Taras Aug 21 2020 at 21:25

Untuk masalah Anda, saya dapat menyarankan untuk mencoba pendekatan lain dengan menggunakan ST_IsValid()yaitu boolean dan berfungsi sebagai T(1)/F(0). Jadi, kueri Anda akan terlihat seperti

SELECT a.geometry, 
       a.id as a_id, 
       b.FID as b_id,
       st_astext(ST_GeometryN(st_difference(a.geometry, b.geometry), 1)) as st_difference,
       ST_IsValid(ST_GeometryN(st_difference(a.geometry, b.geometry), 1)) as st_isvalid
FROM a 
INNER JOIN b ON st_touches(a.geometry, b.geometry)

Saya bisa saja salah, tetapi masalah Anda mungkin ada hubungannya dengan peringatan yang dijelaskan di ST_IsEmpty()

Berubah: 2.0.0 Dalam versi PostGIS ST_GeomFromText ('GEOMETRYCOLLECTION (EMPTY)') sebelumnya diizinkan. Ini sekarang ilegal di PostGIS 2.0.0 agar lebih sesuai dengan standar SQL / MM