PostGIS- GROUP BY untuk nilai data kontinu?

8

Dalam kode sampel untuk fungsi PostGIS ST_ConvexHull , banyak poligon akan dibuat berdasarkan nilai diskrit yang berbeda yang ditemukan di bidang "disease_type".

--Get estimate of infected area based on point observations
SELECT d.disease_type,
    ST_ConvexHull(ST_Collect(d.the_geom)) As the_geom
    FROM disease_obs As d
    GROUP BY d.disease_type;

Katakanlah ada bidang numerik (sebut saja "bidang saya") dengan nilai kontinu dari 0-5. Bagaimana Anda akan menghasilkan hasil yang serupa dengan GROUP BY tetapi mendefinisikan breakpoint Anda sendiri (misalnya: 0-1.25, 1.25-3.5, 3.5-5)?

RyanKDalton
sumber
Bukan pertanyaan GIS tapi karena sudah dijawab.
underdark

Jawaban:

9

Anda dapat menggunakan CASE untuk membuat kelas. Sesuatu seperti itu:

SELECT 
d.disease_type,
ST_ConvexHull(ST_Collect(d.the_geom)) As the_geom
FROM 
    (
    SELECT
    diseaseobs.the_geom,
    (CASE diseaseobs.number WHEN number BETWEEN 0 AND 1.5 THEN 'type one'
         WHEN number BETWEEN 1.6 AND 3 THEN 'type two'       
         ELSE 'other'
    END ) as disease_type
    FROM schema.diseaseobs

    ) AS d

GROUP BY d.disease_type;
Pablo
sumber
Terima kasih, Pablo. Ini bagus ... Saya perlu mengujinya sendiri tetapi saya berharap ini adalah jawaban yang saya cari.
RyanKDalton
2

Halo

Apa yang saya gunakan untuk melakukan dalam kasus-kasus itu adalah membuat tabel dengan kelas-kelas dan bergabung melawan mereka atau menggunakan subquery untuk membuat daftar kelas.

Saya pikir itu memberikan pendekatan yang lebih intuitif dan saya pikir itu lebih fleksibel karena Anda dapat memperbarui kelas hanya dengan memperbarui tabel.

Manfaat lain adalah Anda bisa mendapatkan kelas kosong juga.

pendekatan subquery bisa terlihat seperti:

SELECT
d.disease_type,
ST_ConvexHull(ST_Collect(d.the_geom)) AS the_geom FROM disease_obs
RIGHT JOIN
(SELECT 0::float AS classbottom, 1.25::float AS classtop, 1::int AS classid
UNION ALL    
SELECT 1.25::float AS classbottom, 3.5::float AS classtop, 2::int AS classid
UNION ALL    
SELECT 3.5::float AS classbottom, 5::float AS classtop, 3::int AS classid) AS classes
ON disease_obs.continuous_value>=classes.classbottom AND disease_obs.continuous_value<classes.classbottom
GROUP BY classes.id;

Di sini saya menggunakan hak untuk bergabung juga mendapatkan kelas-kelas kosong yang kadang-kadang berguna. Jika Anda tidak ingin yang kosong cukup ubah menjadi gabungan batin.

Jika Anda memindahkan kelas ke tabel dan menempatkan sisa kueri dalam tampilan, Anda dapat mengubah kelas tanpa menyentuh kueri.

HTH / Nicklas

Nicklas Avén
sumber
Terima kasih untuk sarannya. Saya mempertimbangkan untuk mengambil rute ini, tetapi pada akhirnya saya ingin memasukkan ini ke dalam aplikasi di mana pengguna dapat memilih titik istirahat mereka sendiri, yang membuat solusi ini tidak cukup kondusif.
RyanKDalton