Des experts de Trig ou GPS peuvent-ils m'aider ici? J'essaie de créer un calcul de boîte à bornisation géo-spacial (rectangle) renvoyant la latitude et la longitude maximales en utilisant la méthode suivante que j'ai récupérée. J'appelle la méthode une fois pour chacun des roulements: nord, sud, est et ouest. Avec ces quatre valeurs, j'ai l'intention d'interroger mon magasin de données de base pour tous les objets de la boîte.
-(CLLocation*) offsetLocation:(CLLocation*)startLocation:(double)offsetMeters:(double)bearing { double EARTH_MEAN_RADIUS_METERS = 6372796.99; double newLatitude = asin( sin(startLocation.coordinate.latitude) * cos(offsetMeters/EARTH_MEAN_RADIUS_METERS) + cos(startLocation.coordinate.latitude) * sin(offsetMeters/EARTH_MEAN_RADIUS_METERS) * cos(bearing) ); double newLongitude = startLocation.coordinate.longitude + atan2( sin(bearing) * sin(offsetMeters/EARTH_MEAN_RADIUS_METERS) * cos(startLocation.coordinate.latitude), cos(offsetMeters/EARTH_MEAN_RADIUS_METERS) - sin(startLocation.coordinate.latitude) * sin(newLatitude)); CLLocation *tempLocation = [[CLLocation alloc] initWithLatitude:newLatitude longitude:newLongitude]; [tempLocation autorelease]; return tempLocation; }
3 Réponses :
Je n'ai pas examiné votre code, mais vous pouvez également utiliser la fonction MAPKIT MKCOORDINATEGIONMakeWithDistance () Code> Pour que le framework Calculer une boîte de sélection pour vous.
CLLocationCoordinate2D center = { 37.3, -122.0 };
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(center, 2000.0, 2000.0);
CLLocationCoordinate2D northWestCorner, southEastCorner;
northWestCorner.latitude = center.latitude - (region.span.latitudeDelta / 2.0);
northWestCorner.longitude = center.longitude + (region.span.longitudeDelta / 2.0);
southEastCorner.latitude = center.latitude + (region.span.latitudeDelta / 2.0);
southEastCorner.longitude = center.longitude - (region.span.longitudeDelta / 2.0);
Wow. Je n'utilise pas mapkit, je n'avais donc pas pensé à regarder là-bas. Merci. Je vais essayer les deux méthodes.
MkcoordinaeegionMakeWithDistance fait une belle boîte très facilement, mais je ne sais pas comment récupérer les limites (latitude maximale ou longitude) de la région nouvellement créée. Toutes les propriétés semblaient être liées à la carte elle-même.
C'est juste un peu de mathématiques, n'est-ce pas? J'ai ajouté du code à ma réponse. Notez que ce code ne fonctionne pas si la boîte à bornes traverse la ligne de date ou les pôles. Mais alors, vous auriez besoin de la diviser en plusieurs cases de toute façon pour interroger le magasin de données.
Ole, merci !. Cela fonctionne parfaitement. C'était ma première expérience avec Mapkit et elle ne m'a jamais eue que vous pouviez le faire avec des mathématiques simples. J'ai passé deux jours à essayer de comprendre les formules Haversine et Vincingy toy jusqu'à ce que mon cerveau soit bouillonnant. Maintenant, c'est "un peu de mathématiques". :)
CllouerCoordinated2D stocke les coordonnées en degrés, mais les fonctions de Trig utilisées nécessitent des unités de radian. Si vous convertissez en radians (multipliez par M_PI / 180, ou 0.017453293F), cela fonctionnera probablement. P>
Comment allez-vous les gars de la création des nspredicats?
Je semble courir dans des problèmes de performance avec les miens. P>
NSPredicate *northWestLat = [NSPredicate predicateWithFormat:@"ANY locations.lat > %lf", northWestCorner.latitude]; NSPredicate *southhWestLat = [NSPredicate predicateWithFormat:@"ANY locations.lat < %lf", southEastCorner.latitude]; NSPredicate *latitudePredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:northWestLat, southhWestLat, nil]]; NSPredicate *northWestLng = [NSPredicate predicateWithFormat:@"ANY locations.lng < %lf", northWestCorner.longitude]; NSPredicate *southEastLng = [NSPredicate predicateWithFormat:@"ANY locations.lng > %lf", southEastCorner.longitude]; NSPredicate *longitudePredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:northWestLng, southEastLng, nil]]; NSPredicate *coordPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:latitudePredicate, longitudePredicate, nil]];
Pourquoi utilisez-vous? Pourquoi pas seulement [nspredicate prédicatwithFormat: @ "latitude>% F et latitude <% F et Longitude>% F et longitude <% F", Latmin, Latmax, Lngmin, Lngmax]; Code>