Загружать дополнительные объекты из Core Data, когда пользователь прокручивает MKMapView.

С помощью MapKit в iPhone 3.0 SDK вы создаете объекты, соответствующие протоколу MKAnnotation. Загрузить их в MKMapView очень просто. Однако, когда пользователь прокручивает MKMapView, пришло время загрузить новые аннотации. Вероятным местом для запроса новых объектов будет mapView:regionDidChangeAnimated:, который вызывается при изменении региона карты, а затем добавляет/заменяет аннотации новыми.

В частности, я хотел бы запросить Core Data, чтобы получить все объекты, существующие в пределах текущего MKCoordinateRegion (mapView.region), чтобы я загружал только те объекты, которые будут отображаться на экране. Объекты в Core Data имеют атрибуты широты и долготы (и атрибут CLLocation определен в классе '.m/.h, который я могу заполнить вручную из него) и использовать его для NSPredicate для поиска близлежащих объектов.

Из-за характера того, сколько объектов существует в базе данных Core Data, мы не можем предварительно загрузить ВСЕ объекты в качестве аннотаций, иначе у нас закончится память (и это будет мучительно медленно).

Как получить только те объекты, расположение которых находится в границах текущего представления карты?


person Kevin Elliott    schedule 20.08.2009    source источник


Ответы (1)


Извините, английский не мой родной язык..

После того, как пользователь прокрутит вниз или вверх... значения региона изменятся, в частности, latitudeDelta и longitudeDelta из regionDidChangeAnimated. Оттуда вы можете получить границы вашего текущего mapView..(minlat, minlong, maxlat, maxlong)

minlat = current_coordinate_lat - latitudeDelta; //note everything is in dd (decimal degrees)

maxlat = current_coordinate_lat + latitudeDelta;

minlong = ...

maxlong = ...

Поскольку у вас уже есть вычисленные границы, вы можете обработать, какой объект нужно показать, а затем добавить аннотацию на карту. Я экспериментировал со значениями ниже.

См. изображение здесь. .png

Оттуда.. я могу сделать оператор sqlite3 sql, чтобы получить точки в этих пределах..

SELECT * FROM pois WHERE categ_id = %@ AND (sat_latitude > %f AND sat_latitude < %f) AND (sat_longitude > %f AND sat_longitude < %f)

person Rupert    schedule 20.08.2009
comment
Эта общая концепция хорошо сработала для меня! Единственное, что раздражает, это то, что он загружает объекты, которые находятся сразу за пределами прямоугольника, поэтому пользователь не видит, как он бросает булавки. Это в основном косметика, так что не торопитесь ее решать. Любые идеи, почему это за гранью? Я могу только предположить, что границы сообщают больше, чем ВИДИМОЕ на экране. Мысли? - person Kevin Elliott; 21.08.2009
comment
Кевин, причина, по которой вы получаете (получали) слишком много объектов, заключается в том, что дельты широты и долготы нужно сначала разрезать пополам, поскольку они представляют расстояние по всему региону, а не только от центра. Так например: minLat = currentCenter - (latDelta/2) и т.д. - person Mark Leonard; 14.04.2011