Quiero ordenar muchas ubicaciones (puntos de ruta) en su distancia desde la ubicación actual. La ubicación actual es, por supuesto, un objetivo en movimiento, por lo que para cada actualización de ubicación, es necesario volver a calcular la distancia para cada ubicación. Pero solo volver a calcular para ubicaciones cercanas sería suficiente.¿Cuál es la manera más rápida de ordenar muchas ubicaciones a distancia?
Actualmente uso Core-Data, y almaceno la distancia a la ubicación actual como un atributo en la tabla (pero solo la actualización es cuando se cambia) desde el método de configurecell: atindexpath :. Ese tipo de trabajo funciona, pero la aplicación no responde mientras que core-data automágicamente está actualizando todas las distancias. Esto funciona para 250 ubicaciones, pero para 5000 se bloquea. Lo necesito para trabajar en 10.000 ubicaciones, aunque probablemente solo necesite las 1000 ubicaciones más cercanas.
Ideas que aún no probé: Almacene todas las distancias en una matriz en memoria separada con nada más que la id. De registro y la distancia. Luego ordena la matriz en la distancia. El problema es que no puedo usar FetchedResultsController porque no hay ningún campo de ordenación en la base de datos.
Filtre las ubicaciones en función de su latitud y longitud mediante el uso de un predicado. Entonces solo presente las ubicaciones filtradas.
Haga el recálculo de distancias en una secuencia separada.
Ninguna de las ideas parece tan fácil de probar.
¿Alguien con sugerencias, ideas diferentes, una variación de mis ideas?
Para esto necesito una "ubicación del Centro". entonces puedo tratar todas las ubicaciones como puntos en una superficie plana. Creo que esto es adecuado para "ordenar previamente" todas las ubicaciones, por lo que las ubicaciones cercanas se clasifican previamente en las cercanías. Y todas mis ubicaciones estarían en Europa por ahora. Puede ser parte de la solución. – Bjinse
Hilbert Curve es sin duda "la" manera de hacerlo, pero si mi comprensión de las curvas de relleno de espacio es correcta, cualquier curva de relleno de espacio servirá (me viene a la mente Peano. Escoge uno que preserve bien la localidad). Otra cosa a considerar es almacenar sus ubicaciones en un kd-árbol adaptativo para descartar rápidamente ubicaciones muy distantes. –
Para dimensiones bajas, kd-tree es mejor que la curva de relleno de espacio. Para grandes dimensiones, solo es bueno si N> = 2^D (N = número de puntos, D = dimensiones). La razón es que si se divide en una dimensión diferente para cada nivel en el árbol kd, si tiene muy pocos puntos, tendrá un único punto en cada hoja antes de dividirse en cada dimensión. Esto significa que la estructura del árbol ignora las dimensiones restantes y la calidad sufre. –