سؤال

احصل على تطبيق يجد موقع GPS الخاص بك بنجاح ، لكنني بحاجة إلى أن أكون قادرًا على مقارنة هذا GPS مع قائمة مواقع GPS ، إذا كان كلاهما متماثلاً ، فسيحصل على مكافأة.

اعتقدت أنني عملت ، لكن لا يبدو.

لديّ "توظيف جديد" كموقع حيث أنت ، أعتقد أن المشكلة هي أنني بحاجة إلى أن أكون قادرًا على فصل البيانات الطويلة والاتصالات عن تحديد الموقع.

حتى الآن حاولت هذا:

NSString *latitudeVar = [[NSString alloc] initWithFormat:@"%g°", newLocation.coordinate.latitude];

NSString *longitudeVar = [[NSString alloc] initWithFormat:@"%g°", newLocation.coordinate.longitude];

مثال على قائمة مواقع GPS:

location:(CLLocation*)newLocation;

CLLocationCoordinate2D bonusOne;    

bonusOne.latitude = 37.331689;
bonusOne.longitude = -122.030731;

وثم

if (latitudeVar == bonusOne.latitude && longitudeVar == bonusOne.longitude) {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"infinite loop firday" message:@"infloop" delegate:nil cancelButtonTitle:@"Stinky" otherButtonTitles:nil ];    

    [alert show];
    [alert release];
}

يأتي هذا بخطأ "معاملات غير صالحة إلى ثنائية == لديها تبختر NSString و CllocationDegrees"

أي أفكار؟

هل كانت مفيدة؟

المحلول

بشكل عام ، يجب أن تكون حريصًا على مقارنة أرقام النقاط العائمة مباشرة. بسبب طريقة تعريفها ، قد لا تكون القيمة الداخلية بالضبط أثناء تهيئتها ، بمعنى أنها نادراً ما تكون متطابقة. بدلاً من ذلك ، يجب عليك التحقق لمعرفة ما إذا كان الفرق بينهما أقل من عتبة معينة ، على سبيل المثال

if(fabs(latitude1 - latitude2) <= 0.000001)
...

يمكن أن يكون هناك خيار آخر هو التحقق من المدى الذي يبعده الشخص عن الموقع المطلوب عن طريق حساب المسافة. قد يأخذ هذا أيضًا في الاعتبار حقيقة أن الإحداثيات من GPS ليست صحيحة تمامًا ، ولكنها قد تختلف إلى 10 أمتار حتى في ظل ظروف جيدة:

CLLocation *loc1 = [[CLLocation alloc] initWithLatitude:lat1 longitude:lon1];
double distance = [loc1 getDistanceFrom:position2];
if(distance <= 10)
...

كلوز

نصائح أخرى

لماذا لا تقارن bonusone.latitude و newlocation.coordinate.latitude مباشرة؟ أنت تخوض رقم نقطة عائمة إلى سلسلة ثم مقارنتها برقم نقطة عائم وهذا هو السبب في أنك تحصل على هذا الخطأ.

أيضًا ، نظرًا لأن وحدة GPS تميل إلى القفز قليلاً ، فربما تريد أيضًا

ج: قياس المسافة بين Bonusone و NewLocation.coordinate (باستخدام نظرية فيثاغورات لانقاذات التثليث ، لا يوجد سبب لنا أكثر دقة من ذلك عندما تكون على هذا المقياس الصغير. وظيفة قياس) وحدد أقل من كمية معينة.

ب: حول خط العرض وخط الطول إلى عدد معين من الأرقام بحيث يكون ، في الداخل ، على سبيل المثال ، 100 قدم.

سيعمل أي من هؤلاء بشكل أفضل بالنسبة لك من الاعتماد على العوامات المتساوية ، وهو أمر يمثل مشكلة بشكل عام في البرمجيات وخاصة مشكلة عندما يكون الجهاز الذي تقيسه هو مستوى ضوضاء مرتفع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top