2010-02-01 8 views
24

Ich habe eine Core Data-Datenbank mit Breiten- und Längengradeigenschaften. Gibt es eine Möglichkeit, die getDistanceFrom:-Methode von Core Location zu verwenden, um die fünf nächstgelegenen Standorte zu einem CLLocation aus dem GPS zu finden? Muss ich alle Objekte mit Core Data laden und durch sie analysieren, indem ich getDistanceFrom: auf jedem oder gibt es einen einfacheren Weg?Kerndaten und Kernposition

Antwort

28

Sie werden durch einen nach dem anderen haben zu durchlaufen; Soweit ich weiß, gibt es keinen anderen Weg, es zu tun.

Sie können dies jedoch effizienter machen, indem Sie eine Begrenzungsbox verwenden, wenn Sie die Elemente aus den Stammdaten abrufen. Dadurch verringert sich die Anzahl der Objekte, die zurückgegeben werden.

d So etwas wie

float latMax = wantedLat + 1; 
float latMin = wantedLat - 1; 
float lngMax = wantedLng + 1; 
float lngMin = wantedLng - 1; 
NSPredicate *predicate = [NSPredicate 
    predicateWithFormat:@"lat > %f and lat < %f and lng > %f and lng < %f", 
    latMin, latMax, lngMin, lngMax]; 

Obwohl, je nachdem, wie viele Daten Sie haben und wie eng es im Abstand ist, sollten Sie eine andere Zahl als 1 verwenden!

Sam

PS Auch habe ich nicht berücksichtigt die Tatsache, dass Länge Wraps!

+0

Sieht wie nützlicher Code aus, danke. –

+0

Danke dafür - ich habe etwas ähnliches in meiner App verwendet. Aber es sieht für mich aus, dass beide Sätze von < and > jetzt falsch sind! – iPhoneDollaraire

+0

Sie haben Recht - hoppla! – deanWombourne

2

Sie können CoreData nicht verwenden, um das nächste Objekt zu finden, aber Sie können die Abfrage eingrenzen, indem Sie eine Begrenzungsbox verwenden. Um das nächste Objekt zu finden, möchten Sie vielleicht einfach den Unterschied in lat/long verwenden, der erheblich schneller ist als die Berechnung der tatsächlichen Entfernungen.

Ich hatte eine ähnliche Frage:

CoreData: Find minimum of calculated property

+0

Danke für den Link. –

2

Das folgende Beispiel ist fast das, was Sie suchen. Es verwendet eine SQLite-Funktion, um den Abstand in der ORDER BY-Klausel (Haversine-Formel) zu berechnen. Problem ist, dass dieses Beispiel nicht Core-Daten, sondern die SQLite-API direkt verwendet.

http://www.thismuchiknow.co.uk/?p=71