Tôi đang cố gắng thực hiện một giao điểm giữa hai lớp:
- Lớp polyline đại diện cho một số đường (~ 5500 hàng)
- Lớp đa giác biểu thị bộ đệm có hình dạng không đều xung quanh các điểm quan tâm khác nhau (~ 47.000 hàng)
Cuối cùng, những gì tôi đang cố gắng làm là cắt các polylines cho nhiều bộ đệm (đôi khi chồng chéo) này, và sau đó tổng hợp tổng chiều dài đường có trong mỗi bộ đệm.
Vấn đề là mọi thứ đang chạy SLOW. Tôi không chắc sẽ mất bao lâu, nhưng tôi đã hủy bỏ truy vấn của mình sau> 34 giờ. Tôi hy vọng rằng ai đó có thể chỉ ra nơi tôi đã mắc một số lỗi với truy vấn SQL của mình hoặc có thể chỉ cho tôi cách làm việc này tốt hơn.
CREATE TABLE clip_roads AS
SELECT
ST_Intersection(b.the_geom, z.the_geom) AS clip_geom,
b.*
FROM
public."roads" b,
public."buffer1KM" z
WHERE ST_Intersects(b.the_geom, z.the_geom);
CREATE INDEX "clip_roads_clip_geom_gist"
ON "clip_roads"
USING gist
(clip_geom);
CREATE TABLE buffer1km_join AS
SELECT
z.name, z.the_geom,
sum(ST_Length(b.clip_geom)) AS sum_length_m
FROM
public."clip_roads" b,
public."buffer1KM" z
WHERE
ST_Contains(z.the_geom, b.the_geom)
GROUP BY z.name, z.the_geom;
Tôi có một chỉ mục GiST được tạo cho bảng đường ban đầu và (để an toàn?) Tạo một chỉ mục trước khi thực hiện tạo bảng thứ hai.
Kế hoạch truy vấn từ PGAdmin III trông như thế này, mặc dù tôi e rằng tôi không có nhiều kỹ năng trong việc diễn giải nó:
"Nested Loop (cost=0.00..29169.98 rows=35129 width=49364)"
" Output: st_intersection(b.the_geom, z.the_geom), b.gid, b.geo_id, b.address_l, b.address_r, b.lf_name, b.lfn_id, b.lfn_name, b.lfn_type_c, b.lfn_type_d, b.lfn_dir_co, b.lfn_dir_de, b.lfn_desc, b.oe_flag_l, b.oe_flag_r, b.fcode_desc, b.fcode, b.fnode, b.tnode, b.metrd_num, b.lo_num_l, b.lo_n_suf_l, b.hi_num_l, b.hi_n_suf_l, b.lo_num_r, b.lo_n_suf_r, b.hi_num_r, b.hi_n_suf_r, b.juris_code, b.dir_code, b.dir_code_d, b.cp_type, b.length, b.the_geom"
" Join Filter: _st_intersects(b.the_geom, z.the_geom)"
" -> Seq Scan on public."roads" b (cost=0.00..306.72 rows=5472 width=918)"
" Output: b.gid, b.geo_id, b.address_l, b.address_r, b.lf_name, b.lfn_id, b.lfn_name, b.lfn_type_c, b.lfn_type_d, b.lfn_dir_co, b.lfn_dir_de, b.lfn_desc, b.oe_flag_l, b.oe_flag_r, b.fcode_desc, b.fcode, b.fnode, b.tnode, b.metrd_num, b.lo_num_l, b.lo_n_suf_l, b.hi_num_l, b.hi_n_suf_l, b.lo_num_r, b.lo_n_suf_r, b.hi_num_r, b.hi_n_suf_r, b.juris_code, b.dir_code, b.dir_code_d, b.cp_type, b.length, b.the_geom"
" -> Index Scan using "buffer1KM_index_the_geom" on public."buffer1KM" z (cost=0.00..3.41 rows=1 width=48446)"
" Output: z.gid, z.objectid, z.facilityid, z.name, z.frombreak, z.tobreak, z.postal_cod, z.pc_area, z.ct_id, z.da_id, z.taz_id, z.edge_poly, z.cchs_0708, z.tts_06, z.the_geom"
" Index Cond: (b.the_geom && z.the_geom)"
Là hoạt động này chỉ cam chịu để chạy trong vài ngày? Tôi hiện đang chạy cái này trên PostGIS cho Windows, nhưng về lý thuyết tôi có thể giải quyết nhiều vấn đề về phần cứng hơn bằng cách đưa nó lên Amazon EC2. Tuy nhiên, tôi thấy rằng truy vấn chỉ sử dụng một lõi tại một thời điểm (có cách nào để làm cho nó sử dụng nhiều hơn không?).