3

数百の場所のリストがあり、現在画面に表示されている場所の MKPinAnnotation のみを表示したいと考えています。画面は、半径 2 マイルのユーザーの現在地から始まります。もちろん、ユーザーは画面をスクロールしたり、ズームしたりできます。現在、マップの更新イベントを待ってから、場所リストをループして、次のように座標を確認します。

-(void)mapViewDidFinishLoadingMap:(MKMapView *)mapView {
  CGPoint point;
  CLLocationCoordinate2D coordinate;

  . . .
  /* in location loop */
  coordinate.latitude = [nextLocation getLatitude];
  coordinate.longitude = [nextLocation getLongitude];

  /* Determine if point is in view. Is there a better way then this? */
  point = [mapView convertCoordinate:coordinate toPointToView:nil];
  if( (point.x > 0) && (point.y>0) ) {
    /* Add coordinate to array that is later added to mapView */
  }

したがって、ポイントが画面上のどこにあるかconvertCoordinateに尋ねています(この方法を誤解していない限り、非常に可能性があります)。座標が画面上にない場合は、mapView に追加しません。

私の質問は、場所の緯度/経度が現在のビューに表示され、mapView に追加する必要があるかどうかを判断する正しい方法ですか? または、これを別の方法で行う必要がありますか?

4

3 に答える 3

7

コードでは、toPointToView:オプションのビューを渡す必要があります。私はそれを与えましたmapView。x と y の上限も指定する必要があります。

これは私のために働いたいくつかのコードです(注釈をループしながら、現在マップ上に表示されている注釈を教えてくれました):

for (Shop *shop in self.shops) {
    ShopAnnotation *ann = [ShopAnnotation annotationWithShop:shop];
    [self.mapView addAnnotation:ann];

    CGPoint annPoint = [self.mapView convertCoordinate:ann.coordinate 
            toPointToView:self.mapView];

    if (annPoint.x > 0.0 && annPoint.y > 0.0 && 
            annPoint.x < self.mapView.frame.size.width && 
            annPoint.y < self.mapView.frame.size.height) {
        NSLog(@"%@ Coordinate: %f %f", ann.title, annPoint.x, annPoint.y);
    }
}
于 2010-02-04T04:47:05.000 に答える
5

私はこれが古いスレッドであることを知っています。当時何が利用可能だったのかわかりません...

// -- Your previous code and CLLocationCoordinate2D init --
MKMapRect visibleRect = [mapView visibleMapRect];
if(MKMapRectContainsPoint(visibleRect, MKMapPointForCoordinate(coordinate))) {

    // Do your stuff

}

画面スペースに戻す必要はありません。また、あなたがこれをやろうとしている理由がわかりません。画面にないときに注釈を追加しないのは奇妙だと思います... MapKit はすでにこれを最適化し、表示される注釈ビューのみを作成 (およびリサイクル) します。 .

于 2015-10-22T19:12:54.760 に答える
2

少し読んだ後、これが悪い考えだと言っているものは何も見つかりません。アプリで少しテストを行いましたが、常に正しい結果が得られます。一度に 300 以上の座標をすべて追加するのではなく、現在表示されているマップ領域に表示される座標のみを追加すると、アプリの読み込みがはるかに速くなります。

私が探していたのは [mapView isCoordinateInVisibleRegion:myCoordinate] のようなメソッドでしたが、これまでのところ、このメソッドは迅速で正確に見えます。

また、タイトルが間違っているために意味が混乱した可能性があるため、以前のタイトルを「表示可能なマップ領域内」に変更しました。

于 2009-08-10T13:09:42.360 に答える