PostGIS- NHÓM THEO cho các giá trị dữ liệu liên tục?


8

Trong mã mẫu cho hàm PostGIS ST_ConvexHull , nhiều đa giác sẽ được tạo dựa trên các giá trị riêng biệt, khác nhau được tìm thấy trong trường "bệnh_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;

Hãy nói rằng có một trường số (hãy gọi nó là "myfield") với các giá trị liên tục từ 0-5. Làm thế nào bạn có thể tạo ra kết quả tương tự như NHÓM THEO nhưng xác định điểm dừng của riêng bạn (ví dụ: 0-1.25, 1.25-3.5, 3.5-5)?


Không thực sự là một câu hỏi về GIS nhưng vì nó đã được trả lời.
underdark

Câu trả lời:


9

Bạn có thể sử dụng CASE để tạo các lớp. Một cái gì đó như thế:

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;

Cảm ơn, Pablo. Điều này thật tuyệt ... Tôi cần phải tự mình kiểm tra nhưng tôi hy vọng rằng đây là câu trả lời mà tôi đang tìm kiếm.
RyanKDalton

2

Ê

Những gì tôi sử dụng để làm trong những trường hợp đó là tạo một bảng với các lớp và tham gia chống lại chúng hoặc sử dụng truy vấn con để tạo danh sách các lớp.

Tôi nghĩ rằng điều đó mang lại một cách tiếp cận trực quan hơn và tôi nghĩ nó linh hoạt hơn vì bạn có thể cập nhật các lớp chỉ bằng cách cập nhật một bảng.

Một lợi ích khác là bạn cũng có thể nhận được các lớp trống.

phương pháp truy vấn con có thể trông giống như:

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;

Ở đây tôi đã sử dụng một tham gia đúng để cũng có được các lớp trống đôi khi có thể có ích. Nếu bạn không muốn những cái trống, chỉ cần thay đổi thành một tham gia bên trong.

Nếu bạn di chuyển các lớp vào một bảng và đặt phần còn lại của truy vấn vào dạng xem, bạn có thể thay đổi các lớp mà không cần chạm vào truy vấn.

HTH / Nicklas


Cám ơn vì sự gợi ý. Tôi đã cân nhắc việc đi theo con đường này, nhưng cuối cùng tôi muốn đưa nó vào một ứng dụng mà người dùng có thể chọn điểm dừng của riêng họ, điều này làm cho giải pháp này không hoàn toàn thuận lợi.
RyanKDalton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.