緯度 1 度が約 111111 メートルで、経度 1 度が 111111*cos(latitude) メートルであることがわかっている場合、特定の正方形内のすべての場所を簡単に取得できます。
SELECT * FROM items WHERE latitude BETWEEN %f AND %f AND longitude BETWEEN %f AND %f
このクエリは、数百万行であっても非常に高速です。ただし、緯度と経度のインデックスを作成することを忘れないでください。
CREATE INDEX position ON items (latitude, longitude)
これを Objective-C で使用して、現在の場所から 3 km 以内にあるすべての関心のある場所を取得します。
double latDist = 1.0 / 111111.0 * 3.0;
double lonDist = 1.0 / ABS(111111.0*cos(location.coordinate.latitude)) * 3.0;
FMResultSet *results = [database executeQueryWithFormat:@"SELECT * FROM items WHERE latitude BETWEEN %f AND %f AND longitude BETWEEN %f AND %f", location.coordinate.latitude - latDist, location.coordinate.latitude + latDist, location.coordinate.longitude - lonDist, location.coordinate.longitude + lonDist];
正確な距離を計算し、結果を並べ替えることができるようになりました...