Jak mohu zjistit, zda je koordinovat je v současné době viditelné části mapy regionu?

hlasů
2

Mám seznam několika stovek míst a jen chcete zobrazit MKPinAnnotation na těch místech v současné době na obrazovce. Na obrazovce se začne aktuální polohy uživatele s poloměrem 2 míle. Samozřejmě, že uživatel může procházet a zoom na obrazovce. Právě teď, čekám na akci s aktualizacemi map, a potom smyčku výběru umístění a zkontrolujte souřadnic, jako je tento:

-(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 */
  }

Tak se ptám, kde convertCoordinate bod bude na obrazovce (pokud jsem špatně tuto metodu, která je velmi pravděpodobné). V případě, že koordinovat není na obrazovce, pak jsem nikdy přidat do MapView.

Takže moje otázka, je to správný způsob, jak zjistit, zda lat / long by se objevila umístění je v aktuálním pohledu a měly by být přidány do o MapView? Nebo bych to dělat jinak?

Položena 29/07/2009 v 00:59
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
7

V kódu, měli byste si projít pohled na toPointToView:možnost. Dal jsem to my mapView. Budete muset zadat horní mez pro x a y taky.

Tady je nějaký kód, který pracoval pro mě (mi řekl, že aktuálně viditelné poznámky na mé mapě, zatímco průchozí anotace):

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);
    }
}
Odpovězeno 04/02/2010 v 05:47
zdroj uživatelem

hlasů
3

Vím, že to je stará nit, není si jistý, co bylo k dispozici v té době ... Ale měli byste raději:

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

    // Do your stuff

}

Není třeba převádět zpět do prostoru obrazovky. Také si nejsem jistý důvod, proč se snažíte, jak to udělat, myslím, že to je divné, ne přidávat poznámky, když nejsou na obrazovce ... MapKit již optimalizuje to a jen vytváří (a recykluje) pohledy poznámek, které jsou viditelné ,

Odpovězeno 22/10/2015 v 19:12
zdroj uživatelem

hlasů
2

Po troše čtení Nemohu najít nic, co říká, že je to špatný nápad. Udělal jsem trochu testování v mé aplikaci, a vždycky jsem si správné výsledky. Tyto aplikace načte mnohem rychleji, když jsem jen dodat souřadnice, které se objeví v aktuálně viditelné části mapy regionu místo všech 300+ souřadnic najednou.

To, co jsem hledala byla metoda, jako [MapView isCoordinateInVisibleRegion: myCoordinate], ale zatím tato metoda je rychlá a zdá přesné.

Také jsem změnil název na čtení „ve viditelné části mapy regionu“ namísto předchozí, protože si myslím, že nesprávný název může být zmaten, co tím myslím.

Odpovězeno 10/08/2009 v 14:09
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more