मैं वर्तमान में समकालिक और अंतर्निहित एल्गोरिदम के क्षेत्र में काम कर रहा हूं। अब समस्याओं का क्या कारण है, यदि आइसोक्रोन स्वयं की गणना नहीं है, लेकिन परिणामों की कल्पना है।
मेरे आइसोक्रोन एल्गोरिथ्म के परिणाम बिंदु और किनारे हैं। वास्तव में मेरे पास एक कार्यशील समाधान है, लेकिन 3873 किनारों के लिए और 1529 नोड्स के लिए चीजें हमेशा के लिए लगती हैं (मेरे लेनोवो T440s लैपटॉप पर लगभग 2.0 सेकंड) जिसमें 2015 कोर i7 सीपीयू और एक बहुत तेज एसएसडी होता है)। सेकंड के बजाय मुझे कुछ और पसंद है जैसे कि msec :-)।
हो सकता है कि कोई व्यक्ति पॉलीगॉन बनाने के लिए आवश्यक गणना समय को कम करने में मेरी मदद कर सकता है जो कि उपलब्ध क्षेत्रों की कल्पना करता है।
लेकिन रुकिए ... पहले चीजें पहले!
यहां किनारों का एक दृश्य है कि मैं अपने
आइसोक्रोन का गणना परिणाम हूं:
ये किनारों को पोस्टजीआईएस डेटाबेस तालिका में संग्रहीत किया जाता है और सरल लिनेस्टर हैं।
उपयोगकर्ता को जो मैं दिखाना चाहता हूं वह इस तरह दिखता है: चित्र के बहुत दक्षिण और बहुत पूर्व में डिस्कनेक्ट किए गए क्षेत्रों पर ध्यान दें। इन्हें अलग-अलग क्षेत्रों के रूप में तैयार किया जाना चाहिए (इसलिए यहां कोई विलय की अनुमति नहीं है :-))
वर्तमान में मैं इस क्वेरी का उपयोग कर रहा हूं:
SELECT ST_AsGeoJson(St_Transform(ST_Multi(ST_Collect(polygons)), 4326)) AS coverage FROM (
SELECT ST_MakePolygon(ST_ExteriorRing(ST_GeometryN(segments, generate_series(1, ST_NumGeometries(segments))))) AS polygons FROM (
SELECT ST_Union(ST_Buffer("GEOMETRY", 20, 'quad_segs=2')) AS segments FROM my_edges AS a
) AS b
) AS c
मैंने पहले से ही कुछ प्रयोग किए हैं और मैंने बहुत सारे दस्तावेज भी पढ़े हैं, लेकिन मैं सिर्फ एक बेहतर समाधान नहीं खोज सकता।
मेरी नजर में बड़ी समस्या ST_Union का उपयोग है (जैसा कि डॉक्स में कहा गया है कि यह कार्य धीमा हो सकता है)। बहुत दिलचस्प बात यह है कि इसे ST_Collect के साथ प्रतिस्थापित करने से ST_Buffer गणना धीमी हो जाती है, ताकि सभी-सभी निम्नलिखित क्वेरी में अधिक समय लगे, हालांकि यह किनारों के बीच के क्षेत्रों को नहीं भरता है (यह केवल लाइनों के चारों ओर एक बफर बनाता है ):
SELECT ST_AsGeoJson(St_Transform(ST_Multi(ST_Collect(polygons)), 4326)) AS coverage FROM (
SELECT ST_Buffer(ST_Collect(ST_LineMerge("GEOMETRY")), 20, 'quad_segs=2') AS polygons FROM my_edges AS a
) AS b
यह मेरे सिस्टम पर लगभग 3.8 सेकंड लेता है (इसलिए लगभग दो बार)। इस छोटे बेंचमार्क से मेरा पहला निष्कर्ष यह है कि ST_Buffer अप्रत्याशित रूप से धीमा हो जाता है जब यह मल्टीलाइनस्ट्रेस (यहां तक कि जब प्रत्येक पंक्ति के लिए बफ़र्स बनाने और बफ़र्स को मर्ज करने की तुलना में धीमा हो जाता है - जो मेरी नज़र में सिर्फ अजीब है)
मैंने अल्फा-आकृतियों (pgRout से कार्यान्वयन का उपयोग करके) का उपयोग करने की भी कोशिश की, लेकिन चूंकि कोई अल्फा मान सेट करने के लिए नहीं है (और वास्तव में मुझे अब ऐसा मूल्य निर्धारित करने के लिए कौन सा मूल्य नहीं होगा) मुझे बस एक महान बहुभुज मिलता है ( इसलिए मैं अलग-अलग क्षेत्रों के रूप में बहुत दक्षिण और पूर्व में क्षेत्रों को खो दूंगा जो कि मैं नहीं चाहता)।
इसके अलावा ST_Polygonize (जो मेरे दिमाग में आई पहली चीज थी) कोई भी परिणाम देने योग्य नहीं था, लेकिन शायद मैं यहां से चूक गया ...
क्या PostGIS में दिखाए गए क्षेत्र को बनाने का एक बेहतर तरीका है? शायद जावा कोड (jts) या क्लाइंट साइड जावास्क्रिप्ट कोड (jsts) का उपयोग करके भी? वास्तव में मैं कुछ विस्तार खोने के साथ रह सकता था जब तक कि मेरे परिणाम में दिखाए गए क्षेत्र अलग-अलग रहते हैं और गणना बहुत तेज हो जाती है।