Bagaimana cara menggunakan ST_Intersection?

15

Berikut ini ringkasan singkat tentang apa yang saya coba lakukan: Saya memiliki 3 tabel di Postgres, 'a' dan 'b', masing-masing memiliki kolom Polygon, dan 'c' memiliki kolom Point. Apa yang saya coba lakukan di sini adalah untuk mendapatkan persimpangan geometri antara 'a', 'b' dan 'c', dan untuk menampilkan geometri tersebut pada layer vektor OpenLayers.

Saya sudah tahu cara menampilkan segala bentuk geometri dari String di OpenLayers, tapi saya mengalami masalah dengan fungsi ST_Intersection PostGIS, saya melakukan ini:

SELECT ST_Intersection(a.geom, b.geom) as inter from a, b;

di mana a.geom dan b.geom adalah kolom geometri, dan saya mendapatkan pesan kesalahan ini:

NOTICE:  TopologyException: found non-noded intersection between 515172 2.14408e+06, 497067 2.13373e+06 and 501321 2.13546e+06, 471202 2.14843e+06 500621 2.13576e+06 
ERROR:  GEOS Intersection() threw an error!

Saya juga mencoba untuk mengekspresikan geometri yang dihasilkan sebagai teks menggunakan ST_AsText seperti ini:

SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as inter from a, b;

tetapi mengirim saya pesan kesalahan ini:

HINT: No function matches the given name and argument types. You might need to add explicit type casts.

Saya tidak tahu apa yang saya lakukan salah, saya hanya ingin agar WKT Poligon ditampilkan di OpenLayers, berikut ini cara saya menampilkan geometri dari WKT:

                    var in_options = {
                        'internalProjection': new OpenLayers.Projection("EPSG:4326"),
                        'externalProjection': new OpenLayers.Projection("EPSG:4326")
                    }; 

                    var fea= new OpenLayers.Format.WKT(in_options).read(data); //data is the string with the WKT
                    vectorLayer.addFeatures([fea]); //this piece of code works great
                    map.zoomToExtent(bounds);

PEMBARUAN: Saya mencoba yang berikutnya:

SELECT ST_Intersection(a.geom, b.geom) as intersect_ab FROM a INNER JOIN b ON 
ST_Intersection(a,b) WHERE ST_Overlaps(a.geom, b.geom) 
AND ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

tapi saya mendapatkan pesan kesalahan berikutnya:

ERROR: Function st_intersection(a,b) does not exist.
HINT: No function matches the given name and argument types. You might need to add explicit type casts.

Saya menambahkan isvalid untuk memverifikasi hanya poligon yang valid sedang dievaluasi, tetapi ia mengatakan kesalahan ada di ST_Intersection (a, b), baik a, b dan c memiliki SRID yang sama jadi saya benar-benar bingung, maaf jika saya bertanya terlalu banyak, tapi saya cukup baru dengan PostGIS jadi saya harap saya tidak terlalu mengganggu Anda. Terima kasih.

Uriel
sumber
1
Apa yang SELECT PostGIS_Full_Version();kembali?
Mike T
POSTGIS = "1.4.0" GEOS = "3.1.0-CAPI-1.5.0" PROJ = "Rel. 4.7.1, 23 September 2009" USE_STATS
Uriel

Jawaban:

8

Dugaan saya adalah gagal jika persimpangan mengembalikan NULL. Jadi, Anda harus menambahkan klausa tempat memeriksa apakah sebenarnya ada persimpangan sebelum Anda mencoba membuat WKT.

underdark
sumber
Saya mencoba ini: SELECT ST_Intersection (a.geom, b.geom) sebagai intersect_ab DARI INNER BERGABUNG DENGAN ST_Intersection (a, b) WHERE ST_Overlaps (a.geom, b.geom) DAN ST_isvalid (a.geom) = 't 'AND ST_isvalid (b.geom) =' t '; tetapi kembali kesalahan yang sama: ** GALAT: Fungsi st_intersection (a, b) tidak ada. PETUNJUK: Tidak ada fungsi yang cocok dengan nama dan tipe argumen yang diberikan. Anda mungkin perlu menambahkan gips tipe eksplisit. ** Saya benar-benar terjebak dalam hal ini, jika Anda dapat membantu saya, saya akan sangat menghargainya.
Uriel
Coba ringkasan (a.geom) dan ringkasan (b.geom) untuk menyelidiki nilai.
underdark
ringkasan -------------------------- Poligon [BS] dengan 1 cincin dering 0 memiliki 4 poin Poligon [BS] dengan 1 cincin dering 0 memiliki 5 poin Polygon [BS] dengan 1 cincin, 0 memiliki 10 poin
Uriel
Ya, seharusnya ST_Intersection (a.geom, b.geom) bukan ST_Intersection (a, b)
underdark
6

