2010-02-01 17 views
24

Tengo una base de datos Core Data con propiedades de latitud y longitud. ¿Hay alguna manera de utilizar el método getDistanceFrom: de Core Location para encontrar las cinco ubicaciones más cercanas a un CLLocation obtenidas del GPS? ¿Tengo que cargar todos los objetos usando Core Data y analizarlos, usando getDistanceFrom: en cada uno o hay una manera más fácil?Datos principales y ubicación principal

Respuesta

28

que tendrá que recorrer una por una; por lo que sé, no hay otra manera de hacerlo.

Sin embargo, puede hacer que esto sea más eficiente al usar un cuadro delimitador cuando obtiene los elementos de los datos centrales, esto reducirá la cantidad de objetos que se devolverán.

es decir, algo así como

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

Aunque, dependiendo de la cantidad de datos que tiene y cómo de cerca está espaciada, tendrá que utilizar un número diferente de 1!

Sam

PS Además, no he tenido en cuenta el hecho de que los abrigos de longitud!

+0

Parece un código útil, gracias. –

+0

Gracias por esto, he usado algo similar en mi aplicación. ¡Pero me parece que ambos conjuntos de < and > están en el camino equivocado ahora! – iPhoneDollaraire

+0

Tienes razón, ¡Uy! – deanWombourne

2

No puede usar CoreData para encontrar el objeto más cercano, pero puede querer restringir la consulta utilizando un cuadro delimitador. Para encontrar el objeto más cercano, quizás prefiera usar simplemente la diferencia en lat/long, que es considerablemente más rápido que calcular las distancias reales.

que tenía una pregunta similar:

CoreData: Find minimum of calculated property

+0

Gracias por el enlace. –

2

El siguiente ejemplo es casi lo que está buscando. Utiliza una función SQLite para calcular la distancia en la cláusula ORDER BY (fórmula Haversine). El problema es que este ejemplo no usa Core-Data, sino la API de SQLite directamente.

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

Cuestiones relacionadas