2012-04-17 14 views
9

मैं दूरी का उपयोग करने की कोशिश कर रहा हूं: स्थानान्तरण: मेरे हाथ में मेरे आईफोन के साथ चलने वाली कुल दूरी की गणना करने के लिए विधि। अब तक, मैं अपने भ्रमित, गलत, और प्रतीत होता है मनमाने ढंग से परिणाम का समाधान करने में मदद करने के लिए पूरी तरह से खोज कर रहा हूं। इन कोड स्निपेट में, लेबल केवल एक लेबल ऑब्जेक्ट है जो मेरे ऐप के इंटरफ़ेस में मौजूद है, दूरी हटाया गया चर है कि मैं जिस दूरी पर चला गया था उसे स्टोर करने की कोशिश कर रहा हूं, और लोकमैन एक स्थान प्रबंधक है जिसे मेरी @interface फ़ाइल में घोषित किया गया है ।CLLocation विधि दूरी के साथ समस्या FROLocation: गलत परिणाम

- (void)viewDidLoad 
{ 
    locMan = [[CLLocationManager alloc] init]; 
    locMan.delegate = self; 
    [locMan startUpdatingLocation]; 
    isInitial = true; 
    distanceMoved = 0.0; 
    [super viewDidLoad]; 
} 

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    distanceMoved += [newLocation distanceFromLocation: oldLocation]; 
    theLabel.text = [NSString stringWithFormat: @"%f meters", distanceMoved]; 
} 

फिक्सिंग क्या मैं गलत कर रहा हूँ यहाँ बहुत सराहना की जाएगी के लिए किसी भी मदद करते हैं। धन्यवाद!

उत्तर

13
  1. फ़िल्टर बाहर कैश्ड (पुराने) स्थान डेटा
  2. फ़िल्टर बाहर अवैध स्थान परिणाम (सटीकता < 0),
  3. सेट सटीकता आवश्यकता kCLLocationAccuracyBest करने के लिए सेट,
  4. सेट एक न्यूनतम दूरी फिल्टर, अधिमानतः पर स्थिति शोर को फ़िल्टर करने के लिए कम से कम 10 मीटर।
  5. EDIT: oldLocation शून्य होने पर दूरी की गणना न करें।

आप और भी कर सकते हैं लेकिन यह काम करना चाहिए बशर्ते आपको पर्याप्त क्षैतिज सटीकता (< 30 मीटर) प्राप्त हो। आप कम सटीकता के परिणाम फ़िल्टर कर सकते हैं लेकिन फिर आपको पुराने स्थान का ट्रैक रखना होगा जो थोड़ा अधिक जटिल है।

एक एनएसएलओजी जोड़ें (नीचे देखें) ताकि आप यह पता लगा सकें कि क्या हो रहा है। यदि आपको अभी भी एनएसएलओजी के आउटपुट के बाद अच्छे नतीजे नहीं मिलते हैं तो हम देख सकते हैं कि क्या हो रहा है और और मदद करें। iOS6 के लिए

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    NSTimeInterval age = -[newLocation.timestamp timeIntervalSinceNow]; 

    if (age > 120) return; // ignore old (cached) updates 

    if (newLocation.horizontalAccuracy < 0) return; // ignore invalid udpates 

    // EDIT: need a valid oldLocation to be able to compute distance 
    if (oldLocation == nil || oldLocation.horizontalAccuracy < 0) return; 

    CLLocationDistance distance = [newLocation distanceFromLocation: oldLocation]; 

    NSLog(@"%6.6f/%6.6f to %6.6f/%6.6f for %2.0fm, accuracy +/-%2.0fm", 
     oldLocation.coordinate.latitude, 
     oldLocation.coordinate.longitude, 
     newLocation.coordinate.latitude, 
     newLocation.coordinate.longitude, 
     distance, 
     newLocation.horizontalAccuracy); 

    distanceMoved += distance; 
    theLabel.text = [NSString stringWithFormat: @"%f meters", distanceMoved]; 
} 

