Làm thế nào để tăng tốc độ phân vùng không gian trong postgis?


9

Tôi có một loạt các đa giác chồng chéo và tôi đang cố gắng phân vùng không gian để tránh có các đa giác chồng chéo. Tôi nghĩ vấn đề của tôi khá đơn giản. Sử dụng một số sản phẩm ESRI và http://arcscripts.esri.com/details.asp?dbid=16700 đồng nghiệp của tôi đã tính toán nó trong 48 giây.

Tôi đang cố gắng thực hiện với postgis bằng cách sử dụng http://s3.opengeo.org/postgis-power.pdf#page=24 (đoán chi tiết, sử dụng http://trac.osgeo.org/postgis/wiki/UsersWikiSimplifyPreserveTopology như một nguồn cảm hứng) nhưng nó chậm đến mức tôi không thể làm điều đó với hơn 10 polys (tôi đã có 800 trong số chúng để chia tách). Phần chậm là ST_Union, tôi đã thử nhiều thứ, nhưng không có nơi nào thành công, đây là tình trạng hiện tại:

select geom from
(select st_linemerge(st_union(geom)) as geom from
    (select st_exteriorring((st_dumprings((st_dump(t.geom)).geom)).geom) as geom from
        (SELECT geometry AS geom, id
               FROM tt
              WHERE campaign_id = 204
              ORDER BY id limit 200) t) t2) t3

điều này đã được tính toán trong 26 phút (linTablege () thực tế là không). Các polys là MultiPolygons trong trường hợp st_dump làm phiền bạn.

Bạn có bất cứ lời khuyên? St_union () của linework là phần rất chậm.

Cảm ơn,

Nico.

PS: đây là một số con số: 852 đa cực, dẫn đến 14880 đa giác, dẫn đến 21467 linestrings có tổng số 315513 đỉnh.


Nếu không có ai trả lời, bạn có thể muốn thử danh sách gửi thư của postGIS.
GIS-Jonathan

Tôi không thực sự hâm mộ danh sách gửi thư, hơn nữa, nó cũng có thể là một vấn đề GEOS, người có thể phàn nàn về JTS, tốt, tôi thích giữ vấn đề mở.
nraynaud

bằng cách thu thập các đường thẳng và thực hiện liên kết với một hình học trống, tôi có thể thực hiện nó trong 800 giây: st_union (st_collect (geom), st_setsrid (geomfromtext ('POINT EMPTY'), 900913) chậm hơn gần 20 lần so với công cụ ESRI.
nraynaud

1
từ bộ nhớ, hãy thử thả st_union từ st_linemerge (st_union ...) nếu nó giúp
Simplexio

Câu trả lời:


3

Câu trả lời này có thể không giúp @nraynaud trực tiếp, nhưng hy vọng sẽ làm sáng tỏ chủ đề này.

Có một vấn đề tương tự trong spatiaLite <4.0 do vấn đề với GEOS. Xem liên kết này để thảo luận về vấn đề này.

Cách giải quyết là thay thế hàm ST_Union () bằng ST_UnaryUnion (ST_Collect ()). Thật không may, ST_UnaryUnion không có sẵn cho đến postGIS 2.0 (theo như tôi có thể nói.)


1

Phiên bản nào của PostGIS bạn đang sử dụng? Liên kết chậm hơn nhiều nếu bạn đang sử dụng PostGIS <1.4 hoặc GEOS <3.2. Liên minh nhanh hơn nhiều đã được giới thiệu trong 1.4, nhưng cũng yêu cầu GEOS 3.2+. Vì vậy, trước tiên nếu bạn đang sử dụng thấp hơn 1,4, tôi sẽ nâng cấp lên ít nhất 1,5.

SELECT postgis_full_version();

Để kiểm tra.

Cũng là ý định của bạn để giữ các cạnh ban đầu của đa giác. Nếu bạn chỉ muốn giải thể các khu vực chồng chéo,

SELECT ST_Union(geom) FROM tt WHERE campaign_id = 204;

Sẽ làm các mẹo.


xin chào, đây là kết quả: "POSTGIS =" 1.5.3 "GEOS =" 3.3.2-CAPI-1.7.2 "PROJ =" Rel. 4.8.0, ngày 6 tháng 3 năm 2012 "LIBXML =" 2.7.3 "USE_STATS". Tôi không thể tìm thấy bất kỳ bổ sung có liên quan đến liên minh trong GEOS gần đây. Tôi đã tìm thấy một tốc độ trong các hiệp hội đa giác, nhưng tôi không hợp nhất các đa giác, và sự tăng tốc này có vẻ gây tranh cãi. Tôi hoàn toàn không muốn liên kết các đa giác của mình vì tôi phải thêm các giá trị cho các đa giác chồng chéo.
nraynaud
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.