Lagi

Bagaimana cara melakukan penggabungan spasial di PostGIS yang mengembalikan nilai minimum poligon titik berpotongan?

Bagaimana cara melakukan penggabungan spasial di PostGIS yang mengembalikan nilai minimum poligon titik berpotongan?


Saya memiliki tabel poligon (buffer) dan tabel titik (dem_points), dan saya ingin melakukan penggabungan spasial pada mereka. Saya perlu menggabungkan titik dengan elevasi minimum (dn) ke poligon yang sesuai secara spasial di PostGIS.

Dalam contoh di atas saya ingin output saya menjadi poligon dengan osm_id of'1234' bergabung dengan titik di mana dn=4200. Saya memiliki pertanyaan ini tetapi ada yang tidak beres:

SELECT osm_id, gid, MIN(dn) FROM ( SELECT a.id AS osm_id, b.id AS gid, b.dn AS dn FROM buffer AS a, dem_points AS b WHERE ST_Within(buffer.geom, dem_points.geom) ) GROUP OLEH (osm_id, gid);'

Dengan kueri ini saya menerima kesalahan ini:

ERROR: subquery di FROM harus memiliki alias LINE 2: FROM ( ^ HINT: Misalnya, FROM (SELECT… ) [AS] foo. ERROR: subquery di FROM harus memiliki alias SQL state: 42601 Petunjuk: Misalnya, FROM ( PILIH… ) [AS] untuk karakter: 40

Bagaimana saya perlu menyusun kueri saya untuk secara spasial bergabung dengan titik dengan elevasi minimum ke poligon yang ada di dalamnya?


Pertama gunakan fungsi jendela untuk mendapatkan peringkat dem_points yang diurutkan. Pada langkah kedua, filter dem_point dengan dn terendah berdasarkan peringkat.

SELECT osm_id, gid, dn FROM ( SELECT b.osm_id, p.gid, p.dn, row_number() OVER (PARTITION BY osm_id order by dn) sebagai rank FROM buffer b, dem_points p WHERE ST_Within(p.geom, b. geom) ) bergabung di WHERE rank = 1

Anda perlu mengelompokkan poin per buffer geom, kemudian menemukan min(dn) untuk setiap buffer geom, dan akhirnya menggabungkannya kembali ke aslinya untuk mendapatkan poin gid. Coba sesuatu seperti ini (menggunakan sintaks WITH untuk membuatnya sedikit lebih mudah diikuti):

DENGAN foo AS ( SELECT b.osm_id, p.gid, p.dn FROM buffer b, dem_points p WHERE ST_Within(p.geom, b.geom) ), bar AS ( SELECT osm_id, min(dn) as dn FROM foo GROUP OLEH osm_id ) PILIH bar.osm_id, foo.gid, bar.dn DARI bar GABUNG foo DI foo.osm_id=bar.osm_id DAN foo.dn=bar.dn

Perhatikan bahwa cara lain untuk melakukan ini adalah dengan menggunakan klausa HAVING PostgreSQL tapi saya pikir itu lebih sulit untuk diikuti.


Saya telah menemukan cara alternatif untuk menyelesaikan pertanyaan ini. Mengikuti utas ini: https://geonet.esri.com/thread/16118 . Dengan melakukan Many to One Join dimana titik adalah fitur target dan poligon adalah fitur join. Kemudian jalankan kueri definisi terhadap lapisan baru seperti ini:

dn in (pilih min(dn) dari grup dn menurut osm_id)

Ini sekarang hanya akan menampilkan titik-titik dengan nilai "dn" minimum. Semua ini perlu dilakukan dalam geodatabase pribadi.