Petunjuknya adalah

ERROR: Function st_intersection(a,b) does not exist.
HINT: No function matches the given name and argument types. You might need to add explicit type casts.

Seperti pesan kesalahan mengatakan Anda tidak dapat menggunakan st_intersection dengan cara itu. Meringkas jawaban lain Anda harus menggunakan sesuatu seperti ini:

SELECT ST_Intersection(a.geom, b.geom) as intersect_ab 
FROM a INNER JOIN b ON ST_Intersects(a.geom,b.geom)
WHERE ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

AFAIK tidak ada gunanya menggunakan st_overlaps dan st_intersects dalam kalimat yang sama karena sangat mirip .

Francisco Puga
sumber
4

Saya menguji antara berbagai lapisan poligon dan gagal jika setidaknya ada geometri yang tidak valid di salah satu lapisan. Apakah Anda memeriksa validitas poligon Anda menggunakan ST_isvalid (the_geom)? Mungkin itu kuncinya.

Fabien Ancelin
sumber
Saya mencoba ini: SELECT ST_Intersection (a.geom, b.geom) sebagai intersect_ab DARI INNER BERGABUNG DENGAN ST_Intersection (a, b) WHERE ST_Overlaps (a.geom, b.geom) DAN ST_isvalid (a.geom) = 't 'AND ST_isvalid (b.geom) =' t '; tetapi kembali kesalahan yang sama: ** GALAT: Fungsi st_intersection (a, b) tidak ada. PETUNJUK: Tidak ada fungsi yang cocok dengan nama dan tipe argumen yang diberikan. Anda mungkin perlu menambahkan gips tipe eksplisit. ** Saya benar-benar bingung mengapa itu tidak berhasil
Uriel
2

Coba sesuatu seperti ini:

SELECT  ST_Intersection(a.geom, b.geom) As intersect_ab
    FROM a INNER JOIN b ON ST_Intersection(a,b)
    WHERE ST_Overlaps(a.geom, b.geom)
    ;

Sumber

CaptDragon
sumber
Saya mencobanya juga tetapi mengembalikan pesan kesalahan yang sama: PETUNJUK: Tidak ada fungsi yang cocok dengan nama dan tipe argumen yang diberikan. Anda mungkin perlu menambahkan gips tipe eksplisit.
Uriel
Bagaimana jika Anda menggunakan "INNER JOIN b ON ST_Intersection (a.geom, b.geom)"?
CaptDragon
Bunyinya: ERROR: argumen JOIN / ON harus bertipe boolean, bukan tipe geometri.
Uriel
shizer ... pasti ada sesuatu yang salah dengan data atau sesuatu karena jenis permintaan ini cocok untuk saya.
CaptDragon
Saya menambahkan AND ST_isvalid (a.geom) = 't' AND ST_isvalid (b.geom) = 't'; pada akhirnya hanya mengevaluasi geometri yang valid tetapi itu memberitahu saya kesalahan ada di st_intersection (a, b)
Uriel
1

Saya mencoba untuk mengecualikan geometri yang tidak valid tetapi tidak berhasil, jadi pada akhirnya saya harus menghapus setiap geometri yang tidak valid dan kemudian menggunakan ini:

SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as intersect_ab FROM a,b 
WHERE ST_Overlaps(a.geom, b.geom) AND ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

Seperti yang Anda lihat, saya menghilangkan bagian ST_Intersection (a, b), dan ini bekerja dengan baik, saya agak sedih karena saya tidak dapat menemukan cara untuk mengecualikan geometri yang tidak valid dari pilih saya, tetap terima kasih kepada semua orang karena telah membantu saya diluar sini.

Uriel
sumber
0

Saya pernah mengalami masalah ini.

<pre>NOTICE:  TopologyException: found non-noded intersection between xxx, xxxx and xxx, xxx  ERROR:  GEOS Intersection() threw an error!</pre>

Saya dapat menyelesaikan kesalahan ini menggunakan metode ini.
- Gunakan QGIS
- Tambahkan layer vektor dari database Anda
- Ambil poin dari pesan kesalahan dan cari di QGIS
   "QuickWKT" (plugin) dapat digunakan untuk menemukannya
- Kemudian Anda akan melihat masalah linestring
- Aktifkan mode edit
- Pilih "alat simpul" untuk menampilkan simpul hijau (masalah simpul)
- Pindahkan simpul dari simpul yang tumpang tindih
- Simpan perubahan

Ruthe
sumber