Daha çox

PostGIS istifadə edərək bir çoxbucaqlı bir poliqonu necə bölmək olar?

PostGIS istifadə edərək bir çoxbucaqlı bir poliqonu necə bölmək olar?


Məndə daha kiçik bir çoxbucaqlı (cədvəl_b) olan böyük bir çoxbucaqlı (cədvəl_a) var. İndi daha böyük poliqonu kiçik poliqonla bölmək istəyirəm.

təəssüf kist_split (cədvəl_a.geom, cədvəl_b.geom)işləmir (Xəta: Bir çoxbucağı bir çoxbucaqla bölmək dəstəklənmir).

PostGIS istifadə edərək çoxbucağı çoxbucaqla bölmək üçün bir yol varmı?


Bir çoxbucağı başqa bir çoxbucaqla bölə bilməzsiniz, ancaq istifadə edə bilərsinizST_Hüdudbir çoxbucaqlı əmələ gətirən sətirləri çıxarmaq və sonra bölməyi etmək. Misal üçün:

Müvəqqəti cədvəl test məlumatları yaradın (id serial, geom həndəsə); INSTERT INTO testdata (geom) VALUES (ST_Buffer ('POINT (0 0)', 1)), (ST_Buffer ('POINT (0.5 0)', 1)); ST_Split SEÇİN (a.geom, ST_Boundary (b.geom)) FROM testdata a, testdata b WHERE ST_Intersects (a.geom, b.geom) AND a.id! = B.id;

Bunu etmək üçün bir neçə yol var, məsələn hissəni kəsişmədən əldə etmək üçün st_difference istifadə edə bilərsiniz:

st_difference (table_a.geom, table_b.geom)

və st_intersection kəsişməsini almaq üçün:

st_intersection (table_a.geom, table_b.geom)

Misal:

poli a poli b ehtiva edir:

st_difference:

st_intersection:

EDIT1: eyni qata bölünmək üçün əlavə həll:

Yeni bir cədvəl yaratmaq istəmirsinizsə, çoxbucaqlıların arasından keçib b poliqonlarını b qatından digər çoxbucaqların olduğu yerlərə bölə bilərsiniz.

Bu həlli sınamaq üçün yalnız iki çoxbucaqlı təbəqə yarada və bəzi çoxbucaqlıları rəqəmləşdirə bilərsiniz. Bunu cədvəlinizlə etməzdən əvvəl həllinizin sizin üçün işlədiyinə əmin olun, çünki bölünməsi lazım olan orijinal poliqonları masanızdan silin:

CƏDVƏL YARATIN public.testpolygons1 (gid serial PRIMARY ANAHTAR, geom həndəsə (Polygon, 3857)); CƏDVƏL YARATIN public.testpolygons2 (gid serial PRIMARY KEY, geom həndəsə (Polygon, 3857)); - İNDİ BƏZİ POLİQONLARI RƏQƏMLƏNDİRİN, beləliklə qat çoxbucaqlarındakı1 çoxbucaqlı təbəqə çoxbucaqlarında2 çoxbucaqlılar var2; - ŞİMDİ qat çoxbucaqlılarındakı bütün xüsusiyyətlər vasitəsi ilə DÖNDÜRÜLMƏSİNİZ 1 $ $ BİLDİRİN query_string MƏTN; var_record RECORD; var_record2 RECORD; Var_record İÇİN SEÇİN GID, geom FROM testpolygons1DAN BAŞLA ((SELECT count (*) FROM (SELECT var_record.gid FROM testpolygons2 AS b WHERE ST_Contains (var_record.geom, ST_Boundary (b.geom))) AS test)> 0 ) O zaman testpolygons1 (geom) SELECT (ST_Dump (ST_Split (var_record.geom, b.geom))). Geom - DAHA ÇOX ATRİBUTLAR ƏLAVƏ ETİN (ST_Boundary (geom) OLDUĞUNU testpolygons2 kimi) var_record.geom, b.geom); Testpolygons1-dən SİLİN HARADA gid = var_record.gid; DİQQƏTİ%% artırın, var_record.geom; BAŞQA BİLDİRİŞDƏ 'bölünməyə ehtiyac yoxdur'; SONDUR; DİGƏRLƏRİN DİQQƏTLƏNDİRMƏSİNDƏN İSTİSNAL 'XƏBƏRDARLIĞI' Hata:% ', SQLERRM; SON; SON DÖNGÜ; END $$; ------------------ - VƏ YA DA FUNKSİYA İLƏ EYNİ ETİN: FUNKSİYANI YARATIN poly_split_poly () $$ BİLGİSİNDƏ QAYDI QAYDI var_record RECORD; Var_record İÇİN SEÇİN GID, geom FROM testpolygons1DAN BAŞLA ((SELECT count (*) FROM (SELECT var_record.gid FROM testpolygons2 AS b WHERE ST_Contains (var_record.geom, ST_Boundary (b.geom))) AS test)> 0 ) SONRA testpolygons1 (geom) SELECT (ST_Dump (ST_Split (var_record.geom, b.geom)))). Geom - INSOM (əlavə et) testpolygons2-dən SEOM ST_Boundary (geom) əlavə etmədən ƏLAVƏ OLARAQ İSTƏYİN. ST_Contains (var_record.geom, b.geom); Testpolygons1-dən SİLİN HARADA gid = var_record.gid; --QAZDIRMA '%', var_record.geom; DİQQƏT BİLGİSİ 'Gid% bölünmüş poliqon', var_record.gid; BAŞQA BİLDİRİŞDƏ 'bölünməyə ehtiyac yoxdur'; SONDUR; DİGƏRLƏRİN DİQQƏTLƏNDİRMƏSİNDƏN İSTİSNAL 'XƏBƏRDARLIĞI' Hata:% ', SQLERRM; SON; SON DÖNGÜ; SON; $$ DİL plpgsql; - FUNKSİYANI RUN: SEÇİN poly_split_poly ();

https://gist.github.com/neogis-de/4111323180849e5a8f9f

Daha asan bir həll yolu olmadığına əmin deyiləm, amma bu mənim üçün işləyir.


Table_a adını dəyişin və yeni bir table_a yaradın 'AS SELECT' işə yarayan kimi görünür:

DƏYİŞDİRMƏ CƏDVƏLİ my_schema.table_a CƏDVƏLİ_A_DELETE YENİDƏN YENİDİR; CƏDVƏL YARADIN my_schema.table_a AS SELECT row_number () over () AS gid, subquery. * FROM (SELECT (ST_Dump (COALEomach (ST_Difference (table_a_delete.geom, ST_Union (table_b.geom)), table_a_delete.geom))). : my_schema.table_a_delete, my_schema.table_b-dən həndəsə (poliqon, SRID) - WHERE table_b.column_xy = 'value_xy' GROUP BY table_a_delete.gid) AS sual; DROP CƏDVƏLİ my_schema.table_a_delete;

Diqqət yetirməyəcəyim bir şey varmı?


Videoya baxın: Paraleloqram,onun xassələri və əlamətləri 1-52