Tôi đang cố gắng sử dụng ST_Difference để tạo một tập hợp đa giác (process.trimmedparcelsnew) không chứa bất kỳ khu vực nào được bao phủ bởi một tập hợp đa giác khác (test.single_geometry_1) bằng PostGis 2.1 (và Postgres SQL 9.3). Đây là truy vấn của tôi:
CREATE TABLE processing.trimmedparcelsnew AS
SELECT
orig.id, ST_Difference(orig.geom, cont.geom) AS difference
FROM
test.single_geometry_1 cont,
test.multi_geometry_1 orig;
Nhưng các đa giác kết quả đã không được cắt, thay vào đó chúng dường như đã bị phân tách ở nơi chúng giao nhau với lớp khác. Tôi đã cố gắng chỉ chạy lựa chọn mà không đặt kết quả vào một bảng và mọi thứ khác tôi có thể nghĩ ra, nhưng dường như tôi không thể làm cho chức năng này hoạt động.
Tôi đã đính kèm một hình ảnh của kết quả
Sau khi nhận xét, tôi đã thử thêm mệnh đề WHERE. Tôi muốn các bưu kiện không có giao lộ và các khu vực giao nhau của các bưu kiện khác bị xóa (lớp test.single_geometry thể hiện sự ô nhiễm mà tôi muốn xóa khỏi bưu kiện của mình). Tôi đã thử một giao lộ nhưng tất nhiên tôi thực sự muốn các giao lộ không vì vậy bây giờ tôi đang thử một giao điểm. Tôi cũng đã thử thêm orig vào bảng của mình nhưng tài liệu về ST_Difference ( http://postgis.net/docs/ST_Difference.html ) không nói nó trả về hình học chính xác mà tôi cần (một hình học đại diện cho phần hình học A đó không giao nhau với hình học B), vì vậy tôi bối rối không biết tại sao tôi lại muốn đa giác ban đầu trong bảng của mình. Dù sao, đây là mã sửa đổi của tôi:
CREATE TABLE processing.trimmedparcelsnew AS
SELECT
orig.id, ST_Difference(orig.geom, cont.geom) AS difference, orig.geom AS geom
FROM
test.single_geometry_1 cont,
test.multi_geometry_1 orig
WHERE ST_Disjoint(orig.geom, cont.geom);
Theo câu trả lời của dbaston, giờ tôi đã thử:
CREATE TABLE processing.parcels_trimmed AS
SELECT id, COALESCE(ST_Difference(geom, (SELECT ST_Union(b.geom)
FROM test.single_geometry_1 b
WHERE ST_Intersects(a.geom, b.geom)
AND a.id != b.id)), a.geom)
FROM test.multi_geometry_1 a;
Kết quả của việc này chỉ là một bản sao của test.multi_geometry_1. Mặc dù bây giờ việc chia tách không còn xảy ra.
Tôi đã thử phiên bản trước, nhưng một lần nữa chỉ nhận được một bản sao của test.multi_geometry_1:
CREATE TABLE processing.parcels_trimmed_no_coalesce AS
SELECT id, COALESCE(ST_Difference(geom, (SELECT ST_Union(b.geom)
FROM test.single_geometry_1 b
WHERE ST_Intersects(a.geom, b.geom)
AND a.id != b.id)), a.geom)
FROM test.multi_geometry_1 a;
Tôi bắt đầu tự hỏi liệu có điều gì khác tôi đang làm sai không? Tuyên bố tố tụng là:
DROP TABLE IF EXISTS processing.parcels_trimmed_no_coalesce;
Và tôi đang chạy các truy vấn từ cửa sổ truy vấn SQL PostgreQuery và Openjump.
Câu lệnh tôi sử dụng để xem bảng là:
SELECT * FROM processing.parcels_trimmed_no_coalesce;
Để đơn giản hóa, bây giờ tôi đã giảm truy vấn này xuống chỉ còn:
SELECT id, COALESCE(ST_Difference(geom, (SELECT ST_Union(b.geom)
FROM test.geometriestocutagainst b
WHERE ST_Intersects(a.geom, b.geom)
AND a.id != b.id)), a.geom)
FROM test.geometriestocut a;
Điều này vẫn chỉ dẫn đến các đa giác ban đầu (test.geometriestocut) khi kết quả mong muốn là kết quả ban đầu được cắt bớt so với test.geometriestocutagainst.
WHERE
mệnh đề, vì vậy bạn có thể mở rộng đa thức trong bảng kết quả. Có bao nhiêu hàng trongtrimmedparcelsnew
?