Lebih

Temukan semua poligon yang berisi poin kriteria tertentu

Temukan semua poligon yang berisi poin kriteria tertentu


Saya memiliki dua tabel (PostGIS), satu berisi titik, dan yang lainnya berisi poligon.

Saat ini saya memiliki kueri untuk menemukan poligon (kerangka Laravel):

$polygon = DB::connection('pgsql') ->select(DB::raw("SELECT row_to_json(fc) FROM ( SELECT 'FeatureCollection' As type, array_to_json(array_agg(f)) As features FROM (SELECT 'Feature' ' As type , ST_AsGeoJSON(ST_Transform(geom,4326))::json As geometric , row_to_json((SELECT l FROM (SELECT areal) As l )) As properties FROM jbb2013 As lg WHERE gid = 1208749 OR gid = 692891 OR gid = 993224 ATAU gid = 1171857 ATAU gid = 1176873) As f ) As fc;"));

Dengan beberapa pekerjaan saya mendapatkan hasilnya sebagai GeoJSON, saya kemudian mengirimkannya ke Leaflet.

Seperti yang Anda lihat, saya menentukan poligon dengan id. Bukan itu yang ingin saya lakukan. Saya ingin menggunakan tabel lain yang berisi poin dan menemukan poin dengan customer_id tertentu.

Jadi kira-kira seperti ini: Temukan semua titik yang dimiliki customer_id tertentu Gunakan titik-titik itu dalam kueri ST_Contains untuk menemukan poligon yang berisi titik-titik tersebut. GeoJSON yang dihasilkan seharusnya hanya berisi poligon yang ditemukan oleh kueri.

Hasil (jbb2013 adalah tabel poligon dan sampel adalah tempat penyimpanan poin):

$polygon = DB::connection('pgsql') ->select(DB::raw("SELECT row_to_json(fc) FROM ( SELECT 'FeatureCollection' tipe AS, array_to_json(array_agg(f)) AS features FROM (SELECT 'Feature' ' tipe AS , ST_AsGeoJSON(ST_Transform(lg.geom,4326))::json AS geometri , row_to_json((SELECT l FROM (SELECT areal) AS l )) SEBAGAI properti FROM jbb2013 AS lg, (PILIH geom DARI sampel WHERE customer_id = : customer_id) AS pts WHERE ST_Intersects(lg.geom, pts.geom)) AS f ) AS fc;"), array('customer_id' => $customer_id) );

Jangan terlalu khawatir dengan GeoJSON yang memproduksi SQL -- saya tahu betapa julingnya hal itu. Pada akhirnya, Anda memiliki tabel jbb2013 di klausa FROM akhir, dan Anda ingin membatasinya pada titik-titik yang berpotongan berdasarkan customer_id, sehingga Anda dapat melakukan penggabungan spasial standar, sebagai sub-kueri di mana Anda hanya memilih titik-titik tersebut yang cocok dengan customer_id tertentu, menggunakan ST_Intersects di WHERE untuk membatasi hasil. Saya tidak tahu apa yang Anda sebut tabel poin, jadi saya menyebutnya poin.

$polygon = DB::connection('pgsql') ->select(DB::raw("SELECT row_to_json(fc) FROM ( SELECT 'FeatureCollection' As type, array_to_json(array_agg(f)) As features FROM (SELECT 'Feature' ' Sebagai tipe , ST_AsGeoJSON(ST_Transform(geom,4326))::json Sebagai geometri , row_to_json((SELECT l FROM (SELECT areal) As l )) Sebagai properti FROM jbb2013 As lg, (PILIH geom dari titik di mana customer_id di (1 ,2,3) as pts WHERE ST_Intersects(lg.geom, pts.geom) As f ) As fc;") );

Semua fungsi agregat json membuat kueri seperti itu sulit dibaca, tetapi jika Anda hanya fokus pada FROM/WHERE final, Anda dapat melakukan apa yang Anda inginkan secara normal.


PILIH poligon.* FROM poligon, titik WHERE ST_Contains(polygons.wkb_geometry, points.wkb_geometry AND points.id IN (PILIH kondisi Anda);

Apakah itu yang Anda cari?