Lấy hình học từ nhiều bảng bằng PostGIS?


13

Tôi rất mới đối với PostGIS, PostgreSQL và SQL nói chung.

Tôi có 44 bảng trong cơ sở dữ liệu PostGIS của mình và mỗi bảng biểu thị một lớp dữ liệu vectơ khác nhau. Mỗi cái được tải từ một shapefile riêng và mỗi cái có một cột mô tả hình học cho lớp đó, được gọi làwkb_geometry

Tôi muốn chọn một đa giác cụ thể trên một lớp, sau đó lấy TẤT CẢ hình học từ một tập hợp con các lớp chồng lên hộp giới hạn của đa giác đó. Tôi không cảm thấy kén chọn về thứ tự sắp ra, nhưng sẽ hữu ích nếu nó được sắp xếp theo các bảng mà mỗi nhóm hình học xuất phát.

Đây là một mẫu câu lệnh SQL của tôi:

SELECT
    ST_AsEWKT(wkb_geometry) /* Some of this data has z values, hence the EWKT */
FROM
    table2, table3, table4, table5
WHERE 
    wkb_geometry &&
        (
        SELECT
            wkb_geometry
        FROM
            table1
        WHERE
            ogc_fid = 25
        );

trong đó trả về một lỗi:

column reference "wkb_geometry" is ambiguous
/* note that every table that I am selecting from has a "wkb_geometry" column */

Cách đúng đắn để làm điều này là gì?


1
Bạn có thể thấy SQL Primer của chúng tôi hữu ích. Chúng tôi đã thiết kế nó để trả lời các câu hỏi SQL newbie chủ yếu mặc dù nó cũng bao gồm một số cấu trúc SQL nâng cao. postgis.us/ch CHƯƠNG_appcill_c Chương 1 cũng có thể hữu ích vì đây là một đoạn mồi không gian của PostGIS.
LR1234567

+1. Đó là những chương miễn phí. Mua toàn bộ cuốn sách, Benjamin, đó là một khoản đầu tư đáng giá. nếu bạn muốn tìm hiểu về PostGIS và nhiều hơn nữa.
Nicklas Avén

Câu trả lời:


8

trước hết bạn nhận được thông báo lỗi này, vì bạn không chỉ định bảng nào bạn muốn chọn cột hình học (và vì tất cả chúng đều có cùng tên, postgres đang bị lẫn lộn). Đó là lý do tại sao bạn nhận được thông báo lỗi

tham chiếu cột "wkb_geometry" không rõ ràng

Nếu bạn có cùng tên cột trong nhiều bảng, hãy luôn thêm tên bảng phía trước tên cột: vd. bảng1.wkb_geometry

Đối với truy vấn của bạn: Nếu tôi hiểu bạn đúng, bạn muốn tìm các đối tượng trong các lớp khác nhau giao nhau một đối tượng cụ thể trong một lớp cụ thể.

Bắt đầu nhìn vào hai bảng cùng một lúc để giữ cho nó đơn giản:

Bảng 1 là bảng có đối tượng cụ thể, bảng2 bảng với các đối tượng khác

SELECT
ST_AsEWKT(table2.wkb_geometry)
FROM
table1, table2
WHERE
(table2.wkb_geometry && table1.wkb_geometry)
AND
table1.ogc_fid = 25

Bây giờ, nếu bạn muốn thêm các đối tượng bổ sung từ các bảng khác, bạn cần UNION ALL, như Sasa đã đề cập. Tên cột không cần giống nhau, nhưng số lượng cột và kiểu dữ liệu!

SELECT
ST_AsEWKT(table2.wkb_geometry)
FROM
table1, table2
WHERE
(table2.wkb_geometry && table1.wkb_geometry)
AND
table1.ogc_fid = 25

UNION ALL

SELECT
ST_AsEWKT(table3.wkb_geometry)
FROM
table1, table3
WHERE
(table3.wkb_geometry && table1.wkb_geometry)
AND
table1.ogc_fid = 25

UNION ALL

etc...

Bạn có thể gặp sự cố, mở truy vấn trong trình xem, vì không có ID duy nhất. Một cách đơn giản để giải quyết điều này là lưu kết quả dưới dạng bảng có cột id.

chúc vui vẻ


6

Tôi không có máy khách SQL trước mặt nên điều này có thể không chính xác 100%, nhưng bạn sẽ muốn một cái gì đó theo dòng:

SELECT ST_AsEWKT(wkb_geometry) FROM table2 WHERE ...
UNION ALL
SELECT ST_AsEWKT(wkb_geometry) FROM table3 WHERE ...

và như thế. Vấn đề của bạn là truy vấn sql không biết bảng nào (bảng 2/3/4/5) mà bạn đang đề cập khi bạn chỉ định CHỌN ST_AsEWKT (wkb_geometry), do đó tham chiếu mơ hồ. Bạn cũng có thể thêm ĐẶT HÀNG theo kết quả nếu bạn muốn chúng được đặt hàng

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.