PostGis 2.1 (ve Postgres SQL 9.3) kullanarak başka bir çokgen kümesi (test.single_geometry_1) herhangi bir alanı içermeyen çokgenler kümesi (işleme.trimmedparcelsnew) oluşturmak için ST_Difference kullanmaya çalışıyorum. İşte benim sorgu:
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;
Ancak ortaya çıkan çokgenler kırpılmamış, bunun yerine diğer katmanla kesiştikleri yerde bölünmüş gibi görünüyorlar. Sonucu bir tabloya ve aklınıza gelebilecek diğer her şeye koymadan seçimi çalıştırmayı denedim, ancak bu işlevi çalıştıramadım.
Sonucun bir resmini ekledim
Yorumlardan sonra, bir WHERE yan tümcesi eklemeyi denedim. Kesişme olmayan parseller ve diğer parsellerin kesişen alanlarının kaldırılmasını istiyorum (katman testi.single_geometry, parsellerimden çıkarılmasını istediğim kirliliği temsil ediyor). Bir kavşak denedim ama tabii ki aslında kavşakları istemiyorum, bu yüzden şimdi ayrılmaya çalışıyorum. Ben de benim tabloya orig eklemeyi denedim ama ST_Difference ( http://postgis.net/docs/ST_Difference.html ) belgelerini tam ihtiyacım geometri (A geometrisinin bu kısmını temsil eden bir geometri döndürür) diyor geometri B ile kesişmez), bu yüzden neden orijinal çokgeni masamda neden isteyeceğim konusunda kafam karıştı. Her neyse, işte benim değiştirilmiş kodum:
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);
Dbaston'un cevabından sonra şimdi denedim:
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;
Bunun sonucu yalnızca test.multi_geometry_1 ürününün bir kopyasıdır. Gerçi şimdi bölünme gerçekleşmiyor.
Önceki sürümü denedim, ancak tekrar sadece test.multi_geometry_1 kopyasını alın:
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;
Yanlış yaptığım başka bir şey olup olmadığını merak etmeye başlıyorum? Devam eden ifade:
DROP TABLE IF EXISTS processing.parcels_trimmed_no_coalesce;
Ve ben PostgreSQL SQL sorgu penceresinden ve Openjump sorguları çalıştırıyorum.
Tabloyu görmek için kullandığım ifade:
SELECT * FROM processing.parcels_trimmed_no_coalesce;
Sadeleştirme açısından şimdi bu sorguyu aşağıya indirdim:
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;
Bu, istenen sonuç test.geometriestocutagainst'e kesilmiş orijinal olduğunda, yalnızca orijinal çokgenlerle (test.geometriestocut) sonuçlanır.
WHERE
cümle belirtmediniz , dolayısıyla ortaya çıkan tabloda polinom genişlemesi olabilir. Kaç satır vartrimmedparcelsnew
?