2011-12-19 15 views
5

के साथ रूट चेकपॉइंट के पास है, यहां स्थिति है:जांचें कि क्या उपयोगकर्ता जीपीएस

मेरे पास एक पूर्वनिर्धारित जीपीएस मार्ग है जो उपयोगकर्ता चलाएगा। मार्ग में कुछ चेकपॉइंट हैं और उपयोगकर्ता को उन सभी के पास पास होना चाहिए (उन्हें रेसिंग गेम चेकपॉइंट के रूप में सोचें, जो उपयोगकर्ता को शॉर्टकट लेने से रोकता है)। मुझे यह सुनिश्चित करने की ज़रूरत है कि उपयोगकर्ता सभी चेकपॉइंट्स से गुजरता है। मैं एक ऐसे क्षेत्र को निर्धारित करना चाहता हूं जिसे चेकपॉइंट के त्रिज्या के अंदर माना जाएगा, लेकिन मैं नहीं चाहता कि यह केवल एक रेडियल क्षेत्र हो, यह पथ के रूप को ध्यान में रखते हुए एक क्षेत्र होना चाहिए। इसे समझ में नहीं आया? मैंने भी नहीं किया। इस खराब तरीके से चित्र को बेहतर समझने के लिए देखें: Route example

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

मैंने पहले से ही यह देखने के लिए एक फ़ंक्शन देखा है कि उपयोगकर्ता इस तरह बहुभुज के अंदर है, लेकिन मुझे बहुभुज की गणना करने की आवश्यकता है।

कोई सुझाव?

संपादित करें:

मैं सरल distanceTo() फ़ंक्शन का उपयोग सिर्फ एक काल्पनिक वृत्त और जांच करने के लिए करता है, तो उपयोगकर्ता है पर विचार कर रहा हूँ। यह अच्छा है क्योंकि कार्यान्वित करने और समझने के लिए इतना आसान है, और बुरा है क्योंकि यह सुनिश्चित करने के लिए कि सबसे गलत उपयोगकर्ता चेकपॉइंट के साथ गुजरता है, मुझे एक बड़ा त्रिज्या चाहिए, जिससे सही उपयोगकर्ता अपेक्षाकृत चेकपॉइंट क्षेत्र में प्रवेश कर सके।

और बस आप लोग बेहतर स्थिति को समझते हैं, यह एक ऐप के लिए है जिसे यातायात (कार या बस) में उपयोग किया जाना चाहिए, और चेकपॉइंट्स आपके मार्ग को विभाजित करने वाले स्थलों या धब्बे होना चाहिए, उदाहरण के लिए, कहीं जहां यातायात जाम शुरू होता है या बंद हो जाता है।

+0

आंतरिक सर्कल का उपयोग करने के बजाय आपको बहुभुज की आवश्यकता क्यों है? – SERPRO

उत्तर

2

कड़ी में यह करने के लिए आप सिर्फ दो के बीच की दूरी की जांच कर सकता है, यह सोचते हैं आप चौकी की जियोलोकेशन पता है।

distanceTo फ़ंक्शन का उपयोग करें और उपयोगकर्ता को चेकपॉइंट से जारी रखने के लिए कई मीटर की सीमा तय करें।

संपादित

जब से तुम distanceTo से बचना चाहते हैं, यहाँ एक छोटे से समारोह मैं अगर एक बिंदु एक बहुभुज में है एक समय पहले की जाँच करने के लिखा है:

public boolean PIP(Point point, List<Point> polygon){ 
    boolean nodepolarity=false; 
    int sides = polygon.size(); 
    int j = sides -1; 
    for(int i=0;i<sides;i++){ 
     if((polygon.get(i).y<point.y && polygon.get(j).y>=point.y) ||(polygon.get(j).y<point.y && polygon.get(i).y>=point.y)){ 
      if (polygon.get(i).x+(point.y-polygon.get(i).y)/(polygon.get(j).y-polygon.get(i).y)*(polygon.get(j).x-polygon.get(i).x)<point.x) { 
       nodepolarity=!nodepolarity; 
      } 
     } 
    j=i; 
    } 
    return nodepolarity; //FALSE=OUTSIDE, TRUE=INSIDE 
} 

List<Point> polygon की एक सूची है पॉलीगॉन बनाने वाले अंक।

यह पॉलीगॉन के माध्यम से किरणों को कितने चौराहे बनाता है यह निर्धारित करने के लिए Ray casting algorithm का उपयोग करता है।

आपको केवल toPixels विधि का उपयोग करके जियोपॉइंट्स को पिक्सल में अनुवादित करने के साथ आवश्यक क्षेत्र के आस-पास 'सीमा' बनाना होगा।

उन बिंदुओं को एक सूची <> सूची में संग्रहीत करें, और आपको सभी सेट होना चाहिए।

+0

वही है जो मैं टालने की कोशिश कर रहा हूं, अगर मैं ऐसा करता हूं तो मैं कुछ परिशुद्धता खो देता हूं, लेकिन अगर मुझे कुछ और नहीं मिलता है तो मैं इसे देख लूंगा। –

+0

@RodrigoCastro संपादित करें – MrZander

+0

Thaanks, मैं लगभग क्षेत्र बनाने के साथ लगभग कर रहा हूं (मैंने वास्तव में इसके बारे में और सोचने के बाद जो चाहता हूं उसकी परिभाषा को बदल दिया)। मैंने प्रश्न को एक नई (और बेहतर) छवि के साथ संपादित किया जो मैं चाहता हूं। –

