Saya mencoba melakukan persimpangan antara dua lapisan:
- Lapisan polyline mewakili beberapa jalan (~ 5500 baris)
- Lapisan poligon mewakili buffer berbentuk tidak teratur di sekitar berbagai tempat menarik (~ 47.000 baris)
Pada akhirnya, apa yang saya coba lakukan adalah untuk memotong polylines ke banyak (kadang tumpang tindih) buffer ini, dan kemudian meringkas total panjang jalan yang terkandung dalam setiap buffer.
Masalahnya adalah bahwa semuanya berjalan lambat. Saya tidak yakin berapa lama ini harus dilakukan, tetapi saya baru saja membatalkan permintaan saya setelah> 34 jam. Saya berharap bahwa seseorang dapat menunjukkan di mana saya telah membuat kesalahan dengan permintaan SQL saya, atau dapat mengarahkan saya ke cara yang lebih baik untuk melakukan ini.
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;
Saya memiliki indeks GiST yang dibuat untuk tabel jalan asli, dan (hanya untuk aman?) Membuat indeks sebelum melakukan pembuatan tabel kedua.
Rencana kueri dari PGAdmin III terlihat seperti ini, meskipun saya khawatir saya tidak memiliki banyak keterampilan dalam menafsirkannya:
"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)"
Apakah operasi ini hanya akan berjalan selama beberapa hari? Saya saat ini menjalankan ini pada PostGIS untuk Windows, tetapi secara teori saya dapat melemparkan lebih banyak perangkat keras pada masalah dengan meletakkannya di Amazon EC2. Namun, saya melihat bahwa kueri hanya menggunakan satu inti pada satu waktu (apakah ada cara untuk membuatnya menggunakan lebih banyak?).