2009-07-28 20 views
2

私は数百の場所のリストを持っていて、現在画面上のそれらの場所の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に追加する必要がありますか?あるいは私は別のやり方でこれをしなければならないのでしょうか?私は、これは悪い考えであると言う何かを見つけることができません読書の少し後

+0

これは私にとってはうまくいかないようです。何らかの理由で、私のオブジェクトのすべてが一致するようです。ほとんどのxとyの値は非常に高いです。何か案は? –

+0

私は確信していません、私は今旅行中で、Macにアクセスできない。まず、マップ領域を確認することです。しかし、それでもポイントが画面に表示されない場合(少なくとも私のテストでは)、convertCoordinateメソッドは常に0を返します。私がMacの前に戻ったら、それをチェックします。 – ryanday

答えて

2

。私は私のアプリで少しテストをしたし、私はいつも正しい結果を得る。一度に300以上の座標すべてではなく、現在表示されている地図領域に表示される座標だけを追加すると、アプリの読み込み速度が大幅に向上します。私が探していた何

は[MapViewのisCoordinateInVisibleRegion:myCoordinate]のような方法であったが、これまでのところ、この方法は、迅速で正確なようです。

はまた、私は間違ったタイトルは私の意味を混同しているかもしれないと思うので、代わりに前の「可視マップ領域に」読んでタイトルを変更しました。あなたのコードで

+0

あなたは[mapView isCoordinateInVisibleRegion:myCoordinate]のサンプルコードを提供してもらえますか?それで、私はどのように私のアプリで使用することができます知ることができます。 – Nit

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); 
    } 
} 
3

私は、これは古いスレッドですけど、ないバック利用可能であったものを確認してくださいその後、...しかし、あなたはむしろ行う必要があります:

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

    // Do your stuff 

} 

画面スペースに変換する必要はありません。 はまた、私はあなたがこれをやろうとしている理由は、私はこれは、彼らが画面上にないとき注釈を追加しないように奇妙だと思うかわからない... MapKitは、注釈ビューをすでにこれを最適化し、唯一の作成(リサイクル)可視。

+0

男私はこのプロジェクトを覚えています:)しかし、私は詳細を覚えていません。私は、問題を表示する必要があります座標を表示する場合は、私のアプリがはるかに高速に読み込まれていると思う。マップキットがまだ最適化されていないのでしょうか?私はこれがios4だと思う。 – ryanday

+0

はい、これは今のところ行く方法ではないかもしれないと言及する価値があると思った...返事をありがとう、感謝します。 –

+0

代わりに 'MKMapPointForCoordinate(<#CLLocationCoordinate2D coordinate#>)'を使うか、直接 'coordinate'するべきだったと思います。 – gklka

関連する問題