1

जांच में कुछ algos नीचे

http://geospatialpython.com/2011/01/point-in-polygon.html

+0

धन्यवाद, मुझे वास्तविक बहुभुज को परिभाषित करने के लिए अभी आवश्यकता है। जब मैं घर जाता हूं तो मैं ऐसा करने की कोशिश करूंगा। –

1

मुझे पता है कि यह एक पुराना सवाल है, लेकिन शायद यह किसी के लिए उपयोगी होगा।

यह एक आसान तरीका है, जिसमें बहुत कम गणना की आवश्यकता है। यह पहली बार उपयोगकर्ता थ्रेसहोल्ड क्षेत्र के अंदर आने पर ट्रिगर नहीं करेगा, यह केवल निकटतम बिंदु प्राप्त करता है जहां उपयोगकर्ता चेकपॉइंट के पास पास हो गया है और वह काफी करीब आ गया है।

विचार यह है कि प्रत्येक चेकपॉइंट के लिए दूरी की 3 आइटम सूची को बनाए रखने के लिए, इसमें पिछले तीन दूरी के साथ (इसलिए यह [डी (टी), डी (टी -1), डी (टी -2) होगा ])। यह सूची प्रत्येक दूरी की गणना पर घुमाया जाना चाहिए।

यदि किसी भी दूरी की गणना पर पिछली डी (टी -1) दूरी वर्तमान एक डी (टी) से छोटी है और पिछले डी (टी -2) से बड़ी है, तो चलती बिंदु चेकपॉइंट पारित कर दी गई है। चाहे यह वास्तविक गुजर रहा हो, या यह केवल एक गड़बड़ी थी, वास्तविक दूरी डी (टी -1) की जांच करके तय किया जा सकता है। जांच-केंद्रों व पिछले तीन दूरी की सूची के साथ एक Map<Checkpoint, List<Double>> -

private long DISTANCE_THRESHOLD = 2000; 

private Checkpoint calculateCheckpoint(Map<Checkpoint, List<Double>> checkpointDistances) 
{ 
    Map<Checkpoint, Double> candidates = new LinkedHashMap<Checkpoint, Double>(); 
    for (Checkpoint checkpoint: checkpointDistances.keySet()) 
    { 
     List<Double> distances = checkpointDistances.get(checkpoint); 
     if (distances == null || distances.size() < 3) 
      continue; 
     if (distances.get(0) > distances.get(1) && distances.get(1) < distances.get(2) && distances.get(1) < (DISTANCE_THRESHOLD)) //TODO: make this depend on current speed 
      candidates.put(checkpoint, distances.get(1)); 
    } 

    List<Entry<Checkpoint, Double>> list = new LinkedList<Entry<Checkpoint,Double>>(candidates.entrySet()); 
    Collections.sort(list, comp); 

    if (list.size() > 0) 
     return list.get(0).getKey(); 
    else 
     return null; 
} 

Comparator<Entry<Checkpoint, Double>> comp = new Comparator<Entry<Checkpoint,Double>>() 
{ 
    @Override 
    public int compare(Entry<Checkpoint, Double> o1, Entry<Checkpoint, Double> o2) 
    { 
     return o1.getValue().compareTo(o2.getValue()); 
    } 
}; 

समारोह एक पैरामीटर हो जाता है। यह निकटतम Checkpoint उत्तीर्ण या null (यदि कोई नहीं था) आउटपुट करता है। DISTANCE_THRESHOLD बुद्धिमानी से चुना जाना चाहिए। Comparator केवल निकटतम प्राप्त करने के लिए उपयोगकर्ता की दूरी के आधार पर चेकपॉइंट्स को सॉर्ट करने में सक्षम होना है।

स्वाभाविक रूप से इसमें कुछ मामूली त्रुटियां हैं, उदा। यदि चलती बिंदु क्रिस-क्रॉस को ले जा रही है, या जीपीएस परिशुद्धता से त्रुटि आंदोलन उपयोगकर्ता की वास्तविक गति के अनुरूप है, तो इससे कई पास अंक मिलेगा, लेकिन यह लगभग किसी भी एल्गोरिदम को प्रभावित करेगा।

+0

धन्यवाद, मैं अब मूल परियोजना पर काम नहीं कर रहा हूं लेकिन यह शायद बस ट्रैकिंग के बारे में आने वाली परियोजना के साथ मेरी मदद करेगा! –

+0

और मुझे लगता है कि असंगतता की जांच के लिए एक ही समय में स्मृति में 3 से अधिक अंक बनाए रखना एक अच्छा विचार होगा, जो वास्तविक डेटा के बजाय जीपीएस ग्लिच का सुझाव दे सकता है, यह दर्शाता है कि उपयोगकर्ता ने –

+1

@ रॉड्रिगो- कास्त्रो हाँ, समस्या को हल करने के लिए 3 अंक पूर्ण न्यूनतम हैं। अधिक अंक त्रुटि की संभावना को कम कर देंगे, लेकिन कोड जटिल। हो सकता है कि इसे कुछ और बुद्धिमान एल्गोरिदम (शायद जीपीएस चिप स्वयं) के लिए छोड़ा जाना चाहिए, जो माप के जिटर को फ़िल्टर करेगा और केवल वास्तविक/प्रभावी आंदोलन डेटा प्रदान करेगा। तो यह एक और समस्या है। :) – Tylla