- (void)viewDidLoad 
{ 
    locMan = [[CLLocationManager alloc] init]; 
    locMan.delegate = self; 
    locMan.desiredAccuracy = kCLLocationAccuracyBest; 
    locMan.distanceFilter = 10; 

    [locMan startUpdatingLocation]; 
    isInitial = true; 
    distanceMoved = 0.0; 
    [super viewDidLoad]; 
} 

संपादित करें यदि आप एक ही का उपयोग कर didUpdateLocations: (के बाद से उपरोक्त विधि अब पदावनत किया जाता है) सबसे सरल समाधान के बस अगले अद्यतन आप पर कि इतने एक संपत्ति में प्रत्येक स्थान को बचाने के लिए है करना चाहता था पिछला स्थानकक्षा में एक संपत्ति घोषित धारण करने के लिए oldLocation:

@property (nonatomic, retain) CLLocation* oldLocation; 

तब प्रतिनिधि विधि में आप प्रत्येक newLocation अगली बार के लिए oldLocation के रूप में उपयोग के लिए सहेजने प्रतिनिधि विधि कहा जाता है:

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocations:(NSArray *)locations 
{ 
    CLLocation* newLocation = [locations lastObject]; 

    NSTimeInterval age = -[newLocation.timestamp timeIntervalSinceNow]; 

    if (age > 120) return; // ignore old (cached) updates 

    if (newLocation.horizontalAccuracy < 0) return; // ignore invalid udpates 

    // EDIT: need a valid oldLocation to be able to compute distance 
    if (self.oldLocation == nil || self.oldLocation.horizontalAccuracy < 0) { 
     self.oldLocation = newLocation; 
     return; 
    } 

    CLLocationDistance distance = [newLocation distanceFromLocation: self.oldLocation]; 

    NSLog(@"%6.6f/%6.6f to %6.6f/%6.6f for %2.0fm, accuracy +/-%2.0fm", 
     self.oldLocation.coordinate.latitude, 
     self.oldLocation.coordinate.longitude, 
     newLocation.coordinate.latitude, 
     newLocation.coordinate.longitude, 
     distance, 
     newLocation.horizontalAccuracy); 

    distanceMoved += distance; 
    theLabel.text = [NSString stringWithFormat: @"%f meters", distanceMoved]; 

    self.oldLocation = newLocation; // save newLocation for next time 
} 
+0

मैंने अभी इस सटीक कोड का उपयोग किया है, लेकिन मैंने दूरी फ़िल्टर को 1 में बदल दिया है। किसी कारण से, मेरी दूरी 1 से शुरू होती है। लगभग 2 मीटर आगे चलने के बाद मेरा आउटपुट यहां दिया गया है: 2012-04-17 17: 58: 05.341 स्थान मैनेजरटेस्ट 2 [422: 707] 0.000000/0.000000 से 39.856110/-74.940113 -1 मीटर के लिए, सटीकता +/- 10 मीटर 2012-04 -17 17: 58: 10.248 स्थानमैनेजरटेस्ट 2 [422: 707] 39.856110/-74.940113 से 39.856165/-74.940107 6 मीटर के लिए, सटीकता +/- 50 मीटर 2012-04-17 17: 58: 11.248 स्थान प्रबंधकगरस्ट 2 [422: 707] 39.856165/- 74.940107 से 3 9 856223/-74.940010 10 मीटर के लिए, सटीकता +/- 50 मीटर दूरी दूर 15m के आसपास आया - बहुत अधिक – bnasty

+0

मैंने कुछ बार पहले इस कोड का उपयोग करने की कोशिश की, और मुझे कुछ प्रतीत होता है कि सटीक परिणाम और कुछ – bnasty

+0

