Core Dataとともに保存されている場所(この場合は> 3000)がいくつかあります。マップを開いたら、場所を取得して配列に保存します。マップビュー領域が変更されるたびに、現在表示されている注釈を計算visibleMaprect
し、ピクセル距離でフィルタリングする関数を呼び出します。(クワッドツリーのようなより複雑な最適化があることは知っていますが、それが極端に必要でない場合は、今は実際には実装しません)。これは私のコードです:
//locations is an array of NSManagedObjects
for (int i =0 ; i < [locations count]; i++)
{
// managed object class for faster access, valueforkey takes ages ...
LocationEntity * thisLocation = [locations objectAtIndex:i];
CLLocationCoordinate2D coord = CLLocationCoordinate2DMake( [thisLocation.latitude doubleValue], [thisLocation.longitude doubleValue]) ;
// mapRect is mapView.visibleMapRect
BOOL isOnScreen = MKMapRectContainsPoint(mapRect, MKMapPointForCoordinate(coord));
if (isOnScreen)
{
CGPoint cgp = [mapView convertCoordinate:coord toPointToView:mapView];
// compare the distance to already existing annotations
for (int idx = 0; idx < [annotations count] && hasEnoughDistance; idx++)
{
CGPoint cgp_prev = [mapView convertCoordinate:[[annotations objectAtIndex:idx] coordinate] toPointToView:mapView];
if ( getDist(cgp, cgp_prev) < dist ) hasEnoughDistance = FALSE;
}
}
if (hasEnoughDistance)
// if it's ok, create the annotation, add to an array and after the for add all to the map
}
ズーム/移動するたびに、マップが数秒間フリーズします。タイムプロファイラーで確認したところ、座標がモデルのインデックス付き属性であるにもかかわらず、座標の単純な取得に1秒かかることもあれば、0.1秒かかることもあります...また、これらのタイプの線には時間がかかるようです。
CGPoint cgp = [mapView convertCoordinate:coord toPointToView:mapView];
この関数を使用せずに、2つの注釈/座標間のピクセル/ポイント距離を計算するにはどうすればよいですか?または、Core Dataの最適化の提案はありますか?
ありがとう :)