Agregando mKAnnotaciones aleatorias alnetworkingedor de la location actual en un MKMapView

Tengo un MKMapView que muestra la location actual de los usuarios. Cuando hago clic en un button en la barra de navigation, quiero colocar aleatoriamente 10 pines MKAnnotation . Estos pueden soltarse en cualquier lugar, de manera aleatoria, pero solo dentro del área visible actual del map y alnetworkingedor de la location actual.

¿Cómo podría hacer algo así? ¿Hay alguna manera de tener un range largo / lat que esté alnetworkingedor de la location de los usuarios, pero dentro del área del map? Entonces, ¿podría elegir random de este range?

Básicamente, necesito encontrar qué coorderadas están disponibles en la MKCoordinateRegion actual.

¿Hay una mejor manera de hacerlo?

Puede get sus annotations utilizando la distancia entre la location del usuario y otra location.

revisa el código a continuación

 #define DISTANCE_RADIUS 10.0 // in KM -(NSArray *)findNearMe:(NSArray *)lounges { NSMutableArray *arNearme = [NSMutableArray array]; CLLocation *currentLocation; for(NSDictionary *d in lounges) { currentLocation = [[CLLocation alloc] initWithLatitude:29.33891 longitude:48.077202]; CGFloat latitude=[[d valueForKey:@"latitude"] floatValue]; CGFloat longitude=[[d valueForKey:@"longitude"] floatValue]; CLLocation *newPinLocation=[[CLLocation alloc] initWithLatitude:latitude longitude:longitude]; double distanceValue=[currentLocation distanceFromLocation:newPinLocation]; if(distanceValue/1000.0<=DISTANCE_RADIUS) { [arNearme addObject:d]; } } return arNearme; } 

Le devolverá una variedad de range de 1 a 1000 km cerca de la location del usuario. Usó la matriz de annotations y muestra sus annotations en la vista de map con la location del usuario.

Me di count, así es como lo hice:

 /** * Adds new pins to the map * * @version $Revision: 0.1 */ + (void)addPinsToMap:(MKMapView *)mapView amount:(int)howMany { //First we need to calculate the corners of the map so we get the points CGPoint nePoint = CGPointMake(mapView.bounds.origin.x + mapView.bounds.size.width, mapView.bounds.origin.y); CGPoint swPoint = CGPointMake((mapView.bounds.origin.x), (mapView.bounds.origin.y + mapView.bounds.size.height)); //Then transform those point into lat,lng values CLLocationCoordinate2D neCoord = [mapView convertPoint:nePoint toCoordinateFromView:mapView]; CLLocationCoordinate2D swCoord = [mapView convertPoint:swPoint toCoordinateFromView:mapView]; // Loop for (int y = 0; y < howMany; y++) { double latRange = [MapUtility randomFloatBetween:neCoord.latitude andBig:swCoord.latitude]; double longRange = [MapUtility randomFloatBetween:neCoord.longitude andBig:swCoord.longitude]; // Add new waypoint to map CLLocationCoordinate2D location = CLLocationCoordinate2DMake(latRange, longRange); MPin *pin = [[MPin alloc] init]; pin.coordinate = location; [mapView addAnnotation:pin]; }//end }//end /** * Random numbers * * @version $Revision: 0.1 */ + (double)randomFloatBetween:(double)smallNumber andBig:(double)bigNumber { double diff = bigNumber - smallNumber; return (((double) (arc4random() % ((unsigned)RAND_MAX + 1)) / RAND_MAX) * diff) + smallNumber; }//end 

En Swift 3.0

 func addPins() { let nePoint = CGPoint(x: mapView.bounds.origin.x + mapView.bounds.size.width, y: mapView.bounds.origin.y) let sePoint = CGPoint(x: mapView.bounds.origin.x, y: mapView.bounds.origin.y + mapView.bounds.size.height) let neCoord = mapView.convert(nePoint, toCoordinateFrom: mapView) let seCoord = mapView.convert(sePoint, toCoordinateFrom: mapView) var y = 5 while y > 0 { let latRange = randomBetweenNumbers(firstNum: Float(neCoord.latitude), secondNum: Float(seCoord.latitude)) let longRange = randomBetweenNumbers(firstNum: Float(neCoord.longitude), secondNum: Float(seCoord.longitude)) let location = CLLocationCoordinate2D(latitude: CLLocationDegrees(latRange), longitude: CLLocationDegrees(longRange)) let pin = MKPointAnnotation() pin.coordinate = location pin.title = "Home" mapView.addAnnotation(pin) y -= 1 } } func randomBetweenNumbers(firstNum: Float, secondNum: Float) -> Float{ return Float(arc4random()) / Float(UINT32_MAX) * abs(firstNum - secondNum) + min(firstNum, secondNum) }