मैं दो परतों के बीच एक चौराहा प्रदर्शन करने की कोशिश कर रहा हूँ:
- कुछ सड़कों का प्रतिनिधित्व करने वाली पॉलीलाइन परत (~ 5500 पंक्तियाँ)
- बहुभुज परत ब्याज के विभिन्न बिंदुओं के आसपास अनियमित आकार के बफ़र्स का प्रतिनिधित्व करती है (~ 47,000 पंक्तियाँ)
अंततः, मैं जो करने की कोशिश कर रहा हूं, वह इन कई (कभी-कभी अतिव्यापी) बफ़र को पॉलीइन्स को क्लिप करना है, और फिर प्रत्येक बफ़र के भीतर निहित रोडवे की कुल लंबाई को योग करना है।
समस्या यह है कि चीजें धीमी गति से चल रही हैं। मुझे यकीन नहीं है कि यह कितना समय लेना चाहिए, लेकिन मैंने सिर्फ> 34 घंटे के बाद अपनी क्वेरी निरस्त कर दी। मैं उम्मीद कर रहा हूं कि कोई व्यक्ति या तो यह इंगित कर सकता है कि मैंने अपनी एसक्यूएल क्वेरी के साथ कुछ गलती की है, या मुझे ऐसा करने के बेहतर तरीके से इंगित कर सकता है।
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 पर इसे चला रहा हूं, लेकिन मैं सैद्धांतिक रूप से अमेज़न EC2 पर इसे डालकर समस्या पर अधिक हार्डवेयर फेंक सकता हूं। हालाँकि, मैं देख रहा हूँ कि क्वेरी केवल एक समय में एक कोर का उपयोग कर रही है (क्या इसका अधिक उपयोग करने का कोई तरीका है?)।