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.
SELECT PostGIS_Full_Version();
kembali?Jawaban:
Dugaan saya adalah gagal jika persimpangan mengembalikan NULL. Jadi, Anda harus menambahkan klausa tempat memeriksa apakah sebenarnya ada persimpangan sebelum Anda mencoba membuat WKT.
sumber
Petunjuknya adalah
Seperti pesan kesalahan mengatakan Anda tidak dapat menggunakan st_intersection dengan cara itu. Meringkas jawaban lain Anda harus menggunakan sesuatu seperti ini:
AFAIK tidak ada gunanya menggunakan st_overlaps dan st_intersects dalam kalimat yang sama karena sangat mirip .
sumber
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.
sumber
Coba sesuatu seperti ini:
Sumber
sumber
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:
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.
sumber
Saya pernah mengalami masalah ini.
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
sumber