ฉันพยายามแยกระหว่างสองชั้น:
- Polyline layer แสดงถนนบางเส้น (ประมาณ 5500 แถว)
- ชั้นรูปหลายเหลี่ยมที่แสดงบัฟเฟอร์รูปร่างผิดปกติรอบ ๆ จุดที่น่าสนใจต่างๆ (ประมาณ 47,000 แถว)
ท้ายที่สุดสิ่งที่ฉันพยายามทำคือตัดคลิป polylines ไปยังบัฟเฟอร์ (บางครั้งซ้อนทับกัน) เหล่านี้แล้วสรุปความยาวรวมของถนนที่อยู่ในบัฟเฟอร์แต่ละอัน
ปัญหาคือสิ่งที่กำลังทำงานช้า ฉันไม่แน่ใจว่าจะใช้เวลานานเท่าใด แต่ฉันเพิ่งยกเลิกการสืบค้นหลังจาก> 34 ชั่วโมง ฉันหวังว่าบางคนสามารถชี้ให้เห็นว่าฉันทำผิดพลาดกับแบบสอบถาม SQL ของฉันหรือสามารถชี้ให้ฉันเป็นวิธีที่ดีกว่าในการทำเช่นนี้
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;
ฉันมีดัชนี GiST ที่สร้างขึ้นสำหรับตารางถนนต้นฉบับและ (เพื่อความปลอดภัยหรือไม่) สร้างดัชนีก่อนที่จะสร้างตารางที่สอง
แผนแบบสอบถามจาก PGAdmin III มีลักษณะเช่นนี้ แต่ฉันเกรงว่าฉันไม่มีทักษะในการตีความ:
"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)"
การดำเนินการนี้เป็นเพียงอีกต่อไปที่จะทำงานเป็นเวลาหลายวัน? ขณะนี้ฉันกำลังใช้งาน PostGIS สำหรับ Windows แต่ในทางทฤษฎีแล้วฉันสามารถเพิ่มฮาร์ดแวร์ให้กับปัญหาได้โดยวางลงบน Amazon EC2 อย่างไรก็ตามฉันเห็นว่าแบบสอบถามใช้เพียงหนึ่งคอร์ในแต่ละครั้ง (มีวิธีที่จะทำให้ใช้มากกว่าหรือไม่)