PostGIS में समय के साथ बिंदु समूहों की पहचान और सरलीकरण कैसे करें?


11

मैंने सिर्फ स्थानिक डेटाबेस के साथ काम करना शुरू किया है और मैं कच्चे जीपीएस-ट्रैक्स (निश्चित ट्रैकिंग आवृत्ति के साथ) के सामान्यीकरण के लिए एक एसक्यूएल (पोस्टजीआईएस) क्वेरी लिखना चाहता हूं। पहली चीज़ जो मैं जा रहा हूँ, वह एक क्वेरी है जो प्रतिनिधि बिंदुओं द्वारा बड़े पैमाने पर बिंदु बादलों को बदलने के लिए "y मीटर की दूरी के भीतर x अंक" जैसे क्वेरी के रूप में स्टैंडस्टिल के बिंदुओं की पहचान करती है। मुझे पहले से ही एक निश्चित दूरी के भीतर अंक स्नैप करने और तड़कने वालों को गिनने का एहसास हुआ। नीचे दी गई तस्वीर में एक कच्चा उदाहरण ट्रैक (छोटे काले बिंदु) और तले हुए बिंदुओं के केंद्रों को रंगीन मंडलियों के रूप में देखा जा सकता है (आकार = तड़क बिंदुओं की संख्या)।

यहाँ छवि विवरण दर्ज करें

CREATE table simplified AS 
 SELECT count(raw.geom)::integer AS count, st_centroid(st_collect(raw.geom)) AS center
   FROM raw
  GROUP BY st_snaptogrid(raw.geom, 500, 0.5)
  ORDER BY count(raw.geom) DESC;

मैं इस समाधान से काफी संतुष्ट हूं, लेकिन समय-समस्या है: ट्रैक को एक पूरे दिन के ट्रैक के रूप में लागू करना, जिस शहर में व्यक्ति पहले से ही देखे गए स्थानों पर लौट सकता है। मेरे उदाहरण में, डार्क-ब्लू सर्कल उस व्यक्ति के घर का प्रतिनिधित्व करता है जिसे उसने दो बार दौरा किया था लेकिन मेरी क्वेरी निश्चित रूप से उस पर ध्यान नहीं देती है।

इस मामले में, परिष्कृत क्वेरी को केवल सन्निहित टाइमस्टैम्प (या आईडी) के साथ अंक एकत्र करना चाहिए, ताकि यह यहां दो प्रतिनिधित्व बिंदुओं का उत्पादन करे। मेरा पहला विचार मेरी क्वेरी का 3 डी-संस्करण (तीसरे आयाम के रूप में समय) में संशोधन था, लेकिन यह काम नहीं करता है।

किसी को भी मेरे लिए कोई सलाह है? मुझे उम्मीद है कि मेरा प्रश्न स्पष्ट है।


लाइन-विचार के लिए धन्यवाद। मुझे एक लिनेस्ट्रिंग बनाने और सरल बनाने का एहसास हुआ जैसा कि आप नीचे स्क्रीनशॉट में देख सकते हैं (डॉट्स मूल बिंदु हैं)। यहाँ छवि विवरण दर्ज करें मुझे अभी भी आराम की जगहों (> x x त्रिज्या में x बिंदुओं) को निर्धारित करने की आवश्यकता है, आदर्श रूप से एक आगमन समय और एक छोड़ने के समय के साथ एक बिंदु ... कोई अन्य विचार?


2
क्या आपको वास्तव में अन्य उद्देश्यों के लिए बिंदुओं की आवश्यकता है? अन्यथा, ऐसा लगता है कि शायद बस बिंदुओं से लाइनें बनाई जा रही हैं, और फिर उन पंक्तियों को सरल / सामान्य करना आपके उद्देश्य की पूर्ति करेगा।
एंथनी -गिसो-

2
यह एक आकर्षक समस्या है। आप अनिवार्य रूप से उसी प्रश्न से कुछ विचारों को चमकने में सक्षम हो सकते हैं जो गणितज्ञ साइट पर mathematica.stackexchange.com/questions/2711 पर पूछा गया था । सभी उत्तर डेटा के अस्थायी आयाम का दोहन नहीं करते हैं (लेकिन मेरा है :-)।
whuber

@ एंथोनी-जीआईएससीओई- यह एक दिलचस्प दृष्टिकोण है। यदि मामले में सुविधाओं की आवश्यकता है, तो नए को सामान्यीकृत लाइनों के कोने से बनाया जा सकता है, या यहाँ gis.stackexchange.com/questions/27102/… जैसी लाइनों के साथ बनाया जा सकता है । मुझे पता है, वे अभी भी मूल बिंदु नहीं हैं!
-ytilia

@ एंथोनी: मुझे पूरी तरह से "प्रतिनिधित्व" की जरूरत है-किसी भी समझ के-पॉइंट्स और कम से कम शुरुआत और एंडटाइम ...
बर्लिन_ज

1
और यह वास्तव में उपयोगी होगा एक
पोस्टगिस

जवाबों:


4

यदि आपको वास्तव में विज़ुअलाइज़ेशन के लिए सभी बिंदुओं की आवश्यकता है, तो आप एक लाइन बना सकते हैं और st_simplify (जो डगलस प्यूकर कार्यान्वयन है) काम को काफी अच्छी तरह से करेगा।

कुछ मामलों में आपको सभी बिंदुओं को संग्रहीत करने की भी आवश्यकता नहीं होती है, इसलिए आप बिंदु डेटा को सहेजने से पहले फ़िल्टरिंग कर सकते हैं, जैसे जब विषय नहीं चलता है, तो इसे संग्रहीत न करें। DB में अंक जोड़ने से पहले आप डगलसपाइकर या कुछ अन्य मूल फ़िल्टर लागू कर सकते हैं। इसके अलावा कुछ जीपीएस प्रदाता (जैसे एंड्रॉइड लोकेशन एपीआई) समय और न्यूनतम दूरी के आधार पर प्रारंभिक फ़िल्टरिंग स्वचालित रूप से कर सकते हैं। कुछ मामलों में आप डुप्लिकेट डेटा रखते हैं: तेज़ विज़ुअलाइज़ेशन के लिए पूर्वनिर्मित और संग्रह के लिए पूर्ण लॉग। आजकल प्लेन स्टोरेज काफी सस्ता है।


3

इस बीच, मुझे अपनी समस्या का हल मिल गया:

सबसे पहले, मैंने हर बिंदु के लिए "दूरी-प्रकार" निर्धारित किया। यदि बिंदु x मीटर के रूप में अगले बिंदु के करीब है, तो इसे "स्टॉप" के रूप में निर्धारित किया जाता है, अन्यथा "चाल" के रूप में। फिर, मैंने इस तरह से एक विंडो फ़ंक्शन शुरू किया:

     SELECT t1.id, t1.dist_type, t1."time", t1.the_geom, t1.group_flag, sum(t1.group_flag) OVER (ORDER BY t1.id) AS group_nr
FROM ( SELECT distances.id, distances.the_geom, distances."time", distances.dist_type, 
                CASE
                    WHEN lag(distances.dist_type) OVER (ORDER BY distances.id) = distances.dist_type THEN NULL::integer
                    ELSE 1
                END AS group_flag
           FROM distances) t1;

परिणामी तालिका निम्नानुसार है:

यहाँ छवि विवरण दर्ज करें

सरल अगले चरण समूह "स्टॉप" अंक, इन बिंदु समूहों के केंद्रक की पहचान करते हैं, और आगमन और समय छोड़ने के रूप में न्यूनतम और अधिकतम टाइमस्टैम्प लेते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.