Hoe kan ik bepalen of een coördinaat is in de huidige kaart te regio?

stemmen
2

Ik heb een lijst van enkele honderden locaties en om alleen de MKPinAnnotation voor die locaties die momenteel op het scherm weer te geven. Het scherm begint met de huidige locatie van de gebruiker met een straal van 2 mijl. Natuurlijk kan de gebruiker scrollen en inzoomen op het scherm. Op dit moment, ik wacht op een kaartupdate gebeurtenis, en dan loop door mijn locatie lijst en controleer de coördinaten als volgt uit:

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

Dus ik vraag convertCoordinate waarvan het punt zou zijn op het scherm (tenzij ik deze methode, die is heel goed mogelijk verkeerd). Als de coördinaat is niet op het scherm, dan heb ik het nooit toe te voegen aan de Mapview.

Dus mijn vraag, is dit de juiste manier om te bepalen of een locatie van lat / lang zou verschijnen in de huidige inzichten en uitgaande moet worden toegevoegd aan de de Mapview? Of moet ik dit doen op een andere manier?

De vraag is gesteld op 29/07/2009 om 00:59
bron van user
In andere talen...                            


3 antwoorden

stemmen
7

In de code, moet u slagen voor een weergave voor de toPointToView:optie. Ik gaf het mijn mapView. Je moet een bovengrens voor de x- en y te specificeren.

Hier is een code die werkte voor mij (vertelde me op dat moment zichtbare meldingen in mijn kaart, terwijl het doorlussen de aantekening):

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);
    }
}
antwoordde op 04/02/2010 om 05:47
bron van user

stemmen
3

Ik weet dat dit een oude thread, niet zeker wat beschikbaar was toen ... Maar moet je liever doen:

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

    // Do your stuff

}

Geen behoefte om terug te zetten naar de ruimte op het scherm. Ook ik ben niet zeker van de reden waarom u probeert om dit te doen, ik denk dat dit is vreemd om niet aantekeningen toe te voegen als ze niet op het scherm ... MapKit optimaliseert al deze en alleen creëert (en recycleert) uitzicht annotatie die zichtbaar zijn .

antwoordde op 22/10/2015 om 19:12
bron van user

stemmen
2

Na een beetje van het lezen kan ik niet iets dat zegt dat dit een slecht idee vinden. Ik heb een beetje van het testen gedaan in mijn aanvraag en ik krijg altijd de juiste resultaten. De app laadt veel sneller toen ik coördinaten die zal verschijnen in de huidige zichtbare kaart gebied in plaats van alle 300+ coördineert in een keer toe te voegen alleen.

Wat ik was op zoek naar een methode zoals [mapView isCoordinateInVisibleRegion: myCoordinate], maar tot nu toe deze methode is snel en lijkt accuraat.

Ik heb ook veranderde de titel te lezen "in het zichtbare kaart regio" in plaats van de vorige, omdat ik denk dat de verkeerde titel kan mijn zin heb in de war.

antwoordde op 10/08/2009 om 14:09
bron van user

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