0

Mit MapKit im iPhone 3.0 SDK erstellen Sie Objekte, die dem MKAnnotation-Protokoll entsprechen. Diese auf die MKMapView zu laden ist sehr einfach. Wenn ein Benutzer die MKMapView scrollt, ist es jedoch an der Zeit, neue Anmerkungen zu laden. Ein wahrscheinlicher Ort, um die neuen Objekte anzufordern, wäre in mapView: regionDidChangeAnimated:, die aufgerufen wird, wenn die Region der Karte geändert wird, und dann die Anmerkungen mit den neuen hinzufügen/ersetzen.Weitere Objekte aus Core Data laden, wenn ein Benutzer ein MKMapView scrollt

Insbesondere würde Ich mag Core Data abzufragen alle Objekte abzurufen, die MKCoordinateRegion (mapView.region) innerhalb des aktuellen existieren, so dass ich nur die Objekte laden, die auf dem Bildschirm angezeigt wird. Die Objekte in Core Data haben Breiten- und Längengradattribute (und ein CLLocation-Attribut ist in der Klasse '.m/.h definiert, die ich manuell daraus auffüllen kann) und verwenden dies für ein NSPredicate zum Auffinden nahegelegener Objekte.

Aufgrund der Art der Anzahl der Objekte in der Core Data-Datenbank können wir ALLE Objekte nicht als Annotationen laden, da sonst nicht genügend Speicher zur Verfügung steht (und es wäre quälend langsam).

Wie kann ich nur die Objekte abrufen, die Standorte in den aktuellen Mapview-Grenzen haben?

Antwort

5

Leider Englisch ist nicht meine erste Sprache ..

Sobald der Benutzer scrollt nach unten oder oben .. die Region Wert ändern, insbesondere latitudeDelta und longitudeDelta von regionDidChangeAnimated. Von dort können Sie die Grenzen Ihrer aktuellen mapView zu bekommen .. (minlat, minlong, MAXLAT, maxlong)

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

maxlat = current_coordinate_lat + latitudeDelta; 

minlong = ... 

maxlong = ... 

Da Sie die berechneten Grenzen bereits haben, dann können Sie verarbeiten, welches Objekt zu zeigen braucht, dann fügen die Anmerkung in der Karte. Ich habe unten mit den Werten experimentiert ..

Siehe Bild hier .. http://img43.imageshack.us/img43/703/picture1txe.png

Von dort .. ich sqlite3 SQL-Anweisung tun können, um die Punkte zu bekommen innerhalb der begrenze ..

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

+0

Dieses allgemeine Konzept hat gut für mich funktioniert! Das einzige, was ärgerlich ist, ist, dass es Objekte lädt, die gerade außerhalb der Grenzen des Rechtecks ​​sind, so dass der Benutzer nicht sehen kann, wie es die Pins fallen lässt. Das ist meistens kosmetisch, also ist es keine Eile, es zu lösen. Irgendwelche Ideen, warum es jenseits der Grenzen ist? Ich kann nur davon ausgehen, dass die Grenzen größer sind als das, was auf dem Bildschirm SICHTBAR ist. Gedanken? –

+1

Kevin, der Grund, warum Sie zu viele Objekte bekommen, ist, dass die Breiten- und Längengrad-Deltas beide zuerst halbiert werden müssen, da sie die Entfernung über die gesamte Region repräsentieren, nicht nur von der Mitte. Also zum Beispiel: minLat = currentCenter - (latDelta/2), usw. –

Verwandte Themen