Я намагаюся використовувати ST_Difference для створення набору багатокутників (treatment.trimmedparcelsnew), які не містять жодної області, охопленої іншим набором полігонів (test.single_geometry_1) за допомогою PostGis 2.1 (і Postgres SQL 9.3). Ось мій запит:
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;
Але отримані багатокутники не були оброблені, натомість вони, здається, розкололися там, де вони перетинаються з іншим шаром. Я спробував просто виконати вибір, не кладучи результат у таблицю, і все інше, про що я можу придумати, але я не можу змусити цю функцію працювати.
Я додав картину результату
Після коментарів я спробував додати пункт WHERE. Я хочу, щоб посилки, які не перетиналися, а ділянки, що перетинаються, були видалені (шар test.single_geometry являє собою забруднення, яке я хочу видалити з моїх посилок). Я спробував перехрестя, але, звичайно, я дійсно хочу, щоб не перехрестя, тому я зараз намагаюся роз'єднати. Я також спробував додати оригінал до моєї таблиці, але документація для ST_Difference ( http://postgis.net/docs/ST_Difference.html ) каже, що вона повертає ту точну геометрію, яка мені потрібна (геометрія, яка представляє ту частину геометрії A, що не перетинається з геометрією B), тому я плутаюсь, чому б хотів замість цього оригінальний багатокутник у своїй таблиці. У всякому разі, ось мій модифікований код:
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);
Виходячи з відповіді Дбастона, я зараз спробував:
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;
Результат цього - лише копія test.multi_geometry_1. Хоча зараз розщеплення вже не відбувається.
Я спробував попередню версію, але знову просто отримаю копію 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;
Я починаю цікавитись, чи є ще щось, що я роблю неправильно? Висновок:
DROP TABLE IF EXISTS processing.parcels_trimmed_no_coalesce;
І я запускаю запити з вікна запитів PostgreSQL SQL і Openjump.
Заява, яку я використовую для перегляду таблиці:
SELECT * FROM processing.parcels_trimmed_no_coalesce;
В інтересах спрощення я скоротив цей запит до просто:
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;
Це все одно призводить до отримання лише оригінальних багатокутників (test.geometriestocut), коли бажаний результат є оригінальним, обробленим проти test.geometriestocutagainst.
WHERE
застереження, тож у отриманій таблиці може виникнути поліноміальне розширення. Скільки рядівtrimmedparcelsnew
?