2010-02-01 23 views
24

Ho un database di dati di base con proprietà di latitudine e longitudine. C'è un modo per utilizzare il metodo getDistanceFrom: di Core Location per trovare le cinque posizioni più vicine a un CLLocation ottenuto dal GPS? Devo caricare tutti gli oggetti usando Core Data e analizzarli, usando getDistanceFrom: su ognuno di essi o esiste un modo più semplice?Core Data and Core Location

risposta

28

si dovrà scorrere uno per uno; per quanto ne so non c'è altro modo per farlo.

Tuttavia, è possibile renderlo più efficiente utilizzando un riquadro di delimitazione quando si ottengono gli elementi dai dati principali: ciò ridurrà il numero di oggetti che verranno restituiti.

cioè Qualcosa di simile

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]; 

Anche se, a seconda della quantità di dati che hai e quanto strettamente è distanziati, si vuole utilizzare un numero diverso da 1!

Sam

PS Inoltre, non ho preso in considerazione il fatto che avvolge longitudine!

+0

Sembra codice utile, grazie. –

+0

Grazie per questo - ho usato qualcosa di simile nella mia app. Ma mi sembra che entrambe le serie di < and > siano ora nel modo sbagliato! – iPhoneDollaraire

+0

Hai ragione - oops! – deanWombourne

2

Non è possibile utilizzare CoreData per trovare l'oggetto più vicino, ma potrebbe essere necessario restringere la query utilizzando un riquadro di delimitazione. Per trovare l'oggetto più vicino, si potrebbe preferire utilizzare semplicemente la differenza in lat/long che è considerevolmente più veloce del calcolo delle distanze effettive.

avevo una domanda simile:

CoreData: Find minimum of calculated property

+0

Grazie per il collegamento. –

2

Il seguente esempio è quasi quello che stai cercando. Utilizza una funzione SQLite per calcolare la distanza nella clausola ORDER BY (formula di Haversine). Il problema è che questo esempio non usa Core-Data, ma direttamente l'API SQLite.

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