İki katman arasında bir kavşak gerçekleştirmeye çalışıyorum:
- Bazı yolları temsil eden çoklu katman (~ 5500 satır)
- Çeşitli ilgi noktalarında (~ 47.000 satır) düzensiz şekilli tamponları temsil eden çokgen katman
Nihayetinde, yapmaya çalıştığım şey, çok sayıda (bazen çakışan) tamponlara çoklu çizgileri kırpmak ve daha sonra her bir tampon içindeki toplam yol uzunluğunu özetlemektir.
Sorun şu ki, şeyler YAVAŞ çalışıyor. Bunun ne kadar sürmesi gerektiğinden emin değilim, ancak sorgumu> 34 saat sonra iptal ettim. Birisi ya SQL sorgu ile bazı hata yaptım nerede işaret edebilir, ya da bana bunu yapmak için daha iyi bir yol işaret umuyoruz.
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;
Orijinal yollar tablo için oluşturulan bir GiST dizini var ve (sadece güvenli olmak için?) İkinci tablo oluşturma yapmadan önce bir dizin oluşturmak.
Korkarım ki PGAdmin III'ten gelen sorgu planı şuna benziyor: Bunu yorumlama konusunda çok fazla yeteneğim yok:
"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)"
Bu işlem birkaç gün sürecek mi? Şu anda Windows için PostGIS'de çalıştırıyorum, ancak teorik olarak Amazon EC2'ye koyarak daha fazla donanım atabilirim. Ancak, sorgu tek seferde yalnızca bir çekirdek kullandığını görüyorum (daha fazla kullanmak için bir yolu var mı?).