0

iPhone 3.0 SDKのMapKitを使用して、MKAnnotationプロトコルに準拠するオブジェクトを作成します。これらをMKMapViewにロードするのは非常に簡単です。ただし、ユーザーがMKMapViewをスクロールすると、新しい注釈をロードするときが来ました。新しいオブジェクトをリクエストする可能性のある場所は、mapView:regionDidChangeAnimated:です。これは、マップのリージョンが変更されたときに呼び出され、アノテーションを新しいものに追加/置換します。

具体的には、Core Dataにクエリを実行して、現在のMKCoordinateRegion(mapView.region)内に存在するすべてのオブジェクトを取得し、画面に表示されるオブジェクトのみをロードするようにします。Core Dataのオブジェクトには緯度と経度の属性があり(CLLocation属性はクラスの.m / .hで定義されており、そこから手動で入力できます)、これをNSPredicateに使用して近くのオブジェクトを検索します。

Core Dataデータベースに存在するオブジェクトの数の性質上、すべてのオブジェクトを注釈としてプリロードすることはできません。そうしないと、メモリが不足します(非常に遅くなります)。

現在のマップビュー境界に位置するオブジェクトのみを取得するにはどうすればよいですか?

4

1 に答える 1

5

申し訳ありませんが、英語は私の母国語ではありません。

ユーザーが下または上にスクロールすると、リージョンの値が変更されます。特に、regionDidChangeAnimatedのlatitudeDeltaとlongitudeDeltaが変更されます。そこから、現在のmapViewの境界を取得できます。(minlat、minlong、maxlat、maxlong)

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

maxlat = current_coordinate_lat + latitudeDelta;

minlong = ...

maxlong = ...

計算された境界がすでにあるので、表示する必要のあるオブジェクトを処理してから、マップに注釈を追加できます。以下の値を試してみました。

こちらの画像をご覧ください。http://img43.imageshack.us/img43/703/picture1txe.png

そこから..sqlite3sqlステートメントを実行して、その範囲内のポイントを取得できます。

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

于 2009-08-20T03:46:49.913 に答える