Chcę posortować wiele lokalizacji (punktów trasy) na ich odległość od bieżącej lokalizacji. Bieżąca lokalizacja jest oczywiście ruchomym celem, więc przy każdej aktualizacji lokalizacji konieczne jest przeliczenie dystansu dla każdej lokalizacji. Ale wystarczyłoby tylko ponowne przeliczenie na najbliższe lokalizacje.Jaki jest najszybszy sposób sortowania wielu lokalizacji na odległość?
Obecnie korzystam z danych podstawowych i przechowuję odległość do bieżącej lokalizacji jako atrybut w tabeli (ale aktualizuję tylko wtedy, gdy jest zmieniana) z metody configurecell: atindexpath: method. Ten rodzaj prac, ale aplikacja nie odpowiada, podczas gdy dane podstawowe automagicznie aktualizują wszystkie odległości. Działa to w 250 lokalizacjach, ale w przypadku 5000 powoduje awarię. Potrzebuję go do pracy w 10.000 lokalizacji, chociaż prawdopodobnie potrzebuję tylko 1000 najbliższych lokalizacji.
Pomysły, których jeszcze nie próbowałem: Przechowuj wszystkie odległości w osobnej tablicy w pamięci z niczym oprócz identyfikatora rekordu i odległości. Następnie posortuj tablicę na odległość. Problem polega na tym, że nie mogę użyć kontrolera FetchedResultsController, ponieważ w bazie danych nie ma pola sortowania.
Filtruj lokalizacje na podstawie ich szerokości i długości geograficznej za pomocą predykatu. Następnie przedstaw tylko przefiltrowane lokalizacje.
Wykonaj ponowną kalkulację odległości w oddzielnym wątku.
Żadne z pomysłów nie wydaje się łatwe, wystarczy je wypróbować.
Ktoś z sugestiami, różnymi pomysłami, odmianą moich pomysłów?
Do tego potrzebuję "Centrum lokalizację". więc mogę traktować wszystkie lokalizacje jako punkty na płaskiej powierzchni. Myślę, że jest to odpowiednie do "wstępnego sortowania" wszystkich lokalizacji, dzięki czemu pobliskie lokalizacje są sortowane w pobliżu. A wszystkie moje lokalizacje będą na razie w Europie. To może być część rozwiązania. – Bjinse
Hilbert Curve to z pewnością "sposób" na zrobienie tego, ale jeśli moje rozumienie krzywych wypełniania przestrzeni jest poprawne, zrobi to każda krzywa wypełniająca przestrzeń (Peano przychodzi na myśl, wybierz taką, która dobrze zachowuje lokalizację). Inną kwestią do rozważenia jest przechowywanie twoich lokalizacji w adaptacyjnym drzewie kd, aby szybko wykluczyć miejsca zbyt odległe. –
W przypadku małych wymiarów drzewo kd jest lepsze niż krzywa wypełniania przestrzeni. Dla dużych wymiarów jest to dobre tylko wtedy, gdy N> = 2^D (N = liczba punktów, D = wymiary). Powodem jest to, że jeśli podzielisz na inny poziom dla każdego poziomu w drzewie kd, jeśli masz zbyt mało punktów, będziesz mieć jeden punkt w każdym liściu, zanim podzielisz się wzdłuż każdego wymiaru. Oznacza to, że struktura drzewa ignoruje pozostałe wymiary i jakość. –