से बहुत दूर थे -1 दूरी वह जगह है जहां आपका पुराना स्थान 0 था, जिसका शायद मतलब है कि पुराने स्थान परम शून्य था। आपको इसके लिए भी एक चेक जोड़ना होगा (ऊपर मेरा संपादन देखें)। जब आप क्षैतिज रिपोर्ट करते हैं तो आप उच्च सटीकता की अपेक्षा नहीं कर सकते हैं शुद्धता 50 मीटर है !!! इसका मतलब है कि जीपीएस में पर्याप्त सिग्नल नहीं है, इसका मतलब है कि किसी भी दिशा में रिपोर्ट की गई स्थिति 50 मीटर तक बंद हो सकती है। – progrmr

0

आप अपने स्थान प्रबंधक की सटीकता सेट नहीं कर रहे हैं। सेब डॉक्स के माध्यम से जाओ, यह सटीकता = bestfornavigation की तरह कुछ है। या कुछ और। उसे नरक की तरह बैटरी निकालना चाहिए, लेकिन इस तरह के प्रयोजनों के लिए इसका मतलब है।

संपादित करें: बस याद किया कि मेरे पास हाथ था।

// Create the Location Manager 
locationManager = [[CLLocationManager alloc] init]; 

// Configure the Location Manager 
locationManager.delegate = self; 
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; 
+0

मैंने कोशिश की वांछित सटीकता के लिए सभी अलग-अलग स्थिरांक सेट करना, लेकिन अभी भी कोई भाग्य नहीं है। अब, मेरा ऐप दूरी के साथ शुरू होगा -100000 पर 0.000000 के बजाय किसी कारण से। क्या समस्या संभवतः मेरे कोर लोकेशन फ्रेमवर्क या मेरे आईफोन के भीतर ही हो सकती है? – bnasty

+0

पुराने और नए लोकेशन को एनएसएलओएल यह देखने के लिए कि वे कैसे बदल रहे हैं। तो मुझे बताओ ताकि मुझे पता चल सके कि क्या हो रहा है। Ive स्थान प्रबंधक के साथ बहुत काम करता है और मुझे याद है कि अगर आप इसे सही तरीके से कॉन्फ़िगर नहीं करते हैं तो यह अजीब सामान – Pochi

+0

अक्षांश और देशांतर निर्देशांक सही साबित होते हैं, क्योंकि प्रत्येक बार स्थान अपडेट होने पर, अंतिम समय से नया स्थान होता है पुराने स्थान के रूप में संग्रहीत। किसी कारण से, दोनों स्थानों के बीच की दूरी को अत्यधिक उच्च संख्या के रूप में गणना की जा रही है। – bnasty

0
CLLocationDistance distance = [secondLocation distanceFromLocation:firstLocation]; // distance is expressed in meters 

CLLocationDistance kilometers = distance/1000.0; 
// or you can also use this.. 
CLLocationDistance meters = distance; 

NSString *distanceString = [[NSString alloc] initWithFormat: @"%f", kilometers]; 

flot totaldistancecovered = [distanceString floatValue]; 

//Now,you can use this float value for addition... 
// distanceMoved should be float type variable which is declare in .h file... 

distanceMoved = distanceMoved + totaldistancecovered ; 
theLabel.text = [NSString stringWithFormat: @"%f meters", distanceMoved]; 

आशा इस तुम्हारी मदद करेगा ..

+0

'CLLocationDistance' केवल' डबल' के लिए टाइप किया गया है, इसलिए इसे स्ट्रिंग में बदलने का कोई कारण नहीं है और फिर गणित करने के लिए फिर से वापस करने का कोई कारण नहीं है। – pr1001

0

पहली बात आप पहली बार अपडेट आप स्थान प्रबंधक से प्राप्त होने वाले टाइमस्टैम्प की जाँच करके पहले अद्यतन का निर्वहन कर रहा है क्या करना चाहिए, यह आमतौर पर कैश अंतिम ज्ञात स्थिति। दूसरा सटीकता याद रखें, प्रारंभिक मान जो आपको मिलेगा वे हमेशा एक विस्तृत श्रृंखला में होते हैं।

संबंधित मुद्दे